diff --git a/src/main/java/de/ugoe/cs/rwm/mocci/AbsScaler.java b/src/main/java/de/ugoe/cs/rwm/mocci/AbsScaler.java index 0d14d01bfe76e3ce4d81b9c2214706ebb2f1dc71..46c11a6940d2f93f6c9a703999986d15d9bf483e 100644 --- a/src/main/java/de/ugoe/cs/rwm/mocci/AbsScaler.java +++ b/src/main/java/de/ugoe/cs/rwm/mocci/AbsScaler.java @@ -11,6 +11,8 @@ package de.ugoe.cs.rwm.mocci; import java.nio.file.Path; +import java.util.ArrayList; +import java.util.List; import org.eclipse.cmf.occi.core.impl.OCCIFactoryImpl; import org.eclipse.cmf.occi.infrastructure.impl.InfrastructureFactoryImpl; @@ -21,6 +23,7 @@ import org.modmacao.placement.impl.PlacementFactoryImpl; import de.ugoe.cs.rwm.docci.connector.Connector; import monitoring.impl.MonitoringFactoryImpl; +import ossweruntime.impl.OssweruntimeFactoryImpl; public abstract class AbsScaler { protected InfrastructureFactoryImpl iFactory = new InfrastructureFactoryImpl(); @@ -28,10 +31,21 @@ public abstract class AbsScaler { protected MonitoringFactoryImpl mFactory = new MonitoringFactoryImpl(); protected PlatformFactoryImpl pFactory = new PlatformFactoryImpl(); protected PlacementFactoryImpl placeFactory = new PlacementFactoryImpl(); + protected OssweruntimeFactoryImpl osFactory = new OssweruntimeFactoryImpl(); protected Resource runtimeModel; protected Connector conn; protected Path runtimePath; + static List<String> interfaces = new ArrayList<String>() { + { + add("10.254.1.12"); + add("10.254.1.22"); + add("10.254.1.32"); + add("10.254.1.42"); + add("10.254.1.52"); + } + }; + protected org.eclipse.cmf.occi.core.Resource getResourceById(EList<org.eclipse.cmf.occi.core.Resource> eList, String string) { for(org.eclipse.cmf.occi.core.Resource res: eList ) { diff --git a/src/main/java/de/ugoe/cs/rwm/mocci/DownScaler.java b/src/main/java/de/ugoe/cs/rwm/mocci/DownScaler.java index 0d20cebb47f515e63139fe54ae489979a745a1ea..118c8335508ea06fcd82a66d5c2062ba2a89c35b 100644 --- a/src/main/java/de/ugoe/cs/rwm/mocci/DownScaler.java +++ b/src/main/java/de/ugoe/cs/rwm/mocci/DownScaler.java @@ -11,28 +11,45 @@ package de.ugoe.cs.rwm.mocci; import java.nio.file.Path; +import java.util.List; import org.eclipse.cmf.occi.core.Configuration; import org.eclipse.cmf.occi.core.Link; +import org.eclipse.cmf.occi.core.MixinBase; import org.eclipse.cmf.occi.infrastructure.Compute; +import org.eclipse.cmf.occi.infrastructure.Ipnetworkinterface; +import org.eclipse.cmf.occi.infrastructure.Networkinterface; import org.eclipse.emf.common.util.BasicEList; import org.eclipse.emf.common.util.EList; import org.eclipse.emf.ecore.EObject; +import org.eclipse.emf.ecore.plugin.EcorePlugin; import org.eclipse.emf.ecore.resource.Resource; +import org.eclipse.emf.ecore.resource.ResourceSet; +import org.eclipse.emf.ecore.util.EcoreUtil; +import org.eclipse.epsilon.emc.emf.CachedResourceSet; import org.modmacao.occi.platform.Component; import de.ugoe.cs.rwm.docci.ModelUtility; import de.ugoe.cs.rwm.docci.connector.Connector; +import de.ugoe.cs.rwm.docci.executor.MartExecutor; +import monitoring.Datagatherer; +import monitoring.Dataprocessor; import monitoring.Monitorableproperty; public class DownScaler extends AbsScaler { + private List<Link> linksToDelete; + private List<org.eclipse.cmf.occi.core.Resource> resourcesToDelete; + public DownScaler(Connector conn, Path runtimePath) { this.conn = conn; this.runtimePath = runtimePath; + this.linksToDelete = new BasicEList<Link>(); + this.resourcesToDelete = new BasicEList<org.eclipse.cmf.occi.core.Resource>(); } public Resource downScaleNodes() { + CachedResourceSet.getCache().clear(); EList<EObject> toDelete = new BasicEList<EObject>(); runtimeModel = ModelUtility.loadOCCIintoEMFResource(conn.loadRuntimeModel(runtimePath)); Configuration config = ((Configuration) runtimeModel.getContents().get(0)); @@ -46,8 +63,8 @@ public class DownScaler extends AbsScaler { if(monProp != null && monProp.getMonitoringResult() != null) { if(monProp.getMonitoringResult().equals("None")) { System.out.println(" VM with None CPU utilization found: " + comp.getId()); - toDelete.add(comp); - toDelete.addAll(linksAndComponents(comp)); + addConnectedLinksAndComponents(comp); + resourcesToDelete.add(comp); System.out.println(" Deleting Entities Around: " + comp.getTitle() +" ("+comp.getId()+")"); downScale = true; break; @@ -60,19 +77,41 @@ public class DownScaler extends AbsScaler { if(downScale == false) { System.out.println(" Every Compute busy/Only one worker! Skipping downScale!"); } + + for(Link link: linksToDelete) { + System.out.println("Deleting: " + link); + System.out.println(link); + EcoreUtil.delete(link); + } + + + System.out.println(config.getResources()); + + System.out.println(""); + + + + config.getResources().removeAll(resourcesToDelete); + + for(org.eclipse.cmf.occi.core.Resource res: resourcesToDelete) { + System.out.println(res); + EcoreUtil.delete(res); + } + Resource rM = runtimeModel; + System.out.println(rM); - runtimeModel.getContents().removeAll(toDelete); - return runtimeModel; + System.out.println(""); + System.out.println(config.getResources()); + CachedResourceSet.getCache().clear(); + return rM; } + private Monitorableproperty getAttachedCPUMonProp(Compute comp) { for(Link link: comp.getRlinks()) { - //System.out.println("LINK: " + link); if(link instanceof Monitorableproperty) { Monitorableproperty monProp = (Monitorableproperty) link; - //System.out.println("MonPROP: " + monProp); - //System.out.println("Prop: " + monProp.getMonitoringProperty()); if(monProp.getMonitoringProperty().equals("CPU")) { return monProp; } @@ -81,21 +120,39 @@ public class DownScaler extends AbsScaler { return null; } - private EList<EObject> linksAndComponents(Compute comp) { - EList<EObject> toDelete = new BasicEList<EObject>(); - toDelete.addAll(comp.getLinks()); - toDelete.addAll(comp.getRlinks()); + private void addConnectedLinksAndComponents(Compute comp) { + linksToDelete.addAll(comp.getLinks()); + linksToDelete.addAll(comp.getRlinks()); for(Link link: comp.getRlinks()) { if(link.getSource() instanceof Component) { - toDelete.add(link.getSource()); + System.out.println(link); + resourcesToDelete.add(link.getSource()); + linksToDelete.addAll(link.getSource().getLinks()); + linksToDelete.addAll(link.getSource().getRlinks()); } if(link instanceof Monitorableproperty) { - toDelete.add(link.getSource()); + resourcesToDelete.add(link.getSource()); + } + } + + for(Link link: comp.getLinks()) { + System.out.println(link); + if(link instanceof Networkinterface) { + Networkinterface nwi = (Networkinterface) link; + System.out.println(nwi.getAttributes()); + for(MixinBase mixB: nwi.getParts()) { + if(mixB instanceof Ipnetworkinterface) { + System.out.println(mixB); + Ipnetworkinterface ipnwi = (Ipnetworkinterface) mixB; + if(ipnwi.getOcciNetworkinterfaceAddress().startsWith("100.254.1")) { + interfaces.add(ipnwi.getOcciNetworkinterfaceAddress()); + System.out.println("Addin ip to interface list"); + } + } + } } } - - return toDelete; } } diff --git a/src/main/java/de/ugoe/cs/rwm/mocci/InitialDeployment.java b/src/main/java/de/ugoe/cs/rwm/mocci/InitialDeployment.java index 8a18857553da883cd93188aeeac3d51bea054eb8..da69966882ceb264f0f0689fc6444902d63a2d2e 100644 --- a/src/main/java/de/ugoe/cs/rwm/mocci/InitialDeployment.java +++ b/src/main/java/de/ugoe/cs/rwm/mocci/InitialDeployment.java @@ -24,6 +24,7 @@ import de.ugoe.cs.rwm.docci.MartDeployer; import de.ugoe.cs.rwm.docci.ModelUtility; import de.ugoe.cs.rwm.docci.connector.Connector; import de.ugoe.cs.rwm.docci.connector.LocalhostConnector; +import de.ugoe.cs.rwm.docci.connector.MartConnector; import de.ugoe.cs.rwm.docci.executor.MartExecutor; import de.ugoe.cs.rwm.tocci.Transformator; import de.ugoe.cs.rwm.tocci.TransformatorFactory; @@ -38,6 +39,7 @@ public class InitialDeployment { public static void main (String args[]) { Connector conn = new LocalhostConnector("localhost", 8080, "ubuntu"); + //Connector conn = new MartConnector("192.168.35.45", 8080, "ubuntu", "~/key.pem"); RegistryAndLoggerSetup.setup(); deploy(conn); } diff --git a/src/main/java/de/ugoe/cs/rwm/mocci/MAPE.java b/src/main/java/de/ugoe/cs/rwm/mocci/MAPE.java index 6bf3f352f323cae7fed8b40cfe33515dcfef7081..59fe5b2884c6d86b4150e09a22b05bc0f6f0e0e6 100644 --- a/src/main/java/de/ugoe/cs/rwm/mocci/MAPE.java +++ b/src/main/java/de/ugoe/cs/rwm/mocci/MAPE.java @@ -16,9 +16,11 @@ import org.eclipse.emf.ecore.resource.Resource; import org.json.JSONArray; import de.ugoe.cs.rwm.docci.MartDeployer; +import de.ugoe.cs.rwm.docci.ModelUtility; import de.ugoe.cs.rwm.docci.connector.Connector; import de.ugoe.cs.rwm.docci.connector.LocalhostConnector; import de.ugoe.cs.rwm.docci.executor.MartExecutor; +import org.modmacao.occi.platform.Component; /**Making javadoc happy. * @author erbel @@ -30,6 +32,7 @@ public class MAPE { static MartDeployer deployer = new MartDeployer(conn); static MartExecutor executor = new MartExecutor(conn); static Resource runtimeModel; + static Component newComp; static int interval = 10000; /**Making javadoc happy. @@ -96,6 +99,9 @@ public static void execute(Resource runtimeModel) { System.out.println("Execute: Deploying adjusted Model"); deployer.deploy(runtimeModel); + if(newComp != null) { + executor.executeOperation("POST", newComp, ModelUtility.getAction(newComp, "start")); + } } diff --git a/src/main/java/de/ugoe/cs/rwm/mocci/RegistryAndLoggerSetup.java b/src/main/java/de/ugoe/cs/rwm/mocci/RegistryAndLoggerSetup.java index b284bc94f10645625813587836e5bf2c7770b70a..bc45b7891fd82ab76883845f56f8a781b1e041c1 100644 --- a/src/main/java/de/ugoe/cs/rwm/mocci/RegistryAndLoggerSetup.java +++ b/src/main/java/de/ugoe/cs/rwm/mocci/RegistryAndLoggerSetup.java @@ -50,7 +50,7 @@ public class RegistryAndLoggerSetup { Logger.getLogger(ModelRetriever.class.getName()).setLevel(Level.OFF); Logger.getLogger(Comparator.class.getName()).setLevel(Level.OFF); Logger.getLogger(Provisioner.class.getName()).setLevel(Level.OFF); - Logger.getLogger(Deployer.class.getName()).setLevel(Level.OFF); + Logger.getLogger(Deployer.class.getName()).setLevel(Level.INFO); Logger.getLogger(Deprovisioner.class.getName()).setLevel(Level.OFF); Logger.getLogger(Executor.class.getName()).setLevel(Level.INFO); Logger.getLogger(MartAppDeployerSlave.class.getName()).setLevel(Level.OFF); diff --git a/src/main/java/de/ugoe/cs/rwm/mocci/UpScaler.java b/src/main/java/de/ugoe/cs/rwm/mocci/UpScaler.java index 88ccfc2e24cc14496d8e8d40e4d07802fb8f1ce6..f90b1a6957ccbf4324167b8b56df4ecee9c2cfb0 100644 --- a/src/main/java/de/ugoe/cs/rwm/mocci/UpScaler.java +++ b/src/main/java/de/ugoe/cs/rwm/mocci/UpScaler.java @@ -11,11 +11,16 @@ package de.ugoe.cs.rwm.mocci; import java.nio.file.Path; +import java.util.ArrayList; +import java.util.List; import org.eclipse.cmf.occi.core.AttributeState; import org.eclipse.cmf.occi.core.Configuration; +import org.eclipse.cmf.occi.core.Mixin; +import org.eclipse.cmf.occi.core.MixinBase; import org.eclipse.cmf.occi.infrastructure.Compute; import org.eclipse.cmf.occi.infrastructure.ComputeStatus; +import org.eclipse.cmf.occi.infrastructure.Ipnetworkinterface; import org.eclipse.cmf.occi.infrastructure.Networkinterface; import org.eclipse.emf.ecore.resource.Resource; import org.modmacao.occi.platform.Component; @@ -28,8 +33,10 @@ import de.ugoe.cs.rwm.docci.connector.Connector; import monitoring.Datagatherer; import monitoring.Dataprocessor; import monitoring.Monitorableproperty; +import monitoring.Occiresultprovider; import monitoring.Resultprovider; import monitoring.Sensor; +import ossweruntime.Ubuntu_xenialxerus; public class UpScaler extends AbsScaler { @@ -48,8 +55,8 @@ public class UpScaler extends AbsScaler { Component worker = addWorkerComponent(config, comp); Sensor sens = addSensor(config, comp); Datagatherer dg = addDataGatherer(config, comp, sens); - Dataprocessor dp = addDataProcessor(config, monVM, sens, dg); - Resultprovider rp = addResultProvider(config, monVM, sens, dp); + Dataprocessor dp = addDataProcessor(config, comp, sens, dg); + Resultprovider rp = addResultProvider(config, comp, sens, dp); return runtimeModel; } @@ -57,18 +64,42 @@ public class UpScaler extends AbsScaler { private Compute addCompute(Configuration config) { System.out.println(" Adding Compute Node to Model"); Compute comp = iFactory.createCompute(); - comp.setTitle("hadoop-worker-additional"); comp.setOcciComputeState(ComputeStatus.ACTIVE); + AttributeState attr = factory.createAttributeState(); attr.setName("occi.compute.state"); attr.setValue("active"); comp.getAttributes().add(attr); config.getResources().add(comp); - //executor.executeOperation("PUT", comp, null); + + Ubuntu_xenialxerus mixOs = osFactory.createUbuntu_xenialxerus(); + comp.getParts().add(mixOs); Networkinterface nwi = iFactory.createNetworkinterface(); nwi.setTarget(getResourceById(config.getResources(), "urn:uuid:29d78078-fb4c-47aa-a9af-b8aaf3339591")); nwi.setSource(comp); + Ipnetworkinterface mixB = iFactory.createIpnetworkinterface(); + String ip = interfaces.get(0); + mixB.setOcciNetworkinterfaceAddress(ip); + nwi.getParts().add(mixB); + AttributeState ipAttr = factory.createAttributeState(); + attr.setName("occi.networkinterface.address"); + attr.setValue(ip); + nwi.getAttributes().add(attr); + + String ipadjusted = ip.replace(".", "-"); + comp.setTitle("hadoop-worker-additional-" + ipadjusted); + + AttributeState hostname = factory.createAttributeState(); + attr.setName("occi.compute.hostname"); + attr.setValue("hadoop-worker-additional-" + ipadjusted); + comp.getAttributes().add(hostname); + + + System.out.println(" Ip in Hadoop Network: " + interfaces.get(0)); + interfaces.remove(0); + + Networkinterface nwimon = iFactory.createNetworkinterface(); nwimon.setTarget(getResourceById(config.getResources(), "urn:uuid:7a9fca2c-24fb-473c-aa9c-8dc9e68a432a")); @@ -80,7 +111,7 @@ public class UpScaler extends AbsScaler { System.out.println(" Adding Worker Component to Model"); Component worker = pFactory.createComponent(); worker.setTitle("worker-component"); - worker.setOcciComponentState(Status.ACTIVE); + //worker.setOcciComponentState(Status.ACTIVE); config.getResources().add(worker); AttributeState attr = factory.createAttributeState(); @@ -88,6 +119,10 @@ public class UpScaler extends AbsScaler { attr.setValue(worker.getId()); worker.getAttributes().add(attr); + MixinBase mBase = factory.createMixinBase(); + mBase.setMixin(getMixin("hworker", config)); + worker.getParts().add(mBase); + Placementlink pLink = placeFactory.createPlacementlink(); pLink.setSource(worker); pLink.setTarget(comp); @@ -95,15 +130,15 @@ public class UpScaler extends AbsScaler { Componentlink compLink = pFactory.createComponentlink(); compLink.setSource(getResourceById(config.getResources(), "urn:uuid:a4888ba9-a0ea-48f2-a29e-901c876ab42d")); compLink.setTarget(worker); + MAPE.newComp = worker; return worker; } - + private Sensor addSensor(Configuration config, Compute comp) { System.out.println(" Adding Sensor to Model"); Sensor sens = mFactory.createSensor(); sens.setTitle("CPUSensor"); config.getResources().add(sens); - //executor.executeOperation("PUT", sens, null); AttributeState attr = factory.createAttributeState(); attr.setName("occi.core.id"); @@ -119,7 +154,6 @@ public class UpScaler extends AbsScaler { mp.getAttributes().add(attrProp); mp.setSource(sens); mp.setTarget(comp); - //executor.executeOperation("PUT", mp, null); return sens; } @@ -135,11 +169,13 @@ public class UpScaler extends AbsScaler { attr.setValue(dg.getId()); dg.getAttributes().add(attr); - //executor.executeOperation("PUT", dg, null); + MixinBase mBase = factory.createMixinBase(); + mBase.setMixin(getMixin("cpugatherer", config)); + dg.getParts().add(mBase); + Componentlink c1 = pFactory.createComponentlink(); c1.setSource(sens); c1.setTarget(dg); - //executor.executeOperation("PUT", c1, null); Placementlink pl = placeFactory.createPlacementlink(); pl.setSource(dg); @@ -159,6 +195,10 @@ public class UpScaler extends AbsScaler { attr.setValue(dp.getId()); dp.getAttributes().add(attr); + MixinBase mBase = factory.createMixinBase(); + mBase.setMixin(getMixin("cpuprocessorlocal", config)); + dp.getParts().add(mBase); + Componentlink c2 = pFactory.createComponentlink(); c2.setSource(sens); c2.setTarget(dp); @@ -177,6 +217,19 @@ public class UpScaler extends AbsScaler { rp.setTitle("CPUProvider"); config.getResources().add(rp); + Occiresultprovider orp = mFactory.createOcciresultprovider(); + orp.setResultProviderEndpoint("192.168.35.45:8080"); + AttributeState attrOP = factory.createAttributeState(); + attrOP.setName("result.provider.endpoint"); + attrOP.setValue("192.168.35.45:8080"); + rp.getAttributes().add(attrOP); + + rp.getParts().add(orp); + + MixinBase mBase = factory.createMixinBase(); + mBase.setMixin(getMixin("cpupublisher", config)); + rp.getParts().add(mBase); + AttributeState attr = factory.createAttributeState(); attr.setName("occi.core.id"); attr.setValue(rp.getId()); @@ -196,4 +249,13 @@ public class UpScaler extends AbsScaler { return rp; } + + private Mixin getMixin(String string, Configuration config) { + for(Mixin mix: config.getMixins()) { + if(mix.getTerm().equals(string)) { + return mix; + } + } + return null; + } }