diff --git a/scripts/birbnetes/.gitignore b/scripts/birbnetes/.gitignore
new file mode 100644
index 0000000..53752db
--- /dev/null
+++ b/scripts/birbnetes/.gitignore
@@ -0,0 +1 @@
+output
diff --git a/scripts/birbnetes/compile.sh b/scripts/birbnetes/compile.sh
new file mode 100644
index 0000000..aa3cedd
--- /dev/null
+++ b/scripts/birbnetes/compile.sh
@@ -0,0 +1,4 @@
+#!/bin/sh
+rm -rf ../../bin
+mkdir ../../bin
+javac -classpath "../../lib/cloudsim-4.0.jar:../../lib/commons-math3-3.6.1.jar:../../lib/colt.jar" -sourcepath ../../src ../../src/edu/boun/edgecloudsim/applications/birbnetes/MainApp.java -d ../../bin
diff --git a/scripts/birbnetes/config/applications.xml b/scripts/birbnetes/config/applications.xml
new file mode 100644
index 0000000..f7ac597
--- /dev/null
+++ b/scripts/birbnetes/config/applications.xml
@@ -0,0 +1,18 @@
+
+
+
+ 100
+ 1
+ 7
+ 0
+ 2
+ 20
+ 88
+ 2
+ 750
+ 1
+ 4
+ 20
+ 5
+
+
\ No newline at end of file
diff --git a/scripts/birbnetes/config/default_config.properties b/scripts/birbnetes/config/default_config.properties
new file mode 100644
index 0000000..43d7ed5
--- /dev/null
+++ b/scripts/birbnetes/config/default_config.properties
@@ -0,0 +1,42 @@
+#default config file
+simulation_time=30
+warm_up_period=3
+vm_load_check_interval=0.1
+location_check_interval=0.1
+file_log_enabled=true
+deep_file_log_enabled=false
+
+min_number_of_mobile_devices=100
+max_number_of_mobile_devices=1000
+mobile_device_counter_size=100
+
+wan_propagation_delay=0.1
+lan_internal_delay=0.005
+wlan_bandwidth=200
+wan_bandwidth=15
+gsm_bandwidth=0
+
+#all the host on cloud runs on a single datacenter
+number_of_host_on_cloud_datacenter=1
+number_of_vm_on_cloud_host=4
+core_for_cloud_vm=4
+mips_for_cloud_vm=10000
+ram_for_cloud_vm=32000
+storage_for_cloud_vm=1000000
+
+#mobile devices has no processing unit in this scenario
+core_for_mobile_vm=4
+mips_for_mobile_vm=1000
+ram_for_mobile_vm=4000
+storage_for_mobile_vm=16000
+
+#use ',' for multiple values
+orchestrator_policies=NEXT_FIT
+
+#use ',' for multiple values
+simulation_scenarios=SINGLE_TIER,TWO_TIER,TWO_TIER_WITH_EO
+
+#mean waiting time in seconds
+attractiveness_L1_mean_waiting_time=500
+attractiveness_L2_mean_waiting_time=300
+attractiveness_L3_mean_waiting_time=120
diff --git a/scripts/birbnetes/config/edge_devices.xml b/scripts/birbnetes/config/edge_devices.xml
new file mode 100644
index 0000000..6daa000
--- /dev/null
+++ b/scripts/birbnetes/config/edge_devices.xml
@@ -0,0 +1,71 @@
+
+
+
+ 0.1
+ 3.0
+ 0.05
+ 0.1
+
+ 1
+ 1
+ 0
+ 0
+
+
+
+ 8
+ 4000
+ 8000
+ 200000
+
+
+ 2
+ 1000
+ 2000
+ 50000
+
+
+ 2
+ 1000
+ 2000
+ 50000
+
+
+
+
+
+
+ 0.1
+ 3.0
+ 0.05
+ 0.1
+
+ 2
+ 2
+ 1
+ 0
+
+
+
+ 8
+ 4000
+ 8000
+ 200000
+
+
+ 2
+ 1000
+ 2000
+ 50000
+
+
+ 2
+ 1000
+ 2000
+ 50000
+
+
+
+
+
+
\ No newline at end of file
diff --git a/scripts/birbnetes/matlab/getConfiguration.m b/scripts/birbnetes/matlab/getConfiguration.m
new file mode 100644
index 0000000..834d5c1
--- /dev/null
+++ b/scripts/birbnetes/matlab/getConfiguration.m
@@ -0,0 +1,53 @@
+%--------------------------------------------------------------
+%description
+% returns a value according to the given argumentssss
+%--------------------------------------------------------------
+function [ret_val] = getConfiguration(argType)
+ if(argType == 1)
+ ret_val = 'D:\sim_results';
+ elseif(argType == 2)
+ ret_val = 1; %Number of iterations
+ elseif(argType == 3)
+ ret_val = 100; %min number of mobile device
+ elseif(argType == 4)
+ ret_val = 100; %step size of mobile device count
+ elseif(argType == 5)
+ ret_val =1000; %max number of mobile device
+ elseif(argType == 6)
+ ret_val = 1; %xTickLabelCoefficient
+ elseif(argType == 7)
+ ret_val = {'SINGLE_TIER','TWO_TIER','TWO_TIER_WITH_EO'};
+ elseif(argType == 8)
+ ret_val = {'1-tier','2-tier','2-tier with EO'};
+ elseif(argType == 9)
+ ret_val=[10 3 12 12]; %position of figure
+ elseif(argType == 10)
+ ret_val = 'Number of Mobile Devices'; %Common text for x axis
+ elseif(argType == 11)
+ ret_val = 1; %return 1 if you want to save figure as pdf
+ elseif(argType == 12)
+ ret_val = 0; %return 1 if you want to plot errors
+ elseif(argType == 20)
+ ret_val=1; %return 1 if graph is plotted colerful
+ elseif(argType == 21)
+ ret_val=[0.55 0 0]; %color of first line
+ elseif(argType == 22)
+ ret_val=[0 0.15 0.6]; %color of second line
+ elseif(argType == 23)
+ ret_val=[0 0.23 0]; %color of third line
+ elseif(argType == 24)
+ ret_val=[0.6 0 0.6]; %color of fourth line
+ elseif(argType == 25)
+ ret_val=[0.08 0.08 0.08]; %color of fifth line
+ elseif(argType == 26)
+ ret_val=[0 0.8 0.8]; %color of sixth line
+ elseif(argType == 27)
+ ret_val=[0.8 0.4 0]; %color of seventh line
+ elseif(argType == 28)
+ ret_val=[0.8 0.8 0]; %color of eighth line
+ elseif(argType == 40)
+ ret_val={'-k*','-ko','-ks','-kv','-kp','-kd','-kx','-kh'}; %line style (marker) of the colerless line
+ elseif(argType == 50)
+ ret_val={':k*',':ko',':ks',':kv',':kp',':kd',':kx',':kh'}; %line style (marker) of the colerfull line
+ end
+end
\ No newline at end of file
diff --git a/scripts/birbnetes/matlab/plotAvgFailedTask.m b/scripts/birbnetes/matlab/plotAvgFailedTask.m
new file mode 100644
index 0000000..c1d4afe
--- /dev/null
+++ b/scripts/birbnetes/matlab/plotAvgFailedTask.m
@@ -0,0 +1,21 @@
+function [] = plotAvgFailedTask()
+
+ plotGenericResult(1, 2, 'Failed Tasks (%)', 'ALL_APPS', 'percentage_for_all');
+ plotGenericResult(1, 2, {'Failed Tasks for';'Augmented Reality App (%)'}, 'AUGMENTED_REALITY', 'percentage_for_all');
+ plotGenericResult(1, 2, 'Failed Tasks for Health App (%)', 'HEALTH_APP', 'percentage_for_all');
+ plotGenericResult(1, 2, {'Failed Tasks for';'Infotainment App (%)'}, 'INFOTAINMENT_APP', 'percentage_for_all');
+ plotGenericResult(1, 2, 'Failed Tasks for Heavy Comp. App (%)', 'HEAVY_COMP_APP', 'percentage_for_all');
+
+ plotGenericResult(2, 2, 'Failed Tasks on Edge (%)', 'ALL_APPS', 'percentage_for_all');
+ plotGenericResult(2, 2, {'Failed Tasks on Edge';'for Augmented Reality App (%)'}, 'AUGMENTED_REALITY', 'percentage_for_all');
+ plotGenericResult(2, 2, 'Failed Tasks on Edge for Health App (%)', 'HEALTH_APP', 'percentage_for_all');
+ plotGenericResult(2, 2, 'Failed Tasks on Edge for Infotainment App (%)', 'INFOTAINMENT_APP', 'percentage_for_all');
+ plotGenericResult(2, 2, 'Failed Tasks on Edge for Heavy Comp. App (%)', 'HEAVY_COMP_APP', 'percentage_for_all');
+
+ plotGenericResult(3, 2, 'Failed Tasks on Cloud (%)', 'ALL_APPS', 'percentage_for_all');
+ plotGenericResult(3, 2, {'Failed Tasks on Cloud for';'Augmented Reality App (%)'}, 'AUGMENTED_REALITY', 'percentage_for_all');
+ plotGenericResult(3, 2, 'Failed Tasks on Cloud for Health App (%)', 'HEALTH_APP', 'percentage_for_all');
+ plotGenericResult(3, 2, 'Failed Tasks on Cloud for Infotainment App (%)', 'INFOTAINMENT_APP', 'percentage_for_all');
+ plotGenericResult(3, 2, 'Failed Tasks on Cloud for Heavy Comp. App (%)', 'HEAVY_COMP_APP', 'percentage_for_all');
+
+end
\ No newline at end of file
diff --git a/scripts/birbnetes/matlab/plotAvgNetworkDelay.m b/scripts/birbnetes/matlab/plotAvgNetworkDelay.m
new file mode 100644
index 0000000..4edd5d4
--- /dev/null
+++ b/scripts/birbnetes/matlab/plotAvgNetworkDelay.m
@@ -0,0 +1,21 @@
+function [] = plotAvgNetworkDelay()
+
+ plotGenericResult(1, 7, 'Average Network Delay (sec)', 'ALL_APPS', '');
+ plotGenericResult(1, 7, {'Average Network Delay';'for Augmented Reality App (sec)'}, 'AUGMENTED_REALITY', '');
+ plotGenericResult(1, 7, 'Average Network Delay for Health App (sec)', 'HEALTH_APP', '');
+ plotGenericResult(1, 7, {'Average Network Delay';'for Infotainment App (sec)'}, 'INFOTAINMENT_APP', '');
+ plotGenericResult(1, 7, {'Average Network Delay';'for Heavy Comp. App (sec)'}, 'HEAVY_COMP_APP', '');
+
+ plotGenericResult(5, 1, 'Average WLAN Delay (sec)', 'ALL_APPS', '');
+ plotGenericResult(5, 1, {'Average WLAN Delay';'for Augmented Reality App (sec)'}, 'AUGMENTED_REALITY', '');
+ plotGenericResult(5, 1, 'Average WLAN Delay for Health App (sec)', 'HEALTH_APP', '');
+ plotGenericResult(5, 1, {'Average WLAN Delay';'for Infotainment App (sec)'}, 'INFOTAINMENT_APP', '');
+ plotGenericResult(5, 1, {'Average WLAN Delay';'for Heavy Comp. App %(sec)'}, 'HEAVY_COMP_APP', '');
+
+ plotGenericResult(5, 3, 'Average WAN Delay (sec)', 'ALL_APPS', '');
+ plotGenericResult(5, 3, {'Average WAN Delay';'for Augmented Reality App (sec)'}, 'AUGMENTED_REALITY', '');
+ plotGenericResult(5, 3, 'Average WAN Delay for Health App (sec)', 'HEALTH_APP', '');
+ plotGenericResult(5, 3, {'Average WAN Delay';'for Infotainment App (sec)'}, 'INFOTAINMENT_APP', '');
+ plotGenericResult(5, 3, {'Average WAN Delay';'for Heavy Comp. App (sec)'}, 'HEAVY_COMP_APP', '');
+
+end
\ No newline at end of file
diff --git a/scripts/birbnetes/matlab/plotAvgProcessingTime.m b/scripts/birbnetes/matlab/plotAvgProcessingTime.m
new file mode 100644
index 0000000..103e48e
--- /dev/null
+++ b/scripts/birbnetes/matlab/plotAvgProcessingTime.m
@@ -0,0 +1,21 @@
+function [] = plotAvgProcessingTime()
+
+ plotGenericResult(1, 6, 'Processing Time (sec)', 'ALL_APPS', '');
+ plotGenericResult(1, 6, 'Processing Time for Augmented Reality App (sec)', 'AUGMENTED_REALITY', '');
+ plotGenericResult(1, 6, 'Processing Time for Health App (sec)', 'HEALTH_APP', '');
+ plotGenericResult(1, 6, 'Processing Time for Infotainment App (sec)', 'INFOTAINMENT_APP', '');
+ plotGenericResult(1, 6, 'Processing Time for Heavy Comp. App (sec)', 'HEAVY_COMP_APP', '');
+
+ plotGenericResult(2, 6, 'Processing Time on Edge (sec)', 'ALL_APPS', '');
+ plotGenericResult(2, 6, {'Processing Time on Edge';'for Augmented Reality App (sec)'}, 'AUGMENTED_REALITY', '');
+ plotGenericResult(2, 6, {'Processing Time on Edge';'for Health App (sec)'}, 'HEALTH_APP', '');
+ plotGenericResult(2, 6, {'Processing Time on Edge';'for Infotainment App (sec)'}, 'INFOTAINMENT_APP', '');
+ plotGenericResult(2, 6, {'Processing Time on Edge';'for Heavy Computation App (sec)'}, 'HEAVY_COMP_APP', '');
+
+ plotGenericResult(3, 6, 'Processing Time on Cloud (sec)', 'ALL_APPS', '');
+ plotGenericResult(3, 6, {'Processing Time on Cloud';'for Augmented Reality App (sec)'}, 'AUGMENTED_REALITY', '');
+ plotGenericResult(3, 6, {'Processing Time on Cloud';'for Health App (sec)'}, 'HEALTH_APP', '');
+ plotGenericResult(3, 6, {'Processing Time on Cloud';'for Infotainment App (sec)'}, 'INFOTAINMENT_APP', '');
+ plotGenericResult(3, 6, {'Processing Time on Cloud';'for Heavy Computation App (sec)'}, 'HEAVY_COMP_APP', '');
+
+end
\ No newline at end of file
diff --git a/scripts/birbnetes/matlab/plotAvgServiceTime.m b/scripts/birbnetes/matlab/plotAvgServiceTime.m
new file mode 100644
index 0000000..1682f30
--- /dev/null
+++ b/scripts/birbnetes/matlab/plotAvgServiceTime.m
@@ -0,0 +1,21 @@
+function [] = plotAvgServiceTime()
+
+ plotGenericResult(1, 5, 'Service Time (sec)', 'ALL_APPS', '');
+ plotGenericResult(1, 5, {'Service Time for';'Augmented Reality App (sec)'}, 'AUGMENTED_REALITY', '');
+ plotGenericResult(1, 5, 'Service Time for Health App (sec)', 'HEALTH_APP', '');
+ plotGenericResult(1, 5, 'Service Time for Infotainment App (sec)', 'INFOTAINMENT_APP', '');
+ plotGenericResult(1, 5, {'Service Time for';'Compute Intensive App (sec)'}, 'HEAVY_COMP_APP', '');
+
+ plotGenericResult(2, 5, 'Service Time on Edge (sec)', 'ALL_APPS', '');
+ plotGenericResult(2, 5, {'Service Time on Edge';'for Augmented Reality App (sec)'}, 'AUGMENTED_REALITY', '');
+ plotGenericResult(2, 5, 'Service Time on Edge for Health App (sec)', 'HEALTH_APP', '');
+ plotGenericResult(2, 5, {'Service Time on Edge';'for Infotainment App (sec)'}, 'INFOTAINMENT_APP', '');
+ plotGenericResult(2, 5, {'Service Time on Edge';'for Heavy Comp. App (sec)'}, 'HEAVY_COMP_APP', '');
+
+ plotGenericResult(3, 5, 'Service Time on Cloud (sec)', 'ALL_APPS', '');
+ plotGenericResult(3, 5, {'Service Time on Cloud';'for Augmented Reality App (sec)'}, 'AUGMENTED_REALITY', '');
+ plotGenericResult(3, 5, 'Service Time on Cloud for Health App (sec)', 'HEALTH_APP', '');
+ plotGenericResult(3, 5, {'Service Time on Cloud';'for Infotainment App (sec)'}, 'INFOTAINMENT_APP', '');
+ plotGenericResult(3, 5, {'Service Time on Cloud';'for Heavy Comp. App (sec)'}, 'HEAVY_COMP_APP', '');
+
+end
\ No newline at end of file
diff --git a/scripts/birbnetes/matlab/plotAvgVmUtilization.m b/scripts/birbnetes/matlab/plotAvgVmUtilization.m
new file mode 100644
index 0000000..ac092c3
--- /dev/null
+++ b/scripts/birbnetes/matlab/plotAvgVmUtilization.m
@@ -0,0 +1,9 @@
+function [] = plotAvgVmUtilization()
+
+ plotGenericResult(2, 8, 'Average VM Utilization (%)', 'ALL_APPS', '');
+ plotGenericResult(2, 8, {'Average VM Utilization';'for Augmented Reality App (%)'}, 'AUGMENTED_REALITY', '');
+ plotGenericResult(2, 8, 'Average VM Utilization for Health App (%)', 'HEALTH_APP', '');
+ plotGenericResult(2, 8, 'Average VM Utilization for Infotainment App (%)', 'INFOTAINMENT_APP', '');
+ plotGenericResult(2, 8, 'Average VM Utilization for Heavy Comp. App (%)', 'HEAVY_COMP_APP', '');
+
+end
\ No newline at end of file
diff --git a/scripts/birbnetes/matlab/plotGenericResult.m b/scripts/birbnetes/matlab/plotGenericResult.m
new file mode 100644
index 0000000..d5dee9b
--- /dev/null
+++ b/scripts/birbnetes/matlab/plotGenericResult.m
@@ -0,0 +1,149 @@
+function [] = plotGenericResult(rowOfset, columnOfset, yLabel, appType, calculatePercentage)
+ folderPath = getConfiguration(1);
+ numOfSimulations = getConfiguration(2);
+ startOfMobileDeviceLoop = getConfiguration(3);
+ stepOfMobileDeviceLoop = getConfiguration(4);
+ endOfMobileDeviceLoop = getConfiguration(5);
+ xTickLabelCoefficient = getConfiguration(6);
+
+ scenarioType = getConfiguration(7);
+ legends = getConfiguration(8);
+ numOfMobileDevices = (endOfMobileDeviceLoop - startOfMobileDeviceLoop)/stepOfMobileDeviceLoop + 1;
+
+ pos=getConfiguration(9);
+
+ all_results = zeros(numOfSimulations, size(scenarioType,2), numOfMobileDevices);
+ min_results = zeros(size(scenarioType,2), numOfMobileDevices);
+ max_results = zeros(size(scenarioType,2), numOfMobileDevices);
+
+ for s=1:numOfSimulations
+ for i=1:size(scenarioType,2)
+ for j=1:numOfMobileDevices
+ try
+ mobileDeviceNumber = startOfMobileDeviceLoop + stepOfMobileDeviceLoop * (j-1);
+ filePath = strcat(folderPath,'\ite',int2str(s),'\SIMRESULT_',char(scenarioType(i)),'_NEXT_FIT_',int2str(mobileDeviceNumber),'DEVICES_',appType,'_GENERIC.log');
+
+ readData = dlmread(filePath,';',rowOfset,0);
+ value = readData(1,columnOfset);
+ if(strcmp(calculatePercentage,'percentage_for_all'))
+ readData = dlmread(filePath,';',1,0);
+ totalTask = readData(1,1)+readData(1,2);
+ value = (100 * value) / totalTask;
+ elseif(strcmp(calculatePercentage,'percentage_for_completed'))
+ readData = dlmread(filePath,';',1,0);
+ totalTask = readData(1,1);
+ value = (100 * value) / totalTask;
+ elseif(strcmp(calculatePercentage,'percentage_for_failed'))
+ readData = dlmread(filePath,';',1,0);
+ totalTask = readData(1,2);
+ value = (100 * value) / totalTask;
+ end
+
+ all_results(s,i,j) = value;
+ catch err
+ error(err)
+ end
+ end
+ end
+ end
+
+ if(numOfSimulations == 1)
+ results = all_results;
+ else
+ results = mean(all_results); %still 3d matrix but 1xMxN format
+ end
+
+ results = squeeze(results); %remove singleton dimensions
+
+ for i=1:size(scenarioType,2)
+ for j=1:numOfMobileDevices
+ x=all_results(:,i,j); % Create Data
+ SEM = std(x)/sqrt(length(x)); % Standard Error
+ ts = tinv([0.05 0.95],length(x)-1); % T-Score
+ CI = mean(x) + ts*SEM; % Confidence Intervals
+
+ if(CI(1) < 0)
+ CI(1) = 0;
+ end
+
+ if(CI(2) < 0)
+ CI(2) = 0;
+ end
+
+ min_results(i,j) = results(i,j) - CI(1);
+ max_results(i,j) = CI(2) - results(i,j);
+ end
+ end
+
+ types = zeros(1,numOfMobileDevices);
+ for i=1:numOfMobileDevices
+ types(i)=startOfMobileDeviceLoop+((i-1)*stepOfMobileDeviceLoop);
+ end
+
+ hFig = figure;
+ set(hFig, 'Units','centimeters');
+ set(hFig, 'Position',pos);
+ set(0,'DefaultAxesFontName','Times New Roman');
+ set(0,'DefaultTextFontName','Times New Roman');
+ set(0,'DefaultAxesFontSize',10);
+ set(0,'DefaultTextFontSize',12);
+ if(getConfiguration(20) == 1)
+ for i=1:1:numOfMobileDevices
+ xIndex=startOfMobileDeviceLoop+((i-1)*stepOfMobileDeviceLoop);
+
+ markers = getConfiguration(50);
+ for j=1:size(scenarioType,2)
+ plot(xIndex, results(j,i),char(markers(j)),'MarkerFaceColor',getConfiguration(20+j),'color',getConfiguration(20+j));
+ hold on;
+ end
+ end
+
+ for j=1:size(scenarioType,2)
+ if(getConfiguration(12) == 1)
+ errorbar(types, results(j,:), min_results(j,:),max_results(j,:),':k','color',getConfiguration(20+j),'LineWidth',1.5);
+ else
+ plot(types, results(j,:),':k','color',getConfiguration(20+j),'LineWidth',1.5);
+ end
+ hold on;
+ end
+
+ set(gca,'color','none');
+ else
+ markers = getConfiguration(40);
+ for j=1:size(scenarioType,2)
+ if(getConfiguration(12) == 1)
+ errorbar(types, results(j,:),min_results(j,:),max_results(j,:),char(markers(j)),'MarkerFaceColor','w','LineWidth',1.2);
+ else
+ plot(types, results(j,:),char(markers(j)),'MarkerFaceColor','w','LineWidth',1.2);
+ end
+ hold on;
+ end
+
+ end
+
+ lgnd = legend(legends,'Location','NorthWest');
+ if(getConfiguration(20) == 1)
+ set(lgnd,'color','none');
+ end
+
+ hold off;
+ axis square
+ xlabel(getConfiguration(10));
+ set(gca,'XTick', (startOfMobileDeviceLoop*xTickLabelCoefficient):(stepOfMobileDeviceLoop*xTickLabelCoefficient):endOfMobileDeviceLoop);
+ set(gca,'XTickLabel', (startOfMobileDeviceLoop*xTickLabelCoefficient):(stepOfMobileDeviceLoop*xTickLabelCoefficient):endOfMobileDeviceLoop);
+ ylabel(yLabel);
+ set(gca,'XLim',[startOfMobileDeviceLoop-5 endOfMobileDeviceLoop+5]);
+
+ set(get(gca,'Xlabel'),'FontSize',12)
+ set(get(gca,'Ylabel'),'FontSize',12)
+ set(lgnd,'FontSize',11)
+
+ if(getConfiguration(11) == 1)
+ set(hFig, 'PaperUnits', 'centimeters');
+ set(hFig, 'PaperPositionMode', 'manual');
+ set(hFig, 'PaperPosition',[0 0 pos(3) pos(4)]);
+ set(gcf, 'PaperSize', [pos(3) pos(4)]); %Keep the same paper size
+ filename = strcat(folderPath,'\',int2str(rowOfset),'_',int2str(columnOfset),'_',appType);
+ saveas(gcf, filename, 'pdf');
+ end
+end
\ No newline at end of file
diff --git a/scripts/birbnetes/matlab/plotTaskFailureReason.m b/scripts/birbnetes/matlab/plotTaskFailureReason.m
new file mode 100644
index 0000000..0356b15
--- /dev/null
+++ b/scripts/birbnetes/matlab/plotTaskFailureReason.m
@@ -0,0 +1,27 @@
+function [] = plotTaskFailureReason()
+
+ plotGenericResult(1, 10, 'Failed Task due to VM Capacity (%)', 'ALL_APPS', 'percentage_for_failed');
+ plotGenericResult(1, 10, {'Failed Task due to VM Capacity';'for Augmented Reality App (%)'}, 'AUGMENTED_REALITY', 'percentage_for_failed');
+ plotGenericResult(1, 10, {'Failed Task due to VM Capacity';'for Health App (%)'}, 'HEALTH_APP', 'percentage_for_failed');
+ plotGenericResult(1, 10, {'Failed Task due to VM Capacity';'for Infotainment App (%)'}, 'INFOTAINMENT_APP', 'percentage_for_failed');
+ plotGenericResult(1, 10, {'Failed Task due to VM Capacity';'for Heavy Computation App (%)'}, 'HEAVY_COMP_APP', 'percentage_for_failed');
+
+ plotGenericResult(1, 11, 'Failed Task due to Mobility (%)', 'ALL_APPS', 'percentage_for_failed');
+ plotGenericResult(1, 11, {'Failed Task due to Mobility';'for Augmented Reality App (%)'}, 'AUGMENTED_REALITY', 'percentage_for_failed');
+ plotGenericResult(1, 11, {'Failed Task due to Mobility';'for Health App (%)'}, 'HEALTH_APP', 'percentage_for_failed');
+ plotGenericResult(1, 11, {'Failed Task due to Mobility';'for Infotainment App (%)'}, 'INFOTAINMENT_APP', 'percentage_for_failed');
+ plotGenericResult(1, 11, {'Failed Task due to Mobility';'for Heavy Computation App (%)'}, 'HEAVY_COMP_APP', 'percentage_for_failed');
+
+ plotGenericResult(5, 5, 'Failed Tasks due to WLAN failure (%)', 'ALL_APPS', 'percentage_for_failed');
+ plotGenericResult(5, 5, {'Failed Tasks due to WLAN failure';'for Augmented Reality App (%)'}, 'AUGMENTED_REALITY', 'percentage_for_failed');
+ plotGenericResult(5, 5, {'Failed Tasks due to WLAN failure';'for Health App (%)'}, 'HEALTH_APP', 'percentage_for_failed');
+ plotGenericResult(5, 5, {'Failed Tasks due to WLAN failure';'for Infotainment App (%)'}, 'INFOTAINMENT_APP', 'percentage_for_failed');
+ plotGenericResult(5, 5, {'Failed Tasks due to WLAN failure';'for Heavy Comp. App (%)'}, 'HEAVY_COMP_APP', 'percentage_for_failed');
+
+ plotGenericResult(5, 7, 'Failed Tasks due to WAN failure (%)', 'ALL_APPS', 'percentage_for_failed');
+ plotGenericResult(5, 7, {'Failed Tasks due to WAN failure';'for Augmented Reality App (%)'}, 'AUGMENTED_REALITY', 'percentage_for_failed');
+ plotGenericResult(5, 7, {'Failed Tasks due to WAN failure';'for Health App (%)'}, 'HEALTH_APP', 'percentage_for_failed');
+ plotGenericResult(5, 7, {'Failed Tasks due to WAN failure';'for Infotainment App (%)'}, 'INFOTAINMENT_APP', 'percentage_for_failed');
+ plotGenericResult(5, 7, {'Failed Tasks due to WAN failure';'for Heavy Comp. App (%)'}, 'HEAVY_COMP_APP', 'percentage_for_failed');
+
+end
\ No newline at end of file
diff --git a/scripts/birbnetes/run_scenarios.sh b/scripts/birbnetes/run_scenarios.sh
new file mode 100644
index 0000000..c770335
--- /dev/null
+++ b/scripts/birbnetes/run_scenarios.sh
@@ -0,0 +1,59 @@
+#!/bin/bash
+if [ "$#" -ne 2 ]; then
+ echo "Missing arguments! Please provide number of parallel processes and number of iterations."
+ echo "Usage: '$0 4 10'"
+ exit 1
+fi
+
+re='^[0-9]+$'
+if ! [[ $1 =~ $re ]] ; then
+ echo "$1 is not an integer! Please provide number of parallel processes."
+ echo "Usage: '$0 4 10'"
+ exit 1
+fi
+
+if ! [[ $2 =~ $re ]] ; then
+ echo "$1 is not an integer! Please provide number of iterations."
+ echo "Usage: '$0 4 10'"
+ exit 1
+fi
+
+script_root_path="$(dirname "$(readlink -f "$0")")"
+root_out_folder=${script_root_path}/output
+num_of_processes=$1
+iterationNumber=$2
+process_counter=0
+
+date=$(date '+%d-%m-%Y_%H-%M')
+simulation_out_folder=${root_out_folder}/${date}
+mkdir -p $simulation_out_folder
+
+simulations=$(cat ${script_root_path}/simulation.list)
+
+rm -rf ${script_root_path}/tmp_runner*
+
+for sim_args in $simulations
+do
+ scenario_name=$(echo $sim_args | cut -d ';' -f1)
+ edge_devices_file=$(echo $sim_args | cut -d ';' -f2)
+ applications_file=$(echo $sim_args | cut -d ';' -f3)
+ for (( i=1; i<=$iterationNumber; i++ ))
+ do
+ process_id=$(($process_counter % $num_of_processes))
+ process_counter=$(($process_counter + 1))
+
+ echo "${script_root_path}/runner.sh $simulation_out_folder $scenario_name $edge_devices_file $applications_file ${i}" >> "${simulation_out_folder}/tmp_runner${process_id}.sh"
+ done
+done
+
+#num_of_cores=$(grep -c ^processor /proc/cpuinfo)
+
+for (( i=0; i<$num_of_processes; i++ ))
+do
+ chmod +x ${simulation_out_folder}/tmp_runner${i}.sh
+ ${simulation_out_folder}/tmp_runner${i}.sh &
+
+# pid=$!
+# cpu=$(($i % $num_of_cores))
+# taskset -cp $cpu,$cpu $pid
+done
diff --git a/scripts/birbnetes/runner.sh b/scripts/birbnetes/runner.sh
new file mode 100644
index 0000000..82afb86
--- /dev/null
+++ b/scripts/birbnetes/runner.sh
@@ -0,0 +1,18 @@
+#!/bin/sh
+
+script_root_path="$(dirname "$(readlink -f "$0")")"
+simulation_out_folder=$1
+scenario_name=$2
+edge_devices_file=$3
+applications_file=$4
+iteration_number=$5
+
+scenario_out_folder=${simulation_out_folder}/${scenario_name}/ite${iteration_number}
+scenario_conf_file=${script_root_path}/config/${scenario_name}.properties
+scenario_edge_devices_file=${script_root_path}/config/${edge_devices_file}
+scenario_applications_file=${script_root_path}/config/${applications_file}
+
+mkdir -p $scenario_out_folder
+java -classpath '../../bin:../../lib/cloudsim-4.0.jar:../../lib/commons-math3-3.6.1.jar:../../lib/colt.jar' edu.boun.edgecloudsim.applications.birbnetes.MainApp $scenario_conf_file $scenario_edge_devices_file $scenario_applications_file $scenario_out_folder $iteration_number > ${scenario_out_folder}.log
+tar -czf ${scenario_out_folder}.tar.gz -C $simulation_out_folder/${scenario_name} ite${iteration_number}
+rm -rf $scenario_out_folder
diff --git a/scripts/birbnetes/simulation.list b/scripts/birbnetes/simulation.list
new file mode 100644
index 0000000..3a4122a
--- /dev/null
+++ b/scripts/birbnetes/simulation.list
@@ -0,0 +1 @@
+default_config;edge_devices.xml;applications.xml
\ No newline at end of file
diff --git a/src/edu/boun/edgecloudsim/applications/birbnetes/BirbnetesScenarioFactory.java b/src/edu/boun/edgecloudsim/applications/birbnetes/BirbnetesScenarioFactory.java
new file mode 100644
index 0000000..a642f4c
--- /dev/null
+++ b/src/edu/boun/edgecloudsim/applications/birbnetes/BirbnetesScenarioFactory.java
@@ -0,0 +1,75 @@
+package edu.boun.edgecloudsim.applications.birbnetes;
+
+import edu.boun.edgecloudsim.cloud_server.CloudServerManager;
+import edu.boun.edgecloudsim.cloud_server.DefaultCloudServerManager;
+import edu.boun.edgecloudsim.edge_client.DefaultMobileDeviceManager;
+import edu.boun.edgecloudsim.edge_client.MobileDeviceManager;
+import edu.boun.edgecloudsim.edge_client.mobile_processing_unit.DefaultMobileServerManager;
+import edu.boun.edgecloudsim.edge_client.mobile_processing_unit.MobileServerManager;
+import edu.boun.edgecloudsim.edge_orchestrator.BasicEdgeOrchestrator;
+import edu.boun.edgecloudsim.edge_orchestrator.EdgeOrchestrator;
+import edu.boun.edgecloudsim.edge_server.DefaultEdgeServerManager;
+import edu.boun.edgecloudsim.edge_server.EdgeServerManager;
+import edu.boun.edgecloudsim.mobility.MobilityModel;
+import edu.boun.edgecloudsim.mobility.StationaryMobility;
+import edu.boun.edgecloudsim.network.MM1Queue;
+import edu.boun.edgecloudsim.network.NetworkModel;
+import edu.boun.edgecloudsim.task_generator.IdleActiveLoadGenerator;
+import edu.boun.edgecloudsim.task_generator.LoadGeneratorModel;
+
+public class BirbnetesScenarioFactory implements edu.boun.edgecloudsim.core.ScenarioFactory {
+ private int numOfMobileDevice;
+ private double simulationTime;
+ private String orchestratorPolicy;
+ private String simScenario;
+
+ BirbnetesScenarioFactory(int _numOfMobileDevice,
+ double _simulationTime,
+ String _orchestratorPolicy,
+ String _simScenario){
+ orchestratorPolicy = _orchestratorPolicy;
+ numOfMobileDevice = _numOfMobileDevice;
+ simulationTime = _simulationTime;
+ simScenario = _simScenario;
+ }
+
+ @Override
+ public LoadGeneratorModel getLoadGeneratorModel() {
+ return new IdleActiveLoadGenerator(numOfMobileDevice, simulationTime, simScenario);
+ }
+
+ @Override
+ public EdgeOrchestrator getEdgeOrchestrator() {
+ return new BasicEdgeOrchestrator(orchestratorPolicy, simScenario);
+ }
+
+ @Override
+ public MobilityModel getMobilityModel() {
+ return new StationaryMobility(numOfMobileDevice,simulationTime);
+ }
+
+ @Override
+ public NetworkModel getNetworkModel() {
+ return new MM1Queue(numOfMobileDevice, simScenario);
+ }
+
+ @Override
+ public EdgeServerManager getEdgeServerManager() {
+ return new DefaultEdgeServerManager();
+ }
+
+ @Override
+ public CloudServerManager getCloudServerManager() {
+ return new DefaultCloudServerManager();
+ }
+
+ @Override
+ public MobileDeviceManager getMobileDeviceManager() throws Exception {
+ return new DefaultMobileDeviceManager();
+ }
+
+ @Override
+ public MobileServerManager getMobileServerManager() {
+ return new DefaultMobileServerManager();
+ }
+}
diff --git a/src/edu/boun/edgecloudsim/applications/birbnetes/MainApp.java b/src/edu/boun/edgecloudsim/applications/birbnetes/MainApp.java
new file mode 100644
index 0000000..ec48948
--- /dev/null
+++ b/src/edu/boun/edgecloudsim/applications/birbnetes/MainApp.java
@@ -0,0 +1,121 @@
+package edu.boun.edgecloudsim.applications.birbnetes;
+
+import edu.boun.edgecloudsim.core.ScenarioFactory;
+import edu.boun.edgecloudsim.core.SimManager;
+import edu.boun.edgecloudsim.core.SimSettings;
+import edu.boun.edgecloudsim.utils.SimLogger;
+import edu.boun.edgecloudsim.utils.SimUtils;
+import org.cloudbus.cloudsim.Log;
+import org.cloudbus.cloudsim.core.CloudSim;
+
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.Date;
+
+public class MainApp {
+
+ /**
+ * Creates main() to run this example
+ */
+ public static void main(String[] args) {
+ //disable console output of cloudsim library
+ Log.disable();
+
+ //enable console output and file output of this application
+ SimLogger.enablePrintLog();
+
+ int iterationNumber = 1;
+ String configFile = "";
+ String outputFolder = "";
+ String edgeDevicesFile = "";
+ String applicationsFile = "";
+ if (args.length == 5){
+ configFile = args[0];
+ edgeDevicesFile = args[1];
+ applicationsFile = args[2];
+ outputFolder = args[3];
+ iterationNumber = Integer.parseInt(args[4]);
+ }
+ else{
+ SimLogger.printLine("Simulation setting file, output folder and iteration number are not provided! Using default ones...");
+ configFile = "scripts/birbnetes/config/default_config.properties";
+ applicationsFile = "scripts/birbnetes/config/applications.xml";
+ edgeDevicesFile = "scripts/birbnetes/config/edge_devices.xml";
+ outputFolder = "sim_results/ite" + iterationNumber;
+ }
+
+ //load settings from configuration file
+ SimSettings SS = SimSettings.getInstance();
+ if(SS.initialize(configFile, edgeDevicesFile, applicationsFile) == false){
+ SimLogger.printLine("cannot initialize simulation settings!");
+ System.exit(0);
+ }
+
+ if(SS.getFileLoggingEnabled()){
+ SimLogger.enableFileLog();
+ SimUtils.cleanOutputFolder(outputFolder);
+ }
+
+ DateFormat df = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
+ Date SimulationStartDate = Calendar.getInstance().getTime();
+ String now = df.format(SimulationStartDate);
+ SimLogger.printLine("Simulation started at " + now);
+ SimLogger.printLine("----------------------------------------------------------------------");
+
+ for(int j=SS.getMinNumOfMobileDev(); j<=SS.getMaxNumOfMobileDev(); j+=SS.getMobileDevCounterSize())
+ {
+ for(int k=0; k> treeMapArray;
+
+ public StationaryMobility(int _numberOfMobileDevices, double _simulationTime) {
+ super(_numberOfMobileDevices, _simulationTime);
+ // TODO Auto-generated constructor stub
+ }
+
+ @Override
+ public void initialize() {
+ treeMapArray = new ArrayList>();
+
+ ExponentialDistribution[] expRngList = new ExponentialDistribution[SimSettings.getInstance().getNumOfEdgeDatacenters()];
+
+ //create random number generator for each place
+ Document doc = SimSettings.getInstance().getEdgeDevicesDocument();
+ NodeList datacenterList = doc.getElementsByTagName("datacenter");
+ for (int i = 0; i < datacenterList.getLength(); i++) {
+ Node datacenterNode = datacenterList.item(i);
+ Element datacenterElement = (Element) datacenterNode;
+ Element location = (Element)datacenterElement.getElementsByTagName("location").item(0);
+ String attractiveness = location.getElementsByTagName("attractiveness").item(0).getTextContent();
+ int placeTypeIndex = Integer.parseInt(attractiveness);
+
+ expRngList[i] = new ExponentialDistribution(SimSettings.getInstance().getMobilityLookUpTable()[placeTypeIndex]);
+ }
+
+ //initialize tree maps and position of mobile devices
+ for(int i=0; i());
+
+ int randDatacenterId = SimUtils.getRandomNumber(0, SimSettings.getInstance().getNumOfEdgeDatacenters()-1);
+ Node datacenterNode = datacenterList.item(randDatacenterId);
+ Element datacenterElement = (Element) datacenterNode;
+ Element location = (Element)datacenterElement.getElementsByTagName("location").item(0);
+ String attractiveness = location.getElementsByTagName("attractiveness").item(0).getTextContent();
+ int placeTypeIndex = Integer.parseInt(attractiveness);
+ int wlan_id = Integer.parseInt(location.getElementsByTagName("wlan_id").item(0).getTextContent());
+ int x_pos = Integer.parseInt(location.getElementsByTagName("x_pos").item(0).getTextContent());
+ int y_pos = Integer.parseInt(location.getElementsByTagName("y_pos").item(0).getTextContent());
+
+ //start locating user shortly after the simulation started (e.g. 10 seconds)
+ treeMapArray.get(i).put(SimSettings.CLIENT_ACTIVITY_START_TIME, new Location(placeTypeIndex, wlan_id, x_pos, y_pos));
+ }
+
+ for(int i=0; i treeMap = treeMapArray.get(i);
+
+ while(treeMap.lastKey() < SimSettings.getInstance().getSimulationTime()) {
+ boolean placeFound = false;
+ int currentLocationId = treeMap.lastEntry().getValue().getServingWlanId();
+ double waitingTime = expRngList[currentLocationId].sample();
+
+ while(placeFound == false){
+ int newDatacenterId = SimUtils.getRandomNumber(0, SimSettings.getInstance().getNumOfEdgeDatacenters()-1);
+ if(newDatacenterId != currentLocationId){
+ placeFound = true;
+ Node datacenterNode = datacenterList.item(newDatacenterId);
+ Element datacenterElement = (Element) datacenterNode;
+ Element location = (Element)datacenterElement.getElementsByTagName("location").item(0);
+ String attractiveness = location.getElementsByTagName("attractiveness").item(0).getTextContent();
+ int placeTypeIndex = Integer.parseInt(attractiveness);
+ int wlan_id = Integer.parseInt(location.getElementsByTagName("wlan_id").item(0).getTextContent());
+ int x_pos = Integer.parseInt(location.getElementsByTagName("x_pos").item(0).getTextContent());
+ int y_pos = Integer.parseInt(location.getElementsByTagName("y_pos").item(0).getTextContent());
+
+ treeMap.put(treeMap.lastKey()+waitingTime, new Location(placeTypeIndex, wlan_id, x_pos, y_pos));
+ }
+ }
+ if(!placeFound){
+ SimLogger.printLine("impossible is occurred! location cannot be assigned to the device!");
+ System.exit(1);
+ }
+ }
+ }
+
+ }
+
+ @Override
+ public Location getLocation(int deviceId, double time) {
+ TreeMap treeMap = treeMapArray.get(deviceId);
+
+ Map.Entry e = treeMap.floorEntry(0.0);
+
+ if(e == null){
+ SimLogger.printLine("impossible is occurred! no location is found for the device '" + deviceId + "' at " + time);
+ System.exit(1);
+ }
+
+ return e.getValue();
+ }
+
+}