major modifications for v2.0 release
Release notes 1- Cloud server processing was simplified in the initial version, it is handled via cloudsim components now. 2- Cloud server manager, edge server manager, mobile device manager and vm allocation policy are used as abstract class in factory pattern to allow developers to use different business logic without modifying EdgeCloudSim source code. 3- The task and place types are no longer defined as enumeration. They are used as integer value in order to manipulate more place type without modifying enum variable. 4- Two sample applications (one of them is simple and the other one extended application) are added along with the corresponding matlab files to plot statistics. 5- Cloud server properties are added to the simulation settings file 6- New log items are added to simulation result files 7- Code refactoring is applied including the modification of comments
This commit is contained in:
@@ -1,42 +1,59 @@
|
||||
/*
|
||||
* Title: EdgeCloudSim - Custom VM Cpu Utilization Model
|
||||
*
|
||||
* Description:
|
||||
* CpuUtilizationModel_Custom implements UtilizationModel and used for
|
||||
* VM CPU utilization model. In CloudSim, the CPU utilization of the VM
|
||||
* is a simple counter. We provide more realistic utilization model
|
||||
* which decide CPU utilization of each application by using the
|
||||
* values defined in the applications.xml file. For those who wants to
|
||||
* add another VM Cpu Utilization Model to EdgeCloudSim should provide
|
||||
* another concreate instance of UtilizationModel via ScenarioFactory
|
||||
*
|
||||
* Licence: GPL - http://www.gnu.org/copyleft/gpl.html
|
||||
* Copyright (c) 2017, Bogazici University, Istanbul, Turkey
|
||||
*/
|
||||
|
||||
package edu.boun.edgecloudsim.edge_client;
|
||||
|
||||
import org.cloudbus.cloudsim.UtilizationModel;
|
||||
|
||||
import edu.boun.edgecloudsim.core.SimSettings;
|
||||
|
||||
public class CpuUtilizationModel_Custom implements UtilizationModel {
|
||||
private SimSettings.APP_TYPES taskType;
|
||||
|
||||
public CpuUtilizationModel_Custom(SimSettings.APP_TYPES _taskType){
|
||||
taskType=_taskType;
|
||||
}
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
* @see cloudsim.power.UtilizationModel#getUtilization(double)
|
||||
*/
|
||||
@Override
|
||||
public double getUtilization(double time) {
|
||||
return SimSettings.getInstance().getTaskLookUpTable()[taskType.ordinal()][9];
|
||||
}
|
||||
|
||||
public double predictUtilization(SimSettings.VM_TYPES _vmType){
|
||||
return SimSettings.getInstance().getTaskLookUpTable()[taskType.ordinal()][9];
|
||||
}
|
||||
}
|
||||
/*
|
||||
* Title: EdgeCloudSim - Custom VM Cpu Utilization Model
|
||||
*
|
||||
* Description:
|
||||
* CpuUtilizationModel_Custom implements UtilizationModel and used for
|
||||
* VM CPU utilization model. In CloudSim, the CPU utilization of the VM
|
||||
* is a simple counter. We provide more realistic utilization model
|
||||
* which decide CPU utilization of each application by using the
|
||||
* values defined in the applications.xml file. For those who wants to
|
||||
* add another VM Cpu Utilization Model to EdgeCloudSim should provide
|
||||
* another concreate instance of UtilizationModel via ScenarioFactory
|
||||
*
|
||||
* Licence: GPL - http://www.gnu.org/copyleft/gpl.html
|
||||
* Copyright (c) 2017, Bogazici University, Istanbul, Turkey
|
||||
*/
|
||||
|
||||
package edu.boun.edgecloudsim.edge_client;
|
||||
|
||||
import org.cloudbus.cloudsim.UtilizationModel;
|
||||
|
||||
import edu.boun.edgecloudsim.core.SimSettings;
|
||||
import edu.boun.edgecloudsim.utils.SimLogger;
|
||||
|
||||
public class CpuUtilizationModel_Custom implements UtilizationModel {
|
||||
private Task task;
|
||||
|
||||
public CpuUtilizationModel_Custom(){
|
||||
}
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
* @see cloudsim.power.UtilizationModel#getUtilization(double)
|
||||
*/
|
||||
@Override
|
||||
public double getUtilization(double time) {
|
||||
int index = 9;
|
||||
if(task.getAssociatedDatacenterId() == SimSettings.CLOUD_DATACENTER_ID)
|
||||
index = 10;
|
||||
|
||||
return SimSettings.getInstance().getTaskLookUpTable()[task.getTaskType()][index];
|
||||
}
|
||||
|
||||
public void setTask(Task _task){
|
||||
task=_task;
|
||||
}
|
||||
|
||||
public double predictUtilization(SimSettings.VM_TYPES _vmType){
|
||||
int index = 0;
|
||||
if(_vmType == SimSettings.VM_TYPES.EDGE_VM)
|
||||
index = 9;
|
||||
else if(_vmType == SimSettings.VM_TYPES.CLOUD_VM)
|
||||
index = 10;
|
||||
else{
|
||||
SimLogger.printLine("Unknown VM Type! Terminating simulation...");
|
||||
System.exit(0);
|
||||
}
|
||||
return SimSettings.getInstance().getTaskLookUpTable()[task.getTaskType()][index];
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,293 @@
|
||||
/*
|
||||
* Title: EdgeCloudSim - Mobile Device Manager
|
||||
*
|
||||
* Description:
|
||||
* DefaultMobileDeviceManager is responsible for submitting the tasks to the related
|
||||
* device by using the Edge Orchestrator. It also takes proper actions
|
||||
* when the execution of the tasks are finished.
|
||||
* By default, DefaultMobileDeviceManager sends tasks to the edge servers or
|
||||
* cloud servers. If you want to use different topology, for example
|
||||
* MAN edge server, you should modify the flow defined in this class.
|
||||
*
|
||||
* Licence: GPL - http://www.gnu.org/copyleft/gpl.html
|
||||
* Copyright (c) 2017, Bogazici University, Istanbul, Turkey
|
||||
*/
|
||||
|
||||
package edu.boun.edgecloudsim.edge_client;
|
||||
|
||||
import org.cloudbus.cloudsim.UtilizationModel;
|
||||
import org.cloudbus.cloudsim.UtilizationModelFull;
|
||||
import org.cloudbus.cloudsim.Vm;
|
||||
import org.cloudbus.cloudsim.core.CloudSim;
|
||||
import org.cloudbus.cloudsim.core.CloudSimTags;
|
||||
import org.cloudbus.cloudsim.core.SimEvent;
|
||||
|
||||
import edu.boun.edgecloudsim.core.SimManager;
|
||||
import edu.boun.edgecloudsim.core.SimSettings;
|
||||
import edu.boun.edgecloudsim.core.SimSettings.NETWORK_DELAY_TYPES;
|
||||
import edu.boun.edgecloudsim.network.NetworkModel;
|
||||
import edu.boun.edgecloudsim.utils.EdgeTask;
|
||||
import edu.boun.edgecloudsim.utils.Location;
|
||||
import edu.boun.edgecloudsim.utils.SimLogger;
|
||||
|
||||
public class DefaultMobileDeviceManager extends MobileDeviceManager {
|
||||
private static final int BASE = 100000; //start from base in order not to conflict cloudsim tag!
|
||||
private static final int REQUEST_RECEIVED_BY_CLOUD = BASE + 1;
|
||||
private static final int REQUEST_RECIVED_BY_EDGE_DEVICE = BASE + 2;
|
||||
private static final int RESPONSE_RECEIVED_BY_MOBILE_DEVICE = BASE + 3;
|
||||
private int taskIdCounter=0;
|
||||
|
||||
public DefaultMobileDeviceManager() throws Exception{
|
||||
}
|
||||
|
||||
@Override
|
||||
public void initialize() {
|
||||
}
|
||||
|
||||
@Override
|
||||
public UtilizationModel getCpuUtilizationModel() {
|
||||
return new CpuUtilizationModel_Custom();
|
||||
}
|
||||
|
||||
/**
|
||||
* Submit cloudlets to the created VMs.
|
||||
*
|
||||
* @pre $none
|
||||
* @post $none
|
||||
*/
|
||||
protected void submitCloudlets() {
|
||||
//do nothing!
|
||||
}
|
||||
|
||||
/**
|
||||
* Process a cloudlet return event.
|
||||
*
|
||||
* @param ev a SimEvent object
|
||||
* @pre ev != $null
|
||||
* @post $none
|
||||
*/
|
||||
protected void processCloudletReturn(SimEvent ev) {
|
||||
NetworkModel networkModel = SimManager.getInstance().getNetworkModel();
|
||||
Task task = (Task) ev.getData();
|
||||
|
||||
SimLogger.getInstance().taskExecuted(task.getCloudletId());
|
||||
|
||||
if(task.getAssociatedDatacenterId() == SimSettings.CLOUD_DATACENTER_ID){
|
||||
//SimLogger.printLine(CloudSim.clock() + ": " + getName() + ": task #" + task.getCloudletId() + " received from cloud");
|
||||
double WanDelay = networkModel.getDownloadDelay(SimSettings.CLOUD_DATACENTER_ID, task.getMobileDeviceId(), task);
|
||||
if(WanDelay > 0)
|
||||
{
|
||||
Location currentLocation = SimManager.getInstance().getMobilityModel().getLocation(task.getMobileDeviceId(),CloudSim.clock()+WanDelay);
|
||||
if(task.getSubmittedLocation().getServingWlanId() == currentLocation.getServingWlanId())
|
||||
{
|
||||
networkModel.downloadStarted(task.getSubmittedLocation(), SimSettings.CLOUD_DATACENTER_ID);
|
||||
SimLogger.getInstance().setDownloadDelay(task.getCloudletId(), WanDelay, NETWORK_DELAY_TYPES.WAN_DELAY);
|
||||
schedule(getId(), WanDelay, RESPONSE_RECEIVED_BY_MOBILE_DEVICE, task);
|
||||
}
|
||||
else
|
||||
{
|
||||
SimLogger.getInstance().failedDueToMobility(task.getCloudletId(), CloudSim.clock());
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
SimLogger.getInstance().failedDueToBandwidth(task.getCloudletId(), CloudSim.clock(), NETWORK_DELAY_TYPES.WAN_DELAY);
|
||||
}
|
||||
}
|
||||
else{
|
||||
//SimLogger.printLine(CloudSim.clock() + ": " + getName() + ": task #" + task.getCloudletId() + " received from edge");
|
||||
double WlanDelay = networkModel.getDownloadDelay(task.getAssociatedHostId(), task.getMobileDeviceId(), task);
|
||||
if(WlanDelay > 0)
|
||||
{
|
||||
Location currentLocation = SimManager.getInstance().getMobilityModel().getLocation(task.getMobileDeviceId(),CloudSim.clock()+WlanDelay);
|
||||
if(task.getSubmittedLocation().getServingWlanId() == currentLocation.getServingWlanId())
|
||||
{
|
||||
networkModel.downloadStarted(currentLocation, SimSettings.GENERIC_EDGE_DEVICE_ID);
|
||||
SimLogger.getInstance().setDownloadDelay(task.getCloudletId(), WlanDelay, NETWORK_DELAY_TYPES.WLAN_DELAY);
|
||||
schedule(getId(), WlanDelay, RESPONSE_RECEIVED_BY_MOBILE_DEVICE, task);
|
||||
}
|
||||
else
|
||||
{
|
||||
SimLogger.getInstance().failedDueToMobility(task.getCloudletId(), CloudSim.clock());
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
SimLogger.getInstance().failedDueToBandwidth(task.getCloudletId(), CloudSim.clock(), NETWORK_DELAY_TYPES.WLAN_DELAY);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
protected void processOtherEvent(SimEvent ev) {
|
||||
if (ev == null) {
|
||||
SimLogger.printLine(getName() + ".processOtherEvent(): " + "Error - an event is null! Terminating simulation...");
|
||||
System.exit(0);
|
||||
return;
|
||||
}
|
||||
|
||||
NetworkModel networkModel = SimManager.getInstance().getNetworkModel();
|
||||
|
||||
switch (ev.getTag()) {
|
||||
case REQUEST_RECEIVED_BY_CLOUD:
|
||||
{
|
||||
Task task = (Task) ev.getData();
|
||||
|
||||
networkModel.uploadFinished(task.getSubmittedLocation(), SimSettings.CLOUD_DATACENTER_ID);
|
||||
|
||||
submitTaskToVm(task,0,SimSettings.CLOUD_DATACENTER_ID);
|
||||
|
||||
break;
|
||||
}
|
||||
case REQUEST_RECIVED_BY_EDGE_DEVICE:
|
||||
{
|
||||
Task task = (Task) ev.getData();
|
||||
|
||||
networkModel.uploadFinished(task.getSubmittedLocation(), SimSettings.GENERIC_EDGE_DEVICE_ID);
|
||||
|
||||
submitTaskToVm(task, 0, SimSettings.GENERIC_EDGE_DEVICE_ID);
|
||||
|
||||
break;
|
||||
}
|
||||
case RESPONSE_RECEIVED_BY_MOBILE_DEVICE:
|
||||
{
|
||||
Task task = (Task) ev.getData();
|
||||
|
||||
if(task.getAssociatedDatacenterId() == SimSettings.CLOUD_DATACENTER_ID)
|
||||
networkModel.downloadFinished(task.getSubmittedLocation(), SimSettings.CLOUD_DATACENTER_ID);
|
||||
else
|
||||
networkModel.downloadFinished(task.getSubmittedLocation(), SimSettings.GENERIC_EDGE_DEVICE_ID);
|
||||
|
||||
SimLogger.getInstance().taskEnded(task.getCloudletId(), CloudSim.clock());
|
||||
break;
|
||||
}
|
||||
default:
|
||||
SimLogger.printLine(getName() + ".processOtherEvent(): " + "Error - event unknown by this DatacenterBroker. Terminating simulation...");
|
||||
System.exit(0);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
public void submitTask(EdgeTask edgeTask) {
|
||||
NetworkModel networkModel = SimManager.getInstance().getNetworkModel();
|
||||
|
||||
//create a task
|
||||
Task task = createTask(edgeTask);
|
||||
|
||||
Location currentLocation = SimManager.getInstance().getMobilityModel().
|
||||
getLocation(task.getMobileDeviceId(),CloudSim.clock());
|
||||
|
||||
//set location of the mobile device which generates this task
|
||||
task.setSubmittedLocation(currentLocation);
|
||||
|
||||
//add related task to log list
|
||||
SimLogger.getInstance().addLog(task.getCloudletId(),
|
||||
task.getTaskType(),
|
||||
(int)task.getCloudletLength(),
|
||||
(int)task.getCloudletFileSize(),
|
||||
(int)task.getCloudletOutputSize());
|
||||
|
||||
int nextHopId = SimManager.getInstance().getEdgeOrchestrator().getDeviceToOffload(task);
|
||||
|
||||
if(nextHopId == SimSettings.CLOUD_DATACENTER_ID){
|
||||
double WanDelay = networkModel.getUploadDelay(task.getMobileDeviceId(), nextHopId, task);
|
||||
|
||||
if(WanDelay>0){
|
||||
networkModel.uploadStarted(currentLocation, nextHopId);
|
||||
SimLogger.getInstance().taskStarted(task.getCloudletId(), CloudSim.clock());
|
||||
SimLogger.getInstance().setUploadDelay(task.getCloudletId(), WanDelay, NETWORK_DELAY_TYPES.WAN_DELAY);
|
||||
schedule(getId(), WanDelay, REQUEST_RECEIVED_BY_CLOUD, task);
|
||||
}
|
||||
else
|
||||
{
|
||||
//SimLogger.printLine("Task #" + task.getCloudletId() + " cannot assign to any VM");
|
||||
SimLogger.getInstance().rejectedDueToBandwidth(
|
||||
task.getCloudletId(),
|
||||
CloudSim.clock(),
|
||||
SimSettings.VM_TYPES.CLOUD_VM.ordinal(),
|
||||
NETWORK_DELAY_TYPES.WAN_DELAY);
|
||||
}
|
||||
}
|
||||
else if(nextHopId == SimSettings.GENERIC_EDGE_DEVICE_ID) {
|
||||
double WlanDelay = networkModel.getUploadDelay(task.getMobileDeviceId(), nextHopId, task);
|
||||
|
||||
if(WlanDelay > 0){
|
||||
networkModel.uploadStarted(currentLocation, nextHopId);
|
||||
schedule(getId(), WlanDelay, REQUEST_RECIVED_BY_EDGE_DEVICE, task);
|
||||
SimLogger.getInstance().taskStarted(task.getCloudletId(), CloudSim.clock());
|
||||
SimLogger.getInstance().setUploadDelay(task.getCloudletId(), WlanDelay, NETWORK_DELAY_TYPES.WLAN_DELAY);
|
||||
}
|
||||
else {
|
||||
SimLogger.getInstance().rejectedDueToBandwidth(
|
||||
task.getCloudletId(),
|
||||
CloudSim.clock(),
|
||||
SimSettings.VM_TYPES.EDGE_VM.ordinal(),
|
||||
NETWORK_DELAY_TYPES.WLAN_DELAY);
|
||||
}
|
||||
}
|
||||
else {
|
||||
SimLogger.printLine("Unknown nextHopId! Terminating simulation...");
|
||||
System.exit(0);
|
||||
}
|
||||
}
|
||||
|
||||
private void submitTaskToVm(Task task, double delay, int datacenterId) {
|
||||
//select a VM
|
||||
Vm selectedVM = SimManager.getInstance().getEdgeOrchestrator().getVmToOffload(task, datacenterId);
|
||||
|
||||
int vmType = 0;
|
||||
if(datacenterId == SimSettings.CLOUD_DATACENTER_ID)
|
||||
vmType = SimSettings.VM_TYPES.CLOUD_VM.ordinal();
|
||||
else
|
||||
vmType = SimSettings.VM_TYPES.EDGE_VM.ordinal();
|
||||
|
||||
if(selectedVM != null){
|
||||
if(datacenterId == SimSettings.CLOUD_DATACENTER_ID)
|
||||
task.setAssociatedDatacenterId(SimSettings.CLOUD_DATACENTER_ID);
|
||||
else
|
||||
task.setAssociatedDatacenterId(selectedVM.getHost().getDatacenter().getId());
|
||||
|
||||
//save related host id
|
||||
task.setAssociatedHostId(selectedVM.getHost().getId());
|
||||
|
||||
//set related vm id
|
||||
task.setAssociatedVmId(selectedVM.getId());
|
||||
|
||||
//bind task to related VM
|
||||
getCloudletList().add(task);
|
||||
bindCloudletToVm(task.getCloudletId(),selectedVM.getId());
|
||||
|
||||
//SimLogger.printLine(CloudSim.clock() + ": Cloudlet#" + task.getCloudletId() + " is submitted to VM#" + task.getVmId());
|
||||
schedule(getVmsToDatacentersMap().get(task.getVmId()), delay, CloudSimTags.CLOUDLET_SUBMIT, task);
|
||||
|
||||
SimLogger.getInstance().taskAssigned(task.getCloudletId(),
|
||||
selectedVM.getHost().getDatacenter().getId(),
|
||||
selectedVM.getHost().getId(),
|
||||
selectedVM.getId(),
|
||||
vmType);
|
||||
}
|
||||
else{
|
||||
//SimLogger.printLine("Task #" + task.getCloudletId() + " cannot assign to any VM");
|
||||
SimLogger.getInstance().rejectedDueToVMCapacity(task.getCloudletId(), CloudSim.clock(), vmType);
|
||||
}
|
||||
}
|
||||
|
||||
private Task createTask(EdgeTask edgeTask){
|
||||
UtilizationModel utilizationModel = new UtilizationModelFull(); /*UtilizationModelStochastic*/
|
||||
UtilizationModel utilizationModelCPU = getCpuUtilizationModel();
|
||||
|
||||
Task task = new Task(edgeTask.mobileDeviceId, ++taskIdCounter,
|
||||
edgeTask.length, edgeTask.pesNumber,
|
||||
edgeTask.inputFileSize, edgeTask.outputFileSize,
|
||||
utilizationModelCPU, utilizationModel, utilizationModel);
|
||||
|
||||
//set the owner of this task
|
||||
task.setUserId(this.getId());
|
||||
task.setTaskType(edgeTask.taskType);
|
||||
|
||||
if (utilizationModelCPU instanceof CpuUtilizationModel_Custom) {
|
||||
((CpuUtilizationModel_Custom)utilizationModelCPU).setTask(task);
|
||||
}
|
||||
|
||||
return task;
|
||||
}
|
||||
}
|
||||
@@ -1,324 +1,25 @@
|
||||
/*
|
||||
* Title: EdgeCloudSim - Mobile Device Manager
|
||||
*
|
||||
* Description:
|
||||
* MobileDeviceManager is responsible for submitting the tasks to the related
|
||||
* device by using the Edge Orchestrator. It also takes proper actions
|
||||
* when the execution of the tasks are finished.
|
||||
* By default, MobileDeviceManager sends tasks to the edge servers or
|
||||
* cloud servers. If you want to use different topology, for example
|
||||
* MAN edge server, you should modify the flow defined in this class.
|
||||
*
|
||||
* Licence: GPL - http://www.gnu.org/copyleft/gpl.html
|
||||
* Copyright (c) 2017, Bogazici University, Istanbul, Turkey
|
||||
*/
|
||||
|
||||
package edu.boun.edgecloudsim.edge_client;
|
||||
|
||||
import org.cloudbus.cloudsim.DatacenterBroker;
|
||||
import org.cloudbus.cloudsim.Cloudlet;
|
||||
import org.cloudbus.cloudsim.UtilizationModel;
|
||||
import org.cloudbus.cloudsim.UtilizationModelFull;
|
||||
import org.cloudbus.cloudsim.core.CloudSim;
|
||||
import org.cloudbus.cloudsim.core.CloudSimTags;
|
||||
import org.cloudbus.cloudsim.core.SimEvent;
|
||||
|
||||
import edu.boun.edgecloudsim.core.SimManager;
|
||||
import edu.boun.edgecloudsim.core.SimSettings;
|
||||
import edu.boun.edgecloudsim.edge_server.EdgeVM;
|
||||
import edu.boun.edgecloudsim.network.NetworkModel;
|
||||
import edu.boun.edgecloudsim.utils.EdgeTask;
|
||||
import edu.boun.edgecloudsim.utils.Location;
|
||||
import edu.boun.edgecloudsim.utils.SimLogger;
|
||||
|
||||
|
||||
public class MobileDeviceManager extends DatacenterBroker {
|
||||
private static final int BASE = 100000; //start from base in order not to conflict cloudsim tag!
|
||||
private static final int REQUEST_RECEIVED_BY_CLOUD = BASE + 1;
|
||||
private static final int REQUEST_PROCESSED_BY_CLOUD = BASE + 2;
|
||||
private static final int REQUEST_RECIVED_BY_EDGE_DEVICE = BASE + 3;
|
||||
private static final int RESPONSE_RECEIVED_BY_MOBILE_DEVICE = BASE + 4;
|
||||
// private static final int REQUEST_RECIVED_BY_EDGE_ORCHESTRATOR = BASE + 5;
|
||||
private int taskIdCounter=0;
|
||||
|
||||
public MobileDeviceManager() throws Exception {
|
||||
super("Global_Broker");
|
||||
}
|
||||
|
||||
/**
|
||||
* Submit cloudlets to the created VMs.
|
||||
*
|
||||
* @pre $none
|
||||
* @post $none
|
||||
*/
|
||||
protected void submitCloudlets() {
|
||||
//do nothing!
|
||||
}
|
||||
|
||||
/**
|
||||
* Process a cloudlet return event.
|
||||
*
|
||||
* @param ev a SimEvent object
|
||||
* @pre ev != $null
|
||||
* @post $none
|
||||
*/
|
||||
protected void processCloudletReturn(SimEvent ev) {
|
||||
NetworkModel networkModel = SimManager.getInstance().getNetworkModel();
|
||||
Task task = (Task) ev.getData();
|
||||
|
||||
Location currentLocation = SimManager.getInstance().getMobilityModel().getLocation(task.getMobileDeviceId(),CloudSim.clock());
|
||||
if(task.getSubmittedLocation().equals(currentLocation))
|
||||
{
|
||||
//SimLogger.printLine(CloudSim.clock() + ": " + getName() + ": Cloudlet " + task.getCloudletId() + " received");
|
||||
double WlanDelay = networkModel.getDownloadDelay(task.getAssociatedHostId(), task.getMobileDeviceId(), task.getCloudletOutputSize());
|
||||
if(WlanDelay > 0)
|
||||
{
|
||||
networkModel.downloadStarted(currentLocation, SimSettings.GENERIC_EDGE_DEVICE_ID);
|
||||
schedule(getId(), WlanDelay, RESPONSE_RECEIVED_BY_MOBILE_DEVICE, task);
|
||||
SimLogger.getInstance().downloadStarted(task.getCloudletId(), WlanDelay);
|
||||
}
|
||||
else
|
||||
{
|
||||
SimLogger.getInstance().failedDueToBandwidth(task.getCloudletId(), CloudSim.clock());
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
//SimLogger.printLine("task cannot be finished due to mobility of user!");
|
||||
//SimLogger.printLine("device: " +task.getMobileDeviceId()+" - submitted " + task.getSubmissionTime() + " @ " + task.getSubmittedLocation().getXPos() + " handled " + CloudSim.clock() + " @ " + currentLocation.getXPos());
|
||||
SimLogger.getInstance().failedDueToMobility(task.getCloudletId(), CloudSim.clock());
|
||||
}
|
||||
}
|
||||
|
||||
protected void processOtherEvent(SimEvent ev) {
|
||||
if (ev == null) {
|
||||
SimLogger.printLine(getName() + ".processOtherEvent(): " + "Error - an event is null! Terminating simulation...");
|
||||
System.exit(0);
|
||||
return;
|
||||
}
|
||||
|
||||
NetworkModel networkModel = SimManager.getInstance().getNetworkModel();
|
||||
|
||||
switch (ev.getTag()) {
|
||||
case REQUEST_RECEIVED_BY_CLOUD:
|
||||
{
|
||||
Task task = (Task) ev.getData();
|
||||
|
||||
networkModel.uploadFinished(task.getSubmittedLocation(), SimSettings.CLOUD_DATACENTER_ID);
|
||||
|
||||
//save related host id
|
||||
task.setAssociatedHostId(SimSettings.CLOUD_HOST_ID);
|
||||
|
||||
SimLogger.getInstance().uploaded(task.getCloudletId(),
|
||||
SimSettings.CLOUD_DATACENTER_ID,
|
||||
SimSettings.CLOUD_HOST_ID,
|
||||
SimSettings.CLOUD_VM_ID,
|
||||
SimSettings.VM_TYPES.CLOUD_VM.ordinal());
|
||||
|
||||
//calculate computational delay in cloud
|
||||
double ComputationDelay = (double)task.getCloudletLength() / (double)SimSettings.getInstance().getMipsForCloud();
|
||||
|
||||
schedule(getId(), ComputationDelay, REQUEST_PROCESSED_BY_CLOUD, task);
|
||||
|
||||
break;
|
||||
}
|
||||
case REQUEST_PROCESSED_BY_CLOUD:
|
||||
{
|
||||
Task task = (Task) ev.getData();
|
||||
|
||||
//SimLogger.printLine(CloudSim.clock() + ": " + getName() + ": Cloudlet " + task.getCloudletId() + " received");
|
||||
double WanDelay = networkModel.getDownloadDelay(SimSettings.CLOUD_DATACENTER_ID, task.getMobileDeviceId(), task.getCloudletOutputSize());
|
||||
if(WanDelay > 0)
|
||||
{
|
||||
Location currentLocation = SimManager.getInstance().getMobilityModel().getLocation(task.getMobileDeviceId(),CloudSim.clock()+WanDelay);
|
||||
if(task.getSubmittedLocation().equals(currentLocation))
|
||||
{
|
||||
networkModel.downloadStarted(task.getSubmittedLocation(), SimSettings.CLOUD_DATACENTER_ID);
|
||||
schedule(getId(), WanDelay, RESPONSE_RECEIVED_BY_MOBILE_DEVICE, task);
|
||||
SimLogger.getInstance().downloadStarted(task.getCloudletId(), WanDelay);
|
||||
}
|
||||
else
|
||||
{
|
||||
//SimLogger.printLine("task cannot be finished due to mobility of user!");
|
||||
//SimLogger.printLine("device: " +task.getMobileDeviceId()+" - submitted " + task.getSubmissionTime() + " @ " + task.getSubmittedLocation().getXPos() + " handled " + CloudSim.clock() + " @ " + currentLocation.getXPos());
|
||||
SimLogger.getInstance().failedDueToMobility(task.getCloudletId(), CloudSim.clock());
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
SimLogger.getInstance().failedDueToBandwidth(task.getCloudletId(), CloudSim.clock());
|
||||
}
|
||||
break;
|
||||
}
|
||||
/*
|
||||
case REQUEST_RECIVED_BY_EDGE_ORCHESTRATOR:
|
||||
{
|
||||
Task task = (Task) ev.getData();
|
||||
double internalDelay = networkModel.getDownloadDelay(
|
||||
SimSettings.EDGE_ORCHESTRATOR_ID,
|
||||
SimSettings.GENERIC_EDGE_DEVICE_ID,
|
||||
task.getCloudletOutputSize());
|
||||
|
||||
networkModel.downloadStarted(
|
||||
SimSettings.EDGE_ORCHESTRATOR_ID,
|
||||
SimSettings.GENERIC_EDGE_DEVICE_ID,
|
||||
task.getCloudletOutputSize());
|
||||
|
||||
submitTaskToEdgeDevice(task,internalDelay);
|
||||
|
||||
break;
|
||||
}
|
||||
*/
|
||||
case REQUEST_RECIVED_BY_EDGE_DEVICE:
|
||||
{
|
||||
Task task = (Task) ev.getData();
|
||||
|
||||
networkModel.uploadFinished(task.getSubmittedLocation(), SimSettings.GENERIC_EDGE_DEVICE_ID);
|
||||
|
||||
submitTaskToEdgeDevice(task,0);
|
||||
|
||||
break;
|
||||
}
|
||||
case RESPONSE_RECEIVED_BY_MOBILE_DEVICE:
|
||||
{
|
||||
Task task = (Task) ev.getData();
|
||||
|
||||
if(task.getAssociatedHostId() == SimSettings.CLOUD_HOST_ID)
|
||||
networkModel.downloadFinished(task.getSubmittedLocation(), SimSettings.CLOUD_DATACENTER_ID);
|
||||
else
|
||||
networkModel.downloadFinished(task.getSubmittedLocation(), SimSettings.GENERIC_EDGE_DEVICE_ID);
|
||||
|
||||
//SimLogger.printLine(CloudSim.clock() + ": " + getName() + ": Cloudlet " + cloudlet.getCloudletId() + " is received");
|
||||
SimLogger.getInstance().downloaded(task.getCloudletId(), CloudSim.clock());
|
||||
break;
|
||||
}
|
||||
default:
|
||||
SimLogger.printLine(getName() + ".processOtherEvent(): " + "Error - event unknown by this DatacenterBroker. Terminating simulation...");
|
||||
System.exit(0);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
public void submitTaskToEdgeDevice(Task task, double delay) {
|
||||
//select a VM
|
||||
EdgeVM selectedVM = SimManager.getInstance().getEdgeOrchestrator().getVmToOffload(task);
|
||||
|
||||
if(selectedVM != null){
|
||||
//save related host id
|
||||
task.setAssociatedHostId(selectedVM.getHost().getId());
|
||||
|
||||
//bind task to related VM
|
||||
getCloudletList().add(task);
|
||||
bindCloudletToVm(task.getCloudletId(),selectedVM.getId());
|
||||
|
||||
//SimLogger.printLine(CloudSim.clock() + ": Cloudlet#" + task.getCloudletId() + " is submitted to VM#" + task.getVmId());
|
||||
schedule(getVmsToDatacentersMap().get(task.getVmId()), delay, CloudSimTags.CLOUDLET_SUBMIT, task);
|
||||
|
||||
SimLogger.getInstance().uploaded(task.getCloudletId(),
|
||||
selectedVM.getHost().getDatacenter().getId(),
|
||||
selectedVM.getHost().getId(),
|
||||
selectedVM.getId(),
|
||||
selectedVM.getVmType().ordinal());
|
||||
}
|
||||
else{
|
||||
//SimLogger.printLine("Task #" + task.getCloudletId() + " cannot assign to any VM");
|
||||
SimLogger.getInstance().rejectedDueToVMCapacity(task.getCloudletId(), CloudSim.clock());
|
||||
}
|
||||
}
|
||||
|
||||
public void submitTask(EdgeTask edgeTask) {
|
||||
NetworkModel networkModel = SimManager.getInstance().getNetworkModel();
|
||||
|
||||
//create a task
|
||||
Task task = createTask(edgeTask);
|
||||
|
||||
Location currentLocation = SimManager.getInstance().getMobilityModel().
|
||||
getLocation(task.getMobileDeviceId(),CloudSim.clock());
|
||||
|
||||
//set location of the mobile device which generates this task
|
||||
task.setSubmittedLocation(currentLocation);
|
||||
|
||||
//add related task to log list
|
||||
SimLogger.getInstance().addLog(CloudSim.clock(),
|
||||
task.getCloudletId(),
|
||||
task.getTaskType().ordinal(),
|
||||
(int)task.getCloudletLength(),
|
||||
(int)task.getCloudletFileSize(),
|
||||
(int)task.getCloudletOutputSize());
|
||||
|
||||
int nextHopId = SimManager.getInstance().getEdgeOrchestrator().getDeviceToOffload(task);
|
||||
|
||||
if(nextHopId == SimSettings.CLOUD_DATACENTER_ID){
|
||||
double WanDelay = networkModel.getUploadDelay(task.getMobileDeviceId(), nextHopId, task.getCloudletFileSize());
|
||||
|
||||
if(WanDelay>0){
|
||||
networkModel.uploadStarted(currentLocation, nextHopId);
|
||||
schedule(getId(), WanDelay, REQUEST_RECEIVED_BY_CLOUD, task);
|
||||
SimLogger.getInstance().uploadStarted(task.getCloudletId(),WanDelay);
|
||||
}
|
||||
else
|
||||
{
|
||||
//SimLogger.printLine("Task #" + task.getCloudletId() + " cannot assign to any VM");
|
||||
SimLogger.getInstance().rejectedDueToBandwidth(
|
||||
task.getCloudletId(),
|
||||
CloudSim.clock(),
|
||||
SimSettings.VM_TYPES.CLOUD_VM.ordinal());
|
||||
}
|
||||
}
|
||||
// else if(nextHopId == SimSettings.EDGE_ORCHESTRATOR_ID){
|
||||
// double WlanDelay = networkModel.getUploadDelay(task.getMobileDeviceId(), nextHopId, task.getCloudletFileSize());
|
||||
//
|
||||
// if(WlanDelay > 0){
|
||||
// networkModel.uploadStarted(task.getMobileDeviceId(), nextHopId, task.getCloudletFileSize());
|
||||
// schedule(getId(), WlanDelay, REQUEST_RECIVED_BY_EDGE_ORCHESTRATOR, task);
|
||||
// SimLogger.getInstance().uploadStarted(task.getCloudletId(),WlanDelay);
|
||||
// }
|
||||
// else {
|
||||
// SimLogger.getInstance().rejectedDueToBandwidth(
|
||||
// task.getCloudletId(),
|
||||
// CloudSim.clock(),
|
||||
// SimSettings.VM_TYPES.EDGE_VM.ordinal());
|
||||
// }
|
||||
// }
|
||||
else if(nextHopId == SimSettings.GENERIC_EDGE_DEVICE_ID) {
|
||||
double WlanDelay = networkModel.getUploadDelay(task.getMobileDeviceId(), nextHopId, task.getCloudletFileSize());
|
||||
|
||||
if(WlanDelay > 0){
|
||||
networkModel.uploadStarted(currentLocation, nextHopId);
|
||||
schedule(getId(), WlanDelay, REQUEST_RECIVED_BY_EDGE_DEVICE, task);
|
||||
SimLogger.getInstance().uploadStarted(task.getCloudletId(),WlanDelay);
|
||||
}
|
||||
else {
|
||||
SimLogger.getInstance().rejectedDueToBandwidth(
|
||||
task.getCloudletId(),
|
||||
CloudSim.clock(),
|
||||
SimSettings.VM_TYPES.EDGE_VM.ordinal());
|
||||
}
|
||||
}
|
||||
else {
|
||||
SimLogger.printLine("Unknown nextHopId! Terminating simulation...");
|
||||
System.exit(0);
|
||||
}
|
||||
}
|
||||
|
||||
public Task createTask(EdgeTask edgeTask){
|
||||
UtilizationModel utilizationModel = new UtilizationModelFull(); /*UtilizationModelStochastic*/
|
||||
UtilizationModel utilizationModelCPU = SimManager.getInstance().getScenarioFactory().getCpuUtilizationModel(edgeTask.taskType);
|
||||
|
||||
Task task = new Task(edgeTask.mobileDeviceId, ++taskIdCounter,
|
||||
edgeTask.length, edgeTask.pesNumber,
|
||||
edgeTask.inputFileSize, edgeTask.outputFileSize,
|
||||
utilizationModelCPU, utilizationModel, utilizationModel);
|
||||
|
||||
//set the owner of this task
|
||||
task.setUserId(this.getId());
|
||||
task.setTaskType(edgeTask.taskType);
|
||||
|
||||
return task;
|
||||
}
|
||||
|
||||
public void taskEnded(){
|
||||
clearDatacenters();
|
||||
finishExecution();
|
||||
}
|
||||
}
|
||||
package edu.boun.edgecloudsim.edge_client;
|
||||
|
||||
import org.cloudbus.cloudsim.DatacenterBroker;
|
||||
import org.cloudbus.cloudsim.UtilizationModel;
|
||||
|
||||
import edu.boun.edgecloudsim.utils.EdgeTask;
|
||||
|
||||
public abstract class MobileDeviceManager extends DatacenterBroker {
|
||||
|
||||
public MobileDeviceManager() throws Exception {
|
||||
super("Global_Broker");
|
||||
}
|
||||
|
||||
/*
|
||||
* initialize mobile device manager if needed
|
||||
*/
|
||||
public abstract void initialize();
|
||||
|
||||
/*
|
||||
* provides abstract CPU Utilization Model
|
||||
*/
|
||||
public abstract UtilizationModel getCpuUtilizationModel();
|
||||
|
||||
public abstract void submitTask(EdgeTask edgeTask);
|
||||
}
|
||||
|
||||
@@ -1,66 +1,83 @@
|
||||
/*
|
||||
* Title: EdgeCloudSim - Task
|
||||
*
|
||||
* Description:
|
||||
* Task adds app type, task submission location, mobile device id and host id
|
||||
* information to CloudSim's Cloudlet class.
|
||||
*
|
||||
* Licence: GPL - http://www.gnu.org/copyleft/gpl.html
|
||||
* Copyright (c) 2017, Bogazici University, Istanbul, Turkey
|
||||
*/
|
||||
|
||||
package edu.boun.edgecloudsim.edge_client;
|
||||
|
||||
import org.cloudbus.cloudsim.Cloudlet;
|
||||
import org.cloudbus.cloudsim.UtilizationModel;
|
||||
|
||||
import edu.boun.edgecloudsim.core.SimSettings;
|
||||
import edu.boun.edgecloudsim.utils.Location;
|
||||
|
||||
public class Task extends Cloudlet {
|
||||
private SimSettings.APP_TYPES type;
|
||||
private Location submittedLocation;
|
||||
private int mobileDeviceId;
|
||||
private int hostIndex;
|
||||
|
||||
public Task(int _mobileDeviceId, int cloudletId, long cloudletLength, int pesNumber,
|
||||
long cloudletFileSize, long cloudletOutputSize,
|
||||
UtilizationModel utilizationModelCpu,
|
||||
UtilizationModel utilizationModelRam,
|
||||
UtilizationModel utilizationModelBw) {
|
||||
super(cloudletId, cloudletLength, pesNumber, cloudletFileSize,
|
||||
cloudletOutputSize, utilizationModelCpu, utilizationModelRam,
|
||||
utilizationModelBw);
|
||||
|
||||
mobileDeviceId = _mobileDeviceId;
|
||||
}
|
||||
|
||||
|
||||
public void setSubmittedLocation(Location _submittedLocation){
|
||||
submittedLocation =_submittedLocation;
|
||||
}
|
||||
|
||||
public void setAssociatedHostId(int _hostIndex){
|
||||
hostIndex=_hostIndex;
|
||||
}
|
||||
|
||||
public void setTaskType(SimSettings.APP_TYPES _type){
|
||||
type=_type;
|
||||
}
|
||||
|
||||
public int getMobileDeviceId(){
|
||||
return mobileDeviceId;
|
||||
}
|
||||
|
||||
public Location getSubmittedLocation(){
|
||||
return submittedLocation;
|
||||
}
|
||||
|
||||
public int getAssociatedHostId(){
|
||||
return hostIndex;
|
||||
}
|
||||
|
||||
public SimSettings.APP_TYPES getTaskType(){
|
||||
return type;
|
||||
}
|
||||
}
|
||||
/*
|
||||
* Title: EdgeCloudSim - Task
|
||||
*
|
||||
* Description:
|
||||
* Task adds app type, task submission location, mobile device id and host id
|
||||
* information to CloudSim's Cloudlet class.
|
||||
*
|
||||
* Licence: GPL - http://www.gnu.org/copyleft/gpl.html
|
||||
* Copyright (c) 2017, Bogazici University, Istanbul, Turkey
|
||||
*/
|
||||
|
||||
package edu.boun.edgecloudsim.edge_client;
|
||||
|
||||
import org.cloudbus.cloudsim.Cloudlet;
|
||||
import org.cloudbus.cloudsim.UtilizationModel;
|
||||
|
||||
import edu.boun.edgecloudsim.utils.Location;
|
||||
|
||||
public class Task extends Cloudlet {
|
||||
private Location submittedLocation;
|
||||
private int type;
|
||||
private int mobileDeviceId;
|
||||
private int hostIndex;
|
||||
private int vmIndex;
|
||||
private int datacenterId;
|
||||
|
||||
public Task(int _mobileDeviceId, int cloudletId, long cloudletLength, int pesNumber,
|
||||
long cloudletFileSize, long cloudletOutputSize,
|
||||
UtilizationModel utilizationModelCpu,
|
||||
UtilizationModel utilizationModelRam,
|
||||
UtilizationModel utilizationModelBw) {
|
||||
super(cloudletId, cloudletLength, pesNumber, cloudletFileSize,
|
||||
cloudletOutputSize, utilizationModelCpu, utilizationModelRam,
|
||||
utilizationModelBw);
|
||||
|
||||
mobileDeviceId = _mobileDeviceId;
|
||||
}
|
||||
|
||||
|
||||
public void setSubmittedLocation(Location _submittedLocation){
|
||||
submittedLocation =_submittedLocation;
|
||||
}
|
||||
|
||||
public void setAssociatedDatacenterId(int _datacenterId){
|
||||
datacenterId=_datacenterId;
|
||||
}
|
||||
|
||||
public void setAssociatedHostId(int _hostIndex){
|
||||
hostIndex=_hostIndex;
|
||||
}
|
||||
|
||||
public void setAssociatedVmId(int _vmIndex){
|
||||
vmIndex=_vmIndex;
|
||||
}
|
||||
|
||||
public void setTaskType(int _type){
|
||||
type=_type;
|
||||
}
|
||||
|
||||
public int getMobileDeviceId(){
|
||||
return mobileDeviceId;
|
||||
}
|
||||
|
||||
public Location getSubmittedLocation(){
|
||||
return submittedLocation;
|
||||
}
|
||||
|
||||
public int getAssociatedDatacenterId(){
|
||||
return datacenterId;
|
||||
}
|
||||
|
||||
public int getAssociatedHostId(){
|
||||
return hostIndex;
|
||||
}
|
||||
|
||||
public int getAssociatedVmId(){
|
||||
return vmIndex;
|
||||
}
|
||||
|
||||
public int getTaskType(){
|
||||
return type;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user