/** * Copyright 2013 Technische Universitat Wien (TUW), Distributed SystemsGroup * E184. * This work was partially supported by the European Commission in terms * of the CELAR FP7 project (FP7-ICT-2011-8 #317790). * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. */ /** * Author : Georgiana Copil - e.copil@dsg.tuwien.ac.at */ package at.ac.tuwien.dsg.rSybl.cloudInteractionUnit.enforcementPlugins.dryRun; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Random; import java.util.UUID; import at.ac.tuwien.dsg.csdg.DependencyGraph; import at.ac.tuwien.dsg.csdg.Node; import at.ac.tuwien.dsg.csdg.SimpleRelationship; import at.ac.tuwien.dsg.csdg.Node.NodeType; import at.ac.tuwien.dsg.csdg.Relationship.RelationshipType; import at.ac.tuwien.dsg.csdg.elasticityInformation.elasticityRequirements.Strategy; import at.ac.tuwien.dsg.rSybl.cloudInteractionUnit.enforcementPlugins.interfaces.EnforcementInterface; import at.ac.tuwien.dsg.rSybl.cloudInteractionUnit.utils.Configuration; import at.ac.tuwien.dsg.rSybl.cloudInteractionUnit.utils.RuntimeLogger; import at.ac.tuwien.dsg.rSybl.dataProcessingUnit.api.MonitoringAPIInterface; import java.io.InputStream; import java.io.InputStreamReader; import org.json.simple.JSONArray; import org.json.simple.JSONObject; import org.json.simple.parser.JSONParser; public class DryRunEnforcementAPI implements EnforcementInterface { private Node controlledService; private MonitoringAPIInterface monitoring; private List<String> parameters = new ArrayList<String>(); private double MAX_VIOLATION_DEGREE=3.0; public DryRunEnforcementAPI(Node cloudService) { // TODO Auto-generated constructor stub controlledService = cloudService; readParameters(); } public static void main (String[]args){ DryRunEnforcementAPI aPI = new DryRunEnforcementAPI(null); aPI.readParameters(); } public void readParameters(){ JSONParser parser = new JSONParser(); try { InputStream inputStream = Configuration.class.getClassLoader().getResourceAsStream("config/resources.json"); Object obj = parser.parse(new InputStreamReader(inputStream)); JSONObject jsonObject = (JSONObject) obj; for (Object p: jsonObject.keySet()){ String pluginName = (String) p; JSONObject plugin=(JSONObject) jsonObject.get(pluginName); if (pluginName.toLowerCase().contains("dry")){ for (Object a:plugin.keySet()){ String actionName= (String)a; JSONObject action=(JSONObject) plugin.get(actionName); JSONArray jSONArray = (JSONArray) action.get("parameters"); for (int i=0;i<jSONArray.size();i++){ parameters.add((String)jSONArray.get(i)); } } } } }catch(Exception e){ RuntimeLogger.logger.info(e.getMessage()); } } public Node findNode(String id) { boolean found = false; if (!found) { if (id.equalsIgnoreCase(controlledService.getId())) { found = true; return controlledService; } } Node topology = controlledService.getAllRelatedNodesOfType(RelationshipType.COMPOSITION_RELATIONSHIP, NodeType.SERVICE_TOPOLOGY).get(0); if (topology.getId().equalsIgnoreCase(id)) { found = true; return topology; } List<Node> topologies = new ArrayList<Node>(); topologies.addAll(topology.getAllRelatedNodesOfType(RelationshipType.COMPOSITION_RELATIONSHIP, NodeType.SERVICE_TOPOLOGY)); List<Node> componentsToExplore = new ArrayList<Node>(); if (topology.getAllRelatedNodesOfType(RelationshipType.COMPOSITION_RELATIONSHIP, NodeType.SERVICE_UNIT) != null) { componentsToExplore.addAll(topology.getAllRelatedNodesOfType(RelationshipType.COMPOSITION_RELATIONSHIP, NodeType.SERVICE_UNIT)); } while (!found && !topologies.isEmpty()) { Node currentTopology = topologies.get(0); topologies.remove(0); if (currentTopology.getId().equalsIgnoreCase(id)) { found = true; return currentTopology; } else { //System.err.println(currentTopology.getId()); if (currentTopology.getAllRelatedNodesOfType(RelationshipType.COMPOSITION_RELATIONSHIP, NodeType.SERVICE_TOPOLOGY) != null && currentTopology.getAllRelatedNodesOfType(RelationshipType.COMPOSITION_RELATIONSHIP, NodeType.SERVICE_TOPOLOGY).size() > 0) { topologies.addAll(currentTopology.getAllRelatedNodesOfType(RelationshipType.COMPOSITION_RELATIONSHIP, NodeType.SERVICE_TOPOLOGY)); } if (currentTopology.getAllRelatedNodesOfType(RelationshipType.COMPOSITION_RELATIONSHIP, NodeType.SERVICE_UNIT) != null && currentTopology.getAllRelatedNodesOfType(RelationshipType.COMPOSITION_RELATIONSHIP, NodeType.SERVICE_UNIT).size() > 0) { componentsToExplore.addAll(currentTopology.getAllRelatedNodesOfType(RelationshipType.COMPOSITION_RELATIONSHIP, NodeType.SERVICE_UNIT)); } } } // if (getCurrentReadLatency(arg0).isNaN()) while (!found && !componentsToExplore.isEmpty()) { Node component = componentsToExplore.get(0); componentsToExplore.remove(0); if (component.getId().equalsIgnoreCase(id)) { found = true; return component; } } return null; } public boolean scaleOut(double violationDegree, Node arg0){ boolean res =true; RuntimeLogger.logger.info("Scaling out ... " + arg0 + " " + arg0.getNodeType()+" violation degree "+violationDegree); // monitoring.enforcingActionStarted("ScaleOut", arg0); Node o = arg0; res = scaleOutComponent(violationDegree,(Node) o); // monitoring.enforcingActionEnded("ScaleOut", arg0); return res; } public boolean scaleOut(Node arg0) { RuntimeLogger.logger.info("Scaling out ... " + arg0 + " " + arg0.getNodeType()); // monitoring.enforcingActionStarted("ScaleOut", arg0); boolean res = true; Node o = arg0; if (o.getNodeType() == NodeType.CODE_REGION) { scaleOutComponent(findComponentOfCodeRegion(arg0)); } //TODO : enable just ComponentTopology level if (o.getNodeType() == NodeType.SERVICE_TOPOLOGY) { //TODO: make it possible to scale a set of component topologies Node master = null; Node slave = null; ArrayList<Node> comps = (ArrayList<Node>) o.getAllRelatedNodesOfType(RelationshipType.COMPOSITION_RELATIONSHIP, NodeType.SERVICE_UNIT); for (Node comp : comps) { if (comp.getAllRelatedNodesOfType(RelationshipType.MASTER_OF) != null) { master = comp; slave = comp.getAllRelatedNodesOfType(RelationshipType.MASTER_OF).get(0); } } //TODO:add for more slaves List<String> slavesPrivateIps = new ArrayList<String>(); List<String> masterPrivateIps = new ArrayList<String>(); for (String ip : slave.getAssociatedIps()) { if (ip.split("\\.")[0].length() == 2) { slavesPrivateIps.add(ip); } } for (String ip : master.getAssociatedIps()) { if (ip.split("\\.")[0].length() == 2) { masterPrivateIps.add(ip); } } int nb = 1; if (masterPrivateIps.size() != 0) { nb = slavesPrivateIps.size() / masterPrivateIps.size(); } //maybe we implement cluster-level actions //cloudsOpenStackConnection.scaleOutCluster(master, slave, nb,master.getAssociatedIps().get(0),controlledService); } if (o.getNodeType() == NodeType.SERVICE_UNIT) { res = scaleOutComponent((Node) o); } //monitoring.enforcingActionEnded("ScaleOut", arg0); return res; } private void loadDeploymentDescription() { // try { // JAXBContext a = JAXBContext.newInstance( DeploymentDescription.class ); // Unmarshaller u = a.createUnmarshaller(); // String deploymentDescriptionPath = at.ac.tuwien.dsg.sybl.monitorandenforcement.utils.Configuration.getDeploymentDescriptionPath(); // // RuntimeLogger.logger.info("Got here "+deploymentDescriptionPath); // // RuntimeLogger.logger.info("Got here "+this.getClass().getClassLoader().getResourceAsStream(deploymentDescriptionPath)); // // if (deploymentDescriptionPath!=null) // deploymentDescription = (DeploymentDescription) u.unmarshal( this.getClass().getClassLoader().getResourceAsStream(deploymentDescriptionPath)) ; // // //RuntimeLogger.logger.info("Read deployment Descrption"+deploymentDescription.toString()); // // } catch (Exception e) { // RuntimeLogger.logger.error("Error in reading deployment description"+e.toString()); // // TODO Auto-generated catch block // e.printStackTrace(); // } } private boolean scaleOutComponent(double violationDegree,Node o) { if (parameters.size()>0){ DependencyGraph graph = new DependencyGraph(); graph.setCloudService(controlledService); RuntimeLogger.logger.info("~~~~~~~~~~~~~~~~~~~~~~Image from which we create " + (String) o.getStaticInformation("DefaultImage")); String uuid = UUID.randomUUID().toString(); Node node = new Node(); Random r = new Random(); String ip = r.nextInt(256) + "." + r.nextInt(256) + "." + r.nextInt(256) + "." + r.nextInt(256); String vmType = ""; if (violationDegree>MAX_VIOLATION_DEGREE) violationDegree=MAX_VIOLATION_DEGREE; int index = (int) (parameters.size()*violationDegree/MAX_VIOLATION_DEGREE)-1; if (index<0)index=0; if (!ip.equalsIgnoreCase("err") && !ip.equalsIgnoreCase("")) { if (o.getAllRelatedNodesOfType(RelationshipType.HOSTED_ON_RELATIONSHIP, NodeType.ARTIFACT) != null && node.getAllRelatedNodesOfType(RelationshipType.HOSTED_ON_RELATIONSHIP, NodeType.ARTIFACT).size() > 0) { Node artifact = node.getAllRelatedNodesOfType(RelationshipType.HOSTED_ON_RELATIONSHIP, NodeType.ARTIFACT).get(0); node.getStaticInformation().put("UUID", uuid); node.getStaticInformation().put("IP", ip); node.setId(ip); node.setNodeType(NodeType.VIRTUAL_MACHINE); SimpleRelationship rel = new SimpleRelationship(); rel.setSourceElement(artifact.getId()); rel.setTargetElement(node.getId()); rel.setType(RelationshipType.HOSTED_ON_RELATIONSHIP); RuntimeLogger.logger.info("Adding to " + o.getId() + " vm with ip " + ip+" and of type "+parameters.get(index)); artifact.addNode(node, rel); } else { node.getStaticInformation().put("UUID", uuid); node.getStaticInformation().put("IP", ip); node.setId(ip); node.setNodeType(NodeType.VIRTUAL_MACHINE); SimpleRelationship rel = new SimpleRelationship(); rel.setSourceElement(o.getId()); rel.setTargetElement(node.getId()); rel.setType(RelationshipType.HOSTED_ON_RELATIONSHIP); RuntimeLogger.logger.info("Adding to " + o.getId() + " vm with ip " + ip+" and of type "+parameters.get(index)); o.addNode(node, rel); } } RuntimeLogger.logger.info("The controlled service is now " + controlledService.toString()); monitoring.refreshServiceStructure(controlledService); return true; }else{ return scaleOutComponent(o); } } private boolean scaleOutComponent(Node o) { DependencyGraph graph = new DependencyGraph(); graph.setCloudService(controlledService); RuntimeLogger.logger.info("~~~~~~~~~~~~~~~~~~~~~~Image from which we create " + (String) o.getStaticInformation("DefaultImage")); String uuid = UUID.randomUUID().toString(); Node node = new Node(); Random r = new Random(); String ip = r.nextInt(256) + "." + r.nextInt(256) + "." + r.nextInt(256) + "." + r.nextInt(256); if (!ip.equalsIgnoreCase("err") && !ip.equalsIgnoreCase("")) { if (o.getAllRelatedNodesOfType(RelationshipType.HOSTED_ON_RELATIONSHIP, NodeType.ARTIFACT) != null && node.getAllRelatedNodesOfType(RelationshipType.HOSTED_ON_RELATIONSHIP, NodeType.ARTIFACT).size() > 0) { Node artifact = node.getAllRelatedNodesOfType(RelationshipType.HOSTED_ON_RELATIONSHIP, NodeType.ARTIFACT).get(0); node.getStaticInformation().put("UUID", uuid); node.getStaticInformation().put("IP", ip); node.setId(ip); node.setNodeType(NodeType.VIRTUAL_MACHINE); SimpleRelationship rel = new SimpleRelationship(); rel.setSourceElement(artifact.getId()); rel.setTargetElement(node.getId()); rel.setType(RelationshipType.HOSTED_ON_RELATIONSHIP); RuntimeLogger.logger.info("Adding to " + o.getId() + " vm with ip " + ip); artifact.addNode(node, rel); } else { node.getStaticInformation().put("UUID", uuid); node.getStaticInformation().put("IP", ip); node.setId(ip); node.setNodeType(NodeType.VIRTUAL_MACHINE); SimpleRelationship rel = new SimpleRelationship(); rel.setSourceElement(o.getId()); rel.setTargetElement(node.getId()); rel.setType(RelationshipType.HOSTED_ON_RELATIONSHIP); RuntimeLogger.logger.info("Adding to " + o.getId() + " vm with ip " + ip); o.addNode(node, rel); } } RuntimeLogger.logger.info("The controlled service is now " + controlledService.toString()); monitoring.refreshServiceStructure(controlledService); return true; } private void scaleInComponent(Node o) { DependencyGraph graph = new DependencyGraph(); graph.setCloudService(controlledService); Node toBeScaled = graph.getNodeWithID(o.getId()); Node toBeRemoved=null; if (toBeScaled.getAllRelatedNodesOfType(RelationshipType.HOSTED_ON_RELATIONSHIP, NodeType.ARTIFACT) != null && toBeScaled.getAllRelatedNodesOfType(RelationshipType.HOSTED_ON_RELATIONSHIP, NodeType.ARTIFACT).size() > 0) { Node artifact = toBeScaled.getAllRelatedNodesOfType(RelationshipType.HOSTED_ON_RELATIONSHIP, NodeType.ARTIFACT).get(0); if (artifact.getAllRelatedNodesOfType(RelationshipType.HOSTED_ON_RELATIONSHIP, NodeType.CONTAINER)!=null && artifact.getAllRelatedNodesOfType(RelationshipType.HOSTED_ON_RELATIONSHIP, NodeType.CONTAINER).size()>0){ Node container = artifact.getAllRelatedNodesOfType(RelationshipType.HOSTED_ON_RELATIONSHIP, NodeType.CONTAINER).get(0); toBeRemoved = container.getAllRelatedNodesOfType(RelationshipType.HOSTED_ON_RELATIONSHIP, NodeType.VIRTUAL_MACHINE).get(0); RuntimeLogger.logger.info("Trying to remove " + toBeRemoved.getId() + " From " + toBeScaled.getId()); String cmd = ""; String ip = toBeRemoved.getId(); String uuid = (String) toBeRemoved.getStaticInformation().get("UUID"); RuntimeLogger.logger.info("Removing server with UUID" + uuid); }else{ toBeRemoved = artifact.getAllRelatedNodesOfType(RelationshipType.HOSTED_ON_RELATIONSHIP, NodeType.VIRTUAL_MACHINE).get(0); RuntimeLogger.logger.info("Trying to remove " + toBeRemoved.getId() + " From " + toBeScaled.getId()); String cmd = ""; String ip = toBeRemoved.getId(); String uuid = (String) toBeRemoved.getStaticInformation().get("UUID"); RuntimeLogger.logger.info("Removing server with UUID" + uuid); } } else { toBeRemoved = toBeScaled.getAllRelatedNodesOfType(RelationshipType.HOSTED_ON_RELATIONSHIP, NodeType.VIRTUAL_MACHINE).get(0); RuntimeLogger.logger.info("Trying to remove " + toBeRemoved.getId() + " From " + toBeScaled.getId()); String cmd = ""; String ip = toBeRemoved.getId(); String uuid = (String) toBeRemoved.getStaticInformation().get("UUID"); RuntimeLogger.logger.info("Removing server with UUID" + uuid); } //flexiantActions.removeServer(uuid); try { Thread.sleep(30000); } catch (InterruptedException e) { // TODO Auto-generated catch block RuntimeLogger.logger.info(e.getMessage()); } toBeScaled.removeNode(toBeRemoved); monitoring.refreshServiceStructure(controlledService); } private void scaleInComponent(Node o, String IP) { DependencyGraph graph = new DependencyGraph(); graph.setCloudService(controlledService); Node toBeScaled = graph.getNodeWithID(o.getId()); Node toBeRemoved = graph.getNodeWithID(IP); RuntimeLogger.logger.info("Trying to remove " + toBeRemoved.getId() + " From " + toBeScaled.getId()); String cmd = ""; String ip = IP; String uuid = (String) toBeRemoved.getStaticInformation().get("UUID"); RuntimeLogger.logger.info("Removing server with UUID" + uuid); //flexiantActions.removeServer(uuid); try { Thread.sleep(30000); } catch (InterruptedException e) { // TODO Auto-generated catch block RuntimeLogger.logger.info(e.getMessage()); } toBeScaled.removeNode(toBeRemoved); monitoring.refreshServiceStructure(controlledService); } public Node findControllerForComponent(Node c) { Node res = null; List<Node> componentTopologies = controlledService.getAllRelatedNodesOfType(RelationshipType.COMPOSITION_RELATIONSHIP, NodeType.SERVICE_TOPOLOGY); for (Node componentTopology : componentTopologies) { for (Node topology : componentTopology.getAllRelatedNodesOfType(RelationshipType.COMPOSITION_RELATIONSHIP, NodeType.SERVICE_TOPOLOGY)) { Node master = null; Node slave = null; ArrayList<Node> comps = (ArrayList<Node>) topology.getAllRelatedNodesOfType(RelationshipType.COMPOSITION_RELATIONSHIP); for (Node comp : comps) { if (comp.getAllRelatedNodesOfType(RelationshipType.MASTER_OF) != null) { master = comp; slave = comp.getAllRelatedNodesOfType(RelationshipType.MASTER_OF).get(0); } } if (slave.getId().equalsIgnoreCase(c.getId())) { for (Node component : comps) { if (component.getId().equalsIgnoreCase(master.getId())) { res = component; } } } if (topology.getAllRelatedNodesOfType(RelationshipType.COMPOSITION_RELATIONSHIP, NodeType.SERVICE_TOPOLOGY) != null) { for (Node top : topology.getAllRelatedNodesOfType(RelationshipType.COMPOSITION_RELATIONSHIP, NodeType.SERVICE_TOPOLOGY)) { Node master1 = null; Node slave1 = null; ArrayList<Node> comps1 = (ArrayList<Node>) topology.getAllRelatedNodesOfType(RelationshipType.COMPOSITION_RELATIONSHIP); for (Node comp : comps) { if (comp.getAllRelatedNodesOfType(RelationshipType.MASTER_OF) != null) { master1 = comp; slave1 = comp.getAllRelatedNodesOfType(RelationshipType.MASTER_OF).get(0); } } if (slave1.getId().equalsIgnoreCase(c.getId())) { List<Node> comps2 = top.getAllRelatedNodesOfType(RelationshipType.COMPOSITION_RELATIONSHIP, NodeType.SERVICE_UNIT); for (Node component : comps2) { if (component.getId().equalsIgnoreCase(master1.getId())) { res = component; } } } } } } } return res; } private Node findComponentOfCodeRegion(Node e) { boolean found = false; Node topology = controlledService.getAllRelatedNodesOfType(RelationshipType.COMPOSITION_RELATIONSHIP, NodeType.SERVICE_TOPOLOGY).get(0); List<Node> topologies = new ArrayList<Node>(); topologies.addAll(topology.getAllRelatedNodesOfType(RelationshipType.COMPOSITION_RELATIONSHIP, NodeType.SERVICE_TOPOLOGY)); List<Node> componentsToExplore = new ArrayList<Node>(); if (topology.getAllRelatedNodesOfType(RelationshipType.COMPOSITION_RELATIONSHIP, NodeType.SERVICE_UNIT) != null) { componentsToExplore.addAll(topology.getAllRelatedNodesOfType(RelationshipType.COMPOSITION_RELATIONSHIP, NodeType.SERVICE_UNIT)); } while (!topologies.isEmpty()) { Node currentTopology = topologies.get(0); topologies.remove(0); if (currentTopology.getAllRelatedNodesOfType(RelationshipType.COMPOSITION_RELATIONSHIP, NodeType.SERVICE_TOPOLOGY).size() > 0) { topologies.addAll(currentTopology.getAllRelatedNodesOfType(RelationshipType.COMPOSITION_RELATIONSHIP, NodeType.SERVICE_TOPOLOGY)); } if (currentTopology.getAllRelatedNodesOfType(RelationshipType.COMPOSITION_RELATIONSHIP, NodeType.SERVICE_UNIT).size() > 0) { componentsToExplore.addAll(currentTopology.getAllRelatedNodesOfType(RelationshipType.COMPOSITION_RELATIONSHIP, NodeType.SERVICE_UNIT)); } } while (!componentsToExplore.isEmpty()) { Node component = componentsToExplore.get(0); componentsToExplore.remove(0); for (Node codeRegion : component.getAllRelatedNodesOfType(RelationshipType.COMPOSITION_RELATIONSHIP, NodeType.CODE_REGION)) { if (codeRegion.getId().equalsIgnoreCase(e.getId())) { return component; } } } return null; } private Node findParentNode(String entityID, Node controlledService) { if (controlledService.getId().equalsIgnoreCase(entityID)) { return null; } Node topology = controlledService.getAllRelatedNodesOfType(RelationshipType.COMPOSITION_RELATIONSHIP, NodeType.SERVICE_TOPOLOGY).get(0); if (topology.getId().equalsIgnoreCase(entityID)) { //targetedNode=topology; return controlledService; } for (Node componentTopology : topology.getAllRelatedNodesOfType(RelationshipType.COMPOSITION_RELATIONSHIP, NodeType.SERVICE_TOPOLOGY)) { if (componentTopology.getId().equalsIgnoreCase(entityID)) { //targetedNode=componentTopology; return topology; } for (Node subTopology : componentTopology.getAllRelatedNodesOfType(RelationshipType.COMPOSITION_RELATIONSHIP, NodeType.SERVICE_TOPOLOGY)) { if (subTopology.getId().equalsIgnoreCase(entityID)) { //targetedNode=subTopology; return componentTopology; } for (Node comp : subTopology.getAllRelatedNodesOfType(RelationshipType.COMPOSITION_RELATIONSHIP, NodeType.SERVICE_UNIT)) { if (comp.getId().equalsIgnoreCase(entityID)) { //targetedNode=comp; return subTopology; } } } for (Node comp : componentTopology.getAllRelatedNodesOfType(RelationshipType.COMPOSITION_RELATIONSHIP, NodeType.SERVICE_UNIT)) { if (comp.getId().equalsIgnoreCase(entityID)) { //targetedNode=comp; return componentTopology; } } } return null; } public boolean scaleIn(Node arg0) { RuntimeLogger.logger.info("Scaling in..." + arg0.getId()); if (arg0.getNodeType() == NodeType.CODE_REGION) { scaleIn(findComponentOfCodeRegion(arg0)); } //TODO : enable just ComponentTopology level if (arg0.getNodeType() == NodeType.SERVICE_UNIT) { scaleInComponent(arg0); } if (arg0.getNodeType() == NodeType.SERVICE_TOPOLOGY) { ArrayList<Node> comps = (ArrayList<Node>) arg0.getAllRelatedNodesOfType(RelationshipType.COMPOSITION_RELATIONSHIP); Node master = null; Node slave = null; for (Node comp : comps) { if (comp.getAllRelatedNodesOfType(RelationshipType.MASTER_OF) != null) { master = comp; slave = comp.getAllRelatedNodesOfType(RelationshipType.MASTER_OF).get(0); } } for (Node component : comps) { if (component.getId().equalsIgnoreCase(master.getId())) { master = component; } if (component.getId().equalsIgnoreCase(slave.getId())) { slave = component; } } for (String ip : master.getAssociatedIps()) { if (ip.split("\\.")[0].length() == 2) { //monitoring.enforcingActionStarted("ScaleIn",arg0 ); //flexiantActions.scaleInCluster(master, slave, ip,controlledService); //monitoring.enforcingActionEnded("ScaleIn",arg0 ); break; } //scale in on the number of components of the topology } } return true; } public boolean scaleIn(Node arg0, String IP) { RuntimeLogger.logger.info("Scaling in..." + arg0.getId()); if (arg0.getNodeType() == NodeType.CODE_REGION) { scaleIn(findComponentOfCodeRegion(arg0)); } //TODO : enable just ComponentTopology level if (arg0.getNodeType() == NodeType.SERVICE_UNIT) { scaleInComponent(arg0, IP); } if (arg0.getNodeType() == NodeType.SERVICE_TOPOLOGY) { ArrayList<Node> comps = (ArrayList<Node>) arg0.getAllRelatedNodesOfType(RelationshipType.COMPOSITION_RELATIONSHIP); Node master = null; Node slave = null; for (Node comp : comps) { if (comp.getAllRelatedNodesOfType(RelationshipType.MASTER_OF) != null) { master = comp; slave = comp.getAllRelatedNodesOfType(RelationshipType.MASTER_OF).get(0); } } for (Node component : comps) { if (component.getId().equalsIgnoreCase(master.getId())) { master = component; } if (component.getId().equalsIgnoreCase(slave.getId())) { slave = component; } } for (String ip : master.getAssociatedIps()) { if (ip.split("\\.")[0].length() == 2) { //monitoring.enforcingActionStarted("ScaleIn",arg0 ); //flexiantActions.scaleInCluster(master, slave, ip,controlledService); //monitoring.enforcingActionEnded("ScaleIn",arg0 ); break; } //scale in on the number of components of the topology } } return true; } public List<String> getElasticityCapabilities() { List<String> list = new ArrayList<String>(); list.add("scaleOut"); list.add("scaleIn"); return list; } public List<String> getElasticityCapabilities(Node cloudService) { List<String> list = new ArrayList<String>(); list.add("scaleOut"); list.add("scaleIn"); return list; } public void setControlledService(Node controlledService) { this.controlledService = controlledService; } public Node getControlledService() { // TODO Auto-generated method stub return controlledService; } @Override public void setMonitoringPlugin(MonitoringAPIInterface monitoring) { this.monitoring = monitoring; } @Override public boolean containsElasticityCapability(Node entity, String capability) { for (String cap : getElasticityCapabilities()) { if (cap.equalsIgnoreCase(capability)) { return true; } } return false; } @Override public void undeployService(Node serviceID) { } @Override public boolean scaleOut(Node toBeScaled, double violationDegree) { System.out.println("scaling out "+toBeScaled+" violation degree "+violationDegree); return true; } @Override public boolean scaleIn(Node toBeScaled, double violationDegree) { System.out.println("scaling in "+toBeScaled+" violation degree "+violationDegree); return true; } @Override public boolean enforceAction(Node serviceID, String actionName) { System.out.println("Enforcing action "+actionName); return true; } @Override public void diagonallyScale(Node service, Strategy strategy) { System.out.println("Scalling diagonally "); } }