package org.cloudbus.cloudsim.examples.power;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.List;
import org.cloudbus.cloudsim.Cloudlet;
import org.cloudbus.cloudsim.DatacenterBroker;
import org.cloudbus.cloudsim.Log;
import org.cloudbus.cloudsim.Vm;
import org.cloudbus.cloudsim.VmAllocationPolicy;
import org.cloudbus.cloudsim.core.CloudSim;
import org.cloudbus.cloudsim.power.PowerDatacenter;
import org.cloudbus.cloudsim.power.PowerHost;
import org.cloudbus.cloudsim.power.PowerVmAllocationPolicyMigrationAbstract;
import org.cloudbus.cloudsim.power.PowerVmAllocationPolicyMigrationInterQuartileRange;
import org.cloudbus.cloudsim.power.PowerVmAllocationPolicyMigrationLocalRegression;
import org.cloudbus.cloudsim.power.PowerVmAllocationPolicyMigrationLocalRegressionRobust;
import org.cloudbus.cloudsim.power.PowerVmAllocationPolicyMigrationMedianAbsoluteDeviation;
import org.cloudbus.cloudsim.power.PowerVmAllocationPolicyMigrationStaticThreshold;
import org.cloudbus.cloudsim.power.PowerVmAllocationPolicySimple;
import org.cloudbus.cloudsim.power.PowerVmSelectionPolicy;
import org.cloudbus.cloudsim.power.PowerVmSelectionPolicyMaximumCorrelation;
import org.cloudbus.cloudsim.power.PowerVmSelectionPolicyMinimumMigrationTime;
import org.cloudbus.cloudsim.power.PowerVmSelectionPolicyMinimumUtilization;
import org.cloudbus.cloudsim.power.PowerVmSelectionPolicyRandomSelection;
/**
* The Class RunnerAbstract.
*
* If you are using any algorithms, policies or workload included in the power package, please cite
* the following paper:
*
* Anton Beloglazov, and Rajkumar Buyya, "Optimal Online Deterministic Algorithms and Adaptive
* Heuristics for Energy and Performance Efficient Dynamic Consolidation of Virtual Machines in
* Cloud Data Centers", Concurrency and Computation: Practice and Experience (CCPE), Volume 24,
* Issue 13, Pages: 1397-1420, John Wiley & Sons, Ltd, New York, USA, 2012
*
* @author Anton Beloglazov
*/
public abstract class RunnerAbstract {
/** The enable output. */
private static boolean enableOutput;
/** The broker. */
protected static DatacenterBroker broker;
/** The cloudlet list. */
protected static List<Cloudlet> cloudletList;
/** The vm list. */
protected static List<Vm> vmList;
/** The host list. */
protected static List<PowerHost> hostList;
/**
* Run.
*
* @param enableOutput the enable output
* @param outputToFile the output to file
* @param inputFolder the input folder
* @param outputFolder the output folder
* @param workload the workload
* @param vmAllocationPolicy the vm allocation policy
* @param vmSelectionPolicy the vm selection policy
* @param parameter the parameter
*/
public RunnerAbstract(
boolean enableOutput,
boolean outputToFile,
String inputFolder,
String outputFolder,
String workload,
String vmAllocationPolicy,
String vmSelectionPolicy,
String parameter) {
try {
initLogOutput(
enableOutput,
outputToFile,
outputFolder,
workload,
vmAllocationPolicy,
vmSelectionPolicy,
parameter);
} catch (Exception e) {
e.printStackTrace();
System.exit(0);
}
init(inputFolder + "/" + workload);
start(
getExperimentName(workload, vmAllocationPolicy, vmSelectionPolicy, parameter),
outputFolder,
getVmAllocationPolicy(vmAllocationPolicy, vmSelectionPolicy, parameter));
}
/**
* Inits the log output.
*
* @param enableOutput the enable output
* @param outputToFile the output to file
* @param outputFolder the output folder
* @param workload the workload
* @param vmAllocationPolicy the vm allocation policy
* @param vmSelectionPolicy the vm selection policy
* @param parameter the parameter
* @throws IOException Signals that an I/O exception has occurred.
* @throws FileNotFoundException the file not found exception
*/
protected void initLogOutput(
boolean enableOutput,
boolean outputToFile,
String outputFolder,
String workload,
String vmAllocationPolicy,
String vmSelectionPolicy,
String parameter) throws IOException, FileNotFoundException {
setEnableOutput(enableOutput);
Log.setDisabled(!isEnableOutput());
if (isEnableOutput() && outputToFile) {
File folder = new File(outputFolder);
if (!folder.exists()) {
folder.mkdir();
}
File folder2 = new File(outputFolder + "/log");
if (!folder2.exists()) {
folder2.mkdir();
}
File file = new File(outputFolder + "/log/"
+ getExperimentName(workload, vmAllocationPolicy, vmSelectionPolicy, parameter) + ".txt");
file.createNewFile();
Log.setOutput(new FileOutputStream(file));
}
}
/**
* Inits the simulation.
*
* @param inputFolder the input folder
*/
protected abstract void init(String inputFolder);
/**
* Starts the simulation.
*
* @param experimentName the experiment name
* @param outputFolder the output folder
* @param vmAllocationPolicy the vm allocation policy
*/
protected void start(String experimentName, String outputFolder, VmAllocationPolicy vmAllocationPolicy) {
System.out.println("Starting " + experimentName);
try {
PowerDatacenter datacenter = (PowerDatacenter) Helper.createDatacenter(
"Datacenter",
PowerDatacenter.class,
hostList,
vmAllocationPolicy);
datacenter.setDisableMigrations(false);
broker.submitVmList(vmList);
broker.submitCloudletList(cloudletList);
CloudSim.terminateSimulation(Constants.SIMULATION_LIMIT);
double lastClock = CloudSim.startSimulation();
List<Cloudlet> newList = broker.getCloudletReceivedList();
Log.printLine("Received " + newList.size() + " cloudlets");
CloudSim.stopSimulation();
Helper.printResults(
datacenter,
vmList,
lastClock,
experimentName,
Constants.OUTPUT_CSV,
outputFolder);
} catch (Exception e) {
e.printStackTrace();
Log.printLine("The simulation has been terminated due to an unexpected error");
System.exit(0);
}
Log.printLine("Finished " + experimentName);
}
/**
* Gets the experiment name.
*
* @param args the args
* @return the experiment name
*/
protected String getExperimentName(String... args) {
StringBuilder experimentName = new StringBuilder();
for (int i = 0; i < args.length; i++) {
if (args[i].isEmpty()) {
continue;
}
if (i != 0) {
experimentName.append("_");
}
experimentName.append(args[i]);
}
return experimentName.toString();
}
/**
* Gets the vm allocation policy.
*
* @param vmAllocationPolicyName the vm allocation policy name
* @param vmSelectionPolicyName the vm selection policy name
* @param parameterName the parameter name
* @return the vm allocation policy
*/
protected VmAllocationPolicy getVmAllocationPolicy(
String vmAllocationPolicyName,
String vmSelectionPolicyName,
String parameterName) {
VmAllocationPolicy vmAllocationPolicy = null;
PowerVmSelectionPolicy vmSelectionPolicy = null;
if (!vmSelectionPolicyName.isEmpty()) {
vmSelectionPolicy = getVmSelectionPolicy(vmSelectionPolicyName);
}
double parameter = 0;
if (!parameterName.isEmpty()) {
parameter = Double.valueOf(parameterName);
}
if (vmAllocationPolicyName.equals("iqr")) {
PowerVmAllocationPolicyMigrationAbstract fallbackVmSelectionPolicy = new PowerVmAllocationPolicyMigrationStaticThreshold(
hostList,
vmSelectionPolicy,
0.7);
vmAllocationPolicy = new PowerVmAllocationPolicyMigrationInterQuartileRange(
hostList,
vmSelectionPolicy,
parameter,
fallbackVmSelectionPolicy);
} else if (vmAllocationPolicyName.equals("mad")) {
PowerVmAllocationPolicyMigrationAbstract fallbackVmSelectionPolicy = new PowerVmAllocationPolicyMigrationStaticThreshold(
hostList,
vmSelectionPolicy,
0.7);
vmAllocationPolicy = new PowerVmAllocationPolicyMigrationMedianAbsoluteDeviation(
hostList,
vmSelectionPolicy,
parameter,
fallbackVmSelectionPolicy);
} else if (vmAllocationPolicyName.equals("lr")) {
PowerVmAllocationPolicyMigrationAbstract fallbackVmSelectionPolicy = new PowerVmAllocationPolicyMigrationStaticThreshold(
hostList,
vmSelectionPolicy,
0.7);
vmAllocationPolicy = new PowerVmAllocationPolicyMigrationLocalRegression(
hostList,
vmSelectionPolicy,
parameter,
Constants.SCHEDULING_INTERVAL,
fallbackVmSelectionPolicy);
} else if (vmAllocationPolicyName.equals("lrr")) {
PowerVmAllocationPolicyMigrationAbstract fallbackVmSelectionPolicy = new PowerVmAllocationPolicyMigrationStaticThreshold(
hostList,
vmSelectionPolicy,
0.7);
vmAllocationPolicy = new PowerVmAllocationPolicyMigrationLocalRegressionRobust(
hostList,
vmSelectionPolicy,
parameter,
Constants.SCHEDULING_INTERVAL,
fallbackVmSelectionPolicy);
} else if (vmAllocationPolicyName.equals("thr")) {
vmAllocationPolicy = new PowerVmAllocationPolicyMigrationStaticThreshold(
hostList,
vmSelectionPolicy,
parameter);
} else if (vmAllocationPolicyName.equals("dvfs")) {
vmAllocationPolicy = new PowerVmAllocationPolicySimple(hostList);
} else {
System.out.println("Unknown VM allocation policy: " + vmAllocationPolicyName);
System.exit(0);
}
return vmAllocationPolicy;
}
/**
* Gets the vm selection policy.
*
* @param vmSelectionPolicyName the vm selection policy name
* @return the vm selection policy
*/
protected PowerVmSelectionPolicy getVmSelectionPolicy(String vmSelectionPolicyName) {
PowerVmSelectionPolicy vmSelectionPolicy = null;
if (vmSelectionPolicyName.equals("mc")) {
vmSelectionPolicy = new PowerVmSelectionPolicyMaximumCorrelation(
new PowerVmSelectionPolicyMinimumMigrationTime());
} 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 vmSelectionPolicy;
}
/**
* Sets the enable output.
*
* @param enableOutput the new enable output
*/
public void setEnableOutput(boolean enableOutput) {
RunnerAbstract.enableOutput = enableOutput;
}
/**
* Checks if is enable output.
*
* @return true, if is enable output
*/
public boolean isEnableOutput() {
return enableOutput;
}
}