package org.cloudbus.cloudsim.examples.container;
import org.cloudbus.cloudsim.Log;
import org.cloudbus.cloudsim.container.containerPlacementPolicies.*;
import org.cloudbus.cloudsim.container.containerSelectionPolicies.PowerContainerSelectionPolicy;
import org.cloudbus.cloudsim.container.containerSelectionPolicies.PowerContainerSelectionPolicyCor;
import org.cloudbus.cloudsim.container.containerSelectionPolicies.PowerContainerSelectionPolicyMaximumUsage;
import org.cloudbus.cloudsim.container.core.*;
import org.cloudbus.cloudsim.container.hostSelectionPolicies.*;
import org.cloudbus.cloudsim.container.resourceAllocatorMigrationEnabled.PowerContainerVmAllocationPolicyMigrationAbstractHostSelection;
import org.cloudbus.cloudsim.container.resourceAllocatorMigrationEnabled.PowerContainerVmAllocationPolicyMigrationStaticThresholdMC;
import org.cloudbus.cloudsim.container.resourceAllocatorMigrationEnabled.PowerContainerVmAllocationPolicyMigrationStaticThresholdMCUnderUtilized;
import org.cloudbus.cloudsim.container.resourceAllocators.ContainerAllocationPolicy;
import org.cloudbus.cloudsim.container.resourceAllocators.ContainerAllocationPolicyRS;
import org.cloudbus.cloudsim.container.resourceAllocators.ContainerVmAllocationPolicy;
import org.cloudbus.cloudsim.container.resourceAllocators.PowerContainerAllocationPolicySimple;
import org.cloudbus.cloudsim.container.vmSelectionPolicies.PowerContainerVmSelectionPolicy;
import org.cloudbus.cloudsim.container.vmSelectionPolicies.PowerContainerVmSelectionPolicyMaximumCorrelation;
import org.cloudbus.cloudsim.container.vmSelectionPolicies.PowerContainerVmSelectionPolicyMaximumUsage;
import org.cloudbus.cloudsim.core.CloudSim;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.List;
/**
* The RunnerAbs Class is the modified version of {@link org.cloudbus.cloudsim.examples.power.RunnerAbstract}
* Created by sareh on 18/08/15.
*/
public abstract class RunnerAbs {
private static boolean enableOutput;
protected static ContainerDatacenterBroker broker;
/**
* The vm list.
*/
protected static List<ContainerVm> vmList;
/**
* The container list.
*/
protected static List<Container> containerList;
/**
* The host list.
*/
protected static List<ContainerHost> hostList;
/**
* The Cloudlet List
*/
protected static List<ContainerCloudlet> cloudletList;
/**
* The overBooking Factor for containers
*/
private double overBookingFactor;
private String experimentName;
private String logAddress;
private String runTime;
public RunnerAbs(boolean enableOutput, boolean outputToFile, String inputFolder, String outputFolder, String vmAllocationPolicy, String containerAllocationPolicy, String vmSelectionPolicy, String containerSelectionPolicy, String hostSelectionPolicy, double overBookingFactor, String runTime, String logAddress) {
setOverBookingFactor(overBookingFactor);
setRunTime(runTime);
setLogAddress(logAddress);
setExperimentName(this.getExperimentName(hostSelectionPolicy, vmAllocationPolicy, vmSelectionPolicy, containerSelectionPolicy, containerAllocationPolicy, String.valueOf(getOverBookingFactor()), runTime));
try {
this.initLogOutput(enableOutput, outputToFile, outputFolder, vmAllocationPolicy, vmSelectionPolicy, containerSelectionPolicy, hostSelectionPolicy);
} catch (Exception var10) {
var10.printStackTrace();
System.exit(0);
}
this.init(inputFolder + "/", getOverBookingFactor());
this.start(getExperimentName(), outputFolder, this.getVmAllocationPolicy(vmAllocationPolicy, vmSelectionPolicy, containerSelectionPolicy, hostSelectionPolicy), getContainerAllocationPolicy(containerAllocationPolicy));
}
public String getLogAddress() {
return logAddress;
}
public void setLogAddress(String logAddress) {
this.logAddress = logAddress;
}
public String getRunTime() {
return runTime;
}
public void setRunTime(String runTime) {
this.runTime = runTime;
}
protected void initLogOutput(boolean enableOutput, boolean outputToFile, String outputFolder, String vmAllocationPolicy, String vmSelectionPolicy, String containerSelectionPolicy, String hostSelectionPolicy) throws IOException, FileNotFoundException {
this.setEnableOutput(enableOutput);
Log.setDisabled(!this.isEnableOutput());
// OutputStream out = new FileOutputStream("/home/sareh/Dropbox/programming/Results/log.txt");
//OutputStream out = new BufferedOutputStream(new FileOutputStream("/home/sareh/Dropbox/programming/Results/log1.txt"), 100000);
// Log.setOutput(out);
if (this.isEnableOutput() && outputToFile) {
int index = getExperimentName().lastIndexOf("_");
// File folder1 = new File(outputFolder + "/stats/"+getExperimentName().substring(0, index));
File folder = new File(outputFolder);
File parent = folder.getParentFile();
if (!parent.exists() && !parent.mkdirs()) {
throw new IllegalStateException("Couldn't create dir: " + parent);
}
if (!folder.exists()) {
folder.mkdir();
}
File folder2 = new File(outputFolder + "/log/" + getExperimentName().substring(0, index));
File parent2 = folder2.getParentFile();
if (!parent2.exists() && !parent2.mkdirs()) {
throw new IllegalStateException("Couldn't create dir: " + parent2);
}
if (!folder2.exists()) {
folder2.mkdir();
}
File folder3 = new File(outputFolder + "/ContainerMigration/" + getExperimentName().substring(0, index));
File parent3 = folder3.getParentFile();
if (!parent3.exists() && !parent3.mkdirs()) {
throw new IllegalStateException("Couldn't create dir: " + parent3);
}
if (!folder3.exists()) {
folder3.mkdir();
}
File folder4 = new File(outputFolder + "/NewlyCreatedVms/" + getExperimentName().substring(0, index));
File parent4 = folder4.getParentFile();
if (!parent4.exists() && !parent4.mkdirs()) {
throw new IllegalStateException("Couldn't create dir: " + parent4);
}
if (!folder4.exists()) {
folder4.mkdir();
}
File folder5 = new File(outputFolder + "/EnergyConsumption/" + getExperimentName().substring(0, index));
File parent5 = folder5.getParentFile();
if (!parent5.exists() && !parent5.mkdirs()) {
throw new IllegalStateException("Couldn't create dir: " + parent5);
}
if (!folder5.exists()) {
folder5.mkdir();
}
File file = new File(outputFolder + "/log/" + getExperimentName().substring(0, index) + "/" + this.getExperimentName(new String[]{hostSelectionPolicy, vmAllocationPolicy, vmSelectionPolicy, containerSelectionPolicy, String.valueOf(getOverBookingFactor()), getRunTime()}) + ".txt");
file.createNewFile();
Log.setOutput(new FileOutputStream(file));
}
}
public String getExperimentName() {
return experimentName;
}
public void setExperimentName(String experimentName) {
this.experimentName = experimentName;
}
protected abstract void init(String var1, double overBookingFactor);
protected void start(String experimentName, String outputFolder, ContainerVmAllocationPolicy vmAllocationPolicy, ContainerAllocationPolicy containerAllocationPolicy) {
System.out.println("Starting " + experimentName);
try {
PowerContainerDatacenter e = (PowerContainerDatacenter) HelperEx.createDatacenter("datacenter",
PowerContainerDatacenterCM.class, hostList, vmAllocationPolicy, containerAllocationPolicy,
getExperimentName(), ConstantsExamples.SCHEDULING_INTERVAL, getLogAddress(),
ConstantsExamples.VM_STARTTUP_DELAY, ConstantsExamples.CONTAINER_STARTTUP_DELAY);
// PowerContainerDatacenter e = (PowerContainerDatacenter) HelperEx.createDatacenter("Datacenter", PowerContainerDatacenter.class, hostList, vmAllocationPolicy, containerAllocationPolicy);
vmAllocationPolicy.setDatacenter(e);
e.setDisableVmMigrations(false);
broker.submitVmList(vmList);
broker.submitContainerList(containerList);
broker.submitCloudletList(cloudletList.subList(0, containerList.size()));
;
CloudSim.terminateSimulation(86400.0D);
double lastClock = CloudSim.startSimulation();
List newList = broker.getCloudletReceivedList();
Log.printLine("Received " + newList.size() + " cloudlets");
CloudSim.stopSimulation();
// HelperEx.printResults(e, broker.getVmsCreatedList(),broker.getContainersCreatedList() ,lastClock, experimentName, true, outputFolder);
HelperEx.printResultsNew(e, broker, lastClock, experimentName, true, outputFolder);
} catch (Exception var8) {
var8.printStackTrace();
Log.printLine("The simulation has been terminated due to an unexpected error");
System.exit(0);
}
Log.printLine("Finished " + experimentName);
}
protected String getExperimentName(String... args) {
StringBuilder experimentName = new StringBuilder();
for (int i = 0; i < args.length; ++i) {
if (!args[i].isEmpty()) {
if (i != 0) {
experimentName.append("_");
}
experimentName.append(args[i]);
}
}
return experimentName.toString();
}
protected ContainerVmAllocationPolicy getVmAllocationPolicy(String vmAllocationPolicyName, String vmSelectionPolicyName, String containerSelectionPolicyName, String hostSelectionPolicyName) {
Object vmAllocationPolicy = null;
PowerContainerVmSelectionPolicy vmSelectionPolicy = null;
PowerContainerSelectionPolicy containerSelectionPolicy = null;
HostSelectionPolicy hostSelectionPolicy = null;
if (!vmSelectionPolicyName.isEmpty() && !containerSelectionPolicyName.isEmpty() && !hostSelectionPolicyName.isEmpty()) {
vmSelectionPolicy = this.getVmSelectionPolicy(vmSelectionPolicyName);
containerSelectionPolicy = this.getContainerSelectionPolicy(containerSelectionPolicyName);
hostSelectionPolicy = this.getHostSelectionPolicy(hostSelectionPolicyName);
}
if (vmAllocationPolicyName.startsWith("MSThreshold-Over_")) {
double overUtilizationThreshold = Double.parseDouble(vmAllocationPolicyName.substring(18));
vmAllocationPolicy = new PowerContainerVmAllocationPolicyMigrationStaticThresholdMC(hostList, vmSelectionPolicy,
containerSelectionPolicy, hostSelectionPolicy, overUtilizationThreshold,
ConstantsExamples.VM_TYPES,ConstantsExamples.VM_PES, ConstantsExamples.VM_RAM, ConstantsExamples.VM_BW,
ConstantsExamples.VM_SIZE, ConstantsExamples.VM_MIPS);
} else if (vmAllocationPolicyName.startsWith("MSThreshold-Under_")) {
double overUtilizationThreshold = Double.parseDouble(vmAllocationPolicyName.substring(18, 22));
double underUtilizationThreshold = Double.parseDouble(vmAllocationPolicyName.substring(24));
vmAllocationPolicy = new PowerContainerVmAllocationPolicyMigrationStaticThresholdMCUnderUtilized(hostList,
vmSelectionPolicy, containerSelectionPolicy, hostSelectionPolicy, overUtilizationThreshold,
underUtilizationThreshold,ConstantsExamples.VM_TYPES,ConstantsExamples.VM_PES, ConstantsExamples.VM_RAM, ConstantsExamples.VM_BW,
ConstantsExamples.VM_SIZE, ConstantsExamples.VM_MIPS );
} else if (vmAllocationPolicyName.startsWith("VMThreshold-Under_")) {
double overUtilizationThreshold = Double.parseDouble(vmAllocationPolicyName.substring(18, 22));
double underUtilizationThreshold = Double.parseDouble(vmAllocationPolicyName.substring(24));
vmAllocationPolicy = new PowerContainerVmAllocationPolicyMigrationAbstractHostSelection(hostList, vmSelectionPolicy, hostSelectionPolicy, overUtilizationThreshold, underUtilizationThreshold);
} else {
System.out.println("Unknown VM allocation policy: " + vmAllocationPolicyName);
System.exit(0);
}
return (ContainerVmAllocationPolicy) vmAllocationPolicy;
}
protected ContainerAllocationPolicy getContainerAllocationPolicy(String containerAllocationPolicyName) {
ContainerAllocationPolicy containerAllocationPolicy;
if (containerAllocationPolicyName == "Simple") {
containerAllocationPolicy = new PowerContainerAllocationPolicySimple(); // DVFS policy without VM migrations
} else {
ContainerPlacementPolicy placementPolicy = getContainerPlacementPolicy(containerAllocationPolicyName);
containerAllocationPolicy = new ContainerAllocationPolicyRS(placementPolicy); // DVFS policy without VM migrations
}
return containerAllocationPolicy;
}
protected ContainerPlacementPolicy getContainerPlacementPolicy(String name) {
ContainerPlacementPolicy placementPolicy;
switch (name) {
case "LeastFull":
placementPolicy = new ContainerPlacementPolicyLeastFull();
break;
case "MostFull":
placementPolicy = new ContainerPlacementPolicyMostFull();
break;
case "FirstFit":
placementPolicy = new ContainerPlacementPolicyFirstFit();
break;
case "Random":
placementPolicy = new ContainerPlacementPolicyRandomSelection();
break;
default:
placementPolicy = null;
System.out.println("The container placement policy is not defined");
break;
}
return placementPolicy;
}
protected HostSelectionPolicy getHostSelectionPolicy(String hostSelectionPolicyName) {
Object hostSelectionPolicy = null;
if (hostSelectionPolicyName == "FirstFit") {
hostSelectionPolicy = new HostSelectionPolicyFirstFit();
} else if (hostSelectionPolicyName == "LeastFull") {
hostSelectionPolicy = new HostSelectionPolicyLeastFull();
} else if (hostSelectionPolicyName == "MostFull") {
hostSelectionPolicy = new HostSelectionPolicyMostFull();
}
// else if (hostSelectionPolicyName == "MinCor") {
// hostSelectionPolicy = new HostSelectionPolicyMinimumCorrelation();
// }
else if (hostSelectionPolicyName == "RandomSelection") {
hostSelectionPolicy = new HostSelectionPolicyRandomSelection();
}
// else if(vmSelectionPolicyName.equals("mmt")) {
// vmSelectionPolicy = new PowerVmSelectionPolicyMinimumMigrationTime();
// } else if(vmSelectionPolicyName.equals("mu")) {
// vmSelectionPolicy = new PowerVmSelectionPolicyMinimumUtilization();
// } else if(vmSelectionPolicyName.equals("rs")) {
// vmSelectionPolicy = new PowerVmSelectionPolicyRandomSelection();
// }
else {
System.out.println("Unknown Host selection policy: " + hostSelectionPolicyName);
System.exit(0);
}
return (HostSelectionPolicy) hostSelectionPolicy;
}
protected PowerContainerSelectionPolicy getContainerSelectionPolicy(String containerSelectionPolicyName) {
Object containerSelectionPolicy = null;
if (containerSelectionPolicyName.equals("Cor")) {
containerSelectionPolicy = new PowerContainerSelectionPolicyCor(new PowerContainerSelectionPolicyMaximumUsage());
} else if (containerSelectionPolicyName.equals("MaxUsage")) {
containerSelectionPolicy = new PowerContainerSelectionPolicyMaximumUsage();
}
// else if(vmSelectionPolicyName.equals("mmt")) {
// vmSelectionPolicy = new PowerVmSelectionPolicyMinimumMigrationTime();
// } else if(vmSelectionPolicyName.equals("mu")) {
// vmSelectionPolicy = new PowerVmSelectionPolicyMinimumUtilization();
// } else if(vmSelectionPolicyName.equals("rs")) {
// vmSelectionPolicy = new PowerVmSelectionPolicyRandomSelection();
// }
else {
System.out.println("Unknown Container selection policy: " + containerSelectionPolicyName);
System.exit(0);
}
return (PowerContainerSelectionPolicy) containerSelectionPolicy;
}
protected PowerContainerVmSelectionPolicy getVmSelectionPolicy(String vmSelectionPolicyName) {
Object vmSelectionPolicy = null;
if (vmSelectionPolicyName.equals("VmMaxC")) {
vmSelectionPolicy = new PowerContainerVmSelectionPolicyMaximumCorrelation(new PowerContainerVmSelectionPolicyMaximumUsage());
} else if (vmSelectionPolicyName.equals("VmMaxU")) {
vmSelectionPolicy = new PowerContainerVmSelectionPolicyMaximumUsage();
}
// else if(vmSelectionPolicyName.equals("mmt")) {
// vmSelectionPolicy = new PowerVmSelectionPolicyMinimumMigrationTime();
// } else if(vmSelectionPolicyName.equals("mu")) {
// vmSelectionPolicy = new PowerVmSelectionPolicyMinimumUtilization();
// } else if(vmSelectionPolicyName.equals("rs")) {
// vmSelectionPolicy = new PowerVmSelectionPolicyRandomSelection();
// }
else {
System.out.println("Unknown VM selection policy: " + vmSelectionPolicyName);
System.exit(0);
}
return (PowerContainerVmSelectionPolicy) vmSelectionPolicy;
}
public void setEnableOutput(boolean enableOutput) {
this.enableOutput = enableOutput;
}
public boolean isEnableOutput() {
return enableOutput;
}
public double getOverBookingFactor() {
return overBookingFactor;
}
public void setOverBookingFactor(double overBookingFactor) {
this.overBookingFactor = overBookingFactor;
}
}