From 51cc3620f3c3785ac49c6bc1dc3c4572ef410568 Mon Sep 17 00:00:00 2001
From: erbel <johannes.erbel@cs.uni-goettingen.de>
Date: Tue, 15 Jan 2019 15:24:11 +0100
Subject: [PATCH] Added Example MAPE loop

---
 .../java/de/ugoe/cs/rwm/mocci/AbsScaler.java  |  34 +++
 .../java/de/ugoe/cs/rwm/mocci/DownScaler.java |  91 +++++++
 src/main/java/de/ugoe/cs/rwm/mocci/MAPE.java  | 229 +++++++-----------
 .../java/de/ugoe/cs/rwm/mocci/MartQuery.java  |  58 +++++
 .../java/de/ugoe/cs/rwm/mocci/Monitor.java    |  39 +++
 .../cs/rwm/mocci/RegistryAndLoggerSetup.java  |   6 +-
 .../java/de/ugoe/cs/rwm/mocci/UpScaler.java   | 189 +++++++++++++++
 7 files changed, 504 insertions(+), 142 deletions(-)
 create mode 100644 src/main/java/de/ugoe/cs/rwm/mocci/AbsScaler.java
 create mode 100644 src/main/java/de/ugoe/cs/rwm/mocci/DownScaler.java
 create mode 100644 src/main/java/de/ugoe/cs/rwm/mocci/MartQuery.java
 create mode 100644 src/main/java/de/ugoe/cs/rwm/mocci/Monitor.java
 create mode 100644 src/main/java/de/ugoe/cs/rwm/mocci/UpScaler.java

diff --git a/src/main/java/de/ugoe/cs/rwm/mocci/AbsScaler.java b/src/main/java/de/ugoe/cs/rwm/mocci/AbsScaler.java
new file mode 100644
index 0000000..c3aa315
--- /dev/null
+++ b/src/main/java/de/ugoe/cs/rwm/mocci/AbsScaler.java
@@ -0,0 +1,34 @@
+package de.ugoe.cs.rwm.mocci;
+
+import java.nio.file.Path;
+
+import org.eclipse.cmf.occi.core.impl.OCCIFactoryImpl;
+import org.eclipse.cmf.occi.infrastructure.impl.InfrastructureFactoryImpl;
+import org.eclipse.emf.common.util.EList;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.modmacao.occi.platform.impl.PlatformFactoryImpl;
+import org.modmacao.placement.impl.PlacementFactoryImpl;
+
+import de.ugoe.cs.rwm.docci.connector.Connector;
+import monitoring.impl.MonitoringFactoryImpl;
+
+public abstract class AbsScaler {
+	protected InfrastructureFactoryImpl iFactory = new InfrastructureFactoryImpl();
+	protected OCCIFactoryImpl factory = new OCCIFactoryImpl();
+	protected MonitoringFactoryImpl mFactory = new MonitoringFactoryImpl();
+	protected PlatformFactoryImpl pFactory = new PlatformFactoryImpl();
+	protected PlacementFactoryImpl placeFactory = new PlacementFactoryImpl();
+	protected Resource runtimeModel;
+	protected Connector conn;
+	protected Path runtimePath;
+	
+	
+	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 ) {
+			if(res.getId().equals(string)) {
+				return res;
+			}
+		}
+		return null;
+	}
+}
diff --git a/src/main/java/de/ugoe/cs/rwm/mocci/DownScaler.java b/src/main/java/de/ugoe/cs/rwm/mocci/DownScaler.java
new file mode 100644
index 0000000..34db999
--- /dev/null
+++ b/src/main/java/de/ugoe/cs/rwm/mocci/DownScaler.java
@@ -0,0 +1,91 @@
+package de.ugoe.cs.rwm.mocci;
+
+import java.nio.file.Path;
+
+import org.eclipse.cmf.occi.core.Configuration;
+import org.eclipse.cmf.occi.core.Link;
+import org.eclipse.cmf.occi.infrastructure.Compute;
+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.resource.Resource;
+import org.modmacao.occi.platform.Component;
+
+import de.ugoe.cs.rwm.docci.ModelUtility;
+import de.ugoe.cs.rwm.docci.connector.Connector;
+import monitoring.Monitorableproperty;
+
+public class DownScaler extends AbsScaler {
+
+	public DownScaler(Connector conn, Path runtimePath) {
+		this.conn = conn; 
+		this.runtimePath = runtimePath;
+	}
+	
+	public Resource downScaleNodes() {
+		EList<EObject> toDelete = new BasicEList<EObject>();
+		runtimeModel = ModelUtility.loadOCCIintoEMFResource(conn.loadRuntimeModel(runtimePath));
+		Configuration config = ((Configuration) runtimeModel.getContents().get(0));
+		boolean downScale = false;
+		
+		for(org.eclipse.cmf.occi.core.Resource res : config.getResources()) {
+			if(res instanceof Compute) {
+				Compute comp = (Compute) res;
+				if(comp.getTitle().contains("hadoop-worker-additional")) {
+					Monitorableproperty monProp = getAttachedCPUMonProp(comp);
+					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));
+							System.out.println("      Deleting Entities Around: " + comp.getTitle() +" ("+comp.getId()+")");
+							downScale = true;
+							break;
+						}
+					}
+				}			
+			}
+		}
+		
+		if(downScale == false) {
+			System.out.println("      Every Compute busy/Only one worker! Skipping downScale!");
+		}
+		
+		runtimeModel.getContents().removeAll(toDelete);
+		return runtimeModel;
+		
+	}
+
+	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;
+				}
+			}
+		}
+		return null;
+	}
+
+	private EList<EObject> linksAndComponents(Compute comp) {
+		EList<EObject> toDelete = new BasicEList<EObject>();
+		toDelete.addAll(comp.getLinks());
+		toDelete.addAll(comp.getRlinks());
+		
+		for(Link link: comp.getRlinks()) {
+			if(link.getSource() instanceof Component) {
+				toDelete.add(link.getSource());
+			}
+			if(link instanceof Monitorableproperty) {
+				toDelete.add(link.getSource());
+			}
+		}
+
+		return toDelete;
+	}
+
+}
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 32accb4..c66df9e 100644
--- a/src/main/java/de/ugoe/cs/rwm/mocci/MAPE.java
+++ b/src/main/java/de/ugoe/cs/rwm/mocci/MAPE.java
@@ -9,15 +9,21 @@ import org.eclipse.cmf.occi.core.Link;
 import org.eclipse.cmf.occi.core.impl.OCCIFactoryImpl;
 import org.eclipse.cmf.occi.infrastructure.Compute;
 import org.eclipse.cmf.occi.infrastructure.ComputeStatus;
+import org.eclipse.cmf.occi.infrastructure.Networkinterface;
 import org.eclipse.cmf.occi.infrastructure.impl.InfrastructureFactoryImpl;
 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.resource.Resource;
+import org.eclipse.epsilon.emc.emf.CachedResourceSet;
+import org.json.JSONArray;
 import org.modmacao.occi.platform.Component;
 import org.modmacao.occi.platform.Componentlink;
 import org.modmacao.occi.platform.PlatformPackage;
+import org.modmacao.occi.platform.Status;
 import org.modmacao.occi.platform.impl.PlatformFactoryImpl;
+import org.modmacao.placement.Placementlink;
+import org.modmacao.placement.impl.PlacementFactoryImpl;
 
 import de.ugoe.cs.rwm.docci.MartDeployer;
 import de.ugoe.cs.rwm.docci.ModelUtility;
@@ -46,35 +52,28 @@ public class MAPE {
 	protected static final Path RUNTIMEPATH = Paths.get(System.getProperty("user.home") + "/.rwm/runtime.occic");
 	static Connector conn = new LocalhostConnector("localhost", 8080, "ubuntu");
 	static MartDeployer deployer = new MartDeployer(conn);
-	static MartExecutor executor = new MartExecutor(conn);
-	static InfrastructureFactoryImpl iFactory = new InfrastructureFactoryImpl();
-	static OCCIFactoryImpl factory = new OCCIFactoryImpl();
-	static MonitoringFactoryImpl mFactory = new MonitoringFactoryImpl();
-	static PlatformFactoryImpl pFactory = new PlatformFactoryImpl();
+	static MartQuery executor = new MartQuery(conn);
 	static Resource runtimeModel;
+	static int interval;
 	
 	/**Making javadoc happy.
 	 * @param args Making javadoc happy.
 	 */
 	public static void main(String[] args) {
+		System.out.println("Starting MAPE loop");
 		RegistryAndLoggerSetup.setup();
+		interval=10000;
 		
-		String query = "/monitorableproperty?attribute=monitoring.result&value=Critical";
 		initialDeploy();
-		String monitor ="";
-		String analysis ="";
-		
-		
-		
-		
 		while(true) {
 			try {
-				monitor = monitor(query);
-				analysis = analyze(monitor);
+				System.out.println("\n--------------------Waiting for new Cycle: Sleeping " + interval +"--------------------");
+				Thread.sleep(interval);
+				
+				Monitor monitor = monitor();
+				String analysis = analyze(monitor);
 				runtimeModel = plan(analysis);
 				execute(runtimeModel);
-				System.out.println("Sleep 10000");
-				Thread.sleep(10000);
 			} catch (InterruptedException e) {
 				e.printStackTrace();
 			}
@@ -82,152 +81,55 @@ public class MAPE {
 		}
 	}
 
-private static String monitor(String query) {
-		MartExecutor exec = new MartExecutor(conn);
-		String result = exec.executeGetOperation(query);
-		System.out.println("Monitor: " + result);
-		return exec.executeGetOperation(query);
+private static Monitor monitor() {
+		int critCPUs = getNumberOfCriticalCPUs();
+		int noneCPUs = getNumberOfNoneCPUs();
+		int allCPUs = getNumberOfAllCPUs();
+		Monitor mon = new Monitor(critCPUs, noneCPUs, allCPUs);
+		System.out.println("Monitor: " + "Monitored CPUs: " + allCPUs + "| Critical CPUs: "+ critCPUs + "| None CPUs: " + noneCPUs);
+		return mon;
 }
 	
-private static String analyze(String monitor) {
+
+private static String analyze(Monitor monitor) {
+	int noneCPUs = monitor.getNoneCPUs();
+	int critCPUs = monitor.getCritCPUs();
+	int allCPUs = monitor.getAllCPUs();
 	
-	if(monitor.contains("/compute/")){
-		System.out.println("Analyze: Critical Compute Detected");
+	if(noneCPUs == 0 && critCPUs > allCPUs/2 && allCPUs <= 6){
+		System.out.println("Analyze: Critical State Detected");
 		return "upScale";
-	}
-	else {
-		System.out.println("Analyze: No Critical Compute Detected");
+	} else {
+		System.out.println("Analyze: Non Critical State Detected");
 		return "downScale";
 	}		
 }
 	
 private static Resource plan(String analysis) {
-	System.out.println("Planning:");
 	switch (analysis) {
-		case "upScale": 	System.out.println("upScale!");
-							return upScaleNodes();
-		case "downScale": 	System.out.println("downScale!");	
-							return downScaleNodes();
+		case "upScale": 	System.out.println("Plan: upScale!");
+							UpScaler upscaler = new UpScaler(conn, RUNTIMEPATH);
+							return upscaler.upScaleNodes();
+		case "downScale": 	System.out.println("Plan: downScale!");
+							DownScaler downscaler = new DownScaler(conn, RUNTIMEPATH);
+							return downscaler.downScaleNodes();
 	}
 	return null;
 }
 
 
 private static void execute(Resource runtimeModel) {
+		System.out.println("Execute: Deploying adjusted Model");
 		deployer.deploy(runtimeModel);
 		
 	}
 
-
-
-
-
-private static Resource downScaleNodes() {
-	EList<EObject> toDelete = new BasicEList<EObject>();
-	
-	runtimeModel = ModelUtility.loadOCCIintoEMFResource(conn.loadRuntimeModel(RUNTIMEPATH));
-	System.out.println(((Configuration) runtimeModel.getContents().get(0)).getResources());
-		for(org.eclipse.cmf.occi.core.Resource res : ((Configuration) runtimeModel.getContents().get(0)).getResources()) {
-			if(res instanceof Compute) {
-				Compute comp = (Compute) res;
-				if(comp.getTitle().contains("worker-additional")) {
-					toDelete.add(comp);
-					toDelete.addAll(linksAndComponents(comp));
-					break;
-					
-				}
-				
-			}
-		
-	}
-	System.out.println(((Configuration) runtimeModel.getContents().get(0)).getResources());
-	runtimeModel.getContents().removeAll(toDelete);
-	System.out.println("Deleting Compute:" + toDelete);
-	System.out.println(((Configuration) runtimeModel.getContents().get(0)).getResources());
-	return runtimeModel;
-	
-}
-
-private static EList<EObject> linksAndComponents(Compute comp) {
-	EList<EObject> toDelete = new BasicEList<EObject>();
-	toDelete.addAll(comp.getLinks());
-	toDelete.addAll(comp.getRlinks());
-	
-	for(Link link: comp.getRlinks()) {
-		if(link.getSource() instanceof Component) {
-			toDelete.add(link.getSource());
-		}
-		if(link instanceof Monitorableproperty) {
-			toDelete.add(link.getSource());
-		}
-	}
-
-	return toDelete;
-}
-
-private static Resource upScaleNodes() {
-	runtimeModel = ModelUtility.loadOCCIintoEMFResource(conn.loadRuntimeModel(RUNTIMEPATH));
-	Configuration config = ((Configuration) runtimeModel.getContents().get(0));
-
-	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);
-	((Configuration) runtimeModel.getContents().get(0)).getResources().add(comp);
-	System.out.println("Compute Node added");
-	//executor.executeOperation("PUT", comp, null);
-	
-	Sensor sens = mFactory.createSensor();
-	sens.setTitle("CPUSensor");
-	config.getResources().add(sens);
-	//executor.executeOperation("PUT", sens, null);
-	
-	Monitorableproperty mp = mFactory.createMonitorableproperty();
-	mp.setTitle("monProp");
-	mp.setMonitoringProperty("CPU");
-	mp.setSource(sens);
-	mp.setTarget(comp);
-	//executor.executeOperation("PUT", mp, null);
-	
-	Datagatherer dg = mFactory.createDatagatherer();
-	dg.setTitle("CPUGatherer");
-	config.getResources().add(dg);
-	executor.executeOperation("PUT", dg, null);
-	Componentlink c1 = pFactory.createComponentlink();
-	c1.setSource(sens);
-	c1.setTarget(dg);
-	//executor.executeOperation("PUT", c1, null);
-	
-	Dataprocessor dp = mFactory.createDataprocessor();
-	dp.setTitle("CPUProcessor");
-	config.getResources().add(dp);
-	//executor.executeOperation("PUT", dp, null);
-	Componentlink c2 = pFactory.createComponentlink();
-	c2.setSource(sens);
-	c2.setTarget(dp);
-	//executor.executeOperation("PUT", c2, null);
-	
-	Resultprovider rp = mFactory.createResultprovider();
-	rp.setTitle("CPUProvider");
-	config.getResources().add(rp);
-	//executor.executeOperation("PUT", rp, null);
-	Componentlink c3 = pFactory.createComponentlink();
-	c3.setSource(sens);
-	c3.setTarget(rp);
-	//executor.executeOperation("PUT", c3, null);
-	
-	return runtimeModel;		
-	}
-
-
+ 
 public static void initialDeploy() {
+	System.out.println("Initial Deployment");
 	Path occiPath = Paths.get(ModelUtility.getPathToResource("occi/hadoopClusterNewExtWithMem.occic"));
 	Resource model = ModelUtility.loadOCCIintoEMFResource(occiPath);
 	
-	System.out.println("OCCI2OCCITransformator");
 	Transformator trans = TransformatorFactory.getTransformator("OCCI2OCCI");
 	trans.transform(model, occiPath);
 	
@@ -235,12 +137,57 @@ public static void initialDeploy() {
 	trans2.setTransformationProperties(manNWRuntimeId, sshKey, userData, manNWid);
 	
 	trans2.transform(occiPath, occiPath);
-	
-
+	deployer.deploy(occiPath);
+	executor.executeGetOperation("/resultprovider");
+}
 
+private static int getNumberOfNoneCPUs() {
+	String query = "/monitorableproperty?attribute=monitoring.result&value=None";
+	String result = executor.executeGetOperation(query);
+	if(result.equals("{ }") == false) {
+		String substring = result.substring(result.indexOf("["), (result.lastIndexOf("]")+1));
+		JSONArray arr = new JSONArray(substring);
+		if(arr.length() == 0) {
+			return 1;
+		} else {
+			return arr.length();
+		}
+	} else {
+		return 0;
+	}
+	
+}
 
-	deployer.deploy(occiPath);
+private static int getNumberOfCriticalCPUs() {
+	String query = "/monitorableproperty?attribute=monitoring.result&value=Critical";
+	String result = executor.executeGetOperation(query);
+	if(result.equals("{ }") == false) {
+		String substring = result.substring(result.indexOf("["), (result.lastIndexOf("]")+1));
+		JSONArray arr = new JSONArray(substring);
+		if(arr.length() == 0) {
+			return 1;
+		} else {
+			return arr.length();
+		}
+	} else {
+		return 0;
+	}	
 }
 
+private static int getNumberOfAllCPUs() {
+	String query = "/monitorableproperty?attribute=monitoring.property&value=CPU";
+	String result = executor.executeGetOperation(query);
+	if(result.equals("{ }") == false) {
+		String substring = result.substring(result.indexOf("["), (result.lastIndexOf("]")+1));
+		JSONArray arr = new JSONArray(substring);
+		if(arr.length() == 0) {
+			return 1;
+		} else {
+			return arr.length();
+		}
+	} else {
+		return 0;
+	}	
+}
 
 }
\ No newline at end of file
diff --git a/src/main/java/de/ugoe/cs/rwm/mocci/MartQuery.java b/src/main/java/de/ugoe/cs/rwm/mocci/MartQuery.java
new file mode 100644
index 0000000..8ae31fe
--- /dev/null
+++ b/src/main/java/de/ugoe/cs/rwm/mocci/MartQuery.java
@@ -0,0 +1,58 @@
+package de.ugoe.cs.rwm.mocci;
+
+import java.net.HttpURLConnection;
+
+import org.eclipse.cmf.occi.core.Action;
+import org.eclipse.cmf.occi.core.AttributeState;
+import org.eclipse.cmf.occi.core.Entity;
+import org.eclipse.cmf.occi.core.Link;
+import org.eclipse.cmf.occi.core.Mixin;
+import org.eclipse.cmf.occi.core.MixinBase;
+import org.eclipse.emf.ecore.EObject;
+
+import de.ugoe.cs.rwm.docci.connector.Connector;
+import de.ugoe.cs.rwm.docci.executor.AbsExecutor;
+import de.ugoe.cs.rwm.docci.executor.MartExecutor;
+
+/**
+ * Handles execution of OCCI Model Elements.
+ *
+ * @author erbel
+ *
+ */
+public class MartQuery extends MartExecutor {
+
+	/**
+	 * Creates an Executor to the OCCI API of the specified connection. Sets
+	 * maxTries to 3.
+	 *
+	 * @param conn
+	 */
+	public MartQuery(Connector conn) {
+		super(conn);
+	}
+
+	/**
+	 * Creates Executor to the OCCI API of the specified connection. maxTries is
+	 * hereby the maximum amount of retries for a request. Should be at least 2 to
+	 * handle connection issues.
+	 *
+	 * @param conn
+	 * @param maxTries
+	 */
+	public MartQuery(Connector conn, int maxTries) {
+		super(conn, maxTries);
+	}
+
+
+	
+	public String executeGetOperation(String query) {
+		String adaptedAddress = "http://" + connector.getAddress() + ":" + connector.getPort() + query;
+		HttpURLConnection conn = establishConnection(adaptedAddress, null, false, null);
+		conn.setRequestProperty("Accept", "application/json");
+
+		//System.out.println("GET" + " " + adaptedAddress);
+
+		return getOutput(conn);
+	}
+}
diff --git a/src/main/java/de/ugoe/cs/rwm/mocci/Monitor.java b/src/main/java/de/ugoe/cs/rwm/mocci/Monitor.java
new file mode 100644
index 0000000..7d7544c
--- /dev/null
+++ b/src/main/java/de/ugoe/cs/rwm/mocci/Monitor.java
@@ -0,0 +1,39 @@
+package de.ugoe.cs.rwm.mocci;
+
+public class Monitor {
+	private int critCPUs;
+	private int noneCPUs;
+	private int allCPUs;
+	
+	public int getAllCPUs() {
+		return allCPUs;
+	}
+
+	public void setAllCPUs(int allCPUs) {
+		this.allCPUs = allCPUs;
+	}
+
+	public Monitor(int critCPUs, int noneCPUs, int allCPUs) {
+		this.critCPUs = critCPUs;
+		this.noneCPUs = noneCPUs;
+		this.allCPUs = allCPUs;
+	}
+
+	public int getCritCPUs() {
+		return critCPUs;
+	}
+
+	public void setCritCPUs(int critCPUs) {
+		this.critCPUs = critCPUs;
+	}
+
+	public int getNoneCPUs() {
+		return noneCPUs;
+	}
+
+	public void setNoneCPUs(int noneCPUs) {
+		this.noneCPUs = noneCPUs;
+	}
+	
+	
+}
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 fc0579a..2e06587 100644
--- a/src/main/java/de/ugoe/cs/rwm/mocci/RegistryAndLoggerSetup.java
+++ b/src/main/java/de/ugoe/cs/rwm/mocci/RegistryAndLoggerSetup.java
@@ -11,7 +11,9 @@ import org.modmacao.placement.PlacementPackage;
 
 import de.ugoe.cs.rwm.cocci.Comparator;
 import de.ugoe.cs.rwm.docci.Deployer;
+import de.ugoe.cs.rwm.docci.appdeployer.MartAppDeployerSlave;
 import de.ugoe.cs.rwm.docci.connector.Connector;
+import de.ugoe.cs.rwm.docci.deprovisioner.Deprovisioner;
 import de.ugoe.cs.rwm.docci.executor.Executor;
 import de.ugoe.cs.rwm.docci.provisioner.Provisioner;
 import de.ugoe.cs.rwm.docci.retriever.ModelRetriever;
@@ -35,9 +37,11 @@ public class RegistryAndLoggerSetup {
 		Logger.getLogger(Connector.class.getName()).setLevel(Level.OFF);
 		Logger.getLogger(ModelRetriever.class.getName()).setLevel(Level.OFF);
 		Logger.getLogger(Comparator.class.getName()).setLevel(Level.OFF);
-		Logger.getLogger(Provisioner.class.getName()).setLevel(Level.INFO);
+		Logger.getLogger(Provisioner.class.getName()).setLevel(Level.OFF);
 		Logger.getLogger(Deployer.class.getName()).setLevel(Level.OFF);
+		Logger.getLogger(Deprovisioner.class.getName()).setLevel(Level.OFF);
 		Logger.getLogger(Executor.class.getName()).setLevel(Level.OFF);
+		Logger.getLogger(MartAppDeployerSlave.class.getName()).setLevel(Level.OFF);
 	}
 	
 	private static void registrySetup() {
diff --git a/src/main/java/de/ugoe/cs/rwm/mocci/UpScaler.java b/src/main/java/de/ugoe/cs/rwm/mocci/UpScaler.java
new file mode 100644
index 0000000..a71e26b
--- /dev/null
+++ b/src/main/java/de/ugoe/cs/rwm/mocci/UpScaler.java
@@ -0,0 +1,189 @@
+package de.ugoe.cs.rwm.mocci;
+
+import java.nio.file.Path;
+
+import org.eclipse.cmf.occi.core.AttributeState;
+import org.eclipse.cmf.occi.core.Configuration;
+import org.eclipse.cmf.occi.infrastructure.Compute;
+import org.eclipse.cmf.occi.infrastructure.ComputeStatus;
+import org.eclipse.cmf.occi.infrastructure.Networkinterface;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.modmacao.occi.platform.Component;
+import org.modmacao.occi.platform.Componentlink;
+import org.modmacao.occi.platform.Status;
+import org.modmacao.placement.Placementlink;
+
+import de.ugoe.cs.rwm.docci.ModelUtility;
+import de.ugoe.cs.rwm.docci.connector.Connector;
+import monitoring.Datagatherer;
+import monitoring.Dataprocessor;
+import monitoring.Monitorableproperty;
+import monitoring.Resultprovider;
+import monitoring.Sensor;
+
+public class UpScaler extends AbsScaler {	
+	
+	public UpScaler(Connector conn, Path runtimePath) {
+		this.conn = conn;
+		this.runtimePath = runtimePath;
+	}
+	
+	@SuppressWarnings("unused")
+	public Resource upScaleNodes() {
+		runtimeModel = ModelUtility.loadOCCIintoEMFResource(conn.loadRuntimeModel(runtimePath));
+		Configuration config = ((Configuration) runtimeModel.getContents().get(0));
+		Compute monVM = (Compute) getResourceById(config.getResources(), "urn:uuid:37829092-c690-494a-98fa-335b2fd660ea");
+
+		Compute comp 		= 	addCompute(config);
+		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);
+		
+		return runtimeModel;		
+		}
+	
+	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);
+		
+		Networkinterface nwi = iFactory.createNetworkinterface();
+		nwi.setTarget(getResourceById(config.getResources(), "urn:uuid:29d78078-fb4c-47aa-a9af-b8aaf3339591"));
+		nwi.setSource(comp);
+		
+		Networkinterface nwimon = iFactory.createNetworkinterface();
+		nwimon.setTarget(getResourceById(config.getResources(), "urn:uuid:7a9fca2c-24fb-473c-aa9c-8dc9e68a432a"));
+		nwimon.setSource(comp);
+		return comp;
+	}
+	
+	private Component addWorkerComponent(Configuration config, Compute comp) {
+		System.out.println("Adding Worker Component to Model");
+		Component worker = pFactory.createComponent();
+		worker.setTitle("worker-component");
+		worker.setOcciComponentState(Status.ACTIVE);
+		config.getResources().add(worker);
+		
+		AttributeState attr = factory.createAttributeState();
+		attr.setName("occi.core.id");
+		attr.setValue(worker.getId());
+		worker.getAttributes().add(attr);
+		
+		Placementlink pLink = placeFactory.createPlacementlink();
+		pLink.setSource(worker);
+		pLink.setTarget(comp);
+		
+		Componentlink compLink = pFactory.createComponentlink();
+		compLink.setSource(getResourceById(config.getResources(), "urn:uuid:a4888ba9-a0ea-48f2-a29e-901c876ab42d"));
+		compLink.setTarget(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");
+		attr.setValue(sens.getId());
+		sens.getAttributes().add(attr);
+		
+		Monitorableproperty mp = mFactory.createMonitorableproperty();
+		mp.setTitle("monProp");
+		mp.setMonitoringProperty("CPU");
+		AttributeState attrProp = factory.createAttributeState();
+		attrProp.setName("monitoring.property");
+		attrProp.setValue("CPU");
+		mp.getAttributes().add(attrProp);
+		mp.setSource(sens);
+		mp.setTarget(comp);
+		//executor.executeOperation("PUT", mp, null);
+		
+		return sens;
+	}
+	
+	private Datagatherer addDataGatherer(Configuration config, Compute comp, Sensor sens) {
+		System.out.println("    Adding Datagatherer to Model");
+		Datagatherer dg = mFactory.createDatagatherer();
+		dg.setTitle("CPUGatherer");
+		config.getResources().add(dg);
+		
+		AttributeState attr = factory.createAttributeState();
+		attr.setName("occi.core.id");
+		attr.setValue(dg.getId());
+		dg.getAttributes().add(attr);
+		
+		//executor.executeOperation("PUT", dg, null);
+		Componentlink c1 = pFactory.createComponentlink();
+		c1.setSource(sens);
+		c1.setTarget(dg);
+		//executor.executeOperation("PUT", c1, null);
+		
+		Placementlink pl = placeFactory.createPlacementlink();
+		pl.setSource(dg);
+		pl.setTarget(comp);
+		
+		return dg;
+	}
+
+	private Dataprocessor addDataProcessor(Configuration config, Compute comp, Sensor sens, Datagatherer dg) {
+		System.out.println("    Adding Dataprocessor to Model");
+		Dataprocessor dp = mFactory.createDataprocessor();
+		dp.setTitle("CPUProcessor");
+		config.getResources().add(dp);
+		
+		AttributeState attr = factory.createAttributeState();
+		attr.setName("occi.core.id");
+		attr.setValue(dp.getId());
+		dp.getAttributes().add(attr);
+		
+		Componentlink c2 = pFactory.createComponentlink();
+		c2.setSource(sens);
+		c2.setTarget(dp);
+		Placementlink pl = placeFactory.createPlacementlink();
+		pl.setSource(dp);
+		pl.setTarget(comp);
+		Componentlink cl = pFactory.createComponentlink();
+		cl.setSource(dp);
+		cl.setTarget(dg);
+		return dp;
+	}
+
+	private Resultprovider addResultProvider(Configuration config, Compute comp, Sensor sens, Dataprocessor dp) {
+		System.out.println("    Adding Resultprovider to Model");
+		Resultprovider rp = mFactory.createResultprovider();
+		rp.setTitle("CPUProvider");
+		config.getResources().add(rp);
+		
+		AttributeState attr = factory.createAttributeState();
+		attr.setName("occi.core.id");
+		attr.setValue(rp.getId());
+		rp.getAttributes().add(attr);
+		
+		Componentlink c3 = pFactory.createComponentlink();
+		c3.setSource(sens);
+		c3.setTarget(rp);
+		
+		Placementlink pl = placeFactory.createPlacementlink();
+		pl.setSource(rp);
+		pl.setTarget(comp);
+		
+		Componentlink cl = pFactory.createComponentlink();
+		cl.setSource(rp);
+		cl.setTarget(dp);
+		
+		return rp;
+	}
+}
-- 
GitLab