this is as good as it gets

This commit is contained in:
Torma Kristóf 2021-04-06 02:45:33 +02:00
parent 8d8bbbf0ae
commit 732f3724b0
22 changed files with 79 additions and 60 deletions

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -6,6 +6,7 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import org.apache.commons.math3.util.Pair; import org.apache.commons.math3.util.Pair;
import org.cloudbus.cloudsim.Log;
import org.cloudbus.cloudsim.core.CloudSim; import org.cloudbus.cloudsim.core.CloudSim;
import org.fog.application.AppEdge; import org.fog.application.AppEdge;
import org.fog.application.AppModule; import org.fog.application.AppModule;
@ -220,6 +221,8 @@ public class ModulePlacementEdgewards extends ModulePlacement{
// FINDING OUT WHETHER PLACEMENT OF OPERATOR ON DEVICE IS POSSIBLE // FINDING OUT WHETHER PLACEMENT OF OPERATOR ON DEVICE IS POSSIBLE
for(AppEdge edge : getApplication().getEdges()){ // take all incoming edges for(AppEdge edge : getApplication().getEdges()){ // take all incoming edges
if(edge.getDestination().equals(moduleName)){ if(edge.getDestination().equals(moduleName)){
Log.printLine(moduleName);
Log.printLine(edge.getDestination());
double rate = appEdgeToRate.get(edge); double rate = appEdgeToRate.get(edge);
totalCpuLoad += rate*edge.getTupleCpuLength(); totalCpuLoad += rate*edge.getTupleCpuLength();
} }

View File

@ -74,15 +74,15 @@ public class Birbnetes {
application.addAppModule("MainModule", 120); application.addAppModule("MainModule", 120);
application.addAppModule("StorageModule", 120); application.addAppModule("StorageModule", 120);
application.addAppEdge("Sensor", "ClientModule", 50, 8800, application.addAppEdge("Sensor", "ClientModule", 4500, 8800,
"Sensor", Tuple.UP, AppEdge.SENSOR); "Sensor", Tuple.UP, AppEdge.SENSOR);
application.addAppEdge("ClientModule", "MainModule", 100, application.addAppEdge("ClientModule", "MainModule", 3000,
1000, "PreProcessedData", Tuple.UP, AppEdge.MODULE); 1000, "PreProcessedData", Tuple.UP, AppEdge.MODULE);
application.addAppEdge("ClientModule", "StorageModule", 10, application.addAppEdge("ClientModule", "StorageModule", 2500,
8800, "StoreData", Tuple.UP, AppEdge.MODULE); 8800, "StoreData", Tuple.UP, AppEdge.MODULE);
application.addAppEdge("MainModule", "ClientModule", 200, application.addAppEdge("MainModule", "ClientModule", 2000,
1000, "ProcessedData", Tuple.DOWN, AppEdge.MODULE); 1000, "ProcessedData", Tuple.DOWN, AppEdge.MODULE);
application.addAppEdge("ClientModule", "Actuators", 50, 1000, application.addAppEdge("ClientModule", "Actuators", 6000, 1000,
"OutputData", Tuple.DOWN, AppEdge.ACTUATOR); "OutputData", Tuple.DOWN, AppEdge.ACTUATOR);
application.addTupleMapping("ClientModule", "Sensor", "PreProcessedData", new FractionalSelectivity(1.0)); application.addTupleMapping("ClientModule", "Sensor", "PreProcessedData", new FractionalSelectivity(1.0));
@ -93,15 +93,27 @@ public class Birbnetes {
"OutputData", new FractionalSelectivity(1.0)); "OutputData", new FractionalSelectivity(1.0));
final AppLoop loop1 = new AppLoop(new ArrayList<>() {{ final AppLoop loop1 = new AppLoop(new ArrayList<>() {{
add("Sensor");
add("ClientModule"); add("ClientModule");
add("StorageModule"); add("StorageModule");
}});
final AppLoop loop2 = new AppLoop(new ArrayList<>() {{
add("ClientModule");
add("MainModule");
add("ClientModule");
}});
final AppLoop loop3 = new AppLoop(new ArrayList<>() {{
add("ClientModule");
add("MainModule");
}});
final AppLoop loop4 = new AppLoop(new ArrayList<>() {{
add("MainModule"); add("MainModule");
add("ClientModule"); add("ClientModule");
add("Actuator");
}}); }});
List<AppLoop> loops = new ArrayList<>() {{ List<AppLoop> loops = new ArrayList<>() {{
add(loop1); add(loop1);
add(loop2);
add(loop3);
add(loop4);
}}; }};
application.setLoops(loops); application.setLoops(loops);
return application; return application;
@ -114,7 +126,7 @@ public class Birbnetes {
Sensor sensor = new Sensor("s-" + id, "Sensor", brokerId, appId, new DeterministicDistribution(getValue(5.00))); Sensor sensor = new Sensor("s-" + id, "Sensor", brokerId, appId, new DeterministicDistribution(getValue(5.00)));
sensors.add(sensor); sensors.add(sensor);
Actuator actuator = new Actuator("a-" + id, brokerId, appId, Actuator actuator = new Actuator("a-" + id, brokerId, appId,
"OutputData"); "Actuators");
actuators.add(actuator); actuators.add(actuator);
sensor.setGatewayDeviceId(lowLevelFogDevice.getId()); sensor.setGatewayDeviceId(lowLevelFogDevice.getId());
sensor.setLatency(10.0); sensor.setLatency(10.0);

View File

@ -36,27 +36,25 @@ import java.util.List;
* *
*/ */
public class Birbnetes_copyofdcnsfog { public class Birbnetes_copyofdcnsfog {
static List<FogDevice> fogDevices = new ArrayList<FogDevice>(); static List<FogDevice> fogDevices = new ArrayList<>();
static List<Sensor> sensors = new ArrayList<Sensor>(); static List<Sensor> sensors = new ArrayList<>();
static List<Actuator> actuators = new ArrayList<Actuator>(); static List<Actuator> actuators = new ArrayList<>();
static int numOfAreas = 1; static int numOfAreas = 1;
static int numOfCamerasPerArea = 4; static int numOfClientsPerArea = 4;
private static boolean CLOUD = false;
public static void main(String[] args) { public static void main(String[] args) {
Log.printLine("Starting DCNS..."); Log.printLine("Starting birbnetes...");
try { try {
Log.disable(); //Log.disable();
int num_user = 1; // number of cloud users int num_user = 1; // number of cloud users
Calendar calendar = Calendar.getInstance(); Calendar calendar = Calendar.getInstance();
boolean trace_flag = false; // mean trace events boolean trace_flag = false; // mean trace events
CloudSim.init(num_user, calendar, trace_flag); CloudSim.init(num_user, calendar, trace_flag);
String appId = "dcns"; // identifier of the application String appId = "birbnetes"; // identifier of the application
FogBroker broker = new FogBroker("broker"); FogBroker broker = new FogBroker("broker");
@ -65,19 +63,20 @@ public class Birbnetes_copyofdcnsfog {
createFogDevices(broker.getId(), appId); createFogDevices(broker.getId(), appId);
Controller controller = null; Controller controller;
ModuleMapping moduleMapping = ModuleMapping.createModuleMapping(); // initializing a module mapping ModuleMapping moduleMapping = ModuleMapping.createModuleMapping(); // initializing a module mapping
for(FogDevice device : fogDevices){ for(FogDevice device : fogDevices){
if(device.getName().startsWith("m")){ // names of all Smart Cameras start with 'm' if(device.getName().startsWith("m")){ // names of all Smart Cameras start with 'm'
moduleMapping.addModuleToDevice("motion_detector", device.getName()); // fixing 1 instance of the Motion Detector module to each Smart Camera moduleMapping.addModuleToDevice("input_svc", device.getName()); // fixing 1 instance of the Motion Detector module to each Smart Camera
} }
} }
moduleMapping.addModuleToDevice("user_interface", "cloud"); // fixing instances of User Interface module in the Cloud moduleMapping.addModuleToDevice("alert_svc", "cloud"); // fixing instances of User Interface module in the Cloud
boolean CLOUD = false;
if(CLOUD){ if(CLOUD){
// if the mode of deployment is cloud-based // if the mode of deployment is cloud-based
moduleMapping.addModuleToDevice("object_detector", "cloud"); // placing all instances of Object Detector module in the Cloud moduleMapping.addModuleToDevice("detector_svc", "cloud"); // placing all instances of Object Detector module in the Cloud
moduleMapping.addModuleToDevice("object_tracker", "cloud"); // placing all instances of Object Tracker module in the Cloud moduleMapping.addModuleToDevice("storage_svc", "cloud"); // placing all instances of Object Tracker module in the Cloud
} }
controller = new Controller("master-controller", fogDevices, sensors, controller = new Controller("master-controller", fogDevices, sensors,
@ -93,7 +92,7 @@ public class Birbnetes_copyofdcnsfog {
CloudSim.stopSimulation(); CloudSim.stopSimulation();
Log.printLine("VRGame finished!"); Log.printLine("birbnetes finished!");
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
Log.printLine("Unwanted errors happen"); Log.printLine("Unwanted errors happen");
@ -102,8 +101,8 @@ public class Birbnetes_copyofdcnsfog {
/** /**
* Creates the fog devices in the physical topology of the simulation. * Creates the fog devices in the physical topology of the simulation.
* @param userId * @param userId id of user/broker
* @param appId * @param appId id of app
*/ */
private static void createFogDevices(int userId, String appId) { private static void createFogDevices(int userId, String appId) {
FogDevice cloud = createFogDevice("cloud", 44800, 40000, 100, 10000, 0, 0.01, 16*103, 16*83.25); FogDevice cloud = createFogDevice("cloud", 44800, 40000, 100, 10000, 0, 0.01, 16*103, 16*83.25);
@ -118,26 +117,25 @@ public class Birbnetes_copyofdcnsfog {
} }
} }
private static FogDevice addArea(String id, int userId, String appId, int parentId){ private static void addArea(String id, int userId, String appId, int parentId){
FogDevice router = createFogDevice("d-"+id, 2800, 4000, 10000, 10000, 1, 0.0, 107.339, 83.4333); FogDevice router = createFogDevice("d-"+id, 2800, 4000, 10000, 10000, 1, 0.0, 107.339, 83.4333);
fogDevices.add(router); fogDevices.add(router);
router.setUplinkLatency(2); // latency of connection between router and proxy server is 2 ms router.setUplinkLatency(2); // latency of connection between router and proxy server is 2 ms
for(int i=0;i<numOfCamerasPerArea;i++){ for(int i = 0; i< numOfClientsPerArea; i++){
String mobileId = id+"-"+i; String mobileId = id+"-"+i;
FogDevice camera = addCamera(mobileId, userId, appId, router.getId()); // adding a smart camera to the physical topology. Smart cameras have been modeled as fog devices as well. FogDevice client = addClient(mobileId, userId, appId, router.getId()); // adding a smart camera to the physical topology. Smart cameras have been modeled as fog devices as well.
camera.setUplinkLatency(2); // latency of connection between camera and router is 2 ms client.setUplinkLatency(2); // latency of connection between camera and router is 2 ms
fogDevices.add(camera); fogDevices.add(client);
} }
router.setParentId(parentId); router.setParentId(parentId);
return router;
} }
private static FogDevice addCamera(String id, int userId, String appId, int parentId){ private static FogDevice addClient(String id, int userId, String appId, int parentId){
FogDevice camera = createFogDevice("m-"+id, 500, 1000, 10000, 10000, 3, 0, 87.53, 82.44); FogDevice camera = createFogDevice("m-"+id, 500, 1000, 10000, 10000, 3, 0, 87.53, 82.44);
camera.setParentId(parentId); camera.setParentId(parentId);
Sensor sensor = new Sensor("s-"+id, "CAMERA", userId, appId, new DeterministicDistribution(5)); // inter-transmission time of camera (sensor) follows a deterministic distribution Sensor sensor = new Sensor("s-"+id, "SOUND", userId, appId, new DeterministicDistribution(5)); // inter-transmission time of camera (sensor) follows a deterministic distribution
sensors.add(sensor); sensors.add(sensor);
Actuator ptz = new Actuator("ptz-"+id, userId, appId, "PTZ_CONTROL"); Actuator ptz = new Actuator("mqtt-"+id, userId, appId, "MQTT_CONTROL");
actuators.add(ptz); actuators.add(ptz);
sensor.setGatewayDeviceId(camera.getId()); sensor.setGatewayDeviceId(camera.getId());
sensor.setLatency(1.0); // latency of connection between camera (sensor) and the parent Smart Camera is 1 ms sensor.setLatency(1.0); // latency of connection between camera (sensor) and the parent Smart Camera is 1 ms
@ -155,14 +153,14 @@ public class Birbnetes_copyofdcnsfog {
* @param downBw downlink bandwidth * @param downBw downlink bandwidth
* @param level hierarchy level of the device * @param level hierarchy level of the device
* @param ratePerMips cost rate per MIPS used * @param ratePerMips cost rate per MIPS used
* @param busyPower * @param busyPower power consumption while busy
* @param idlePower * @param idlePower power consumption at idle
* @return * @return fogdevice
*/ */
private static FogDevice createFogDevice(String nodeName, long mips, private static FogDevice createFogDevice(String nodeName, long mips,
int ram, long upBw, long downBw, int level, double ratePerMips, double busyPower, double idlePower) { int ram, long upBw, long downBw, int level, double ratePerMips, double busyPower, double idlePower) {
List<Pe> peList = new ArrayList<Pe>(); List<Pe> peList = new ArrayList<>();
// 3. Create PEs and add these into a list. // 3. Create PEs and add these into a list.
peList.add(new Pe(0, new PeProvisionerOverbooking(mips))); // need to store Pe id and MIPS Rating peList.add(new Pe(0, new PeProvisionerOverbooking(mips))); // need to store Pe id and MIPS Rating
@ -181,7 +179,7 @@ public class Birbnetes_copyofdcnsfog {
new FogLinearPowerModel(busyPower, idlePower) new FogLinearPowerModel(busyPower, idlePower)
); );
List<Host> hostList = new ArrayList<Host>(); List<Host> hostList = new ArrayList<>();
hostList.add(host); hostList.add(host);
String arch = "x86"; // system architecture String arch = "x86"; // system architecture
@ -193,7 +191,7 @@ public class Birbnetes_copyofdcnsfog {
double costPerStorage = 0.001; // the cost of using storage in this double costPerStorage = 0.001; // the cost of using storage in this
// resource // resource
double costPerBw = 0.0; // the cost of using bw in this resource double costPerBw = 0.0; // the cost of using bw in this resource
LinkedList<Storage> storageList = new LinkedList<Storage>(); // we are not adding SAN LinkedList<Storage> storageList = new LinkedList<>(); // we are not adding SAN
// devices by now // devices by now
FogDeviceCharacteristics characteristics = new FogDeviceCharacteristics( FogDeviceCharacteristics characteristics = new FogDeviceCharacteristics(
@ -208,6 +206,7 @@ public class Birbnetes_copyofdcnsfog {
e.printStackTrace(); e.printStackTrace();
} }
assert fogdevice != null;
fogdevice.setLevel(level); fogdevice.setLevel(level);
return fogdevice; return fogdevice;
} }
@ -216,43 +215,48 @@ public class Birbnetes_copyofdcnsfog {
* Function to create the Intelligent Surveillance application in the DDF model. * Function to create the Intelligent Surveillance application in the DDF model.
* @param appId unique identifier of the application * @param appId unique identifier of the application
* @param userId identifier of the user of the application * @param userId identifier of the user of the application
* @return * @return application
*/ */
@SuppressWarnings({"serial" })
private static Application createApplication(String appId, int userId){ private static Application createApplication(String appId, int userId){
Application application = Application.createApplication(appId, userId); Application application = Application.createApplication(appId, userId);
/* /*
* Adding modules (vertices) to the application model (directed graph) * Adding modules (vertices) to the application model (directed graph)
*/ */
application.addAppModule("object_detector", 10); application.addAppModule("input_svc", 10);
application.addAppModule("motion_detector", 10); application.addAppModule("detector_svc", 10);
application.addAppModule("object_tracker", 10); application.addAppModule("storage_svc", 10);
application.addAppModule("user_interface", 10); application.addAppModule("alert_svc", 10);
/* /*
* Connecting the application modules (vertices) in the application model (directed graph) with edges * Connecting the application modules (vertices) in the application model (directed graph) with edges
*/ */
application.addAppEdge("CAMERA", "motion_detector", 1000, 20000, "CAMERA", Tuple.UP, AppEdge.SENSOR); // adding edge from CAMERA (sensor) to Motion Detector module carrying tuples of type CAMERA application.addAppEdge("SOUND", "input_svc", 1000, 20000, "SOUND", Tuple.UP, AppEdge.SENSOR); // adding edge from CAMERA (sensor) to Motion Detector module carrying tuples of type CAMERA
application.addAppEdge("motion_detector", "object_detector", 2000, 2000, "MOTION_VIDEO_STREAM", Tuple.UP, AppEdge.MODULE); // adding edge from Motion Detector to Object Detector module carrying tuples of type MOTION_VIDEO_STREAM application.addAppEdge("input_svc", "detector_svc", 2000, 2000, "DATA", Tuple.UP, AppEdge.MODULE); // adding edge from Motion Detector to Object Detector module carrying tuples of type MOTION_VIDEO_STREAM
application.addAppEdge("object_detector", "user_interface", 500, 2000, "DETECTED_OBJECT", Tuple.UP, AppEdge.MODULE); // adding edge from Object Detector to User Interface module carrying tuples of type DETECTED_OBJECT application.addAppEdge("detector_svc", "storage_svc", 500, 2000, "STORAGE_DATA", Tuple.UP, AppEdge.MODULE); // adding edge from Object Detector to User Interface module carrying tuples of type DETECTED_OBJECT
application.addAppEdge("object_detector", "object_tracker", 1000, 100, "OBJECT_LOCATION", Tuple.UP, AppEdge.MODULE); // adding edge from Object Detector to Object Tracker module carrying tuples of type OBJECT_LOCATION application.addAppEdge("detector_svc", "alert_svc", 1000, 100, "SMALL_DATA", Tuple.UP, AppEdge.MODULE); // adding edge from Object Detector to Object Tracker module carrying tuples of type OBJECT_LOCATION
application.addAppEdge("object_tracker", "PTZ_CONTROL", 100, 28, 100, "PTZ_PARAMS", Tuple.DOWN, AppEdge.ACTUATOR); // adding edge from Object Tracker to PTZ CONTROL (actuator) carrying tuples of type PTZ_PARAMS application.addAppEdge("alert_svc", "MQTT_CONTROL", 100, 28, 100, "MQTT_DATA", Tuple.DOWN, AppEdge.ACTUATOR); // adding edge from Object Tracker to PTZ CONTROL (actuator) carrying tuples of type PTZ_PARAMS
/* /*
* Defining the input-output relationships (represented by selectivity) of the application modules. * Defining the input-output relationships (represented by selectivity) of the application modules.
*/ */
application.addTupleMapping("motion_detector", "CAMERA", "MOTION_VIDEO_STREAM", new FractionalSelectivity(1.0)); // 1.0 tuples of type MOTION_VIDEO_STREAM are emitted by Motion Detector module per incoming tuple of type CAMERA application.addTupleMapping("input_svc", "SOUND", "DATA", new FractionalSelectivity(1.0)); // 1.0 tuples of type MOTION_VIDEO_STREAM are emitted by Motion Detector module per incoming tuple of type CAMERA
application.addTupleMapping("object_detector", "MOTION_VIDEO_STREAM", "OBJECT_LOCATION", new FractionalSelectivity(1.0)); // 1.0 tuples of type OBJECT_LOCATION are emitted by Object Detector module per incoming tuple of type MOTION_VIDEO_STREAM application.addTupleMapping("detector_svc", "DATA", "SMALL_DATA", new FractionalSelectivity(1.0)); // 1.0 tuples of type OBJECT_LOCATION are emitted by Object Detector module per incoming tuple of type MOTION_VIDEO_STREAM
application.addTupleMapping("object_detector", "MOTION_VIDEO_STREAM", "DETECTED_OBJECT", new FractionalSelectivity(0.05)); // 0.05 tuples of type MOTION_VIDEO_STREAM are emitted by Object Detector module per incoming tuple of type MOTION_VIDEO_STREAM application.addTupleMapping("detector_svc", "DATA", "STORAGE_DATA", new FractionalSelectivity(1.0)); // 1.0 tuples of type OBJECT_LOCATION are emitted by Object Detector module per incoming tuple of type MOTION_VIDEO_STREAM
application.addTupleMapping("alert_svc", "SMALL_DATA", "MQTT_DATA", new FractionalSelectivity(1.0));
/* /*
* Defining application loops (maybe incomplete loops) to monitor the latency of. * Defining application loops (maybe incomplete loops) to monitor the latency of.
* Here, we add two loops for monitoring : Motion Detector -> Object Detector -> Object Tracker and Object Tracker -> PTZ Control * Here, we add two loops for monitoring : Motion Detector -> Object Detector -> Object Tracker and Object Tracker -> PTZ Control
*/ */
final AppLoop loop1 = new AppLoop(new ArrayList<String>(){{add("motion_detector");add("object_detector");add("object_tracker");}}); final AppLoop loop1 = new AppLoop(new ArrayList<>(){{add("input_svc");add("detector_svc");add("alert_svc");}});
final AppLoop loop2 = new AppLoop(new ArrayList<String>(){{add("object_tracker");add("PTZ_CONTROL");}}); final AppLoop loop2 = new AppLoop(new ArrayList<>(){{add("input_svc");add("detector_svc");add("storage_svc");}});
List<AppLoop> loops = new ArrayList<AppLoop>(){{add(loop1);add(loop2);}}; final AppLoop loop3 = new AppLoop(new ArrayList<>(){{add("alert_svc");add("MQTT_CONTROL");}});
final AppLoop loop4 = new AppLoop(new ArrayList<>(){{add("SOUND");add("input_svc");}});
final AppLoop loop5 = new AppLoop(new ArrayList<>(){{add("input_svc");add("detector_svc");}});
final AppLoop loop6 = new AppLoop(new ArrayList<>(){{add("detector_svc");add("storage_svc");}});
final AppLoop loop7 = new AppLoop(new ArrayList<>(){{add("detector_svc");add("alert_svc");}});
List<AppLoop> loops = new ArrayList<>(){{add(loop1);add(loop2);add(loop3);add(loop4);add(loop5);add(loop6);add(loop7);}};
application.setLoops(loops); application.setLoops(loops);
return application; return application;