package org.ow2.choreos.ee.bus.selector;
import org.apache.log4j.Logger;
import org.ow2.choreos.ee.bus.ESBRegister;
import org.ow2.choreos.ee.bus.EasyESBException;
import org.ow2.choreos.ee.bus.EasyESBNode;
import org.ow2.choreos.ee.bus.EasyESBNodeImpl;
import org.ow2.choreos.ee.config.ChoreographyDeployerConfiguration;
import org.ow2.choreos.nodes.NodeNotCreatedException;
import org.ow2.choreos.nodes.NodeNotFoundException;
import org.ow2.choreos.nodes.NodeNotUpdatedException;
import org.ow2.choreos.nodes.NodePoolManager;
import org.ow2.choreos.nodes.datamodel.CloudNode;
import org.ow2.choreos.nodes.datamodel.NodeSpec;
import org.ow2.choreos.nodes.datamodel.ResourceImpact;
import org.ow2.choreos.selectors.ObjectCreationException;
import org.ow2.choreos.selectors.ObjectFactory;
/**
* EasyESB nodes are always created on new dedicated nodes.
* @author leonardo
*
*/
public class ESBNodeFactory implements ObjectFactory<EasyESBNode, ResourceImpact> {
private static final int TIMEOUT_SECONDS = 5 * 60;
private static final String EASIER_BSM_ADMIN_ENDPOINT_PROPERTY = "EASIER_BSM_ADMIN_ENDPOINT";
private NodePoolManager npm;
private CloudNode node;
private EasyESBNode esbNode;
private Logger logger = Logger.getLogger(ESBNodeFactory.class);
public ESBNodeFactory(NodePoolManager npm) {
this.npm = npm;
}
@Override
public EasyESBNode createNewInstance(ResourceImpact requirements) throws ObjectCreationException {
createNewCloudNode();
createNewESBNode();
notifyBSM();
ESBRegister.addEsbNode(esbNode);
logger.info("Created EasyESB node " + esbNode.getAdminEndpoint());
return esbNode;
}
private void createNewCloudNode() throws ObjectCreationException {
try {
node = npm.createNode(new NodeSpec());
} catch (NodeNotCreatedException e) {
throw new ObjectCreationException();
}
}
private void createNewESBNode() throws ObjectCreationException {
ESBDeploymentPreparer preparer = new ESBDeploymentPreparer(node);
try {
preparer.prepareESBDeployment();
} catch (BusNotPreparedException e) {
throw new ObjectCreationException();
}
try {
this.npm.updateNode(node.getId());
} catch (NodeNotUpdatedException e) {
throw new ObjectCreationException();
} catch (NodeNotFoundException e) {
throw new ObjectCreationException();
}
String endpoint = this.getEndpoint();
esbNode = new EasyESBNodeImpl(endpoint);
}
private void notifyBSM() {
String bsmAdminEndpoint = ChoreographyDeployerConfiguration.get(EASIER_BSM_ADMIN_ENDPOINT_PROPERTY);
if (bsmAdminEndpoint != null && !bsmAdminEndpoint.isEmpty()) {
try {
this.esbNode.notifyEasierBSM(bsmAdminEndpoint);
} catch (EasyESBException e) {
; // log will be printed within EasyESBNodeImpl class
}
}
}
private String getEndpoint() {
return "http://" + node.getIp() + ":8180/services/adminExternalEndpoint";
}
@Override
public int getTimeoutInSeconds() {
return TIMEOUT_SECONDS;
}
}