package org.ow2.choreos.ee.services.preparer; import java.util.HashSet; import java.util.List; import java.util.Set; import org.apache.log4j.Logger; import org.ow2.choreos.ee.nodes.selector.NodeSelector; import org.ow2.choreos.ee.nodes.selector.NodeSelectorFactory; import org.ow2.choreos.nodes.datamodel.CloudNode; import org.ow2.choreos.selectors.NotSelectedException; import org.ow2.choreos.services.datamodel.DeployableService; import org.ow2.choreos.services.datamodel.DeployableServiceSpec; public class ServiceDeploymentPreparer { private DeployableServiceSpec newSpec; private DeployableService service; private String serviceSpecName; private Set<CloudNode> nodes; private Logger logger = Logger.getLogger(ServiceDeploymentPreparer.class); public ServiceDeploymentPreparer(DeployableServiceSpec newSpec, DeployableService service) { this.newSpec = newSpec; this.service = service; this.serviceSpecName = newSpec.getName(); } public Set<CloudNode> prepareDeployment() throws PrepareDeploymentFailedException { selectNodes(); prepareInstances(); return nodes; } private void selectNodes() throws PrepareDeploymentFailedException { NodeSelector selector = NodeSelectorFactory.getFactoryInstance().getNodeSelectorInstance(); try { List<CloudNode> nodesList = selector.select(newSpec, newSpec.getNumberOfInstances()); nodes = new HashSet<CloudNode>(nodesList); logger.info("Selected nodes to " + serviceSpecName + ": " + nodes); } catch (NotSelectedException e) { failDeployment(); } if (nodes == null || nodes.isEmpty()) { failDeployment(); } } private void failDeployment() throws PrepareDeploymentFailedException { throw new PrepareDeploymentFailedException(serviceSpecName); } private void prepareInstances() { for (CloudNode node : nodes) { try { InstanceDeploymentPreparer instanceDeploymentPreparer = new InstanceDeploymentPreparer(newSpec, service, node); instanceDeploymentPreparer.prepareDeployment(); } catch (PrepareDeploymentFailedException e) { logger.error(e.getMessage()); } } } }