package org.ow2.choreos.ee.nodes.selector; import java.util.HashMap; import java.util.List; import java.util.Map; import org.ow2.choreos.ee.config.DeploymentManagerConfiguration; import org.ow2.choreos.ee.nodes.NPMFactory; import org.ow2.choreos.nodes.NodePoolManager; import org.ow2.choreos.nodes.datamodel.CloudNode; import org.ow2.choreos.selectors.LimitedRoundRobinSelector; import org.ow2.choreos.selectors.NotSelectedException; import org.ow2.choreos.services.datamodel.DeployableServiceSpec; public class LimitedRoundRobinNodeSelector implements NodeSelector { private static final String VM_LIMIT_PROPERTY = "VM_LIMIT"; private Map<String, LimitedRoundRobinSelector<CloudNode, DeployableServiceSpec>> selectors = new HashMap<String, LimitedRoundRobinSelector<CloudNode, DeployableServiceSpec>>(); @Override public List<CloudNode> select(DeployableServiceSpec spec, int objectsQuantity) throws NotSelectedException { LimitedRoundRobinSelector<CloudNode, DeployableServiceSpec> selector = retrieveSelector(spec); return selector.select(spec, objectsQuantity); } private LimitedRoundRobinSelector<CloudNode, DeployableServiceSpec> retrieveSelector( DeployableServiceSpec serviceSpec) { String cloudAccount = serviceSpec.getOwner(); synchronized (this) { if (!this.selectors.containsKey(cloudAccount)) { int nodeLimit = getNodeLimit(); NodePoolManager npm = NPMFactory.getNewNPMInstance(cloudAccount); NodeFactory factory = new NodeFactory(npm); NodeRetriever retriever = new NodeRetriever(npm); NodeFilter filter = new NodeFilter(); this.selectors.put(cloudAccount, new LimitedRoundRobinSelector<CloudNode, DeployableServiceSpec>( nodeLimit, retriever, factory, filter)); } } return this.selectors.get(cloudAccount); } private int getNodeLimit() { int nodeLimit; try { nodeLimit = Integer.parseInt(DeploymentManagerConfiguration.get(VM_LIMIT_PROPERTY)); } catch (NumberFormatException e) { final int INFINITE_NODES = 100000000; nodeLimit = INFINITE_NODES; } return nodeLimit; } }