The mobile processing units are simulated via CloudSim. It is assumed that the mobile devices operate Hosts and VMs like a server. Therefore, the classes located in the mobile_processing_unit package have a similar naming convention to the other Cloud and Edge components.
125 lines
4.1 KiB
Java
125 lines
4.1 KiB
Java
/*
|
|
* Title: EdgeCloudSim - Edge Orchestrator
|
|
*
|
|
* Description:
|
|
* SampleEdgeOrchestrator offloads tasks to proper server
|
|
* In this scenario mobile devices can also execute tasks
|
|
*
|
|
* Licence: GPL - http://www.gnu.org/copyleft/gpl.html
|
|
* Copyright (c) 2017, Bogazici University, Istanbul, Turkey
|
|
*/
|
|
|
|
package edu.boun.edgecloudsim.applications.sample_app3;
|
|
|
|
import java.util.List;
|
|
|
|
import org.cloudbus.cloudsim.Vm;
|
|
import org.cloudbus.cloudsim.core.CloudSim;
|
|
import org.cloudbus.cloudsim.core.SimEvent;
|
|
|
|
import edu.boun.edgecloudsim.core.SimManager;
|
|
import edu.boun.edgecloudsim.core.SimSettings;
|
|
import edu.boun.edgecloudsim.edge_orchestrator.EdgeOrchestrator;
|
|
import edu.boun.edgecloudsim.edge_server.EdgeVM;
|
|
import edu.boun.edgecloudsim.edge_client.CpuUtilizationModel_Custom;
|
|
import edu.boun.edgecloudsim.edge_client.Task;
|
|
import edu.boun.edgecloudsim.edge_client.mobile_processing_unit.MobileVM;
|
|
import edu.boun.edgecloudsim.utils.SimLogger;
|
|
|
|
public class SampleEdgeOrchestrator extends EdgeOrchestrator {
|
|
|
|
private int numberOfHost; //used by load balancer
|
|
|
|
public SampleEdgeOrchestrator(String _policy, String _simScenario) {
|
|
super(_policy, _simScenario);
|
|
}
|
|
|
|
@Override
|
|
public void initialize() {
|
|
numberOfHost=SimSettings.getInstance().getNumOfEdgeHosts();
|
|
}
|
|
|
|
/*
|
|
* (non-Javadoc)
|
|
* @see edu.boun.edgecloudsim.edge_orchestrator.EdgeOrchestrator#getDeviceToOffload(edu.boun.edgecloudsim.edge_client.Task)
|
|
*
|
|
*/
|
|
@Override
|
|
public int getDeviceToOffload(Task task) {
|
|
int result = 0;
|
|
|
|
if(policy.equals("ONLY_EDGE")){
|
|
result = SimSettings.GENERIC_EDGE_DEVICE_ID;
|
|
}
|
|
else if(policy.equals("ONLY_MOBILE")){
|
|
result = SimSettings.MOBILE_DATACENTER_ID;
|
|
}
|
|
else if(policy.equals("HYBRID")){
|
|
List<MobileVM> vmArray = SimManager.getInstance().getMobileServerManager().getVmList(task.getMobileDeviceId());
|
|
double requiredCapacity = ((CpuUtilizationModel_Custom)task.getUtilizationModelCpu()).predictUtilization(vmArray.get(0).getVmType());
|
|
double targetVmCapacity = (double) 100 - vmArray.get(0).getCloudletScheduler().getTotalUtilizationOfCpu(CloudSim.clock());
|
|
|
|
if (requiredCapacity <= targetVmCapacity)
|
|
result = SimSettings.MOBILE_DATACENTER_ID;
|
|
else
|
|
result = SimSettings.GENERIC_EDGE_DEVICE_ID;
|
|
}
|
|
else {
|
|
SimLogger.printLine("Unknow edge orchestrator policy! Terminating simulation...");
|
|
System.exit(0);
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
@Override
|
|
public Vm getVmToOffload(Task task, int deviceId) {
|
|
Vm selectedVM = null;
|
|
|
|
if (deviceId == SimSettings.MOBILE_DATACENTER_ID) {
|
|
List<MobileVM> vmArray = SimManager.getInstance().getMobileServerManager().getVmList(task.getMobileDeviceId());
|
|
double requiredCapacity = ((CpuUtilizationModel_Custom)task.getUtilizationModelCpu()).predictUtilization(vmArray.get(0).getVmType());
|
|
double targetVmCapacity = (double) 100 - vmArray.get(0).getCloudletScheduler().getTotalUtilizationOfCpu(CloudSim.clock());
|
|
|
|
if (requiredCapacity <= targetVmCapacity)
|
|
selectedVM = vmArray.get(0);
|
|
}
|
|
else if(deviceId == SimSettings.GENERIC_EDGE_DEVICE_ID){
|
|
//Select VM on edge devices via Least Loaded algorithm!
|
|
double selectedVmCapacity = 0; //start with min value
|
|
for(int hostIndex=0; hostIndex<numberOfHost; hostIndex++){
|
|
List<EdgeVM> vmArray = SimManager.getInstance().getEdgeServerManager().getVmList(hostIndex);
|
|
for(int vmIndex=0; vmIndex<vmArray.size(); vmIndex++){
|
|
double requiredCapacity = ((CpuUtilizationModel_Custom)task.getUtilizationModelCpu()).predictUtilization(vmArray.get(vmIndex).getVmType());
|
|
double targetVmCapacity = (double)100 - vmArray.get(vmIndex).getCloudletScheduler().getTotalUtilizationOfCpu(CloudSim.clock());
|
|
if(requiredCapacity <= targetVmCapacity && targetVmCapacity > selectedVmCapacity){
|
|
selectedVM = vmArray.get(vmIndex);
|
|
selectedVmCapacity = targetVmCapacity;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else{
|
|
SimLogger.printLine("Unknown device id! The simulation has been terminated.");
|
|
System.exit(0);
|
|
}
|
|
|
|
return selectedVM;
|
|
}
|
|
|
|
@Override
|
|
public void processEvent(SimEvent arg0) {
|
|
// Nothing to do!
|
|
}
|
|
|
|
@Override
|
|
public void shutdownEntity() {
|
|
// Nothing to do!
|
|
}
|
|
|
|
@Override
|
|
public void startEntity() {
|
|
// Nothing to do!
|
|
}
|
|
|
|
} |