Files
edgecloudsim/src/edu/boun/edgecloudsim/core/SimManager.java
Cagatay Sonmez 08341c3681 some minor backward compatible, major backward incompatible changes and code formatting (beautification)
Minor Modifications:

* Indentation issues are fixed
* Typo errors in source code and comments are fixed
* Misspelled parameters in plotTaskFailureReason.m are corrected
* sim_results folder is added to .gitignore file

Backward compatible changes

* The exit code of the application when there is an error is changed from 0 to 1
* Default constructors are added for Location.java, LoadGeneratorModel.java, MobilityModel.java, EdgeOrchestrator.java (this change request coming from a developer)
* public TaskProperty(int mobileDeviceId, double startTime, ExponentialDistribution[] expRngList) is added to TaskProperty.java  (this change request coming from a developer to create a task without task type)
* double getCreationTime() function is added to Task.java
* void reconfigureMips(double mips) function is added to EdgeVM (for future usage)
* gsm_propagation_delay variable is added to config file. SimSettings class is also modified accordingly. You can use it if you have cellular network access in your scenario.
* wlan_range, northern_bound, southern_bound, eastern_bound, western_bound variables are added to config file; and relevant functions are added to SimSettings class. (this change request coming from a developer)

Backward incompatible changes!

 * location_check_interval variable name is changed to location_check_interval in config.properties file. Please update your config files accordingly (remove 'vm_' part)

 * Major modifications are applied in SimLogger class to decrease time complexity. Now the basic results are kept in the memory and saved to the files at the end of the simulation. As a result of this change, the signature of the SimLogger.addLog () function had to be changed. You must add the mobile device id as the first argument. Please update your MobileDeviceManager class accordingly (add task.getCloudletId () as the first argument).
2020-10-30 11:06:09 +03:00

272 lines
8.6 KiB
Java

/*
* Title: EdgeCloudSim - Simulation Manager
*
* Description:
* SimManager is an singleton class providing many abstract classeses such as
* Network Model, Mobility Model, Edge Orchestrator to other modules
* Critical simulation related information would be gathered via this class
*
* Licence: GPL - http://www.gnu.org/copyleft/gpl.html
* Copyright (c) 2017, Bogazici University, Istanbul, Turkey
*/
package edu.boun.edgecloudsim.core;
import java.io.IOException;
import java.util.List;
import org.cloudbus.cloudsim.Host;
import org.cloudbus.cloudsim.core.CloudSim;
import org.cloudbus.cloudsim.core.SimEntity;
import org.cloudbus.cloudsim.core.SimEvent;
import edu.boun.edgecloudsim.edge_orchestrator.EdgeOrchestrator;
import edu.boun.edgecloudsim.edge_server.EdgeServerManager;
import edu.boun.edgecloudsim.edge_server.EdgeVmAllocationPolicy_Custom;
import edu.boun.edgecloudsim.cloud_server.CloudServerManager;
import edu.boun.edgecloudsim.edge_client.MobileDeviceManager;
import edu.boun.edgecloudsim.edge_client.mobile_processing_unit.MobileServerManager;
import edu.boun.edgecloudsim.mobility.MobilityModel;
import edu.boun.edgecloudsim.task_generator.LoadGeneratorModel;
import edu.boun.edgecloudsim.network.NetworkModel;
import edu.boun.edgecloudsim.utils.TaskProperty;
import edu.boun.edgecloudsim.utils.SimLogger;
public class SimManager extends SimEntity {
private static final int CREATE_TASK = 0;
private static final int CHECK_ALL_VM = 1;
private static final int GET_LOAD_LOG = 2;
private static final int PRINT_PROGRESS = 3;
private static final int STOP_SIMULATION = 4;
private String simScenario;
private String orchestratorPolicy;
private int numOfMobileDevice;
private NetworkModel networkModel;
private MobilityModel mobilityModel;
private ScenarioFactory scenarioFactory;
private EdgeOrchestrator edgeOrchestrator;
private EdgeServerManager edgeServerManager;
private CloudServerManager cloudServerManager;
private MobileServerManager mobileServerManager;
private LoadGeneratorModel loadGeneratorModel;
private MobileDeviceManager mobileDeviceManager;
private static SimManager instance = null;
public SimManager(ScenarioFactory _scenarioFactory, int _numOfMobileDevice, String _simScenario, String _orchestratorPolicy) throws Exception {
super("SimManager");
simScenario = _simScenario;
scenarioFactory = _scenarioFactory;
numOfMobileDevice = _numOfMobileDevice;
orchestratorPolicy = _orchestratorPolicy;
SimLogger.print("Creating tasks...");
loadGeneratorModel = scenarioFactory.getLoadGeneratorModel();
loadGeneratorModel.initializeModel();
SimLogger.printLine("Done, ");
SimLogger.print("Creating device locations...");
mobilityModel = scenarioFactory.getMobilityModel();
mobilityModel.initialize();
SimLogger.printLine("Done.");
//Generate network model
networkModel = scenarioFactory.getNetworkModel();
networkModel.initialize();
//Generate edge orchestrator
edgeOrchestrator = scenarioFactory.getEdgeOrchestrator();
edgeOrchestrator.initialize();
//Create Physical Servers
edgeServerManager = scenarioFactory.getEdgeServerManager();
edgeServerManager.initialize();
//Create Physical Servers on cloud
cloudServerManager = scenarioFactory.getCloudServerManager();
cloudServerManager.initialize();
//Create Physical Servers on mobile devices
mobileServerManager = scenarioFactory.getMobileServerManager();
mobileServerManager.initialize();
//Create Client Manager
mobileDeviceManager = scenarioFactory.getMobileDeviceManager();
mobileDeviceManager.initialize();
instance = this;
}
public static SimManager getInstance(){
return instance;
}
/**
* Triggering CloudSim to start simulation
*/
public void startSimulation() throws Exception{
//Starts the simulation
SimLogger.print(super.getName()+" is starting...");
//Start Edge Datacenters & Generate VMs
edgeServerManager.startDatacenters();
edgeServerManager.createVmList(mobileDeviceManager.getId());
//Start Edge Datacenters & Generate VMs
cloudServerManager.startDatacenters();
cloudServerManager.createVmList(mobileDeviceManager.getId());
//Start Mobile Datacenters & Generate VMs
mobileServerManager.startDatacenters();
mobileServerManager.createVmList(mobileDeviceManager.getId());
CloudSim.startSimulation();
}
public String getSimulationScenario(){
return simScenario;
}
public String getOrchestratorPolicy(){
return orchestratorPolicy;
}
public ScenarioFactory getScenarioFactory(){
return scenarioFactory;
}
public int getNumOfMobileDevice(){
return numOfMobileDevice;
}
public NetworkModel getNetworkModel(){
return networkModel;
}
public MobilityModel getMobilityModel(){
return mobilityModel;
}
public EdgeOrchestrator getEdgeOrchestrator(){
return edgeOrchestrator;
}
public EdgeServerManager getEdgeServerManager(){
return edgeServerManager;
}
public CloudServerManager getCloudServerManager(){
return cloudServerManager;
}
public MobileServerManager getMobileServerManager(){
return mobileServerManager;
}
public LoadGeneratorModel getLoadGeneratorModel(){
return loadGeneratorModel;
}
public MobileDeviceManager getMobileDeviceManager(){
return mobileDeviceManager;
}
@Override
public void startEntity() {
int hostCounter=0;
for(int i= 0; i<edgeServerManager.getDatacenterList().size(); i++) {
List<? extends Host> list = edgeServerManager.getDatacenterList().get(i).getHostList();
for (int j=0; j < list.size(); j++) {
mobileDeviceManager.submitVmList(edgeServerManager.getVmList(hostCounter));
hostCounter++;
}
}
for(int i = 0; i<SimSettings.getInstance().getNumOfCloudHost(); i++) {
mobileDeviceManager.submitVmList(cloudServerManager.getVmList(i));
}
for(int i=0; i<numOfMobileDevice; i++){
if(mobileServerManager.getVmList(i) != null)
mobileDeviceManager.submitVmList(mobileServerManager.getVmList(i));
}
//Creation of tasks are scheduled here!
for(int i=0; i< loadGeneratorModel.getTaskList().size(); i++)
schedule(getId(), loadGeneratorModel.getTaskList().get(i).getStartTime(), CREATE_TASK, loadGeneratorModel.getTaskList().get(i));
//Periodic event loops starts from here!
schedule(getId(), 5, CHECK_ALL_VM);
schedule(getId(), SimSettings.getInstance().getSimulationTime()/100, PRINT_PROGRESS);
schedule(getId(), SimSettings.getInstance().getVmLoadLogInterval(), GET_LOAD_LOG);
schedule(getId(), SimSettings.getInstance().getSimulationTime(), STOP_SIMULATION);
SimLogger.printLine("Done.");
}
@Override
public void processEvent(SimEvent ev) {
synchronized(this){
switch (ev.getTag()) {
case CREATE_TASK:
try {
TaskProperty edgeTask = (TaskProperty) ev.getData();
mobileDeviceManager.submitTask(edgeTask);
} catch (Exception e) {
e.printStackTrace();
System.exit(1);
}
break;
case CHECK_ALL_VM:
int totalNumOfVm = SimSettings.getInstance().getNumOfEdgeVMs();
if(EdgeVmAllocationPolicy_Custom.getCreatedVmNum() != totalNumOfVm){
SimLogger.printLine("All VMs cannot be created! Terminating simulation...");
System.exit(1);
}
break;
case GET_LOAD_LOG:
SimLogger.getInstance().addVmUtilizationLog(
CloudSim.clock(),
edgeServerManager.getAvgUtilization(),
cloudServerManager.getAvgUtilization(),
mobileServerManager.getAvgUtilization());
schedule(getId(), SimSettings.getInstance().getVmLoadLogInterval(), GET_LOAD_LOG);
break;
case PRINT_PROGRESS:
int progress = (int)((CloudSim.clock()*100)/SimSettings.getInstance().getSimulationTime());
if(progress % 10 == 0)
SimLogger.print(Integer.toString(progress));
else
SimLogger.print(".");
if(CloudSim.clock() < SimSettings.getInstance().getSimulationTime())
schedule(getId(), SimSettings.getInstance().getSimulationTime()/100, PRINT_PROGRESS);
break;
case STOP_SIMULATION:
SimLogger.printLine("100");
CloudSim.terminateSimulation();
try {
SimLogger.getInstance().simStopped();
} catch (IOException e) {
e.printStackTrace();
System.exit(1);
}
break;
default:
SimLogger.printLine(getName() + ": unknown event type");
break;
}
}
}
@Override
public void shutdownEntity() {
edgeServerManager.terminateDatacenters();
cloudServerManager.terminateDatacenters();
mobileServerManager.terminateDatacenters();
}
}