initial commit of EdgeCloudSim
EdgeCloudSim with default network model, mobility model, load generator model, edge orchestrator, and VM CPU utilization model
This commit is contained in:
		
							
								
								
									
										21
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,21 @@
 | 
				
			|||||||
 | 
					# OS X
 | 
				
			||||||
 | 
					.DS_Store*
 | 
				
			||||||
 | 
					Icon?
 | 
				
			||||||
 | 
					._*
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Windows
 | 
				
			||||||
 | 
					Thumbs.db
 | 
				
			||||||
 | 
					ehthumbs.db
 | 
				
			||||||
 | 
					Desktop.ini
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Linux
 | 
				
			||||||
 | 
					.directory
 | 
				
			||||||
 | 
					*~
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# bin folder
 | 
				
			||||||
 | 
					bin
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# eclipse's files
 | 
				
			||||||
 | 
					.settings
 | 
				
			||||||
 | 
					.classpath
 | 
				
			||||||
 | 
					.project
 | 
				
			||||||
							
								
								
									
										63
									
								
								config/applications.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										63
									
								
								config/applications.xml
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,63 @@
 | 
				
			|||||||
 | 
					<?xml version="1.0"?>
 | 
				
			||||||
 | 
					<applications>
 | 
				
			||||||
 | 
						<application name="FACE_REC_APP">
 | 
				
			||||||
 | 
							<usage_percentage>100</usage_percentage>
 | 
				
			||||||
 | 
							<prob_cloud_selection>10</prob_cloud_selection>
 | 
				
			||||||
 | 
							<poisson_interarrival>3</poisson_interarrival>
 | 
				
			||||||
 | 
							<active_period>45</active_period>
 | 
				
			||||||
 | 
							<idle_period>15</idle_period>
 | 
				
			||||||
 | 
							<data_upload>1500</data_upload>
 | 
				
			||||||
 | 
							<data_download>16</data_download>
 | 
				
			||||||
 | 
							<task_length>1500</task_length>
 | 
				
			||||||
 | 
							<required_core>2</required_core>
 | 
				
			||||||
 | 
							<vm_utilization>10</vm_utilization>
 | 
				
			||||||
 | 
						</application>
 | 
				
			||||||
 | 
						<application name="HEALTH_APP">
 | 
				
			||||||
 | 
							<usage_percentage>0</usage_percentage>
 | 
				
			||||||
 | 
							<prob_cloud_selection>0</prob_cloud_selection>
 | 
				
			||||||
 | 
							<poisson_interarrival>0</poisson_interarrival>
 | 
				
			||||||
 | 
							<active_period>0</active_period>
 | 
				
			||||||
 | 
							<idle_period>0</idle_period>
 | 
				
			||||||
 | 
							<data_upload>0</data_upload>
 | 
				
			||||||
 | 
							<data_download>0</data_download>
 | 
				
			||||||
 | 
							<task_length>0</task_length>
 | 
				
			||||||
 | 
							<required_core>0</required_core>
 | 
				
			||||||
 | 
							<vm_utilization>0</vm_utilization>
 | 
				
			||||||
 | 
						</application>
 | 
				
			||||||
 | 
						<application name="HEAVY_COMP_APP">
 | 
				
			||||||
 | 
							<usage_percentage>0</usage_percentage>
 | 
				
			||||||
 | 
							<prob_cloud_selection>0</prob_cloud_selection>
 | 
				
			||||||
 | 
							<poisson_interarrival>0</poisson_interarrival>
 | 
				
			||||||
 | 
							<active_period>0</active_period>
 | 
				
			||||||
 | 
							<idle_period>0</idle_period>
 | 
				
			||||||
 | 
							<data_upload>0</data_upload>
 | 
				
			||||||
 | 
							<data_download>0</data_download>
 | 
				
			||||||
 | 
							<task_length>0</task_length>
 | 
				
			||||||
 | 
							<required_core>0</required_core>
 | 
				
			||||||
 | 
							<vm_utilization>0</vm_utilization>
 | 
				
			||||||
 | 
						</application>
 | 
				
			||||||
 | 
						<application name="VIDEO_GAME_APP">
 | 
				
			||||||
 | 
							<usage_percentage>0</usage_percentage>
 | 
				
			||||||
 | 
							<prob_cloud_selection>0</prob_cloud_selection>
 | 
				
			||||||
 | 
							<poisson_interarrival>0</poisson_interarrival>
 | 
				
			||||||
 | 
							<active_period>0</active_period>
 | 
				
			||||||
 | 
							<idle_period>0</idle_period>
 | 
				
			||||||
 | 
							<data_upload>0</data_upload>
 | 
				
			||||||
 | 
							<data_download>0</data_download>
 | 
				
			||||||
 | 
							<task_length>0</task_length>
 | 
				
			||||||
 | 
							<required_core>0</required_core>
 | 
				
			||||||
 | 
							<vm_utilization>0</vm_utilization>
 | 
				
			||||||
 | 
						</application>
 | 
				
			||||||
 | 
						<application name="SIMPLE_SERVICE_APP">
 | 
				
			||||||
 | 
							<usage_percentage>0</usage_percentage>
 | 
				
			||||||
 | 
							<prob_cloud_selection>0</prob_cloud_selection>
 | 
				
			||||||
 | 
							<poisson_interarrival>0</poisson_interarrival>
 | 
				
			||||||
 | 
							<active_period>0</active_period>
 | 
				
			||||||
 | 
							<idle_period>0</idle_period>
 | 
				
			||||||
 | 
							<data_upload>0</data_upload>
 | 
				
			||||||
 | 
							<data_download>0</data_download>
 | 
				
			||||||
 | 
							<task_length>0</task_length>
 | 
				
			||||||
 | 
							<required_core>0</required_core>
 | 
				
			||||||
 | 
							<vm_utilization>0</vm_utilization>
 | 
				
			||||||
 | 
						</application>
 | 
				
			||||||
 | 
					</applications>
 | 
				
			||||||
							
								
								
									
										24
									
								
								config/default_config.properties
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								config/default_config.properties
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,24 @@
 | 
				
			|||||||
 | 
					#default config file
 | 
				
			||||||
 | 
					simulation_time=2
 | 
				
			||||||
 | 
					warm_up_period=1200
 | 
				
			||||||
 | 
					vm_load_check_interval=30
 | 
				
			||||||
 | 
					vm_location_check_interval=30
 | 
				
			||||||
 | 
					deep_file_log_enabled=false
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					min_number_of_mobile_devices=50
 | 
				
			||||||
 | 
					max_number_of_mobile_devices=250
 | 
				
			||||||
 | 
					mobile_device_counter_size=25
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					wan_propogation_delay=0.1
 | 
				
			||||||
 | 
					lan_internal_delay=0.004
 | 
				
			||||||
 | 
					wlan_bandwidth=300
 | 
				
			||||||
 | 
					wan_bandwidth=20
 | 
				
			||||||
 | 
					gsm_bandwidth=10
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					mips_for_cloud=20000
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					task_provisioning=NEXT_FIT
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					attractiveness_L1_mean_waiting_time=60
 | 
				
			||||||
 | 
					attractiveness_L2_mean_waiting_time=30
 | 
				
			||||||
 | 
					attractiveness_L3_mean_waiting_time=15
 | 
				
			||||||
							
								
								
									
										647
									
								
								config/edge_devices.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										647
									
								
								config/edge_devices.xml
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,647 @@
 | 
				
			|||||||
 | 
					<?xml version="1.0"?>
 | 
				
			||||||
 | 
					<edge_devices>
 | 
				
			||||||
 | 
						<datacenter arch="x86" os="Linux" vmm="Xen">
 | 
				
			||||||
 | 
							<costPerBw>0.1</costPerBw>
 | 
				
			||||||
 | 
							<costPerSec>3.0</costPerSec>
 | 
				
			||||||
 | 
							<costPerMem>0.05</costPerMem>
 | 
				
			||||||
 | 
							<costPerStorage>0.1</costPerStorage>
 | 
				
			||||||
 | 
							<location>
 | 
				
			||||||
 | 
								<x_pos>1</x_pos>
 | 
				
			||||||
 | 
								<y_pos>1</y_pos>
 | 
				
			||||||
 | 
								<wlan_id>0</wlan_id>
 | 
				
			||||||
 | 
								<attractiveness>1</attractiveness>
 | 
				
			||||||
 | 
							</location>
 | 
				
			||||||
 | 
							<hosts>
 | 
				
			||||||
 | 
								<host>
 | 
				
			||||||
 | 
									<core>8</core>
 | 
				
			||||||
 | 
									<mips>4000</mips>
 | 
				
			||||||
 | 
									<ram>8000</ram>
 | 
				
			||||||
 | 
									<storage>200000</storage>
 | 
				
			||||||
 | 
									<VMs>
 | 
				
			||||||
 | 
										<VM vmm="Xen">
 | 
				
			||||||
 | 
											<core>2</core>
 | 
				
			||||||
 | 
											<mips>1000</mips>
 | 
				
			||||||
 | 
											<ram>2000</ram>
 | 
				
			||||||
 | 
											<storage>50000</storage>
 | 
				
			||||||
 | 
										</VM>
 | 
				
			||||||
 | 
										<VM vmm="Xen">
 | 
				
			||||||
 | 
											<core>2</core>
 | 
				
			||||||
 | 
											<mips>1000</mips>
 | 
				
			||||||
 | 
											<ram>2000</ram>
 | 
				
			||||||
 | 
											<storage>50000</storage>
 | 
				
			||||||
 | 
										</VM>
 | 
				
			||||||
 | 
										<VM vmm="Xen">
 | 
				
			||||||
 | 
											<core>2</core>
 | 
				
			||||||
 | 
											<mips>1000</mips>
 | 
				
			||||||
 | 
											<ram>2000</ram>
 | 
				
			||||||
 | 
											<storage>50000</storage>
 | 
				
			||||||
 | 
										</VM>
 | 
				
			||||||
 | 
										<VM vmm="Xen">
 | 
				
			||||||
 | 
											<core>2</core>
 | 
				
			||||||
 | 
											<mips>1000</mips>
 | 
				
			||||||
 | 
											<ram>2000</ram>
 | 
				
			||||||
 | 
											<storage>50000</storage>
 | 
				
			||||||
 | 
										</VM>
 | 
				
			||||||
 | 
									</VMs>
 | 
				
			||||||
 | 
								</host>
 | 
				
			||||||
 | 
							</hosts>
 | 
				
			||||||
 | 
						</datacenter>
 | 
				
			||||||
 | 
						<datacenter arch="x86" os="Linux" vmm="Xen">
 | 
				
			||||||
 | 
							<costPerBw>0.1</costPerBw>
 | 
				
			||||||
 | 
							<costPerSec>3.0</costPerSec>
 | 
				
			||||||
 | 
							<costPerMem>0.05</costPerMem>
 | 
				
			||||||
 | 
							<costPerStorage>0.1</costPerStorage>
 | 
				
			||||||
 | 
							<location>
 | 
				
			||||||
 | 
								<x_pos>2</x_pos>
 | 
				
			||||||
 | 
								<y_pos>2</y_pos>
 | 
				
			||||||
 | 
								<wlan_id>1</wlan_id>
 | 
				
			||||||
 | 
								<attractiveness>1</attractiveness>
 | 
				
			||||||
 | 
							</location>
 | 
				
			||||||
 | 
							<hosts>
 | 
				
			||||||
 | 
								<host>
 | 
				
			||||||
 | 
									<core>8</core>
 | 
				
			||||||
 | 
									<mips>4000</mips>
 | 
				
			||||||
 | 
									<ram>8000</ram>
 | 
				
			||||||
 | 
									<storage>200000</storage>
 | 
				
			||||||
 | 
									<VMs>
 | 
				
			||||||
 | 
										<VM vmm="Xen">
 | 
				
			||||||
 | 
											<core>2</core>
 | 
				
			||||||
 | 
											<mips>1000</mips>
 | 
				
			||||||
 | 
											<ram>2000</ram>
 | 
				
			||||||
 | 
											<storage>50000</storage>
 | 
				
			||||||
 | 
										</VM>
 | 
				
			||||||
 | 
										<VM vmm="Xen">
 | 
				
			||||||
 | 
											<core>2</core>
 | 
				
			||||||
 | 
											<mips>1000</mips>
 | 
				
			||||||
 | 
											<ram>2000</ram>
 | 
				
			||||||
 | 
											<storage>50000</storage>
 | 
				
			||||||
 | 
										</VM>
 | 
				
			||||||
 | 
										<VM vmm="Xen">
 | 
				
			||||||
 | 
											<core>2</core>
 | 
				
			||||||
 | 
											<mips>1000</mips>
 | 
				
			||||||
 | 
											<ram>2000</ram>
 | 
				
			||||||
 | 
											<storage>50000</storage>
 | 
				
			||||||
 | 
										</VM>
 | 
				
			||||||
 | 
										<VM vmm="Xen">
 | 
				
			||||||
 | 
											<core>2</core>
 | 
				
			||||||
 | 
											<mips>1000</mips>
 | 
				
			||||||
 | 
											<ram>2000</ram>
 | 
				
			||||||
 | 
											<storage>50000</storage>
 | 
				
			||||||
 | 
										</VM>
 | 
				
			||||||
 | 
									</VMs>
 | 
				
			||||||
 | 
								</host>
 | 
				
			||||||
 | 
							</hosts>
 | 
				
			||||||
 | 
						</datacenter>
 | 
				
			||||||
 | 
						<datacenter arch="x86" os="Linux" vmm="Xen">
 | 
				
			||||||
 | 
							<costPerBw>0.1</costPerBw>
 | 
				
			||||||
 | 
							<costPerSec>3.0</costPerSec>
 | 
				
			||||||
 | 
							<costPerMem>0.05</costPerMem>
 | 
				
			||||||
 | 
							<costPerStorage>0.1</costPerStorage>
 | 
				
			||||||
 | 
							<location>
 | 
				
			||||||
 | 
								<x_pos>3</x_pos>
 | 
				
			||||||
 | 
								<y_pos>3</y_pos>
 | 
				
			||||||
 | 
								<wlan_id>2</wlan_id>
 | 
				
			||||||
 | 
								<attractiveness>2</attractiveness>
 | 
				
			||||||
 | 
							</location>
 | 
				
			||||||
 | 
							<hosts>
 | 
				
			||||||
 | 
								<host>
 | 
				
			||||||
 | 
									<core>8</core>
 | 
				
			||||||
 | 
									<mips>4000</mips>
 | 
				
			||||||
 | 
									<ram>8000</ram>
 | 
				
			||||||
 | 
									<storage>200000</storage>
 | 
				
			||||||
 | 
									<VMs>
 | 
				
			||||||
 | 
										<VM vmm="Xen">
 | 
				
			||||||
 | 
											<core>2</core>
 | 
				
			||||||
 | 
											<mips>1000</mips>
 | 
				
			||||||
 | 
											<ram>2000</ram>
 | 
				
			||||||
 | 
											<storage>50000</storage>
 | 
				
			||||||
 | 
										</VM>
 | 
				
			||||||
 | 
										<VM vmm="Xen">
 | 
				
			||||||
 | 
											<core>2</core>
 | 
				
			||||||
 | 
											<mips>1000</mips>
 | 
				
			||||||
 | 
											<ram>2000</ram>
 | 
				
			||||||
 | 
											<storage>50000</storage>
 | 
				
			||||||
 | 
										</VM>
 | 
				
			||||||
 | 
										<VM vmm="Xen">
 | 
				
			||||||
 | 
											<core>2</core>
 | 
				
			||||||
 | 
											<mips>1000</mips>
 | 
				
			||||||
 | 
											<ram>2000</ram>
 | 
				
			||||||
 | 
											<storage>50000</storage>
 | 
				
			||||||
 | 
										</VM>
 | 
				
			||||||
 | 
										<VM vmm="Xen">
 | 
				
			||||||
 | 
											<core>2</core>
 | 
				
			||||||
 | 
											<mips>1000</mips>
 | 
				
			||||||
 | 
											<ram>2000</ram>
 | 
				
			||||||
 | 
											<storage>50000</storage>
 | 
				
			||||||
 | 
										</VM>
 | 
				
			||||||
 | 
									</VMs>
 | 
				
			||||||
 | 
								</host>
 | 
				
			||||||
 | 
							</hosts>
 | 
				
			||||||
 | 
						</datacenter>
 | 
				
			||||||
 | 
						<datacenter arch="x86" os="Linux" vmm="Xen">
 | 
				
			||||||
 | 
							<costPerBw>0.1</costPerBw>
 | 
				
			||||||
 | 
							<costPerSec>3.0</costPerSec>
 | 
				
			||||||
 | 
							<costPerMem>0.05</costPerMem>
 | 
				
			||||||
 | 
							<costPerStorage>0.1</costPerStorage>
 | 
				
			||||||
 | 
							<location>
 | 
				
			||||||
 | 
								<x_pos>4</x_pos>
 | 
				
			||||||
 | 
								<y_pos>4</y_pos>
 | 
				
			||||||
 | 
								<wlan_id>3</wlan_id>
 | 
				
			||||||
 | 
								<attractiveness>2</attractiveness>
 | 
				
			||||||
 | 
							</location>
 | 
				
			||||||
 | 
							<hosts>
 | 
				
			||||||
 | 
								<host>
 | 
				
			||||||
 | 
									<core>8</core>
 | 
				
			||||||
 | 
									<mips>4000</mips>
 | 
				
			||||||
 | 
									<ram>8000</ram>
 | 
				
			||||||
 | 
									<storage>200000</storage>
 | 
				
			||||||
 | 
									<VMs>
 | 
				
			||||||
 | 
										<VM vmm="Xen">
 | 
				
			||||||
 | 
											<core>2</core>
 | 
				
			||||||
 | 
											<mips>1000</mips>
 | 
				
			||||||
 | 
											<ram>2000</ram>
 | 
				
			||||||
 | 
											<storage>50000</storage>
 | 
				
			||||||
 | 
										</VM>
 | 
				
			||||||
 | 
										<VM vmm="Xen">
 | 
				
			||||||
 | 
											<core>2</core>
 | 
				
			||||||
 | 
											<mips>1000</mips>
 | 
				
			||||||
 | 
											<ram>2000</ram>
 | 
				
			||||||
 | 
											<storage>50000</storage>
 | 
				
			||||||
 | 
										</VM>
 | 
				
			||||||
 | 
										<VM vmm="Xen">
 | 
				
			||||||
 | 
											<core>2</core>
 | 
				
			||||||
 | 
											<mips>1000</mips>
 | 
				
			||||||
 | 
											<ram>2000</ram>
 | 
				
			||||||
 | 
											<storage>50000</storage>
 | 
				
			||||||
 | 
										</VM>
 | 
				
			||||||
 | 
										<VM vmm="Xen">
 | 
				
			||||||
 | 
											<core>2</core>
 | 
				
			||||||
 | 
											<mips>1000</mips>
 | 
				
			||||||
 | 
											<ram>2000</ram>
 | 
				
			||||||
 | 
											<storage>50000</storage>
 | 
				
			||||||
 | 
										</VM>
 | 
				
			||||||
 | 
									</VMs>
 | 
				
			||||||
 | 
								</host>
 | 
				
			||||||
 | 
							</hosts>
 | 
				
			||||||
 | 
						</datacenter>
 | 
				
			||||||
 | 
						<datacenter arch="x86" os="Linux" vmm="Xen">
 | 
				
			||||||
 | 
							<costPerBw>0.1</costPerBw>
 | 
				
			||||||
 | 
							<costPerSec>3.0</costPerSec>
 | 
				
			||||||
 | 
							<costPerMem>0.05</costPerMem>
 | 
				
			||||||
 | 
							<costPerStorage>0.1</costPerStorage>
 | 
				
			||||||
 | 
							<location>
 | 
				
			||||||
 | 
								<x_pos>5</x_pos>
 | 
				
			||||||
 | 
								<y_pos>5</y_pos>
 | 
				
			||||||
 | 
								<wlan_id>4</wlan_id>
 | 
				
			||||||
 | 
								<attractiveness>2</attractiveness>
 | 
				
			||||||
 | 
							</location>
 | 
				
			||||||
 | 
							<hosts>
 | 
				
			||||||
 | 
								<host>
 | 
				
			||||||
 | 
									<core>8</core>
 | 
				
			||||||
 | 
									<mips>4000</mips>
 | 
				
			||||||
 | 
									<ram>8000</ram>
 | 
				
			||||||
 | 
									<storage>200000</storage>
 | 
				
			||||||
 | 
									<VMs>
 | 
				
			||||||
 | 
										<VM vmm="Xen">
 | 
				
			||||||
 | 
											<core>2</core>
 | 
				
			||||||
 | 
											<mips>1000</mips>
 | 
				
			||||||
 | 
											<ram>2000</ram>
 | 
				
			||||||
 | 
											<storage>50000</storage>
 | 
				
			||||||
 | 
										</VM>
 | 
				
			||||||
 | 
										<VM vmm="Xen">
 | 
				
			||||||
 | 
											<core>2</core>
 | 
				
			||||||
 | 
											<mips>1000</mips>
 | 
				
			||||||
 | 
											<ram>2000</ram>
 | 
				
			||||||
 | 
											<storage>50000</storage>
 | 
				
			||||||
 | 
										</VM>
 | 
				
			||||||
 | 
										<VM vmm="Xen">
 | 
				
			||||||
 | 
											<core>2</core>
 | 
				
			||||||
 | 
											<mips>1000</mips>
 | 
				
			||||||
 | 
											<ram>2000</ram>
 | 
				
			||||||
 | 
											<storage>50000</storage>
 | 
				
			||||||
 | 
										</VM>
 | 
				
			||||||
 | 
										<VM vmm="Xen">
 | 
				
			||||||
 | 
											<core>2</core>
 | 
				
			||||||
 | 
											<mips>1000</mips>
 | 
				
			||||||
 | 
											<ram>2000</ram>
 | 
				
			||||||
 | 
											<storage>50000</storage>
 | 
				
			||||||
 | 
										</VM>
 | 
				
			||||||
 | 
									</VMs>
 | 
				
			||||||
 | 
								</host>
 | 
				
			||||||
 | 
							</hosts>
 | 
				
			||||||
 | 
						</datacenter>
 | 
				
			||||||
 | 
						<datacenter arch="x86" os="Linux" vmm="Xen">
 | 
				
			||||||
 | 
							<costPerBw>0.1</costPerBw>
 | 
				
			||||||
 | 
							<costPerSec>3.0</costPerSec>
 | 
				
			||||||
 | 
							<costPerMem>0.05</costPerMem>
 | 
				
			||||||
 | 
							<costPerStorage>0.1</costPerStorage>
 | 
				
			||||||
 | 
							<location>
 | 
				
			||||||
 | 
								<x_pos>6</x_pos>
 | 
				
			||||||
 | 
								<y_pos>6</y_pos>
 | 
				
			||||||
 | 
								<wlan_id>5</wlan_id>
 | 
				
			||||||
 | 
								<attractiveness>2</attractiveness>
 | 
				
			||||||
 | 
							</location>
 | 
				
			||||||
 | 
							<hosts>
 | 
				
			||||||
 | 
								<host>
 | 
				
			||||||
 | 
									<core>8</core>
 | 
				
			||||||
 | 
									<mips>4000</mips>
 | 
				
			||||||
 | 
									<ram>8000</ram>
 | 
				
			||||||
 | 
									<storage>200000</storage>
 | 
				
			||||||
 | 
									<VMs>
 | 
				
			||||||
 | 
										<VM vmm="Xen">
 | 
				
			||||||
 | 
											<core>2</core>
 | 
				
			||||||
 | 
											<mips>1000</mips>
 | 
				
			||||||
 | 
											<ram>2000</ram>
 | 
				
			||||||
 | 
											<storage>50000</storage>
 | 
				
			||||||
 | 
										</VM>
 | 
				
			||||||
 | 
										<VM vmm="Xen">
 | 
				
			||||||
 | 
											<core>2</core>
 | 
				
			||||||
 | 
											<mips>1000</mips>
 | 
				
			||||||
 | 
											<ram>2000</ram>
 | 
				
			||||||
 | 
											<storage>50000</storage>
 | 
				
			||||||
 | 
										</VM>
 | 
				
			||||||
 | 
										<VM vmm="Xen">
 | 
				
			||||||
 | 
											<core>2</core>
 | 
				
			||||||
 | 
											<mips>1000</mips>
 | 
				
			||||||
 | 
											<ram>2000</ram>
 | 
				
			||||||
 | 
											<storage>50000</storage>
 | 
				
			||||||
 | 
										</VM>
 | 
				
			||||||
 | 
										<VM vmm="Xen">
 | 
				
			||||||
 | 
											<core>2</core>
 | 
				
			||||||
 | 
											<mips>1000</mips>
 | 
				
			||||||
 | 
											<ram>2000</ram>
 | 
				
			||||||
 | 
											<storage>50000</storage>
 | 
				
			||||||
 | 
										</VM>
 | 
				
			||||||
 | 
									</VMs>
 | 
				
			||||||
 | 
								</host>
 | 
				
			||||||
 | 
							</hosts>
 | 
				
			||||||
 | 
						</datacenter>
 | 
				
			||||||
 | 
						<datacenter arch="x86" os="Linux" vmm="Xen">
 | 
				
			||||||
 | 
							<costPerBw>0.1</costPerBw>
 | 
				
			||||||
 | 
							<costPerSec>3.0</costPerSec>
 | 
				
			||||||
 | 
							<costPerMem>0.05</costPerMem>
 | 
				
			||||||
 | 
							<costPerStorage>0.1</costPerStorage>
 | 
				
			||||||
 | 
							<location>
 | 
				
			||||||
 | 
								<x_pos>7</x_pos>
 | 
				
			||||||
 | 
								<y_pos>7</y_pos>
 | 
				
			||||||
 | 
								<wlan_id>6</wlan_id>
 | 
				
			||||||
 | 
								<attractiveness>3</attractiveness>
 | 
				
			||||||
 | 
							</location>
 | 
				
			||||||
 | 
							<hosts>
 | 
				
			||||||
 | 
								<host>
 | 
				
			||||||
 | 
									<core>8</core>
 | 
				
			||||||
 | 
									<mips>4000</mips>
 | 
				
			||||||
 | 
									<ram>8000</ram>
 | 
				
			||||||
 | 
									<storage>200000</storage>
 | 
				
			||||||
 | 
									<VMs>
 | 
				
			||||||
 | 
										<VM vmm="Xen">
 | 
				
			||||||
 | 
											<core>2</core>
 | 
				
			||||||
 | 
											<mips>1000</mips>
 | 
				
			||||||
 | 
											<ram>2000</ram>
 | 
				
			||||||
 | 
											<storage>50000</storage>
 | 
				
			||||||
 | 
										</VM>
 | 
				
			||||||
 | 
										<VM vmm="Xen">
 | 
				
			||||||
 | 
											<core>2</core>
 | 
				
			||||||
 | 
											<mips>1000</mips>
 | 
				
			||||||
 | 
											<ram>2000</ram>
 | 
				
			||||||
 | 
											<storage>50000</storage>
 | 
				
			||||||
 | 
										</VM>
 | 
				
			||||||
 | 
										<VM vmm="Xen">
 | 
				
			||||||
 | 
											<core>2</core>
 | 
				
			||||||
 | 
											<mips>1000</mips>
 | 
				
			||||||
 | 
											<ram>2000</ram>
 | 
				
			||||||
 | 
											<storage>50000</storage>
 | 
				
			||||||
 | 
										</VM>
 | 
				
			||||||
 | 
										<VM vmm="Xen">
 | 
				
			||||||
 | 
											<core>2</core>
 | 
				
			||||||
 | 
											<mips>1000</mips>
 | 
				
			||||||
 | 
											<ram>2000</ram>
 | 
				
			||||||
 | 
											<storage>50000</storage>
 | 
				
			||||||
 | 
										</VM>
 | 
				
			||||||
 | 
									</VMs>
 | 
				
			||||||
 | 
								</host>
 | 
				
			||||||
 | 
							</hosts>
 | 
				
			||||||
 | 
						</datacenter>
 | 
				
			||||||
 | 
						<datacenter arch="x86" os="Linux" vmm="Xen">
 | 
				
			||||||
 | 
							<costPerBw>0.1</costPerBw>
 | 
				
			||||||
 | 
							<costPerSec>3.0</costPerSec>
 | 
				
			||||||
 | 
							<costPerMem>0.05</costPerMem>
 | 
				
			||||||
 | 
							<costPerStorage>0.1</costPerStorage>
 | 
				
			||||||
 | 
							<location>
 | 
				
			||||||
 | 
								<x_pos>8</x_pos>
 | 
				
			||||||
 | 
								<y_pos>8</y_pos>
 | 
				
			||||||
 | 
								<wlan_id>7</wlan_id>
 | 
				
			||||||
 | 
								<attractiveness>3</attractiveness>
 | 
				
			||||||
 | 
							</location>
 | 
				
			||||||
 | 
							<hosts>
 | 
				
			||||||
 | 
								<host>
 | 
				
			||||||
 | 
									<core>8</core>
 | 
				
			||||||
 | 
									<mips>4000</mips>
 | 
				
			||||||
 | 
									<ram>8000</ram>
 | 
				
			||||||
 | 
									<storage>200000</storage>
 | 
				
			||||||
 | 
									<VMs>
 | 
				
			||||||
 | 
										<VM vmm="Xen">
 | 
				
			||||||
 | 
											<core>2</core>
 | 
				
			||||||
 | 
											<mips>1000</mips>
 | 
				
			||||||
 | 
											<ram>2000</ram>
 | 
				
			||||||
 | 
											<storage>50000</storage>
 | 
				
			||||||
 | 
										</VM>
 | 
				
			||||||
 | 
										<VM vmm="Xen">
 | 
				
			||||||
 | 
											<core>2</core>
 | 
				
			||||||
 | 
											<mips>1000</mips>
 | 
				
			||||||
 | 
											<ram>2000</ram>
 | 
				
			||||||
 | 
											<storage>50000</storage>
 | 
				
			||||||
 | 
										</VM>
 | 
				
			||||||
 | 
										<VM vmm="Xen">
 | 
				
			||||||
 | 
											<core>2</core>
 | 
				
			||||||
 | 
											<mips>1000</mips>
 | 
				
			||||||
 | 
											<ram>2000</ram>
 | 
				
			||||||
 | 
											<storage>50000</storage>
 | 
				
			||||||
 | 
										</VM>
 | 
				
			||||||
 | 
										<VM vmm="Xen">
 | 
				
			||||||
 | 
											<core>2</core>
 | 
				
			||||||
 | 
											<mips>1000</mips>
 | 
				
			||||||
 | 
											<ram>2000</ram>
 | 
				
			||||||
 | 
											<storage>50000</storage>
 | 
				
			||||||
 | 
										</VM>
 | 
				
			||||||
 | 
									</VMs>
 | 
				
			||||||
 | 
								</host>
 | 
				
			||||||
 | 
							</hosts>
 | 
				
			||||||
 | 
						</datacenter>
 | 
				
			||||||
 | 
						<datacenter arch="x86" os="Linux" vmm="Xen">
 | 
				
			||||||
 | 
							<costPerBw>0.1</costPerBw>
 | 
				
			||||||
 | 
							<costPerSec>3.0</costPerSec>
 | 
				
			||||||
 | 
							<costPerMem>0.05</costPerMem>
 | 
				
			||||||
 | 
							<costPerStorage>0.1</costPerStorage>
 | 
				
			||||||
 | 
							<location>
 | 
				
			||||||
 | 
								<x_pos>9</x_pos>
 | 
				
			||||||
 | 
								<y_pos>9</y_pos>
 | 
				
			||||||
 | 
								<wlan_id>8</wlan_id>
 | 
				
			||||||
 | 
								<attractiveness>3</attractiveness>
 | 
				
			||||||
 | 
							</location>
 | 
				
			||||||
 | 
							<hosts>
 | 
				
			||||||
 | 
								<host>
 | 
				
			||||||
 | 
									<core>8</core>
 | 
				
			||||||
 | 
									<mips>4000</mips>
 | 
				
			||||||
 | 
									<ram>8000</ram>
 | 
				
			||||||
 | 
									<storage>200000</storage>
 | 
				
			||||||
 | 
									<VMs>
 | 
				
			||||||
 | 
										<VM vmm="Xen">
 | 
				
			||||||
 | 
											<core>2</core>
 | 
				
			||||||
 | 
											<mips>1000</mips>
 | 
				
			||||||
 | 
											<ram>2000</ram>
 | 
				
			||||||
 | 
											<storage>50000</storage>
 | 
				
			||||||
 | 
										</VM>
 | 
				
			||||||
 | 
										<VM vmm="Xen">
 | 
				
			||||||
 | 
											<core>2</core>
 | 
				
			||||||
 | 
											<mips>1000</mips>
 | 
				
			||||||
 | 
											<ram>2000</ram>
 | 
				
			||||||
 | 
											<storage>50000</storage>
 | 
				
			||||||
 | 
										</VM>
 | 
				
			||||||
 | 
										<VM vmm="Xen">
 | 
				
			||||||
 | 
											<core>2</core>
 | 
				
			||||||
 | 
											<mips>1000</mips>
 | 
				
			||||||
 | 
											<ram>2000</ram>
 | 
				
			||||||
 | 
											<storage>50000</storage>
 | 
				
			||||||
 | 
										</VM>
 | 
				
			||||||
 | 
										<VM vmm="Xen">
 | 
				
			||||||
 | 
											<core>2</core>
 | 
				
			||||||
 | 
											<mips>1000</mips>
 | 
				
			||||||
 | 
											<ram>2000</ram>
 | 
				
			||||||
 | 
											<storage>50000</storage>
 | 
				
			||||||
 | 
										</VM>
 | 
				
			||||||
 | 
									</VMs>
 | 
				
			||||||
 | 
								</host>
 | 
				
			||||||
 | 
							</hosts>
 | 
				
			||||||
 | 
						</datacenter>
 | 
				
			||||||
 | 
						<datacenter arch="x86" os="Linux" vmm="Xen">
 | 
				
			||||||
 | 
							<costPerBw>0.1</costPerBw>
 | 
				
			||||||
 | 
							<costPerSec>3.0</costPerSec>
 | 
				
			||||||
 | 
							<costPerMem>0.05</costPerMem>
 | 
				
			||||||
 | 
							<costPerStorage>0.1</costPerStorage>
 | 
				
			||||||
 | 
							<location>
 | 
				
			||||||
 | 
								<x_pos>10</x_pos>
 | 
				
			||||||
 | 
								<y_pos>10</y_pos>
 | 
				
			||||||
 | 
								<wlan_id>9</wlan_id>
 | 
				
			||||||
 | 
								<attractiveness>3</attractiveness>
 | 
				
			||||||
 | 
							</location>
 | 
				
			||||||
 | 
							<hosts>
 | 
				
			||||||
 | 
								<host>
 | 
				
			||||||
 | 
									<core>8</core>
 | 
				
			||||||
 | 
									<mips>4000</mips>
 | 
				
			||||||
 | 
									<ram>8000</ram>
 | 
				
			||||||
 | 
									<storage>200000</storage>
 | 
				
			||||||
 | 
									<VMs>
 | 
				
			||||||
 | 
										<VM vmm="Xen">
 | 
				
			||||||
 | 
											<core>2</core>
 | 
				
			||||||
 | 
											<mips>1000</mips>
 | 
				
			||||||
 | 
											<ram>2000</ram>
 | 
				
			||||||
 | 
											<storage>50000</storage>
 | 
				
			||||||
 | 
										</VM>
 | 
				
			||||||
 | 
										<VM vmm="Xen">
 | 
				
			||||||
 | 
											<core>2</core>
 | 
				
			||||||
 | 
											<mips>1000</mips>
 | 
				
			||||||
 | 
											<ram>2000</ram>
 | 
				
			||||||
 | 
											<storage>50000</storage>
 | 
				
			||||||
 | 
										</VM>
 | 
				
			||||||
 | 
										<VM vmm="Xen">
 | 
				
			||||||
 | 
											<core>2</core>
 | 
				
			||||||
 | 
											<mips>1000</mips>
 | 
				
			||||||
 | 
											<ram>2000</ram>
 | 
				
			||||||
 | 
											<storage>50000</storage>
 | 
				
			||||||
 | 
										</VM>
 | 
				
			||||||
 | 
										<VM vmm="Xen">
 | 
				
			||||||
 | 
											<core>2</core>
 | 
				
			||||||
 | 
											<mips>1000</mips>
 | 
				
			||||||
 | 
											<ram>2000</ram>
 | 
				
			||||||
 | 
											<storage>50000</storage>
 | 
				
			||||||
 | 
										</VM>
 | 
				
			||||||
 | 
									</VMs>
 | 
				
			||||||
 | 
								</host>
 | 
				
			||||||
 | 
							</hosts>
 | 
				
			||||||
 | 
						</datacenter>
 | 
				
			||||||
 | 
						<datacenter arch="x86" os="Linux" vmm="Xen">
 | 
				
			||||||
 | 
							<costPerBw>0.1</costPerBw>
 | 
				
			||||||
 | 
							<costPerSec>3.0</costPerSec>
 | 
				
			||||||
 | 
							<costPerMem>0.05</costPerMem>
 | 
				
			||||||
 | 
							<costPerStorage>0.1</costPerStorage>
 | 
				
			||||||
 | 
							<location>
 | 
				
			||||||
 | 
								<x_pos>11</x_pos>
 | 
				
			||||||
 | 
								<y_pos>11</y_pos>
 | 
				
			||||||
 | 
								<wlan_id>10</wlan_id>
 | 
				
			||||||
 | 
								<attractiveness>3</attractiveness>
 | 
				
			||||||
 | 
							</location>
 | 
				
			||||||
 | 
							<hosts>
 | 
				
			||||||
 | 
								<host>
 | 
				
			||||||
 | 
									<core>8</core>
 | 
				
			||||||
 | 
									<mips>4000</mips>
 | 
				
			||||||
 | 
									<ram>8000</ram>
 | 
				
			||||||
 | 
									<storage>200000</storage>
 | 
				
			||||||
 | 
									<VMs>
 | 
				
			||||||
 | 
										<VM vmm="Xen">
 | 
				
			||||||
 | 
											<core>2</core>
 | 
				
			||||||
 | 
											<mips>1000</mips>
 | 
				
			||||||
 | 
											<ram>2000</ram>
 | 
				
			||||||
 | 
											<storage>50000</storage>
 | 
				
			||||||
 | 
										</VM>
 | 
				
			||||||
 | 
										<VM vmm="Xen">
 | 
				
			||||||
 | 
											<core>2</core>
 | 
				
			||||||
 | 
											<mips>1000</mips>
 | 
				
			||||||
 | 
											<ram>2000</ram>
 | 
				
			||||||
 | 
											<storage>50000</storage>
 | 
				
			||||||
 | 
										</VM>
 | 
				
			||||||
 | 
										<VM vmm="Xen">
 | 
				
			||||||
 | 
											<core>2</core>
 | 
				
			||||||
 | 
											<mips>1000</mips>
 | 
				
			||||||
 | 
											<ram>2000</ram>
 | 
				
			||||||
 | 
											<storage>50000</storage>
 | 
				
			||||||
 | 
										</VM>
 | 
				
			||||||
 | 
										<VM vmm="Xen">
 | 
				
			||||||
 | 
											<core>2</core>
 | 
				
			||||||
 | 
											<mips>1000</mips>
 | 
				
			||||||
 | 
											<ram>2000</ram>
 | 
				
			||||||
 | 
											<storage>50000</storage>
 | 
				
			||||||
 | 
										</VM>
 | 
				
			||||||
 | 
									</VMs>
 | 
				
			||||||
 | 
								</host>
 | 
				
			||||||
 | 
							</hosts>
 | 
				
			||||||
 | 
						</datacenter>
 | 
				
			||||||
 | 
						<datacenter arch="x86" os="Linux" vmm="Xen">
 | 
				
			||||||
 | 
							<costPerBw>0.1</costPerBw>
 | 
				
			||||||
 | 
							<costPerSec>3.0</costPerSec>
 | 
				
			||||||
 | 
							<costPerMem>0.05</costPerMem>
 | 
				
			||||||
 | 
							<costPerStorage>0.1</costPerStorage>
 | 
				
			||||||
 | 
							<location>
 | 
				
			||||||
 | 
								<x_pos>12</x_pos>
 | 
				
			||||||
 | 
								<y_pos>12</y_pos>
 | 
				
			||||||
 | 
								<wlan_id>11</wlan_id>
 | 
				
			||||||
 | 
								<attractiveness>3</attractiveness>
 | 
				
			||||||
 | 
							</location>
 | 
				
			||||||
 | 
							<hosts>
 | 
				
			||||||
 | 
								<host>
 | 
				
			||||||
 | 
									<core>8</core>
 | 
				
			||||||
 | 
									<mips>4000</mips>
 | 
				
			||||||
 | 
									<ram>8000</ram>
 | 
				
			||||||
 | 
									<storage>200000</storage>
 | 
				
			||||||
 | 
									<VMs>
 | 
				
			||||||
 | 
										<VM vmm="Xen">
 | 
				
			||||||
 | 
											<core>2</core>
 | 
				
			||||||
 | 
											<mips>1000</mips>
 | 
				
			||||||
 | 
											<ram>2000</ram>
 | 
				
			||||||
 | 
											<storage>50000</storage>
 | 
				
			||||||
 | 
										</VM>
 | 
				
			||||||
 | 
										<VM vmm="Xen">
 | 
				
			||||||
 | 
											<core>2</core>
 | 
				
			||||||
 | 
											<mips>1000</mips>
 | 
				
			||||||
 | 
											<ram>2000</ram>
 | 
				
			||||||
 | 
											<storage>50000</storage>
 | 
				
			||||||
 | 
										</VM>
 | 
				
			||||||
 | 
										<VM vmm="Xen">
 | 
				
			||||||
 | 
											<core>2</core>
 | 
				
			||||||
 | 
											<mips>1000</mips>
 | 
				
			||||||
 | 
											<ram>2000</ram>
 | 
				
			||||||
 | 
											<storage>50000</storage>
 | 
				
			||||||
 | 
										</VM>
 | 
				
			||||||
 | 
										<VM vmm="Xen">
 | 
				
			||||||
 | 
											<core>2</core>
 | 
				
			||||||
 | 
											<mips>1000</mips>
 | 
				
			||||||
 | 
											<ram>2000</ram>
 | 
				
			||||||
 | 
											<storage>50000</storage>
 | 
				
			||||||
 | 
										</VM>
 | 
				
			||||||
 | 
									</VMs>
 | 
				
			||||||
 | 
								</host>
 | 
				
			||||||
 | 
							</hosts>
 | 
				
			||||||
 | 
						</datacenter>
 | 
				
			||||||
 | 
						<datacenter arch="x86" os="Linux" vmm="Xen">
 | 
				
			||||||
 | 
							<costPerBw>0.1</costPerBw>
 | 
				
			||||||
 | 
							<costPerSec>3.0</costPerSec>
 | 
				
			||||||
 | 
							<costPerMem>0.05</costPerMem>
 | 
				
			||||||
 | 
							<costPerStorage>0.1</costPerStorage>
 | 
				
			||||||
 | 
							<location>
 | 
				
			||||||
 | 
								<x_pos>13</x_pos>
 | 
				
			||||||
 | 
								<y_pos>13</y_pos>
 | 
				
			||||||
 | 
								<wlan_id>12</wlan_id>
 | 
				
			||||||
 | 
								<attractiveness>3</attractiveness>
 | 
				
			||||||
 | 
							</location>
 | 
				
			||||||
 | 
							<hosts>
 | 
				
			||||||
 | 
								<host>
 | 
				
			||||||
 | 
									<core>8</core>
 | 
				
			||||||
 | 
									<mips>4000</mips>
 | 
				
			||||||
 | 
									<ram>8000</ram>
 | 
				
			||||||
 | 
									<storage>200000</storage>
 | 
				
			||||||
 | 
									<VMs>
 | 
				
			||||||
 | 
										<VM vmm="Xen">
 | 
				
			||||||
 | 
											<core>2</core>
 | 
				
			||||||
 | 
											<mips>1000</mips>
 | 
				
			||||||
 | 
											<ram>2000</ram>
 | 
				
			||||||
 | 
											<storage>50000</storage>
 | 
				
			||||||
 | 
										</VM>
 | 
				
			||||||
 | 
										<VM vmm="Xen">
 | 
				
			||||||
 | 
											<core>2</core>
 | 
				
			||||||
 | 
											<mips>1000</mips>
 | 
				
			||||||
 | 
											<ram>2000</ram>
 | 
				
			||||||
 | 
											<storage>50000</storage>
 | 
				
			||||||
 | 
										</VM>
 | 
				
			||||||
 | 
										<VM vmm="Xen">
 | 
				
			||||||
 | 
											<core>2</core>
 | 
				
			||||||
 | 
											<mips>1000</mips>
 | 
				
			||||||
 | 
											<ram>2000</ram>
 | 
				
			||||||
 | 
											<storage>50000</storage>
 | 
				
			||||||
 | 
										</VM>
 | 
				
			||||||
 | 
										<VM vmm="Xen">
 | 
				
			||||||
 | 
											<core>2</core>
 | 
				
			||||||
 | 
											<mips>1000</mips>
 | 
				
			||||||
 | 
											<ram>2000</ram>
 | 
				
			||||||
 | 
											<storage>50000</storage>
 | 
				
			||||||
 | 
										</VM>
 | 
				
			||||||
 | 
									</VMs>
 | 
				
			||||||
 | 
								</host>
 | 
				
			||||||
 | 
							</hosts>
 | 
				
			||||||
 | 
						</datacenter>
 | 
				
			||||||
 | 
						<datacenter arch="x86" os="Linux" vmm="Xen">
 | 
				
			||||||
 | 
							<costPerBw>0.1</costPerBw>
 | 
				
			||||||
 | 
							<costPerSec>3.0</costPerSec>
 | 
				
			||||||
 | 
							<costPerMem>0.05</costPerMem>
 | 
				
			||||||
 | 
							<costPerStorage>0.1</costPerStorage>
 | 
				
			||||||
 | 
							<location>
 | 
				
			||||||
 | 
								<x_pos>14</x_pos>
 | 
				
			||||||
 | 
								<y_pos>14</y_pos>
 | 
				
			||||||
 | 
								<wlan_id>13</wlan_id>
 | 
				
			||||||
 | 
								<attractiveness>3</attractiveness>
 | 
				
			||||||
 | 
							</location>
 | 
				
			||||||
 | 
							<hosts>
 | 
				
			||||||
 | 
								<host>
 | 
				
			||||||
 | 
									<core>8</core>
 | 
				
			||||||
 | 
									<mips>4000</mips>
 | 
				
			||||||
 | 
									<ram>8000</ram>
 | 
				
			||||||
 | 
									<storage>200000</storage>
 | 
				
			||||||
 | 
									<VMs>
 | 
				
			||||||
 | 
										<VM vmm="Xen">
 | 
				
			||||||
 | 
											<core>2</core>
 | 
				
			||||||
 | 
											<mips>1000</mips>
 | 
				
			||||||
 | 
											<ram>2000</ram>
 | 
				
			||||||
 | 
											<storage>50000</storage>
 | 
				
			||||||
 | 
										</VM>
 | 
				
			||||||
 | 
										<VM vmm="Xen">
 | 
				
			||||||
 | 
											<core>2</core>
 | 
				
			||||||
 | 
											<mips>1000</mips>
 | 
				
			||||||
 | 
											<ram>2000</ram>
 | 
				
			||||||
 | 
											<storage>50000</storage>
 | 
				
			||||||
 | 
										</VM>
 | 
				
			||||||
 | 
										<VM vmm="Xen">
 | 
				
			||||||
 | 
											<core>2</core>
 | 
				
			||||||
 | 
											<mips>1000</mips>
 | 
				
			||||||
 | 
											<ram>2000</ram>
 | 
				
			||||||
 | 
											<storage>50000</storage>
 | 
				
			||||||
 | 
										</VM>
 | 
				
			||||||
 | 
										<VM vmm="Xen">
 | 
				
			||||||
 | 
											<core>2</core>
 | 
				
			||||||
 | 
											<mips>1000</mips>
 | 
				
			||||||
 | 
											<ram>2000</ram>
 | 
				
			||||||
 | 
											<storage>50000</storage>
 | 
				
			||||||
 | 
										</VM>
 | 
				
			||||||
 | 
									</VMs>
 | 
				
			||||||
 | 
								</host>
 | 
				
			||||||
 | 
							</hosts>
 | 
				
			||||||
 | 
						</datacenter>
 | 
				
			||||||
 | 
					</edge_devices>
 | 
				
			||||||
							
								
								
									
										
											BIN
										
									
								
								lib/cloudsim-4.0.jar
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								lib/cloudsim-4.0.jar
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								lib/commons-math3-3.6.1.jar
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								lib/commons-math3-3.6.1.jar
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										4
									
								
								scripts/compile.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								scripts/compile.sh
									
									
									
									
									
										Normal file
									
								
							@@ -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" -sourcepath ../src ../src/edu/boun/edgecloudsim/sample_application/mainApp.java -d ../bin
 | 
				
			||||||
							
								
								
									
										59
									
								
								scripts/run_scenarios.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										59
									
								
								scripts/run_scenarios.sh
									
									
									
									
									
										Normal file
									
								
							@@ -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
 | 
				
			||||||
							
								
								
									
										18
									
								
								scripts/runner.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								scripts/runner.sh
									
									
									
									
									
										Normal file
									
								
							@@ -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' edu.boun.edgecloudsim.sample_application.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
 | 
				
			||||||
							
								
								
									
										1
									
								
								scripts/simulation.list
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								scripts/simulation.list
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1 @@
 | 
				
			|||||||
 | 
					default_config;edge_devices.xml;applications.xml
 | 
				
			||||||
							
								
								
									
										57
									
								
								src/edu/boun/edgecloudsim/core/ScenarioFactory.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										57
									
								
								src/edu/boun/edgecloudsim/core/ScenarioFactory.java
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,57 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Title:        EdgeCloudSim - Scenarion Factory interface
 | 
				
			||||||
 | 
					 * 
 | 
				
			||||||
 | 
					 * Description: 
 | 
				
			||||||
 | 
					 * ScenarioFactory responsible for providing customizable components
 | 
				
			||||||
 | 
					 * such as  Network Model, Mobility Model, Edge Orchestrator.
 | 
				
			||||||
 | 
					 * This interface is very critical for using custom models on EdgeCloudSim
 | 
				
			||||||
 | 
					 * This interface should be implemented by EdgeCloudSim users
 | 
				
			||||||
 | 
					 * 
 | 
				
			||||||
 | 
					 * Licence:      GPL - http://www.gnu.org/copyleft/gpl.html
 | 
				
			||||||
 | 
					 * Copyright (c) 2017, Bogazici University, Istanbul, Turkey
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package edu.boun.edgecloudsim.core;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import java.util.List;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import org.cloudbus.cloudsim.Host;
 | 
				
			||||||
 | 
					import org.cloudbus.cloudsim.UtilizationModel;
 | 
				
			||||||
 | 
					import org.cloudbus.cloudsim.VmAllocationPolicy;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import edu.boun.edgecloudsim.edge_orchestrator.EdgeOrchestrator;
 | 
				
			||||||
 | 
					import edu.boun.edgecloudsim.mobility.MobilityModel;
 | 
				
			||||||
 | 
					import edu.boun.edgecloudsim.task_generator.LoadGeneratorModel;
 | 
				
			||||||
 | 
					import edu.boun.edgecloudsim.network.NetworkModel;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					public interface ScenarioFactory {
 | 
				
			||||||
 | 
						/**
 | 
				
			||||||
 | 
						 * provides abstract Load Generator Model
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
						public LoadGeneratorModel getLoadGeneratorModel();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/**
 | 
				
			||||||
 | 
						 * provides abstract Edge Orchestrator
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
						public EdgeOrchestrator getEdgeOrchestrator();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/**
 | 
				
			||||||
 | 
						 * provides abstract Mobility Model
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
						public MobilityModel getMobilityModel();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/**
 | 
				
			||||||
 | 
						 * provides abstract Network Model
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
						public NetworkModel getNetworkModel();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/**
 | 
				
			||||||
 | 
						 * provides abstract CPU Utilization Model
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
						public UtilizationModel getCpuUtilizationModel(SimSettings.APP_TYPES _taskType);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/**
 | 
				
			||||||
 | 
						 * provides abstract Vm Allocation Policy
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
						public VmAllocationPolicy getVmAllocationPolicy(List<? extends Host> list, int dataCenterIndex);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										200
									
								
								src/edu/boun/edgecloudsim/core/SimManager.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										200
									
								
								src/edu/boun/edgecloudsim/core/SimManager.java
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,200 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Title:        EdgeCloudSim - Simulation Manager
 | 
				
			||||||
 | 
					 * 
 | 
				
			||||||
 | 
					 * Description: 
 | 
				
			||||||
 | 
					 * SimManager is an singleton class providing many abstract classeses such as
 | 
				
			||||||
 | 
					 * Network Model, Mobility Model, Edge Orchestrator to other modules
 | 
				
			||||||
 | 
					 * Critical simulation related information would be gathered via this class 
 | 
				
			||||||
 | 
					 * 
 | 
				
			||||||
 | 
					 * Licence:      GPL - http://www.gnu.org/copyleft/gpl.html
 | 
				
			||||||
 | 
					 * Copyright (c) 2017, Bogazici University, Istanbul, Turkey
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package edu.boun.edgecloudsim.core;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import java.io.IOException;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import org.cloudbus.cloudsim.Log;
 | 
				
			||||||
 | 
					import org.cloudbus.cloudsim.core.CloudSim;
 | 
				
			||||||
 | 
					import org.cloudbus.cloudsim.core.SimEntity;
 | 
				
			||||||
 | 
					import org.cloudbus.cloudsim.core.SimEvent;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import edu.boun.edgecloudsim.edge_orchestrator.EdgeOrchestrator;
 | 
				
			||||||
 | 
					import edu.boun.edgecloudsim.edge_server.EdgeServerManager;
 | 
				
			||||||
 | 
					import edu.boun.edgecloudsim.edge_server.VmAllocationPolicy_Custom;
 | 
				
			||||||
 | 
					import edu.boun.edgecloudsim.edge_client.MobileDeviceManager;
 | 
				
			||||||
 | 
					import edu.boun.edgecloudsim.mobility.MobilityModel;
 | 
				
			||||||
 | 
					import edu.boun.edgecloudsim.task_generator.LoadGeneratorModel;
 | 
				
			||||||
 | 
					import edu.boun.edgecloudsim.network.NetworkModel;
 | 
				
			||||||
 | 
					import edu.boun.edgecloudsim.utils.EdgeTask;
 | 
				
			||||||
 | 
					import edu.boun.edgecloudsim.utils.SimLogger;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					public class SimManager extends SimEntity {
 | 
				
			||||||
 | 
						private static final int CREATE_TASK = 0;
 | 
				
			||||||
 | 
						private static final int CHECK_ALL_VM = 1;
 | 
				
			||||||
 | 
						private static final int GET_LOAD_LOG = 2;
 | 
				
			||||||
 | 
						private static final int PRINT_PROGRESS = 3;
 | 
				
			||||||
 | 
						private static final int STOP_SIMULATION = 4;
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						private int numOfMobileDevice;
 | 
				
			||||||
 | 
						private NetworkModel networkModel;
 | 
				
			||||||
 | 
						private MobilityModel mobilityModel;
 | 
				
			||||||
 | 
						private ScenarioFactory scenarioFactory;
 | 
				
			||||||
 | 
						private EdgeOrchestrator edgeOrchestrator;
 | 
				
			||||||
 | 
						private EdgeServerManager edgeServerManager;
 | 
				
			||||||
 | 
						private LoadGeneratorModel loadGeneratorModel;
 | 
				
			||||||
 | 
						private MobileDeviceManager mobileDeviceManager;
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						private static SimManager instance = null;
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						public SimManager(ScenarioFactory _scenarioFactory, int _numOfMobileDevice, SimSettings.SCENARIO_TYPES _simScenario) throws Exception {
 | 
				
			||||||
 | 
							super("SimManager");
 | 
				
			||||||
 | 
							scenarioFactory = _scenarioFactory;
 | 
				
			||||||
 | 
							numOfMobileDevice = _numOfMobileDevice;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							SimLogger.print("Creating tasks...");
 | 
				
			||||||
 | 
							loadGeneratorModel = scenarioFactory.getLoadGeneratorModel();
 | 
				
			||||||
 | 
							loadGeneratorModel.initializeModel();
 | 
				
			||||||
 | 
							SimLogger.printLine("Done, ");
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							SimLogger.print("Creating device locations...");
 | 
				
			||||||
 | 
							mobilityModel = scenarioFactory.getMobilityModel();
 | 
				
			||||||
 | 
							mobilityModel.initialize();
 | 
				
			||||||
 | 
							SimLogger.printLine("Done.");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							//Generate network model
 | 
				
			||||||
 | 
							networkModel = scenarioFactory.getNetworkModel();
 | 
				
			||||||
 | 
							networkModel.initialize();
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							//Generate edge orchestrator
 | 
				
			||||||
 | 
							edgeOrchestrator = scenarioFactory.getEdgeOrchestrator();
 | 
				
			||||||
 | 
							edgeOrchestrator.initialize();
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							//Create Physical Servers
 | 
				
			||||||
 | 
							edgeServerManager = new EdgeServerManager();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							//Create Client Manager
 | 
				
			||||||
 | 
							mobileDeviceManager = new MobileDeviceManager();
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							instance = this;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						public static SimManager getInstance(){
 | 
				
			||||||
 | 
							return instance;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						/**
 | 
				
			||||||
 | 
						 * Triggering CloudSim to start simulation
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
						public void startSimulation() throws Exception{
 | 
				
			||||||
 | 
							//Starts the simulation
 | 
				
			||||||
 | 
							SimLogger.print(super.getName()+" is starting...");
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							//Start Edge Servers & Generate VMs
 | 
				
			||||||
 | 
							edgeServerManager.startDatacenters();
 | 
				
			||||||
 | 
							edgeServerManager.createVmList(mobileDeviceManager.getId());
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							CloudSim.startSimulation();
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						public ScenarioFactory getScenarioFactory(){
 | 
				
			||||||
 | 
							return scenarioFactory;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						public int getNumOfMobileDevice(){
 | 
				
			||||||
 | 
							return numOfMobileDevice;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						public NetworkModel getNetworkModel(){
 | 
				
			||||||
 | 
							return networkModel;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						public MobilityModel getMobilityModel(){
 | 
				
			||||||
 | 
							return mobilityModel;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						public EdgeOrchestrator getEdgeOrchestrator(){
 | 
				
			||||||
 | 
							return edgeOrchestrator;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						public EdgeServerManager getLocalServerManager(){
 | 
				
			||||||
 | 
							return edgeServerManager;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						public MobileDeviceManager getMobileDeviceManager(){
 | 
				
			||||||
 | 
							return mobileDeviceManager;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						@Override
 | 
				
			||||||
 | 
						public void startEntity() {
 | 
				
			||||||
 | 
							for(int i=0; i<edgeServerManager.getDatacenterList().size(); i++)
 | 
				
			||||||
 | 
								mobileDeviceManager.submitVmList(edgeServerManager.getVmList(i));
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							//Creation of tasks are scheduled here!
 | 
				
			||||||
 | 
							for(int i=0; i< loadGeneratorModel.getTaskList().size(); i++)
 | 
				
			||||||
 | 
								schedule(getId(), loadGeneratorModel.getTaskList().get(i).startTime, CREATE_TASK, loadGeneratorModel.getTaskList().get(i));
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							//Periodic event loops starts from here!
 | 
				
			||||||
 | 
							schedule(getId(), 5, CHECK_ALL_VM);
 | 
				
			||||||
 | 
							schedule(getId(), SimSettings.getInstance().getSimulationTime()/100, PRINT_PROGRESS);
 | 
				
			||||||
 | 
							schedule(getId(), SimSettings.getInstance().getVmLoadLogInterval(), GET_LOAD_LOG);
 | 
				
			||||||
 | 
							schedule(getId(), SimSettings.getInstance().getSimulationTime(), STOP_SIMULATION);
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							SimLogger.printLine("Done.");
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						@Override
 | 
				
			||||||
 | 
						public void processEvent(SimEvent ev) {
 | 
				
			||||||
 | 
							synchronized(this){
 | 
				
			||||||
 | 
								switch (ev.getTag()) {
 | 
				
			||||||
 | 
								case CREATE_TASK:
 | 
				
			||||||
 | 
									try {
 | 
				
			||||||
 | 
										EdgeTask edgeTask = (EdgeTask) ev.getData();
 | 
				
			||||||
 | 
										mobileDeviceManager.submitTask(edgeTask);						
 | 
				
			||||||
 | 
									} catch (Exception e) {
 | 
				
			||||||
 | 
										e.printStackTrace();
 | 
				
			||||||
 | 
										System.exit(0);
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
									break;
 | 
				
			||||||
 | 
								case CHECK_ALL_VM:
 | 
				
			||||||
 | 
									int totalNumOfVm = SimSettings.getInstance().getNumOfEdgeVMs();
 | 
				
			||||||
 | 
									if(VmAllocationPolicy_Custom.getCreatedVmNum() != totalNumOfVm){
 | 
				
			||||||
 | 
										SimLogger.printLine("All VMs cannot be created! Terminating simulation...");
 | 
				
			||||||
 | 
										System.exit(0);
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
									break;
 | 
				
			||||||
 | 
								case GET_LOAD_LOG:
 | 
				
			||||||
 | 
									SimLogger.getInstance().addVmUtilizationLog(CloudSim.clock(),edgeServerManager.getAvgUtilization());
 | 
				
			||||||
 | 
									schedule(getId(), SimSettings.getInstance().getVmLoadLogInterval(), GET_LOAD_LOG);
 | 
				
			||||||
 | 
									break;
 | 
				
			||||||
 | 
								case PRINT_PROGRESS:
 | 
				
			||||||
 | 
									int progress = (int)((CloudSim.clock()*100)/SimSettings.getInstance().getSimulationTime());
 | 
				
			||||||
 | 
									if(progress % 10 == 0)
 | 
				
			||||||
 | 
										SimLogger.print(Integer.toString(progress));
 | 
				
			||||||
 | 
									else
 | 
				
			||||||
 | 
										SimLogger.print(".");
 | 
				
			||||||
 | 
									if(CloudSim.clock() < SimSettings.getInstance().getSimulationTime())
 | 
				
			||||||
 | 
										schedule(getId(), SimSettings.getInstance().getSimulationTime()/100, PRINT_PROGRESS);
 | 
				
			||||||
 | 
									break;
 | 
				
			||||||
 | 
								case STOP_SIMULATION:
 | 
				
			||||||
 | 
									SimLogger.printLine("100");
 | 
				
			||||||
 | 
									CloudSim.terminateSimulation();
 | 
				
			||||||
 | 
									try {
 | 
				
			||||||
 | 
										SimLogger.getInstance().simStopped();
 | 
				
			||||||
 | 
									} catch (IOException e) {
 | 
				
			||||||
 | 
										e.printStackTrace();
 | 
				
			||||||
 | 
										System.exit(0);
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
									break;
 | 
				
			||||||
 | 
								default:
 | 
				
			||||||
 | 
									Log.printLine(getName() + ": unknown event type");
 | 
				
			||||||
 | 
									break;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						@Override
 | 
				
			||||||
 | 
						public void shutdownEntity() {
 | 
				
			||||||
 | 
							edgeServerManager.terminateDatacenters();
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										490
									
								
								src/edu/boun/edgecloudsim/core/SimSettings.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										490
									
								
								src/edu/boun/edgecloudsim/core/SimSettings.java
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,490 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Title:        EdgeCloudSim - Simulation Settings class
 | 
				
			||||||
 | 
					 * 
 | 
				
			||||||
 | 
					 * Description: 
 | 
				
			||||||
 | 
					 * SimSettings provides system wide simulation settings. It is a
 | 
				
			||||||
 | 
					 * singleton class and provides all necessary information to other modules.
 | 
				
			||||||
 | 
					 * If you need to use another simulation setting variable in your
 | 
				
			||||||
 | 
					 * config file, add related getter methot in this class.
 | 
				
			||||||
 | 
					 *               
 | 
				
			||||||
 | 
					 * Licence:      GPL - http://www.gnu.org/copyleft/gpl.html
 | 
				
			||||||
 | 
					 * Copyright (c) 2017, Bogazici University, Istanbul, Turkey
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package edu.boun.edgecloudsim.core;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import java.io.File;
 | 
				
			||||||
 | 
					import java.io.FileInputStream;
 | 
				
			||||||
 | 
					import java.io.IOException;
 | 
				
			||||||
 | 
					import java.io.InputStream;
 | 
				
			||||||
 | 
					import java.util.Properties;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import javax.xml.parsers.DocumentBuilder;
 | 
				
			||||||
 | 
					import javax.xml.parsers.DocumentBuilderFactory;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import org.w3c.dom.Document;
 | 
				
			||||||
 | 
					import org.w3c.dom.Element;
 | 
				
			||||||
 | 
					import org.w3c.dom.Node;
 | 
				
			||||||
 | 
					import org.w3c.dom.NodeList;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import edu.boun.edgecloudsim.utils.SimLogger;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					public class SimSettings {
 | 
				
			||||||
 | 
						private static SimSettings instance = null;
 | 
				
			||||||
 | 
						private Document edgeDevicesDoc = null;
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						//enumarations for the scenarion, VM, appplication, and place.
 | 
				
			||||||
 | 
						//if you want to add different types on your config file,
 | 
				
			||||||
 | 
						//you may modify current types or add new types here. 
 | 
				
			||||||
 | 
						public static enum VM_TYPES { EDGE_VM, CLOUD_VM }
 | 
				
			||||||
 | 
						public static enum APP_TYPES { FACE_REC_APP, HEALTH_APP, HEAVY_COMP_APP, VIDEO_GAME_APP, SIMPLE_SERVICE_APP }
 | 
				
			||||||
 | 
						public static enum PLACE_TYPES { ATTRACTIVENESS_L1, ATTRACTIVENESS_L2, ATTRACTIVENESS_L3 }
 | 
				
			||||||
 | 
						public static enum SCENARIO_TYPES { SINGLE_TIER, TWO_TIER, TWO_TIER_WITH_EO }
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						//predifined ID for cloud components.
 | 
				
			||||||
 | 
						public static int CLOUD_DATACENTER_ID = 1000;
 | 
				
			||||||
 | 
						public static int CLOUD_HOST_ID = CLOUD_DATACENTER_ID + 1;
 | 
				
			||||||
 | 
						public static int CLOUD_VM_ID = CLOUD_DATACENTER_ID + 2;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						//delimiter for output file.
 | 
				
			||||||
 | 
						public static String DELIMITER = ";";
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
					    private double SIMULATION_TIME; //hours unit in properties file
 | 
				
			||||||
 | 
					    private double WARM_UP_PERIOD; //seconds unit in properties file
 | 
				
			||||||
 | 
					    private double INTERVAL_TO_GET_VM_LOAD_LOG; //seconds unit in properties file
 | 
				
			||||||
 | 
					    private double INTERVAL_TO_GET_VM_LOCATION_LOG; //seconds unit in properties file
 | 
				
			||||||
 | 
					    private boolean DEEP_FILE_LOG_ENABLED; //used for each success failed task
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private int MIN_NUM_OF_MOBILE_DEVICES;
 | 
				
			||||||
 | 
					    private int MAX_NUM_OF_MOBILE_DEVICES;
 | 
				
			||||||
 | 
					    private int MOBILE_DEVICE_COUNTER_SIZE;
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    private int NUM_OF_EDGE_DATACENTERS;
 | 
				
			||||||
 | 
					    private int NUM_OF_EDGE_HOSTS;
 | 
				
			||||||
 | 
					    private int NUM_OF_EDGE_VMS;
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    private double WAN_PROPOGATION_DELAY; //seconds unit in properties file
 | 
				
			||||||
 | 
					    private double LAN_INTERNAL_DELAY; //seconds unit in properties file
 | 
				
			||||||
 | 
					    private int BANDWITH_WLAN; //Mbps unit in properties file
 | 
				
			||||||
 | 
					    private int BANDWITH_WAN; //Mbps unit in properties file
 | 
				
			||||||
 | 
					    private int BANDWITH_GSM; //Mbps unit in properties file
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private int MIPS_FOR_CLOUD; //MIPS
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    private String ORCHESTRATOR_POLICY;
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    // mean waiting time (minute) is stored for each place types
 | 
				
			||||||
 | 
					    private double[] mobilityLookUpTable;
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    // following values are stored for each applications defined in applications.xml
 | 
				
			||||||
 | 
					    // [0] usage percentage (%)
 | 
				
			||||||
 | 
					    // [1] prob. of selecting cloud (%)
 | 
				
			||||||
 | 
					    // [2] poisson mean (sec)
 | 
				
			||||||
 | 
					    // [3] active period (sec)
 | 
				
			||||||
 | 
					    // [4] idle period (sec)
 | 
				
			||||||
 | 
					    // [5] avg data upload (KB)
 | 
				
			||||||
 | 
					    // [6] avg data download (KB)
 | 
				
			||||||
 | 
					    // [7] avg task length (MI)
 | 
				
			||||||
 | 
					    // [8] required # of cores
 | 
				
			||||||
 | 
					    // [9] vm utilization (%)
 | 
				
			||||||
 | 
					    private double[][] taskLookUpTable = new double[APP_TYPES.values().length][10];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						private SimSettings() {
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						public static SimSettings getInstance() {
 | 
				
			||||||
 | 
							if(instance == null) {
 | 
				
			||||||
 | 
								instance = new SimSettings();
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							return instance;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						/**
 | 
				
			||||||
 | 
						 * Reads configuration file and stores information to local variables
 | 
				
			||||||
 | 
						 * @param propertiesFile
 | 
				
			||||||
 | 
						 * @return
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
						public boolean initialize(String propertiesFile, String edgeDevicesFile, String applicationsFile){
 | 
				
			||||||
 | 
							boolean result = false;
 | 
				
			||||||
 | 
							InputStream input = null;
 | 
				
			||||||
 | 
							try {
 | 
				
			||||||
 | 
								input = new FileInputStream(propertiesFile);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								// load a properties file
 | 
				
			||||||
 | 
								Properties prop = new Properties();
 | 
				
			||||||
 | 
								prop.load(input);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								SIMULATION_TIME = 3600 * Double.parseDouble(prop.getProperty("simulation_time")); //hours
 | 
				
			||||||
 | 
								WARM_UP_PERIOD = Double.parseDouble(prop.getProperty("warm_up_period")); //seconds
 | 
				
			||||||
 | 
								INTERVAL_TO_GET_VM_LOAD_LOG = Double.parseDouble(prop.getProperty("vm_load_check_interval")); //seconds
 | 
				
			||||||
 | 
								INTERVAL_TO_GET_VM_LOCATION_LOG = Double.parseDouble(prop.getProperty("vm_location_check_interval")); //seconds
 | 
				
			||||||
 | 
								DEEP_FILE_LOG_ENABLED = Boolean.parseBoolean(prop.getProperty("deep_file_log_enabled"));
 | 
				
			||||||
 | 
								
 | 
				
			||||||
 | 
								MIN_NUM_OF_MOBILE_DEVICES = Integer.parseInt(prop.getProperty("min_number_of_mobile_devices"));
 | 
				
			||||||
 | 
								MAX_NUM_OF_MOBILE_DEVICES = Integer.parseInt(prop.getProperty("max_number_of_mobile_devices"));
 | 
				
			||||||
 | 
								MOBILE_DEVICE_COUNTER_SIZE = Integer.parseInt(prop.getProperty("mobile_device_counter_size"));
 | 
				
			||||||
 | 
								
 | 
				
			||||||
 | 
								WAN_PROPOGATION_DELAY = Double.parseDouble(prop.getProperty("wan_propogation_delay"));
 | 
				
			||||||
 | 
								LAN_INTERNAL_DELAY = Double.parseDouble(prop.getProperty("lan_internal_delay"));
 | 
				
			||||||
 | 
								BANDWITH_WLAN = 1000 * Integer.parseInt(prop.getProperty("wlan_bandwidth"));
 | 
				
			||||||
 | 
								BANDWITH_WAN = 1000 * Integer.parseInt(prop.getProperty("wan_bandwidth"));
 | 
				
			||||||
 | 
								BANDWITH_GSM =  1000 * Integer.parseInt(prop.getProperty("gsm_bandwidth"));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								//It is assumed that
 | 
				
			||||||
 | 
								//-Storage and RAM are unlimited in cloud
 | 
				
			||||||
 | 
								//-Each task is executed with maximum capacity (as if there is no task in the cloud) 
 | 
				
			||||||
 | 
								MIPS_FOR_CLOUD = Integer.parseInt(prop.getProperty("mips_for_cloud"));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								ORCHESTRATOR_POLICY = prop.getProperty("task_provisioning");
 | 
				
			||||||
 | 
								
 | 
				
			||||||
 | 
								//avg waiting time in a place (min)
 | 
				
			||||||
 | 
								double place1_mean_waiting_time = Double.parseDouble(prop.getProperty("attractiveness_L1_mean_waiting_time"));
 | 
				
			||||||
 | 
								double place2_mean_waiting_time = Double.parseDouble(prop.getProperty("attractiveness_L2_mean_waiting_time"));
 | 
				
			||||||
 | 
								double place3_mean_waiting_time = Double.parseDouble(prop.getProperty("attractiveness_L3_mean_waiting_time"));
 | 
				
			||||||
 | 
								
 | 
				
			||||||
 | 
								//mean waiting time (minute)
 | 
				
			||||||
 | 
								mobilityLookUpTable = new double[]{
 | 
				
			||||||
 | 
									place1_mean_waiting_time, //ATTRACTIVENESS_L1
 | 
				
			||||||
 | 
									place2_mean_waiting_time, //ATTRACTIVENESS_L2
 | 
				
			||||||
 | 
									place3_mean_waiting_time  //ATTRACTIVENESS_L3
 | 
				
			||||||
 | 
							    };
 | 
				
			||||||
 | 
								
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							} catch (IOException ex) {
 | 
				
			||||||
 | 
								ex.printStackTrace();
 | 
				
			||||||
 | 
							} finally {
 | 
				
			||||||
 | 
								if (input != null) {
 | 
				
			||||||
 | 
									try {
 | 
				
			||||||
 | 
										input.close();
 | 
				
			||||||
 | 
										result = true;
 | 
				
			||||||
 | 
									} catch (IOException e) {
 | 
				
			||||||
 | 
										e.printStackTrace();
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							parseApplicatinosXML(applicationsFile);
 | 
				
			||||||
 | 
							parseEdgeDevicesXML(edgeDevicesFile);
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							return result;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						/**
 | 
				
			||||||
 | 
						 * returns the parsed XML document for edge_devices.xml
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
						public Document getEdgeDevicesDocument(){
 | 
				
			||||||
 | 
							return edgeDevicesDoc;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/**
 | 
				
			||||||
 | 
						 * returns simulation time (in hours unit) from properties file
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
						public double getSimulationTime()
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							return SIMULATION_TIME;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/**
 | 
				
			||||||
 | 
						 * returns warm up period (in seconds unit) from properties file
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
						public double getWarmUpPeriod()
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							return WARM_UP_PERIOD; 
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/**
 | 
				
			||||||
 | 
						 * returns VM utilization log collection interval (in seconds unit) from properties file
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
						public double getVmLoadLogInterval()
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							return INTERVAL_TO_GET_VM_LOAD_LOG; 
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/**
 | 
				
			||||||
 | 
						 * returns VM location log collection interval (in seconds unit) from properties file
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
						public double getVmLocationLogInterval()
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							return INTERVAL_TO_GET_VM_LOCATION_LOG; 
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/**
 | 
				
			||||||
 | 
						 * returns deep statistics logging status from properties file
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
						public boolean getDeepFileLoggingEnabled()
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							return DEEP_FILE_LOG_ENABLED; 
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/**
 | 
				
			||||||
 | 
						 * returns WAN propogation delay (in second unit) from properties file
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
						public double getWanPropogationDelay()
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							return WAN_PROPOGATION_DELAY;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/**
 | 
				
			||||||
 | 
						 * returns internal LAN propogation delay (in second unit) from properties file
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
						public double getInternalLanDelay()
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							return LAN_INTERNAL_DELAY;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/**
 | 
				
			||||||
 | 
						 * returns WLAN bandwidth (in Mbps unit) from properties file
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
						public int getWlanBandwidth()
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							return BANDWITH_WLAN;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/**
 | 
				
			||||||
 | 
						 * returns WAN bandwidth (in Mbps unit) from properties file
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
						public int getWanBandwidth()
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							return BANDWITH_WAN; 
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/**
 | 
				
			||||||
 | 
						 * returns GSM bandwidth (in Mbps unit) from properties file
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
						public int getGsmBandwidth()
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							return BANDWITH_GSM;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						/**
 | 
				
			||||||
 | 
						 * returns the minimum number of the mobile devices used in the simulation
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
						public int getMinNumOfMobileDev()
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							return MIN_NUM_OF_MOBILE_DEVICES;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/**
 | 
				
			||||||
 | 
						 * returns the maximunm number of the mobile devices used in the simulation
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
						public int getMaxNumOfMobileDev()
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							return MAX_NUM_OF_MOBILE_DEVICES;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/**
 | 
				
			||||||
 | 
						 * returns the number of increase on mobile devices
 | 
				
			||||||
 | 
						 * while iterating from min to max mobile device
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
						public int getMobileDevCounterSize()
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							return MOBILE_DEVICE_COUNTER_SIZE;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/**
 | 
				
			||||||
 | 
						 * returns the number of edge datacenters
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
						public int getNumOfEdgeDatacenters()
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							return NUM_OF_EDGE_DATACENTERS;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/**
 | 
				
			||||||
 | 
						 * returns the number of edge hosts running on the datacenters
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
						public int getNumOfEdgeHosts()
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							return NUM_OF_EDGE_HOSTS;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/**
 | 
				
			||||||
 | 
						 * returns the number of edge VMs running on the hosts
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
						public int getNumOfEdgeVMs()
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							return NUM_OF_EDGE_VMS;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/**
 | 
				
			||||||
 | 
						 * returns MIPS of the central cloud
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
						public int getMipsForCloud()
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							return MIPS_FOR_CLOUD;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/**
 | 
				
			||||||
 | 
						 * returns orchestrator policy as string
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
						public String getOrchestratorPolicy()
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							return ORCHESTRATOR_POLICY;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						/**
 | 
				
			||||||
 | 
						 * returns mobility characteristic within an array
 | 
				
			||||||
 | 
						 * the result includes mean waiting time (minute) or each place type
 | 
				
			||||||
 | 
						 */ 
 | 
				
			||||||
 | 
						public double[] getMobilityLookUpTable()
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							return mobilityLookUpTable;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/**
 | 
				
			||||||
 | 
						 * returns application characteristic within two dimensional array
 | 
				
			||||||
 | 
						 * the result includes the following values for each application type
 | 
				
			||||||
 | 
						 * [0] usage percentage (%)
 | 
				
			||||||
 | 
						 * [1] prob. of selecting cloud (%)
 | 
				
			||||||
 | 
						 * [2] poisson mean (sec)
 | 
				
			||||||
 | 
						 * [3] active period (sec)
 | 
				
			||||||
 | 
						 * [4] idle period (sec)
 | 
				
			||||||
 | 
						 * [5] avg data upload (KB)
 | 
				
			||||||
 | 
						 * [6] avg data download (KB)
 | 
				
			||||||
 | 
						 * [7] avg task length (MI)
 | 
				
			||||||
 | 
						 * [8] required # of cores
 | 
				
			||||||
 | 
						 * [9] vm utilization (%)
 | 
				
			||||||
 | 
						 */ 
 | 
				
			||||||
 | 
						public double[][] getTaskLookUpTable()
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							return taskLookUpTable;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						private void isAttribtuePresent(Element element, String key) {
 | 
				
			||||||
 | 
					        String value = element.getAttribute(key);
 | 
				
			||||||
 | 
					        if (value.isEmpty() || value == null){
 | 
				
			||||||
 | 
					        	throw new IllegalArgumentException("Attribure '" + key + "' is not found in '" + element.getNodeName() +"'");
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						private void isElementPresent(Element element, String key) {
 | 
				
			||||||
 | 
							try {
 | 
				
			||||||
 | 
								String value = element.getElementsByTagName(key).item(0).getTextContent();
 | 
				
			||||||
 | 
						        if (value.isEmpty() || value == null){
 | 
				
			||||||
 | 
						        	throw new IllegalArgumentException("Element '" + key + "' is not found in '" + element.getNodeName() +"'");
 | 
				
			||||||
 | 
						        }
 | 
				
			||||||
 | 
							} catch (Exception e) {
 | 
				
			||||||
 | 
								throw new IllegalArgumentException("Element '" + key + "' is not found in '" + element.getNodeName() +"'");
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						private void parseApplicatinosXML(String filePath)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							Document doc = null;
 | 
				
			||||||
 | 
							try {	
 | 
				
			||||||
 | 
								File devicesFile = new File(filePath);
 | 
				
			||||||
 | 
								DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
 | 
				
			||||||
 | 
								DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
 | 
				
			||||||
 | 
								doc = dBuilder.parse(devicesFile);
 | 
				
			||||||
 | 
								doc.getDocumentElement().normalize();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								NodeList appList = doc.getElementsByTagName("application");
 | 
				
			||||||
 | 
								for (int i = 0; i < appList.getLength(); i++) {
 | 
				
			||||||
 | 
									Node appNode = appList.item(i);
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
									Element appElement = (Element) appNode;
 | 
				
			||||||
 | 
									isAttribtuePresent(appElement, "name");
 | 
				
			||||||
 | 
									isElementPresent(appElement, "usage_percentage");
 | 
				
			||||||
 | 
									isElementPresent(appElement, "prob_cloud_selection");
 | 
				
			||||||
 | 
									isElementPresent(appElement, "poisson_interarrival");
 | 
				
			||||||
 | 
									isElementPresent(appElement, "active_period");
 | 
				
			||||||
 | 
									isElementPresent(appElement, "idle_period");
 | 
				
			||||||
 | 
									isElementPresent(appElement, "data_upload");
 | 
				
			||||||
 | 
									isElementPresent(appElement, "data_download");
 | 
				
			||||||
 | 
									isElementPresent(appElement, "task_length");
 | 
				
			||||||
 | 
									isElementPresent(appElement, "required_core");
 | 
				
			||||||
 | 
									isElementPresent(appElement, "vm_utilization");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									String appName = appElement.getAttribute("name");
 | 
				
			||||||
 | 
									SimSettings.APP_TYPES appType = APP_TYPES.valueOf(appName);
 | 
				
			||||||
 | 
									double usage_percentage = Double.parseDouble(appElement.getElementsByTagName("usage_percentage").item(0).getTextContent());
 | 
				
			||||||
 | 
									double prob_cloud_selection = Double.parseDouble(appElement.getElementsByTagName("prob_cloud_selection").item(0).getTextContent());
 | 
				
			||||||
 | 
									double poisson_interarrival = Double.parseDouble(appElement.getElementsByTagName("poisson_interarrival").item(0).getTextContent());
 | 
				
			||||||
 | 
									double active_period = Double.parseDouble(appElement.getElementsByTagName("active_period").item(0).getTextContent());
 | 
				
			||||||
 | 
									double idle_period = Double.parseDouble(appElement.getElementsByTagName("idle_period").item(0).getTextContent());
 | 
				
			||||||
 | 
									double data_upload = Double.parseDouble(appElement.getElementsByTagName("data_upload").item(0).getTextContent());
 | 
				
			||||||
 | 
									double data_download = Double.parseDouble(appElement.getElementsByTagName("data_download").item(0).getTextContent());
 | 
				
			||||||
 | 
									double task_length = Double.parseDouble(appElement.getElementsByTagName("task_length").item(0).getTextContent());
 | 
				
			||||||
 | 
									double required_core = Double.parseDouble(appElement.getElementsByTagName("required_core").item(0).getTextContent());
 | 
				
			||||||
 | 
									double vm_utilization = Double.parseDouble(appElement.getElementsByTagName("vm_utilization").item(0).getTextContent());
 | 
				
			||||||
 | 
									
 | 
				
			||||||
 | 
								    taskLookUpTable[appType.ordinal()][0] = usage_percentage; //usage percentage (%)
 | 
				
			||||||
 | 
								    taskLookUpTable[appType.ordinal()][1] = prob_cloud_selection; //prob. of selecting cloud (%)
 | 
				
			||||||
 | 
								    taskLookUpTable[appType.ordinal()][2] = poisson_interarrival; //poisson mean (sec)
 | 
				
			||||||
 | 
								    taskLookUpTable[appType.ordinal()][3] = active_period; //active period (sec)
 | 
				
			||||||
 | 
								    taskLookUpTable[appType.ordinal()][4] = idle_period; //idle period (sec)
 | 
				
			||||||
 | 
								    taskLookUpTable[appType.ordinal()][5] = data_upload; //avg data upload (KB)
 | 
				
			||||||
 | 
								    taskLookUpTable[appType.ordinal()][6] = data_download; //avg data download (KB)
 | 
				
			||||||
 | 
								    taskLookUpTable[appType.ordinal()][7] = task_length; //avg task length (MI)
 | 
				
			||||||
 | 
								    taskLookUpTable[appType.ordinal()][8] = required_core; //required # of core
 | 
				
			||||||
 | 
								    taskLookUpTable[appType.ordinal()][9] = vm_utilization; //vm utilization (%)
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
							} catch (Exception e) {
 | 
				
			||||||
 | 
								SimLogger.printLine("Edge Devices XML cannot be parsed! Terminating simulation...");
 | 
				
			||||||
 | 
								e.printStackTrace();
 | 
				
			||||||
 | 
								System.exit(0);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						private void parseEdgeDevicesXML(String filePath)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							try {	
 | 
				
			||||||
 | 
								File devicesFile = new File(filePath);
 | 
				
			||||||
 | 
								DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
 | 
				
			||||||
 | 
								DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
 | 
				
			||||||
 | 
								edgeDevicesDoc = dBuilder.parse(devicesFile);
 | 
				
			||||||
 | 
								edgeDevicesDoc.getDocumentElement().normalize();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								NodeList datacenterList = edgeDevicesDoc.getElementsByTagName("datacenter");
 | 
				
			||||||
 | 
								for (int i = 0; i < datacenterList.getLength(); i++) {
 | 
				
			||||||
 | 
								    NUM_OF_EDGE_DATACENTERS++;
 | 
				
			||||||
 | 
									Node datacenterNode = datacenterList.item(i);
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
									Element datacenterElement = (Element) datacenterNode;
 | 
				
			||||||
 | 
									isAttribtuePresent(datacenterElement, "arch");
 | 
				
			||||||
 | 
									isAttribtuePresent(datacenterElement, "os");
 | 
				
			||||||
 | 
									isAttribtuePresent(datacenterElement, "vmm");
 | 
				
			||||||
 | 
									isElementPresent(datacenterElement, "costPerBw");
 | 
				
			||||||
 | 
									isElementPresent(datacenterElement, "costPerSec");
 | 
				
			||||||
 | 
									isElementPresent(datacenterElement, "costPerMem");
 | 
				
			||||||
 | 
									isElementPresent(datacenterElement, "costPerStorage");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									Element location = (Element)datacenterElement.getElementsByTagName("location").item(0);
 | 
				
			||||||
 | 
									isElementPresent(location, "attractiveness");
 | 
				
			||||||
 | 
									isElementPresent(location, "wlan_id");
 | 
				
			||||||
 | 
									isElementPresent(location, "x_pos");
 | 
				
			||||||
 | 
									isElementPresent(location, "y_pos");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									NodeList hostList = datacenterElement.getElementsByTagName("host");
 | 
				
			||||||
 | 
									for (int j = 0; j < hostList.getLength(); j++) {
 | 
				
			||||||
 | 
									    NUM_OF_EDGE_HOSTS++;
 | 
				
			||||||
 | 
										Node hostNode = hostList.item(j);
 | 
				
			||||||
 | 
										
 | 
				
			||||||
 | 
										Element hostElement = (Element) hostNode;
 | 
				
			||||||
 | 
										isElementPresent(hostElement, "core");
 | 
				
			||||||
 | 
										isElementPresent(hostElement, "mips");
 | 
				
			||||||
 | 
										isElementPresent(hostElement, "ram");
 | 
				
			||||||
 | 
										isElementPresent(hostElement, "storage");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
										NodeList vmList = hostElement.getElementsByTagName("VM");
 | 
				
			||||||
 | 
										for (int k = 0; k < vmList.getLength(); k++) {
 | 
				
			||||||
 | 
										    NUM_OF_EDGE_VMS++;
 | 
				
			||||||
 | 
											Node vmNode = vmList.item(k);
 | 
				
			||||||
 | 
											
 | 
				
			||||||
 | 
											Element vmElement = (Element) vmNode;
 | 
				
			||||||
 | 
											isAttribtuePresent(vmElement, "vmm");
 | 
				
			||||||
 | 
											isElementPresent(vmElement, "core");
 | 
				
			||||||
 | 
											isElementPresent(vmElement, "mips");
 | 
				
			||||||
 | 
											isElementPresent(vmElement, "ram");
 | 
				
			||||||
 | 
											isElementPresent(vmElement, "storage");
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
							} catch (Exception e) {
 | 
				
			||||||
 | 
								SimLogger.printLine("Edge Devices XML cannot be parsed! Terminating simulation...");
 | 
				
			||||||
 | 
								e.printStackTrace();
 | 
				
			||||||
 | 
								System.exit(0);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -0,0 +1,42 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * 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];
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										258
									
								
								src/edu/boun/edgecloudsim/edge_client/MobileDeviceManager.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										258
									
								
								src/edu/boun/edgecloudsim/edge_client/MobileDeviceManager.java
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,258 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * 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 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());
 | 
				
			||||||
 | 
								if(WlanDelay > 0)
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									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();
 | 
				
			||||||
 | 
									
 | 
				
			||||||
 | 
									Location currentLocation = SimManager.getInstance().getMobilityModel().getLocation(task.getMobileDeviceId(),CloudSim.clock());
 | 
				
			||||||
 | 
									
 | 
				
			||||||
 | 
									task.setSubmittedLocation(currentLocation);
 | 
				
			||||||
 | 
									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();
 | 
				
			||||||
 | 
									
 | 
				
			||||||
 | 
									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 WanDelay = networkModel.getDownloadDelay(SimSettings.CLOUD_DATACENTER_ID, task.getMobileDeviceId());
 | 
				
			||||||
 | 
										if(WanDelay > 0)
 | 
				
			||||||
 | 
										{
 | 
				
			||||||
 | 
											schedule(getId(), WanDelay, RESPONSE_RECEIVED_BY_MOBILE_DEVICE, task);
 | 
				
			||||||
 | 
											SimLogger.getInstance().downloadStarted(task.getCloudletId(), WanDelay);
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
										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());
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
									
 | 
				
			||||||
 | 
									break;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								case REQUEST_RECIVED_BY_EDGE_DEVICE:
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									Task task = (Task) ev.getData();
 | 
				
			||||||
 | 
									
 | 
				
			||||||
 | 
									Location currentLocation = SimManager.getInstance().getMobilityModel().getLocation(task.getMobileDeviceId(),CloudSim.clock());
 | 
				
			||||||
 | 
									
 | 
				
			||||||
 | 
									//select a VM
 | 
				
			||||||
 | 
									EdgeVM selectedVM = SimManager.getInstance().getEdgeOrchestrator().selectVm(task);
 | 
				
			||||||
 | 
									
 | 
				
			||||||
 | 
									if(selectedVM != null){
 | 
				
			||||||
 | 
										//save task info
 | 
				
			||||||
 | 
										task.setSubmittedLocation(currentLocation);
 | 
				
			||||||
 | 
										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());
 | 
				
			||||||
 | 
										sendNow(getVmsToDatacentersMap().get(task.getVmId()), 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());
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
									
 | 
				
			||||||
 | 
									break;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								case RESPONSE_RECEIVED_BY_MOBILE_DEVICE:
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									Cloudlet cloudlet = (Cloudlet) ev.getData();
 | 
				
			||||||
 | 
									//SimLogger.printLine(CloudSim.clock() + ": " + getName() + ": Cloudlet " + cloudlet.getCloudletId() + " is received");
 | 
				
			||||||
 | 
									SimLogger.getInstance().downloaded(cloudlet.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);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							//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());
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							if(edgeTask.requireCloud){
 | 
				
			||||||
 | 
								double WanDelay = networkModel.getUploadDelay(task.getMobileDeviceId(),SimSettings.CLOUD_DATACENTER_ID);
 | 
				
			||||||
 | 
								if(WanDelay>0){
 | 
				
			||||||
 | 
									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());
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							else {
 | 
				
			||||||
 | 
								double WlanDelay = networkModel.getUploadDelay(task.getMobileDeviceId(),0);
 | 
				
			||||||
 | 
								if(WlanDelay > 0){
 | 
				
			||||||
 | 
									schedule(getId(), WlanDelay, REQUEST_RECIVED_BY_EDGE_DEVICE, task);
 | 
				
			||||||
 | 
									SimLogger.getInstance().uploadStarted(task.getCloudletId(),WlanDelay);
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								else {
 | 
				
			||||||
 | 
									SimLogger.getInstance().rejectedDueToBandwidth(task.getCloudletId(), CloudSim.clock());
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						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();
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										66
									
								
								src/edu/boun/edgecloudsim/edge_client/Task.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										66
									
								
								src/edu/boun/edgecloudsim/edge_client/Task.java
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,66 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * 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;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -0,0 +1,199 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Title:        EdgeCloudSim - Basic Edge Orchestrator implementation
 | 
				
			||||||
 | 
					 * 
 | 
				
			||||||
 | 
					 * Description: 
 | 
				
			||||||
 | 
					 * BasicEdgeOrchestrator implements basic algorithms which are
 | 
				
			||||||
 | 
					 * first/next/best/worst/random fit algorithms while assigning
 | 
				
			||||||
 | 
					 * requests to the edge devices.
 | 
				
			||||||
 | 
					 *               
 | 
				
			||||||
 | 
					 * Licence:      GPL - http://www.gnu.org/copyleft/gpl.html
 | 
				
			||||||
 | 
					 * Copyright (c) 2017, Bogazici University, Istanbul, Turkey
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package edu.boun.edgecloudsim.edge_orchestrator;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import java.util.List;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import org.cloudbus.cloudsim.core.CloudSim;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import edu.boun.edgecloudsim.core.SimManager;
 | 
				
			||||||
 | 
					import edu.boun.edgecloudsim.core.SimSettings;
 | 
				
			||||||
 | 
					import edu.boun.edgecloudsim.core.SimSettings.SCENARIO_TYPES;
 | 
				
			||||||
 | 
					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.utils.Location;
 | 
				
			||||||
 | 
					import edu.boun.edgecloudsim.utils.SimUtils;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					public class BasicEdgeOrchestrator extends EdgeOrchestrator {
 | 
				
			||||||
 | 
						private int numberOfHost; //used by load balancer
 | 
				
			||||||
 | 
						private int lastSelectedHostIndex; //used by load balancer
 | 
				
			||||||
 | 
						private int[] lastSelectedVmIndexes; //used by each host individually
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						public BasicEdgeOrchestrator(String _policy,
 | 
				
			||||||
 | 
								SCENARIO_TYPES _simScenario) {
 | 
				
			||||||
 | 
							super(_policy, _simScenario);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						@Override
 | 
				
			||||||
 | 
						public void initialize() {
 | 
				
			||||||
 | 
							numberOfHost=SimSettings.getInstance().getNumOfEdgeHosts();
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							lastSelectedHostIndex = -1;
 | 
				
			||||||
 | 
							lastSelectedVmIndexes = new int[numberOfHost];
 | 
				
			||||||
 | 
							for(int i=0; i<numberOfHost; i++)
 | 
				
			||||||
 | 
								lastSelectedVmIndexes[i] = -1;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						@Override
 | 
				
			||||||
 | 
						public EdgeVM selectVm(Task task) {
 | 
				
			||||||
 | 
							if(simScenario == SimSettings.SCENARIO_TYPES.TWO_TIER_WITH_EO)
 | 
				
			||||||
 | 
								return selectVmOnLoadBalancer(task);
 | 
				
			||||||
 | 
							else
 | 
				
			||||||
 | 
								return selectVmOnHost(task);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						public EdgeVM selectVmOnHost(Task task){
 | 
				
			||||||
 | 
							EdgeVM selectedVM = null;
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							Location deviceLocation = SimManager.getInstance().getMobilityModel().getLocation(task.getMobileDeviceId(), CloudSim.clock());
 | 
				
			||||||
 | 
							//in our scenasrio, serving wlan ID is equal to the host id
 | 
				
			||||||
 | 
							//because there is only one host in one place
 | 
				
			||||||
 | 
							int relatedHostId=deviceLocation.getServingWlanId();
 | 
				
			||||||
 | 
							List<EdgeVM> vmArray = SimManager.getInstance().getLocalServerManager().getVmList(relatedHostId);
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							if(policy.equalsIgnoreCase("RANDOM_FIT")){
 | 
				
			||||||
 | 
								int randomIndex = SimUtils.getRandomNumber(0, vmArray.size()-1);
 | 
				
			||||||
 | 
								double requiredCapacity = ((CpuUtilizationModel_Custom)task.getUtilizationModelCpu()).predictUtilization(vmArray.get(randomIndex).getVmType());
 | 
				
			||||||
 | 
								double targetVmCapacity = (double)100 - vmArray.get(randomIndex).getCloudletScheduler().getTotalUtilizationOfCpu(CloudSim.clock());
 | 
				
			||||||
 | 
								if(requiredCapacity <= targetVmCapacity)
 | 
				
			||||||
 | 
									selectedVM = vmArray.get(randomIndex);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							else if(policy.equalsIgnoreCase("WORST_FIT")){
 | 
				
			||||||
 | 
								double selectedVmCapacity = 0; //start with min value
 | 
				
			||||||
 | 
								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 if(policy.equalsIgnoreCase("BEST_FIT")){
 | 
				
			||||||
 | 
								double selectedVmCapacity = 101; //start with max value
 | 
				
			||||||
 | 
								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 if(policy.equalsIgnoreCase("FIRST_FIT")){
 | 
				
			||||||
 | 
								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){
 | 
				
			||||||
 | 
										selectedVM = vmArray.get(vmIndex);
 | 
				
			||||||
 | 
										break;
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							else if(policy.equalsIgnoreCase("NEXT_FIT")){
 | 
				
			||||||
 | 
								int tries = 0;
 | 
				
			||||||
 | 
								while(tries < vmArray.size()){
 | 
				
			||||||
 | 
									lastSelectedVmIndexes[relatedHostId] = (lastSelectedVmIndexes[relatedHostId]+1) % vmArray.size();
 | 
				
			||||||
 | 
									double requiredCapacity = ((CpuUtilizationModel_Custom)task.getUtilizationModelCpu()).predictUtilization(vmArray.get(lastSelectedVmIndexes[relatedHostId]).getVmType());
 | 
				
			||||||
 | 
									double targetVmCapacity = (double)100 - vmArray.get(lastSelectedVmIndexes[relatedHostId]).getCloudletScheduler().getTotalUtilizationOfCpu(CloudSim.clock());
 | 
				
			||||||
 | 
									if(requiredCapacity <= targetVmCapacity){
 | 
				
			||||||
 | 
										selectedVM = vmArray.get(lastSelectedVmIndexes[relatedHostId]);
 | 
				
			||||||
 | 
										break;
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
									tries++;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							return selectedVM;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						public EdgeVM selectVmOnLoadBalancer(Task task){
 | 
				
			||||||
 | 
							EdgeVM selectedVM = null;
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							if(policy.equalsIgnoreCase("RANDOM_FIT")){
 | 
				
			||||||
 | 
								int randomHostIndex = SimUtils.getRandomNumber(0, numberOfHost-1);
 | 
				
			||||||
 | 
								List<EdgeVM> vmArray = SimManager.getInstance().getLocalServerManager().getVmList(randomHostIndex);
 | 
				
			||||||
 | 
								int randomIndex = SimUtils.getRandomNumber(0, vmArray.size()-1);
 | 
				
			||||||
 | 
								
 | 
				
			||||||
 | 
								double requiredCapacity = ((CpuUtilizationModel_Custom)task.getUtilizationModelCpu()).predictUtilization(vmArray.get(randomIndex).getVmType());
 | 
				
			||||||
 | 
								double targetVmCapacity = (double)100 - vmArray.get(randomIndex).getCloudletScheduler().getTotalUtilizationOfCpu(CloudSim.clock());
 | 
				
			||||||
 | 
								if(requiredCapacity <= targetVmCapacity)
 | 
				
			||||||
 | 
									selectedVM = vmArray.get(randomIndex);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							else if(policy.equalsIgnoreCase("WORST_FIT")){
 | 
				
			||||||
 | 
								double selectedVmCapacity = 0; //start with min value
 | 
				
			||||||
 | 
								for(int hostIndex=0; hostIndex<numberOfHost; hostIndex++){
 | 
				
			||||||
 | 
									List<EdgeVM> vmArray = SimManager.getInstance().getLocalServerManager().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 if(policy.equalsIgnoreCase("BEST_FIT")){
 | 
				
			||||||
 | 
								double selectedVmCapacity = 101; //start with max value
 | 
				
			||||||
 | 
								for(int hostIndex=0; hostIndex<numberOfHost; hostIndex++){
 | 
				
			||||||
 | 
									List<EdgeVM> vmArray = SimManager.getInstance().getLocalServerManager().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 if(policy.equalsIgnoreCase("FIRST_FIT")){
 | 
				
			||||||
 | 
								for(int hostIndex=0; hostIndex<numberOfHost; hostIndex++){
 | 
				
			||||||
 | 
									List<EdgeVM> vmArray = SimManager.getInstance().getLocalServerManager().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){
 | 
				
			||||||
 | 
											selectedVM = vmArray.get(vmIndex);
 | 
				
			||||||
 | 
											break;
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							else if(policy.equalsIgnoreCase("NEXT_FIT")){
 | 
				
			||||||
 | 
								int hostCheckCounter = 0;	
 | 
				
			||||||
 | 
								while(selectedVM == null && hostCheckCounter < numberOfHost){
 | 
				
			||||||
 | 
									int tries = 0;
 | 
				
			||||||
 | 
									lastSelectedHostIndex = (lastSelectedHostIndex+1) % numberOfHost;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									List<EdgeVM> vmArray = SimManager.getInstance().getLocalServerManager().getVmList(lastSelectedHostIndex);
 | 
				
			||||||
 | 
									while(tries < vmArray.size()){
 | 
				
			||||||
 | 
										lastSelectedVmIndexes[lastSelectedHostIndex] = (lastSelectedVmIndexes[lastSelectedHostIndex]+1) % vmArray.size();
 | 
				
			||||||
 | 
										double requiredCapacity = ((CpuUtilizationModel_Custom)task.getUtilizationModelCpu()).predictUtilization(vmArray.get(lastSelectedVmIndexes[lastSelectedHostIndex]).getVmType());
 | 
				
			||||||
 | 
										double targetVmCapacity = (double)100 - vmArray.get(lastSelectedVmIndexes[lastSelectedHostIndex]).getCloudletScheduler().getTotalUtilizationOfCpu(CloudSim.clock());
 | 
				
			||||||
 | 
										if(requiredCapacity <= targetVmCapacity){
 | 
				
			||||||
 | 
											selectedVM = vmArray.get(lastSelectedVmIndexes[lastSelectedHostIndex]);
 | 
				
			||||||
 | 
											break;
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
										tries++;
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									hostCheckCounter++;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							return selectedVM;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -0,0 +1,38 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Title:        EdgeCloudSim - Edge Orchestrator
 | 
				
			||||||
 | 
					 * 
 | 
				
			||||||
 | 
					 * Description: 
 | 
				
			||||||
 | 
					 * EdgeOrchestrator is an abstract class which is used for selecting VM
 | 
				
			||||||
 | 
					 * for each client requests. For those who wants to add a custom 
 | 
				
			||||||
 | 
					 * Edge Orchestrator to EdgeCloudSim should extend this class and provide
 | 
				
			||||||
 | 
					 * a concreate instance via ScenarioFactory
 | 
				
			||||||
 | 
					 *               
 | 
				
			||||||
 | 
					 * Licence:      GPL - http://www.gnu.org/copyleft/gpl.html
 | 
				
			||||||
 | 
					 * Copyright (c) 2017, Bogazici University, Istanbul, Turkey
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package edu.boun.edgecloudsim.edge_orchestrator;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import edu.boun.edgecloudsim.core.SimSettings;
 | 
				
			||||||
 | 
					import edu.boun.edgecloudsim.edge_server.EdgeVM;
 | 
				
			||||||
 | 
					import edu.boun.edgecloudsim.edge_client.Task;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					public abstract class EdgeOrchestrator {
 | 
				
			||||||
 | 
						protected String policy;
 | 
				
			||||||
 | 
						protected SimSettings.SCENARIO_TYPES simScenario;
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						public EdgeOrchestrator(String _policy, SimSettings.SCENARIO_TYPES _simScenario){
 | 
				
			||||||
 | 
							policy = _policy;
 | 
				
			||||||
 | 
							simScenario = _simScenario;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						/*
 | 
				
			||||||
 | 
						 * initialize edge orchestrator if needed
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
						public abstract void initialize();
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						/*
 | 
				
			||||||
 | 
						 * returns proper VM from the related edge orchestrator point of view
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
						public abstract EdgeVM selectVm(Task task);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										40
									
								
								src/edu/boun/edgecloudsim/edge_server/EdgeHost.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										40
									
								
								src/edu/boun/edgecloudsim/edge_server/EdgeHost.java
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,40 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Title:        EdgeCloudSim - EdgeHost
 | 
				
			||||||
 | 
					 * 
 | 
				
			||||||
 | 
					 * Description: 
 | 
				
			||||||
 | 
					 * EdgeHost adds location information over CloudSim's Host class
 | 
				
			||||||
 | 
					 *               
 | 
				
			||||||
 | 
					 * Licence:      GPL - http://www.gnu.org/copyleft/gpl.html
 | 
				
			||||||
 | 
					 * Copyright (c) 2017, Bogazici University, Istanbul, Turkey
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package edu.boun.edgecloudsim.edge_server;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import java.util.List;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import org.cloudbus.cloudsim.Host;
 | 
				
			||||||
 | 
					import org.cloudbus.cloudsim.Pe;
 | 
				
			||||||
 | 
					import org.cloudbus.cloudsim.VmScheduler;
 | 
				
			||||||
 | 
					import org.cloudbus.cloudsim.provisioners.BwProvisioner;
 | 
				
			||||||
 | 
					import org.cloudbus.cloudsim.provisioners.RamProvisioner;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import edu.boun.edgecloudsim.utils.Location;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					public class EdgeHost extends Host {
 | 
				
			||||||
 | 
						private Location location;
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						public EdgeHost(int id, RamProvisioner ramProvisioner,
 | 
				
			||||||
 | 
								BwProvisioner bwProvisioner, long storage,
 | 
				
			||||||
 | 
								List<? extends Pe> peList, VmScheduler vmScheduler) {
 | 
				
			||||||
 | 
							super(id, ramProvisioner, bwProvisioner, storage, peList, vmScheduler);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						public void setPlace(Location _location){
 | 
				
			||||||
 | 
							location=_location;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						public Location getLocation(){
 | 
				
			||||||
 | 
							return location;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										224
									
								
								src/edu/boun/edgecloudsim/edge_server/EdgeServerManager.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										224
									
								
								src/edu/boun/edgecloudsim/edge_server/EdgeServerManager.java
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,224 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Title:        EdgeCloudSim - Edge Server Manager
 | 
				
			||||||
 | 
					 * 
 | 
				
			||||||
 | 
					 * Description: 
 | 
				
			||||||
 | 
					 * EdgeServerManager is responsible for creating datacenters, hosts and VMs.
 | 
				
			||||||
 | 
					 * It also provides the list of VMs running on the hosts.
 | 
				
			||||||
 | 
					 * This information is critical for the edge orchestrator.
 | 
				
			||||||
 | 
					 * 
 | 
				
			||||||
 | 
					 * Licence:      GPL - http://www.gnu.org/copyleft/gpl.html
 | 
				
			||||||
 | 
					 * Copyright (c) 2017, Bogazici University, Istanbul, Turkey
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package edu.boun.edgecloudsim.edge_server;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import java.util.ArrayList;
 | 
				
			||||||
 | 
					import java.util.LinkedList;
 | 
				
			||||||
 | 
					import java.util.List;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import org.cloudbus.cloudsim.CloudletSchedulerTimeShared;
 | 
				
			||||||
 | 
					import org.cloudbus.cloudsim.Datacenter;
 | 
				
			||||||
 | 
					import org.cloudbus.cloudsim.DatacenterCharacteristics;
 | 
				
			||||||
 | 
					import org.cloudbus.cloudsim.Host;
 | 
				
			||||||
 | 
					import org.cloudbus.cloudsim.Pe;
 | 
				
			||||||
 | 
					import org.cloudbus.cloudsim.Storage;
 | 
				
			||||||
 | 
					import org.cloudbus.cloudsim.VmAllocationPolicy;
 | 
				
			||||||
 | 
					import org.cloudbus.cloudsim.VmSchedulerSpaceShared;
 | 
				
			||||||
 | 
					import org.cloudbus.cloudsim.core.CloudSim;
 | 
				
			||||||
 | 
					import org.cloudbus.cloudsim.provisioners.BwProvisionerSimple;
 | 
				
			||||||
 | 
					import org.cloudbus.cloudsim.provisioners.PeProvisionerSimple;
 | 
				
			||||||
 | 
					import org.cloudbus.cloudsim.provisioners.RamProvisionerSimple;
 | 
				
			||||||
 | 
					import org.w3c.dom.Document;
 | 
				
			||||||
 | 
					import org.w3c.dom.Element;
 | 
				
			||||||
 | 
					import org.w3c.dom.Node;
 | 
				
			||||||
 | 
					import org.w3c.dom.NodeList;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import edu.boun.edgecloudsim.core.SimManager;
 | 
				
			||||||
 | 
					import edu.boun.edgecloudsim.core.SimSettings;
 | 
				
			||||||
 | 
					import edu.boun.edgecloudsim.utils.Location;
 | 
				
			||||||
 | 
					import edu.boun.edgecloudsim.utils.SimUtils;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					public class EdgeServerManager {
 | 
				
			||||||
 | 
						private List<Datacenter> localDatacenters;
 | 
				
			||||||
 | 
						private List<List<EdgeVM>> vmList;
 | 
				
			||||||
 | 
						private int hostIdCounter;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						public EdgeServerManager() {
 | 
				
			||||||
 | 
							localDatacenters=new ArrayList<Datacenter>();
 | 
				
			||||||
 | 
							vmList = new ArrayList<List<EdgeVM>>();
 | 
				
			||||||
 | 
							hostIdCounter = 0;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						public List<EdgeVM> getVmList(int hostId){
 | 
				
			||||||
 | 
							return vmList.get(hostId);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						public List<Datacenter> getDatacenterList(){
 | 
				
			||||||
 | 
							return localDatacenters;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						public void startDatacenters() throws Exception{
 | 
				
			||||||
 | 
							//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;
 | 
				
			||||||
 | 
								localDatacenters.add(createDatacenter(i, datacenterElement));
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						public void createVmList(int brockerId){
 | 
				
			||||||
 | 
							int hostCounter=0;
 | 
				
			||||||
 | 
							int vmCounter=0;
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							//Create VMs for each hosts
 | 
				
			||||||
 | 
							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;
 | 
				
			||||||
 | 
								NodeList hostNodeList = datacenterElement.getElementsByTagName("host");
 | 
				
			||||||
 | 
								for (int j = 0; j < hostNodeList.getLength(); j++) {
 | 
				
			||||||
 | 
									
 | 
				
			||||||
 | 
									vmList.add(hostCounter, new ArrayList<EdgeVM>());
 | 
				
			||||||
 | 
									
 | 
				
			||||||
 | 
									Node hostNode = hostNodeList.item(j);
 | 
				
			||||||
 | 
									Element hostElement = (Element) hostNode;
 | 
				
			||||||
 | 
									NodeList vmNodeList = hostElement.getElementsByTagName("VM");
 | 
				
			||||||
 | 
									for (int k = 0; k < vmNodeList.getLength(); k++) {
 | 
				
			||||||
 | 
										Node vmNode = vmNodeList.item(k);					
 | 
				
			||||||
 | 
										Element vmElement = (Element) vmNode;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
										String vmm = vmElement.getAttribute("vmm");
 | 
				
			||||||
 | 
										int numOfCores = Integer.parseInt(vmElement.getElementsByTagName("core").item(0).getTextContent());
 | 
				
			||||||
 | 
										double mips = Double.parseDouble(vmElement.getElementsByTagName("mips").item(0).getTextContent());
 | 
				
			||||||
 | 
										int ram = Integer.parseInt(vmElement.getElementsByTagName("ram").item(0).getTextContent());
 | 
				
			||||||
 | 
										long storage = Long.parseLong(vmElement.getElementsByTagName("storage").item(0).getTextContent());
 | 
				
			||||||
 | 
										long bandwidth = SimSettings.getInstance().getWlanBandwidth() / (hostNodeList.getLength()+vmNodeList.getLength());
 | 
				
			||||||
 | 
										
 | 
				
			||||||
 | 
										//VM Parameters		
 | 
				
			||||||
 | 
										EdgeVM vm = new EdgeVM(vmCounter, brockerId, mips, numOfCores, ram, bandwidth, storage, vmm, new CloudletSchedulerTimeShared());
 | 
				
			||||||
 | 
										vm.setVmType(SimSettings.VM_TYPES.EDGE_VM);
 | 
				
			||||||
 | 
										vmList.get(hostCounter).add(vm);
 | 
				
			||||||
 | 
										vmCounter++;
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									hostCounter++;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						public void terminateDatacenters(){
 | 
				
			||||||
 | 
							for (Datacenter datacenter : localDatacenters) {
 | 
				
			||||||
 | 
								datacenter.shutdownEntity();
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						//average utilization of all VMs
 | 
				
			||||||
 | 
						public double getAvgUtilization(){
 | 
				
			||||||
 | 
							double totalUtilization = 0;
 | 
				
			||||||
 | 
							double vmCounter = 0;
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							// for each datacenter...
 | 
				
			||||||
 | 
							for(int i= 0; i<localDatacenters.size(); i++) {
 | 
				
			||||||
 | 
								List<? extends Host> list = localDatacenters.get(i).getHostList();
 | 
				
			||||||
 | 
								// for each host...
 | 
				
			||||||
 | 
								for (int j=0; j < list.size(); j++) {
 | 
				
			||||||
 | 
									Host host = list.get(j);
 | 
				
			||||||
 | 
									List<EdgeVM> vmArray = SimManager.getInstance().getLocalServerManager().getVmList(host.getId());
 | 
				
			||||||
 | 
									//for each vm...
 | 
				
			||||||
 | 
									for(int vmIndex=0; vmIndex<vmArray.size(); vmIndex++){
 | 
				
			||||||
 | 
										totalUtilization += vmArray.get(vmIndex).getCloudletScheduler().getTotalUtilizationOfCpu(CloudSim.clock());
 | 
				
			||||||
 | 
										vmCounter++;
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							return totalUtilization / vmCounter;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						private Datacenter createDatacenter(int index, Element datacenterElement) throws Exception{
 | 
				
			||||||
 | 
							String arch = datacenterElement.getAttribute("arch");
 | 
				
			||||||
 | 
							String os = datacenterElement.getAttribute("os");
 | 
				
			||||||
 | 
							String vmm = datacenterElement.getAttribute("vmm");
 | 
				
			||||||
 | 
							double costPerBw = Double.parseDouble(datacenterElement.getElementsByTagName("costPerBw").item(0).getTextContent());
 | 
				
			||||||
 | 
							double costPerSec = Double.parseDouble(datacenterElement.getElementsByTagName("costPerSec").item(0).getTextContent());
 | 
				
			||||||
 | 
							double costPerMem = Double.parseDouble(datacenterElement.getElementsByTagName("costPerMem").item(0).getTextContent());
 | 
				
			||||||
 | 
							double costPerStorage = Double.parseDouble(datacenterElement.getElementsByTagName("costPerStorage").item(0).getTextContent());
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							List<EdgeHost> hostList=createHosts(datacenterElement);
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							String name = "Datacenter_" + Integer.toString(index);
 | 
				
			||||||
 | 
							double time_zone = 3.0;         // time zone this resource located
 | 
				
			||||||
 | 
							LinkedList<Storage> storageList = new LinkedList<Storage>();	//we are not adding SAN devices by now
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// 5. Create a DatacenterCharacteristics object that stores the
 | 
				
			||||||
 | 
							//    properties of a data center: architecture, OS, list of
 | 
				
			||||||
 | 
							//    Machines, allocation policy: time- or space-shared, time zone
 | 
				
			||||||
 | 
							//    and its price (G$/Pe time unit).
 | 
				
			||||||
 | 
							DatacenterCharacteristics characteristics = new DatacenterCharacteristics(
 | 
				
			||||||
 | 
					                arch, os, vmm, hostList, time_zone, costPerSec, costPerMem, costPerStorage, costPerBw);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// 6. Finally, we need to create a PowerDatacenter object.
 | 
				
			||||||
 | 
							Datacenter datacenter = null;
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
							VmAllocationPolicy vm_policy = SimManager.getInstance().getScenarioFactory().getVmAllocationPolicy(hostList,index);
 | 
				
			||||||
 | 
							datacenter = new Datacenter(name, characteristics, vm_policy, storageList, 0);
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							return datacenter;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						private List<EdgeHost> createHosts(Element datacenterElement){
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// Here are the steps needed to create a PowerDatacenter:
 | 
				
			||||||
 | 
							// 1. We need to create a list to store one or more Machines
 | 
				
			||||||
 | 
							List<EdgeHost> hostList = new ArrayList<EdgeHost>();
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							Element location = (Element)datacenterElement.getElementsByTagName("location").item(0);
 | 
				
			||||||
 | 
							String attractiveness = location.getElementsByTagName("attractiveness").item(0).getTextContent();
 | 
				
			||||||
 | 
							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());
 | 
				
			||||||
 | 
							SimSettings.PLACE_TYPES placeType = SimUtils.stringToPlace(attractiveness);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							NodeList hostNodeList = datacenterElement.getElementsByTagName("host");
 | 
				
			||||||
 | 
							for (int j = 0; j < hostNodeList.getLength(); j++) {
 | 
				
			||||||
 | 
								Node hostNode = hostNodeList.item(j);
 | 
				
			||||||
 | 
								
 | 
				
			||||||
 | 
								Element hostElement = (Element) hostNode;
 | 
				
			||||||
 | 
								int numOfCores = Integer.parseInt(hostElement.getElementsByTagName("core").item(0).getTextContent());
 | 
				
			||||||
 | 
								double mips = Double.parseDouble(hostElement.getElementsByTagName("mips").item(0).getTextContent());
 | 
				
			||||||
 | 
								int ram = Integer.parseInt(hostElement.getElementsByTagName("ram").item(0).getTextContent());
 | 
				
			||||||
 | 
								long storage = Long.parseLong(hostElement.getElementsByTagName("storage").item(0).getTextContent());
 | 
				
			||||||
 | 
								long bandwidth = SimSettings.getInstance().getWlanBandwidth() / hostNodeList.getLength();
 | 
				
			||||||
 | 
								
 | 
				
			||||||
 | 
								// 2. A Machine contains one or more PEs or CPUs/Cores. Therefore, should
 | 
				
			||||||
 | 
								//    create a list to store these PEs before creating
 | 
				
			||||||
 | 
								//    a Machine.
 | 
				
			||||||
 | 
								List<Pe> peList = new ArrayList<Pe>();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								// 3. Create PEs and add these into the list.
 | 
				
			||||||
 | 
								//for a quad-core machine, a list of 4 PEs is required:
 | 
				
			||||||
 | 
								for(int i=0; i<numOfCores; i++){
 | 
				
			||||||
 | 
									peList.add(new Pe(i, new PeProvisionerSimple(mips))); // need to store Pe id and MIPS Rating
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								
 | 
				
			||||||
 | 
								//4. Create Hosts with its id and list of PEs and add them to the list of machines
 | 
				
			||||||
 | 
								EdgeHost host = new EdgeHost(
 | 
				
			||||||
 | 
										hostIdCounter,
 | 
				
			||||||
 | 
										new RamProvisionerSimple(ram),
 | 
				
			||||||
 | 
										new BwProvisionerSimple(bandwidth), //kbps
 | 
				
			||||||
 | 
										storage,
 | 
				
			||||||
 | 
										peList,
 | 
				
			||||||
 | 
										new VmSchedulerSpaceShared(peList)
 | 
				
			||||||
 | 
									);
 | 
				
			||||||
 | 
								
 | 
				
			||||||
 | 
								host.setPlace(new Location(placeType, wlan_id, x_pos, y_pos));
 | 
				
			||||||
 | 
								hostList.add(host);
 | 
				
			||||||
 | 
								hostIdCounter++;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							return hostList;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										34
									
								
								src/edu/boun/edgecloudsim/edge_server/EdgeVM.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								src/edu/boun/edgecloudsim/edge_server/EdgeVM.java
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,34 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Title:        EdgeCloudSim - EdgeVM
 | 
				
			||||||
 | 
					 * 
 | 
				
			||||||
 | 
					 * Description: 
 | 
				
			||||||
 | 
					 * EdgeVM adds vm type information over CloudSim's VM class
 | 
				
			||||||
 | 
					 *               
 | 
				
			||||||
 | 
					 * Licence:      GPL - http://www.gnu.org/copyleft/gpl.html
 | 
				
			||||||
 | 
					 * Copyright (c) 2017, Bogazici University, Istanbul, Turkey
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package edu.boun.edgecloudsim.edge_server;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import org.cloudbus.cloudsim.CloudletScheduler;
 | 
				
			||||||
 | 
					import org.cloudbus.cloudsim.Vm;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import edu.boun.edgecloudsim.core.SimSettings;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					public class EdgeVM extends Vm {
 | 
				
			||||||
 | 
						private SimSettings.VM_TYPES type;
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						public EdgeVM(int id, int userId, double mips, int numberOfPes, int ram,
 | 
				
			||||||
 | 
								long bw, long size, String vmm, CloudletScheduler cloudletScheduler) {
 | 
				
			||||||
 | 
							super(id, userId, mips, numberOfPes, ram, bw, size, vmm, cloudletScheduler);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						public void setVmType(SimSettings.VM_TYPES _type){
 | 
				
			||||||
 | 
							type=_type;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						public SimSettings.VM_TYPES getVmType(){
 | 
				
			||||||
 | 
							return type;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -0,0 +1,158 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Title:        EdgeCloudSim - Custom Vm Allocation Policy
 | 
				
			||||||
 | 
					 * 
 | 
				
			||||||
 | 
					 * Description: 
 | 
				
			||||||
 | 
					 * VmAllocationPolicy_Custom implements VmAllocationPolicy to decide which.
 | 
				
			||||||
 | 
					 * VM is created on which host locatied on the datacenters. For those
 | 
				
			||||||
 | 
					 * who wants to add another Vm Allocation Policy to EdgeCloudSim should
 | 
				
			||||||
 | 
					 * provide another concreate instance of VmAllocationPolicy via ScenarioFactory
 | 
				
			||||||
 | 
					 *               
 | 
				
			||||||
 | 
					 * Licence:      GPL - http://www.gnu.org/copyleft/gpl.html
 | 
				
			||||||
 | 
					 * Copyright (c) 2017, Bogazici University, Istanbul, Turkey
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package edu.boun.edgecloudsim.edge_server;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import java.util.HashMap;
 | 
				
			||||||
 | 
					import java.util.List;
 | 
				
			||||||
 | 
					import java.util.Map;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import org.cloudbus.cloudsim.Host;
 | 
				
			||||||
 | 
					import org.cloudbus.cloudsim.Log;
 | 
				
			||||||
 | 
					import org.cloudbus.cloudsim.Vm;
 | 
				
			||||||
 | 
					import org.cloudbus.cloudsim.VmAllocationPolicy;
 | 
				
			||||||
 | 
					import org.cloudbus.cloudsim.core.CloudSim;
 | 
				
			||||||
 | 
					import org.w3c.dom.Document;
 | 
				
			||||||
 | 
					import org.w3c.dom.Element;
 | 
				
			||||||
 | 
					import org.w3c.dom.Node;
 | 
				
			||||||
 | 
					import org.w3c.dom.NodeList;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import edu.boun.edgecloudsim.core.SimSettings;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Same as VmAllocationPolicySimple.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					public class VmAllocationPolicy_Custom extends VmAllocationPolicy {
 | 
				
			||||||
 | 
						/** The vm table. */
 | 
				
			||||||
 | 
						private Map<String, Host> vmTable;
 | 
				
			||||||
 | 
						private static int createdVmNum;
 | 
				
			||||||
 | 
						private int DataCenterIndex;
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						public VmAllocationPolicy_Custom(List<? extends Host> list, int _DataCenterIndex) {
 | 
				
			||||||
 | 
							super(list);
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							setVmTable(new HashMap<String, Host>());
 | 
				
			||||||
 | 
							DataCenterIndex=_DataCenterIndex;
 | 
				
			||||||
 | 
							createdVmNum = 0;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						@Override
 | 
				
			||||||
 | 
						public boolean allocateHostForVm(Vm vm) {
 | 
				
			||||||
 | 
							boolean result = false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (!getVmTable().containsKey(vm.getUid())) { // if this vm was not created
 | 
				
			||||||
 | 
								boolean vmFound = false;
 | 
				
			||||||
 | 
								int vmCounter = 0;
 | 
				
			||||||
 | 
								int hostIndex = 0;
 | 
				
			||||||
 | 
								int dataCenterIndex = 0;
 | 
				
			||||||
 | 
								
 | 
				
			||||||
 | 
								//find proper datacenter id and host id for this VM
 | 
				
			||||||
 | 
								Document doc = SimSettings.getInstance().getEdgeDevicesDocument();
 | 
				
			||||||
 | 
								NodeList datacenterList = doc.getElementsByTagName("datacenter");
 | 
				
			||||||
 | 
								for (int i = 0; (!vmFound && i < datacenterList.getLength()); i++) {
 | 
				
			||||||
 | 
									Node datacenterNode = datacenterList.item(i);
 | 
				
			||||||
 | 
									Element datacenterElement = (Element) datacenterNode;
 | 
				
			||||||
 | 
									NodeList hostNodeList = datacenterElement.getElementsByTagName("host");
 | 
				
			||||||
 | 
									for (int j = 0; (!vmFound  && j < hostNodeList.getLength()); j++) {
 | 
				
			||||||
 | 
										Node hostNode = hostNodeList.item(j);
 | 
				
			||||||
 | 
										Element hostElement = (Element) hostNode;
 | 
				
			||||||
 | 
										NodeList vmNodeList = hostElement.getElementsByTagName("VM");
 | 
				
			||||||
 | 
										for (int k = 0; (!vmFound && k < vmNodeList.getLength()); k++) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
											if(vmCounter == vm.getId()){
 | 
				
			||||||
 | 
												dataCenterIndex = i;
 | 
				
			||||||
 | 
												hostIndex = j;
 | 
				
			||||||
 | 
												vmFound = true;
 | 
				
			||||||
 | 
											}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
											vmCounter++;
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								if(vmFound && dataCenterIndex == DataCenterIndex && hostIndex < getHostList().size()){
 | 
				
			||||||
 | 
									Host host = getHostList().get(hostIndex);
 | 
				
			||||||
 | 
									result = host.vmCreate(vm);
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
									if (result) { // if vm were succesfully created in the host
 | 
				
			||||||
 | 
										getVmTable().put(vm.getUid(), host);
 | 
				
			||||||
 | 
										createdVmNum++;
 | 
				
			||||||
 | 
										Log.formatLine("%.2f: VM #" + vm.getId() + " has been allocated to the host #" + host.getId(),CloudSim.clock());
 | 
				
			||||||
 | 
										result = true;
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							return result;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						@Override
 | 
				
			||||||
 | 
						public boolean allocateHostForVm(Vm vm, Host host) {
 | 
				
			||||||
 | 
							if (host.vmCreate(vm)) { // if vm has been succesfully created in the host
 | 
				
			||||||
 | 
								getVmTable().put(vm.getUid(), host);
 | 
				
			||||||
 | 
								createdVmNum++;
 | 
				
			||||||
 | 
								
 | 
				
			||||||
 | 
								Log.formatLine("%.2f: VM #" + vm.getId() + " has been allocated to the host #" + host.getId(),CloudSim.clock());
 | 
				
			||||||
 | 
								return true;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							return false;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						@Override
 | 
				
			||||||
 | 
						public List<Map<String, Object>> optimizeAllocation(
 | 
				
			||||||
 | 
								List<? extends Vm> vmList) {
 | 
				
			||||||
 | 
							// TODO Auto-generated method stub
 | 
				
			||||||
 | 
							return null;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						@Override
 | 
				
			||||||
 | 
						public void deallocateHostForVm(Vm vm) {
 | 
				
			||||||
 | 
							Host host = getVmTable().remove(vm.getUid());
 | 
				
			||||||
 | 
							if (host != null) {
 | 
				
			||||||
 | 
								host.vmDestroy(vm);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						@Override
 | 
				
			||||||
 | 
						public Host getHost(Vm vm) {
 | 
				
			||||||
 | 
							return getVmTable().get(vm.getUid());
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						@Override
 | 
				
			||||||
 | 
						public Host getHost(int vmId, int userId) {
 | 
				
			||||||
 | 
							return getVmTable().get(Vm.getUid(userId, vmId));
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						public static int getCreatedVmNum(){
 | 
				
			||||||
 | 
							return createdVmNum;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						/**
 | 
				
			||||||
 | 
						 * Gets the vm table.
 | 
				
			||||||
 | 
						 * 
 | 
				
			||||||
 | 
						 * @return the vm table
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
						public Map<String, Host> getVmTable() {
 | 
				
			||||||
 | 
							return vmTable;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/**
 | 
				
			||||||
 | 
						 * Sets the vm table.
 | 
				
			||||||
 | 
						 * 
 | 
				
			||||||
 | 
						 * @param vmTable the vm table
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
						protected void setVmTable(Map<String, Host> vmTable) {
 | 
				
			||||||
 | 
							this.vmTable = vmTable;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										36
									
								
								src/edu/boun/edgecloudsim/mobility/MobilityModel.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										36
									
								
								src/edu/boun/edgecloudsim/mobility/MobilityModel.java
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,36 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Title:        EdgeCloudSim - Mobility Model
 | 
				
			||||||
 | 
					 * 
 | 
				
			||||||
 | 
					 * Description: 
 | 
				
			||||||
 | 
					 * MobilityModel is an abstract class which is used for calculating the
 | 
				
			||||||
 | 
					 * location of each mobile devices with respect to the time. For those who
 | 
				
			||||||
 | 
					 * wants to add a custom Mobility Model to EdgeCloudSim should extend
 | 
				
			||||||
 | 
					 * this class and provide a concreate instance via ScenarioFactory
 | 
				
			||||||
 | 
					 *               
 | 
				
			||||||
 | 
					 * Licence:      GPL - http://www.gnu.org/copyleft/gpl.html
 | 
				
			||||||
 | 
					 * Copyright (c) 2017, Bogazici University, Istanbul, Turkey
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package edu.boun.edgecloudsim.mobility;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import edu.boun.edgecloudsim.utils.Location;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					public abstract class MobilityModel {
 | 
				
			||||||
 | 
						protected int numberOfMobileDevices;
 | 
				
			||||||
 | 
						protected double simulationTime;
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						public MobilityModel(int _numberOfMobileDevices, double _simulationTime){
 | 
				
			||||||
 | 
							numberOfMobileDevices=_numberOfMobileDevices;
 | 
				
			||||||
 | 
							simulationTime=_simulationTime;
 | 
				
			||||||
 | 
						};
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						/*
 | 
				
			||||||
 | 
						 * calculate location of the devices according to related mobility model
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
						public abstract void initialize();
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						/*
 | 
				
			||||||
 | 
						 * returns location of a device at a certain time
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
						public abstract Location getLocation(int deviceId, double time);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										123
									
								
								src/edu/boun/edgecloudsim/mobility/NomadicMobility.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										123
									
								
								src/edu/boun/edgecloudsim/mobility/NomadicMobility.java
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,123 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Title:        EdgeCloudSim - Nomadic Mobility model implementation
 | 
				
			||||||
 | 
					 * 
 | 
				
			||||||
 | 
					 * Description: 
 | 
				
			||||||
 | 
					 * MobilityModel implements basic nomadic mobility model where the
 | 
				
			||||||
 | 
					 * place of the devices are changed from time to time instead of a
 | 
				
			||||||
 | 
					 * continuous location update.
 | 
				
			||||||
 | 
					 * 
 | 
				
			||||||
 | 
					 * Licence:      GPL - http://www.gnu.org/copyleft/gpl.html
 | 
				
			||||||
 | 
					 * Copyright (c) 2017, Bogazici University, Istanbul, Turkey
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package edu.boun.edgecloudsim.mobility;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import java.util.ArrayList;
 | 
				
			||||||
 | 
					import java.util.List;
 | 
				
			||||||
 | 
					import java.util.TreeMap;
 | 
				
			||||||
 | 
					import java.util.Map.Entry;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import org.w3c.dom.Document;
 | 
				
			||||||
 | 
					import org.w3c.dom.Element;
 | 
				
			||||||
 | 
					import org.w3c.dom.Node;
 | 
				
			||||||
 | 
					import org.w3c.dom.NodeList;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import edu.boun.edgecloudsim.core.SimSettings;
 | 
				
			||||||
 | 
					import edu.boun.edgecloudsim.utils.Location;
 | 
				
			||||||
 | 
					import edu.boun.edgecloudsim.utils.PoissonDistr;
 | 
				
			||||||
 | 
					import edu.boun.edgecloudsim.utils.SimLogger;
 | 
				
			||||||
 | 
					import edu.boun.edgecloudsim.utils.SimUtils;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					public class NomadicMobility extends MobilityModel {
 | 
				
			||||||
 | 
						private List<TreeMap<Double, Location>> treeMapArray;
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						public NomadicMobility(int _numberOfMobileDevices, double _simulationTime) {
 | 
				
			||||||
 | 
							super(_numberOfMobileDevices, _simulationTime);
 | 
				
			||||||
 | 
							// TODO Auto-generated constructor stub
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						@Override
 | 
				
			||||||
 | 
						public void initialize() {
 | 
				
			||||||
 | 
							treeMapArray = new ArrayList<TreeMap<Double, Location>>();
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							PoissonDistr[] poissonRngList = new PoissonDistr[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();
 | 
				
			||||||
 | 
								SimSettings.PLACE_TYPES placeType = SimUtils.stringToPlace(attractiveness);
 | 
				
			||||||
 | 
								
 | 
				
			||||||
 | 
								poissonRngList[i] = new PoissonDistr(SimSettings.getInstance().getMobilityLookUpTable()[placeType.ordinal()]);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							//initialize tree maps and position of mobile devices
 | 
				
			||||||
 | 
							for(int i=0; i<numberOfMobileDevices; i++) {
 | 
				
			||||||
 | 
								treeMapArray.add(i, new TreeMap<Double, Location>());
 | 
				
			||||||
 | 
								
 | 
				
			||||||
 | 
								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();
 | 
				
			||||||
 | 
								SimSettings.PLACE_TYPES placeType = SimUtils.stringToPlace(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 from 10th seconds
 | 
				
			||||||
 | 
								treeMapArray.get(i).put((double)10, new Location(placeType, wlan_id, x_pos, y_pos));
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							for(int i=0; i<numberOfMobileDevices; i++) {
 | 
				
			||||||
 | 
								TreeMap<Double, Location> treeMap = treeMapArray.get(i);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								while(treeMap.lastKey() < SimSettings.getInstance().getSimulationTime()) {				
 | 
				
			||||||
 | 
									boolean placeFound = false;
 | 
				
			||||||
 | 
									int currentLocationId = treeMap.lastEntry().getValue().getServingWlanId();
 | 
				
			||||||
 | 
									double waitingTime = poissonRngList[currentLocationId].sample() * 60;
 | 
				
			||||||
 | 
									
 | 
				
			||||||
 | 
									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();
 | 
				
			||||||
 | 
											SimSettings.PLACE_TYPES placeType = SimUtils.stringToPlace(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(placeType, wlan_id, x_pos, y_pos));
 | 
				
			||||||
 | 
										}					
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
									if(!placeFound){
 | 
				
			||||||
 | 
										SimLogger.printLine("impossible is occured! location cannot be assigned to the device!");
 | 
				
			||||||
 | 
								    	System.exit(0);
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						@Override
 | 
				
			||||||
 | 
						public Location getLocation(int deviceId, double time) {
 | 
				
			||||||
 | 
							TreeMap<Double, Location> treeMap = treeMapArray.get(deviceId);
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							Entry<Double, Location> e = treeMap.floorEntry(time);
 | 
				
			||||||
 | 
						    
 | 
				
			||||||
 | 
						    if(e == null){
 | 
				
			||||||
 | 
						    	SimLogger.printLine("impossible is occured! no location is found for the device!");
 | 
				
			||||||
 | 
						    	System.exit(0);
 | 
				
			||||||
 | 
						    }
 | 
				
			||||||
 | 
						    
 | 
				
			||||||
 | 
							return e.getValue();
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										186
									
								
								src/edu/boun/edgecloudsim/network/MM1Queue.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										186
									
								
								src/edu/boun/edgecloudsim/network/MM1Queue.java
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,186 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Title:        EdgeCloudSim - M/M/1 Queue model implementation
 | 
				
			||||||
 | 
					 * 
 | 
				
			||||||
 | 
					 * Description: 
 | 
				
			||||||
 | 
					 * MM1Queue implements M/M/1 Queue model for WLAN and WAN communication
 | 
				
			||||||
 | 
					 * 
 | 
				
			||||||
 | 
					 * Licence:      GPL - http://www.gnu.org/copyleft/gpl.html
 | 
				
			||||||
 | 
					 * Copyright (c) 2017, Bogazici University, Istanbul, Turkey
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package edu.boun.edgecloudsim.network;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import org.cloudbus.cloudsim.core.CloudSim;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import edu.boun.edgecloudsim.core.SimManager;
 | 
				
			||||||
 | 
					import edu.boun.edgecloudsim.core.SimSettings;
 | 
				
			||||||
 | 
					import edu.boun.edgecloudsim.edge_server.EdgeHost;
 | 
				
			||||||
 | 
					import edu.boun.edgecloudsim.utils.Location;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					public class MM1Queue extends NetworkModel {
 | 
				
			||||||
 | 
						private double WlanPoissonMean; //seconds
 | 
				
			||||||
 | 
						private double WanPoissonMean; //seconds
 | 
				
			||||||
 | 
						private double avgTaskInputSize; //bytes
 | 
				
			||||||
 | 
						private double avgTaskOutputSize; //bytes
 | 
				
			||||||
 | 
						private int maxNumOfClientsInPlace;
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						public MM1Queue(int _numberOfMobileDevices) {
 | 
				
			||||||
 | 
							super(_numberOfMobileDevices);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						@Override
 | 
				
			||||||
 | 
						public void initialize() {
 | 
				
			||||||
 | 
							WlanPoissonMean=0;
 | 
				
			||||||
 | 
							WanPoissonMean=0;
 | 
				
			||||||
 | 
							avgTaskInputSize=0;
 | 
				
			||||||
 | 
							avgTaskOutputSize=0;
 | 
				
			||||||
 | 
							maxNumOfClientsInPlace=0;
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							//Calculate interarrival time and task sizes
 | 
				
			||||||
 | 
							double numOfTaskType = 0;
 | 
				
			||||||
 | 
							SimSettings SS = SimSettings.getInstance();
 | 
				
			||||||
 | 
							for (SimSettings.APP_TYPES taskType : SimSettings.APP_TYPES.values()) {
 | 
				
			||||||
 | 
								double weight = SS.getTaskLookUpTable()[taskType.ordinal()][0]/(double)100;
 | 
				
			||||||
 | 
								if(weight != 0) {
 | 
				
			||||||
 | 
									WlanPoissonMean += (SS.getTaskLookUpTable()[taskType.ordinal()][2])*weight;
 | 
				
			||||||
 | 
									
 | 
				
			||||||
 | 
									double percentageOfCloudCommunication = SS.getTaskLookUpTable()[taskType.ordinal()][1];
 | 
				
			||||||
 | 
									WanPoissonMean += (WlanPoissonMean)*((double)100/percentageOfCloudCommunication)*weight;
 | 
				
			||||||
 | 
									
 | 
				
			||||||
 | 
									avgTaskInputSize += SS.getTaskLookUpTable()[taskType.ordinal()][5]*weight;
 | 
				
			||||||
 | 
									
 | 
				
			||||||
 | 
									avgTaskOutputSize += SS.getTaskLookUpTable()[taskType.ordinal()][6]*weight;
 | 
				
			||||||
 | 
									
 | 
				
			||||||
 | 
									numOfTaskType++;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							WlanPoissonMean = WlanPoissonMean/numOfTaskType;
 | 
				
			||||||
 | 
							avgTaskInputSize = avgTaskInputSize/numOfTaskType;
 | 
				
			||||||
 | 
							avgTaskOutputSize = avgTaskOutputSize/numOfTaskType;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					    * source device is always mobile device in our simulation scenarios!
 | 
				
			||||||
 | 
					    */
 | 
				
			||||||
 | 
						@Override
 | 
				
			||||||
 | 
						public double getUploadDelay(int sourceDeviceId, int destDeviceId) {
 | 
				
			||||||
 | 
							double delay = 0;
 | 
				
			||||||
 | 
							Location accessPointLocation = SimManager.getInstance().getMobilityModel().getLocation(sourceDeviceId,CloudSim.clock());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							//if destination device is the cloud datacenter, both wan and wlan delay should be considered
 | 
				
			||||||
 | 
							if(destDeviceId == SimSettings.CLOUD_DATACENTER_ID){
 | 
				
			||||||
 | 
								double wlanDelay = getWlanUploadDelay(accessPointLocation, CloudSim.clock());
 | 
				
			||||||
 | 
								double wanDelay = getWanUploadDelay(accessPointLocation, CloudSim.clock() + wlanDelay);
 | 
				
			||||||
 | 
								if(wlanDelay > 0 && wanDelay >0)
 | 
				
			||||||
 | 
									delay = wlanDelay + wanDelay;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							else{
 | 
				
			||||||
 | 
								delay = getWlanUploadDelay(accessPointLocation, CloudSim.clock());
 | 
				
			||||||
 | 
								
 | 
				
			||||||
 | 
								//all requests are send to edge orchestrator first than redirected related VM
 | 
				
			||||||
 | 
								delay += (SimSettings.getInstance().getInternalLanDelay() * 2);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							return delay;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					    * destination device is always mobile device in our simulation scenarios!
 | 
				
			||||||
 | 
					    */
 | 
				
			||||||
 | 
						@Override
 | 
				
			||||||
 | 
						public double getDownloadDelay(int sourceDeviceId, int destDeviceId) {
 | 
				
			||||||
 | 
							double delay = 0;
 | 
				
			||||||
 | 
							Location accessPointLocation = SimManager.getInstance().getMobilityModel().getLocation(destDeviceId,CloudSim.clock());
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							//if source device is the cloud datacenter, both wan and wlan delay should be considered
 | 
				
			||||||
 | 
							if(sourceDeviceId == SimSettings.CLOUD_DATACENTER_ID){
 | 
				
			||||||
 | 
								double wlanDelay = getWlanDownloadDelay(accessPointLocation, CloudSim.clock());
 | 
				
			||||||
 | 
								double wanDelay = getWanDownloadDelay(accessPointLocation, CloudSim.clock() + wlanDelay);
 | 
				
			||||||
 | 
								if(wlanDelay > 0 && wanDelay >0)
 | 
				
			||||||
 | 
									delay = wlanDelay + wanDelay;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							else{
 | 
				
			||||||
 | 
								delay = getWlanDownloadDelay(accessPointLocation, CloudSim.clock());
 | 
				
			||||||
 | 
								
 | 
				
			||||||
 | 
								EdgeHost host = (EdgeHost)(SimManager.
 | 
				
			||||||
 | 
										getInstance().
 | 
				
			||||||
 | 
										getLocalServerManager().
 | 
				
			||||||
 | 
										getDatacenterList().get(sourceDeviceId).
 | 
				
			||||||
 | 
										getHostList().get(0));
 | 
				
			||||||
 | 
								
 | 
				
			||||||
 | 
								//if source device id is the edge server which is located in another location, add internal lan delay
 | 
				
			||||||
 | 
								//in our scenasrio, serving wlan ID is equal to the host id, because there is only one host in one place
 | 
				
			||||||
 | 
								if(host.getLocation().getServingWlanId() != accessPointLocation.getServingWlanId())
 | 
				
			||||||
 | 
									delay += (SimSettings.getInstance().getInternalLanDelay() * 2);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							return delay;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						public int getMaxNumOfClientsInPlace(){
 | 
				
			||||||
 | 
							return maxNumOfClientsInPlace;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						private int getDeviceCount(Location deviceLocation, double time){
 | 
				
			||||||
 | 
							int deviceCount = 0;
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							for(int i=0; i<numberOfMobileDevices; i++) {
 | 
				
			||||||
 | 
								Location location = SimManager.getInstance().getMobilityModel().getLocation(i,time);
 | 
				
			||||||
 | 
								if(location.equals(deviceLocation))
 | 
				
			||||||
 | 
									deviceCount++;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							//record max number of client just for debugging
 | 
				
			||||||
 | 
							if(maxNumOfClientsInPlace<deviceCount)
 | 
				
			||||||
 | 
								maxNumOfClientsInPlace = deviceCount;
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							return deviceCount;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						private double calculateMM1(double propogationDelay, int bandwidth /*Kbps*/, double PoissonMean, double avgTaskSize /*KB*/, int deviceCount){
 | 
				
			||||||
 | 
							double Bps=0, mu=0, lamda=0;
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							avgTaskSize = avgTaskSize * (double)1000; //convert from KB to Byte
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							Bps = bandwidth * (double)1000 / (double)8; //convert from Kbps to Byte per seconds
 | 
				
			||||||
 | 
						    lamda = ((double)1/(double)PoissonMean); //task per seconds
 | 
				
			||||||
 | 
							mu = Bps / avgTaskSize ; //task per seconds
 | 
				
			||||||
 | 
							double result = (double)1 / (mu-lamda*(double)deviceCount);
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							return result + propogationDelay;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						private double getWlanDownloadDelay(Location accessPointLocation, double time) {
 | 
				
			||||||
 | 
							return calculateMM1(0,
 | 
				
			||||||
 | 
									SimSettings.getInstance().getWlanBandwidth(),
 | 
				
			||||||
 | 
									WlanPoissonMean,
 | 
				
			||||||
 | 
									avgTaskOutputSize,
 | 
				
			||||||
 | 
									getDeviceCount(accessPointLocation, time));
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						private double getWlanUploadDelay(Location accessPointLocation, double time) {
 | 
				
			||||||
 | 
							return calculateMM1(0,
 | 
				
			||||||
 | 
									SimSettings.getInstance().getWlanBandwidth(),
 | 
				
			||||||
 | 
									WlanPoissonMean,
 | 
				
			||||||
 | 
									avgTaskInputSize,
 | 
				
			||||||
 | 
									getDeviceCount(accessPointLocation, time));
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						private double getWanDownloadDelay(Location accessPointLocation, double time) {
 | 
				
			||||||
 | 
							return calculateMM1(SimSettings.getInstance().getWanPropogationDelay(),
 | 
				
			||||||
 | 
									SimSettings.getInstance().getWanBandwidth(),
 | 
				
			||||||
 | 
									WanPoissonMean,
 | 
				
			||||||
 | 
									avgTaskOutputSize,
 | 
				
			||||||
 | 
									getDeviceCount(accessPointLocation, time));
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						private double getWanUploadDelay(Location accessPointLocation, double time) {
 | 
				
			||||||
 | 
							return calculateMM1(SimSettings.getInstance().getWanPropogationDelay(),
 | 
				
			||||||
 | 
									SimSettings.getInstance().getWanBandwidth(),
 | 
				
			||||||
 | 
									WanPoissonMean,
 | 
				
			||||||
 | 
									avgTaskInputSize,
 | 
				
			||||||
 | 
									getDeviceCount(accessPointLocation, time));
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										37
									
								
								src/edu/boun/edgecloudsim/network/NetworkModel.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										37
									
								
								src/edu/boun/edgecloudsim/network/NetworkModel.java
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,37 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Title:        EdgeCloudSim - Network Model
 | 
				
			||||||
 | 
					 * 
 | 
				
			||||||
 | 
					 * Description: 
 | 
				
			||||||
 | 
					 * NetworkModel is an abstract class which is used for calculating the
 | 
				
			||||||
 | 
					 * network delay from device to device. For those who wants to add a
 | 
				
			||||||
 | 
					 * custom Network Model to EdgeCloudSim should extend this class and
 | 
				
			||||||
 | 
					 * provide a concreate instance via ScenarioFactory
 | 
				
			||||||
 | 
					 *               
 | 
				
			||||||
 | 
					 * Licence:      GPL - http://www.gnu.org/copyleft/gpl.html
 | 
				
			||||||
 | 
					 * Copyright (c) 2017, Bogazici University, Istanbul, Turkey
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package edu.boun.edgecloudsim.network;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					public abstract class NetworkModel {
 | 
				
			||||||
 | 
						protected int numberOfMobileDevices;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						public NetworkModel(int _numberOfMobileDevices){
 | 
				
			||||||
 | 
							numberOfMobileDevices=_numberOfMobileDevices;
 | 
				
			||||||
 | 
						};
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						/**
 | 
				
			||||||
 | 
						* initializes costom network model
 | 
				
			||||||
 | 
						*/
 | 
				
			||||||
 | 
						public abstract void initialize();
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					    * calculates the upload delay from source to destination device
 | 
				
			||||||
 | 
					    */
 | 
				
			||||||
 | 
						public abstract double getUploadDelay(int sourceDeviceId, int destDeviceId);
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					    * calculates the download delay from source to destination device
 | 
				
			||||||
 | 
					    */
 | 
				
			||||||
 | 
						public abstract double getDownloadDelay(int sourceDeviceId, int destDeviceId);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -0,0 +1,79 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Title:        EdgeCloudSim - Sample Scenario Factory
 | 
				
			||||||
 | 
					 * 
 | 
				
			||||||
 | 
					 * Description:  Sample factory providing the default
 | 
				
			||||||
 | 
					 *               instances of required abstract classes 
 | 
				
			||||||
 | 
					 * 
 | 
				
			||||||
 | 
					 * Licence:      GPL - http://www.gnu.org/copyleft/gpl.html
 | 
				
			||||||
 | 
					 * Copyright (c) 2017, Bogazici University, Istanbul, Turkey
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package edu.boun.edgecloudsim.sample_application;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import java.util.List;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import org.cloudbus.cloudsim.Host;
 | 
				
			||||||
 | 
					import org.cloudbus.cloudsim.UtilizationModel;
 | 
				
			||||||
 | 
					import org.cloudbus.cloudsim.VmAllocationPolicy;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import edu.boun.edgecloudsim.core.ScenarioFactory;
 | 
				
			||||||
 | 
					import edu.boun.edgecloudsim.core.SimSettings;
 | 
				
			||||||
 | 
					import edu.boun.edgecloudsim.core.SimSettings.APP_TYPES;
 | 
				
			||||||
 | 
					import edu.boun.edgecloudsim.edge_orchestrator.BasicEdgeOrchestrator;
 | 
				
			||||||
 | 
					import edu.boun.edgecloudsim.edge_orchestrator.EdgeOrchestrator;
 | 
				
			||||||
 | 
					import edu.boun.edgecloudsim.edge_server.VmAllocationPolicy_Custom;
 | 
				
			||||||
 | 
					import edu.boun.edgecloudsim.edge_client.CpuUtilizationModel_Custom;
 | 
				
			||||||
 | 
					import edu.boun.edgecloudsim.mobility.MobilityModel;
 | 
				
			||||||
 | 
					import edu.boun.edgecloudsim.mobility.NomadicMobility;
 | 
				
			||||||
 | 
					import edu.boun.edgecloudsim.task_generator.IdleActiveLoadGenerator;
 | 
				
			||||||
 | 
					import edu.boun.edgecloudsim.task_generator.LoadGeneratorModel;
 | 
				
			||||||
 | 
					import edu.boun.edgecloudsim.network.MM1Queue;
 | 
				
			||||||
 | 
					import edu.boun.edgecloudsim.network.NetworkModel;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					public class SampleScenarioFactory implements ScenarioFactory {
 | 
				
			||||||
 | 
						private int numOfMobileDevice;
 | 
				
			||||||
 | 
						private double simulationTime;
 | 
				
			||||||
 | 
						private String orchestratorPolicy;
 | 
				
			||||||
 | 
						private SimSettings.SCENARIO_TYPES simScenario;
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						SampleScenarioFactory(int _numOfMobileDevice,
 | 
				
			||||||
 | 
								double _simulationTime,
 | 
				
			||||||
 | 
								String _orchestratorPolicy,
 | 
				
			||||||
 | 
								SimSettings.SCENARIO_TYPES _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 NomadicMobility(numOfMobileDevice,simulationTime);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						@Override
 | 
				
			||||||
 | 
						public NetworkModel getNetworkModel() {
 | 
				
			||||||
 | 
							return new MM1Queue(numOfMobileDevice);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						@Override
 | 
				
			||||||
 | 
						public VmAllocationPolicy getVmAllocationPolicy(List<? extends Host> hostList, int dataCenterIndex) {
 | 
				
			||||||
 | 
							return new VmAllocationPolicy_Custom(hostList,dataCenterIndex);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						@Override
 | 
				
			||||||
 | 
						public UtilizationModel getCpuUtilizationModel(APP_TYPES _taskType) {
 | 
				
			||||||
 | 
							return new CpuUtilizationModel_Custom(_taskType);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										121
									
								
								src/edu/boun/edgecloudsim/sample_application/mainApp.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										121
									
								
								src/edu/boun/edgecloudsim/sample_application/mainApp.java
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,121 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Title:        EdgeCloudSim - Sample Application
 | 
				
			||||||
 | 
					 * 
 | 
				
			||||||
 | 
					 * Description:  Sample application for EdgeCloudSim
 | 
				
			||||||
 | 
					 *               
 | 
				
			||||||
 | 
					 * Licence:      GPL - http://www.gnu.org/copyleft/gpl.html
 | 
				
			||||||
 | 
					 * Copyright (c) 2017, Bogazici University, Istanbul, Turkey
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package edu.boun.edgecloudsim.sample_application;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import java.text.DateFormat;
 | 
				
			||||||
 | 
					import java.text.SimpleDateFormat;
 | 
				
			||||||
 | 
					import java.util.Calendar;
 | 
				
			||||||
 | 
					import java.util.Date;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import org.cloudbus.cloudsim.Log;
 | 
				
			||||||
 | 
					import org.cloudbus.cloudsim.core.CloudSim;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					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;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					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 ourput and file output of this application
 | 
				
			||||||
 | 
							SimLogger.enablePrintLog();
 | 
				
			||||||
 | 
							SimLogger.enableFileLog();
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							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...");
 | 
				
			||||||
 | 
								String configName = "default_config";
 | 
				
			||||||
 | 
								configFile = "config/" + configName + ".properties";
 | 
				
			||||||
 | 
								applicationsFile = "config/applications.xml";
 | 
				
			||||||
 | 
								edgeDevicesFile = "config/edge_devices.xml";
 | 
				
			||||||
 | 
								outputFolder = "D:/" + configName + "/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(SimLogger.isFileLogEnabled())
 | 
				
			||||||
 | 
								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 (SimSettings.SCENARIO_TYPES scenario : SimSettings.SCENARIO_TYPES.values())
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									Date ScenarioStartDate = Calendar.getInstance().getTime();
 | 
				
			||||||
 | 
									now = df.format(ScenarioStartDate);
 | 
				
			||||||
 | 
									
 | 
				
			||||||
 | 
									SimLogger.printLine("Scenario started at " + now);
 | 
				
			||||||
 | 
									SimLogger.printLine(scenario + "(" + SS.getOrchestratorPolicy() + ")" + " - duration: " + SS.getSimulationTime()/3600 + " hour(s) - poisson: " + SS.getTaskLookUpTable()[0][2] + " - #devices: " + j + " - ite: " + iterationNumber);
 | 
				
			||||||
 | 
									SimLogger.getInstance().simStarted(outputFolder,"SIMRESULT_" + scenario + "_" + j + "DEVICES");
 | 
				
			||||||
 | 
									
 | 
				
			||||||
 | 
									try
 | 
				
			||||||
 | 
									{
 | 
				
			||||||
 | 
										// First step: Initialize the CloudSim package. It should be called
 | 
				
			||||||
 | 
										// before creating any entities.
 | 
				
			||||||
 | 
										int num_user = 2;   // number of grid users
 | 
				
			||||||
 | 
										Calendar calendar = Calendar.getInstance();
 | 
				
			||||||
 | 
										boolean trace_flag = false;  // mean trace events
 | 
				
			||||||
 | 
								
 | 
				
			||||||
 | 
										// Initialize the CloudSim library
 | 
				
			||||||
 | 
										CloudSim.init(num_user, calendar, trace_flag, 0.01);
 | 
				
			||||||
 | 
										
 | 
				
			||||||
 | 
										ScenarioFactory sampleFactory = new SampleScenarioFactory(j,SS.getSimulationTime(), SS.getOrchestratorPolicy(), scenario);
 | 
				
			||||||
 | 
										
 | 
				
			||||||
 | 
										SimManager manager = new SimManager(sampleFactory, j, scenario);
 | 
				
			||||||
 | 
										manager.startSimulation();
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
									catch (Exception e)
 | 
				
			||||||
 | 
									{
 | 
				
			||||||
 | 
										SimLogger.printLine("The simulation has been terminated due to an unexpected error");
 | 
				
			||||||
 | 
										e.printStackTrace();
 | 
				
			||||||
 | 
										System.exit(0);
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
									
 | 
				
			||||||
 | 
									Date ScenarioEndDate = Calendar.getInstance().getTime();
 | 
				
			||||||
 | 
									now = df.format(ScenarioEndDate);
 | 
				
			||||||
 | 
									SimLogger.printLine("Scenario finished at " + now +  ". It took " + SimUtils.getTimeDifference(ScenarioStartDate,ScenarioEndDate));
 | 
				
			||||||
 | 
									SimLogger.printLine("----------------------------------------------------------------------");
 | 
				
			||||||
 | 
								}//End of SCENARIO_TYPES loop
 | 
				
			||||||
 | 
							}//End of NUMBER_OF_MOBILE_DEVICE loop
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							Date SimulationEndDate = Calendar.getInstance().getTime();
 | 
				
			||||||
 | 
							now = df.format(SimulationEndDate);
 | 
				
			||||||
 | 
							SimLogger.printLine("Simulation finished at " + now +  ". It took " + SimUtils.getTimeDifference(SimulationStartDate,SimulationEndDate));
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -0,0 +1,104 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Title:        EdgeCloudSim - Idle/Active Load Generator implementation
 | 
				
			||||||
 | 
					 * 
 | 
				
			||||||
 | 
					 * Description: 
 | 
				
			||||||
 | 
					 * IdleActiveLoadGenerator implements basic load generator model where the
 | 
				
			||||||
 | 
					 * mobile devices generate task in active period and waits in idle period.
 | 
				
			||||||
 | 
					 * Task interarrival time (load generation period), Idle and active periods
 | 
				
			||||||
 | 
					 * are defined in the configuration file.
 | 
				
			||||||
 | 
					 * 
 | 
				
			||||||
 | 
					 * Licence:      GPL - http://www.gnu.org/copyleft/gpl.html
 | 
				
			||||||
 | 
					 * Copyright (c) 2017, Bogazici University, Istanbul, Turkey
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package edu.boun.edgecloudsim.task_generator;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import java.util.ArrayList;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import org.apache.commons.math3.distribution.ExponentialDistribution;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import edu.boun.edgecloudsim.core.SimSettings;
 | 
				
			||||||
 | 
					import edu.boun.edgecloudsim.core.SimSettings.APP_TYPES;
 | 
				
			||||||
 | 
					import edu.boun.edgecloudsim.utils.EdgeTask;
 | 
				
			||||||
 | 
					import edu.boun.edgecloudsim.utils.PoissonDistr;
 | 
				
			||||||
 | 
					import edu.boun.edgecloudsim.utils.SimLogger;
 | 
				
			||||||
 | 
					import edu.boun.edgecloudsim.utils.SimUtils;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					public class IdleActiveLoadGenerator extends LoadGeneratorModel{
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						public IdleActiveLoadGenerator(int _numberOfMobileDevices, double _simulationTime, SimSettings.SCENARIO_TYPES _simScenario) {
 | 
				
			||||||
 | 
							super(_numberOfMobileDevices, _simulationTime, _simScenario);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						@Override
 | 
				
			||||||
 | 
						public void initializeModel() {
 | 
				
			||||||
 | 
							taskList = new ArrayList<EdgeTask>();
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							//exponential number generator for file input size, file output size and task length
 | 
				
			||||||
 | 
							PoissonDistr[][] poissonRngList = new PoissonDistr[SimSettings.APP_TYPES.values().length][3];
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							//create random number generator for each place
 | 
				
			||||||
 | 
							for(int i=0; i<SimSettings.APP_TYPES.values().length; i++) {
 | 
				
			||||||
 | 
								if(SimSettings.getInstance().getTaskLookUpTable()[i][0] ==0)
 | 
				
			||||||
 | 
									break;
 | 
				
			||||||
 | 
								
 | 
				
			||||||
 | 
								poissonRngList[i][0] = new PoissonDistr(SimSettings.getInstance().getTaskLookUpTable()[i][5]);
 | 
				
			||||||
 | 
								poissonRngList[i][1] = new PoissonDistr(SimSettings.getInstance().getTaskLookUpTable()[i][6]);
 | 
				
			||||||
 | 
								poissonRngList[i][2] = new PoissonDistr(SimSettings.getInstance().getTaskLookUpTable()[i][7]);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							//Each mobile device utilizes an app type (task type)
 | 
				
			||||||
 | 
							for(int i=0; i<numberOfMobileDevices; i++) {
 | 
				
			||||||
 | 
								APP_TYPES randomTaskType = null;
 | 
				
			||||||
 | 
								double taskTypeSelector = SimUtils.getRandomDoubleNumber(0,100);
 | 
				
			||||||
 | 
								double taskTypePercentage = 0;
 | 
				
			||||||
 | 
								for (SimSettings.APP_TYPES taskType : SimSettings.APP_TYPES.values()) {
 | 
				
			||||||
 | 
									taskTypePercentage += SimSettings.getInstance().getTaskLookUpTable()[taskType.ordinal()][0];
 | 
				
			||||||
 | 
									if(taskTypeSelector <= taskTypePercentage){
 | 
				
			||||||
 | 
										randomTaskType = taskType;
 | 
				
			||||||
 | 
										break;
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								if(randomTaskType == null){
 | 
				
			||||||
 | 
									SimLogger.printLine("Impossible is occured! no random task type!");
 | 
				
			||||||
 | 
									continue;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								
 | 
				
			||||||
 | 
								double poissonMean = SimSettings.getInstance().getTaskLookUpTable()[randomTaskType.ordinal()][2];
 | 
				
			||||||
 | 
								double activePeriod = SimSettings.getInstance().getTaskLookUpTable()[randomTaskType.ordinal()][3];
 | 
				
			||||||
 | 
								double idlePeriod = SimSettings.getInstance().getTaskLookUpTable()[randomTaskType.ordinal()][4];
 | 
				
			||||||
 | 
								double activePeriodStartTime = SimUtils.getRandomDoubleNumber(10, 10+activePeriod);  //start from 10th seconds
 | 
				
			||||||
 | 
								double virtualTime = activePeriodStartTime; //start from 10th seconds
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								ExponentialDistribution rng = new ExponentialDistribution(poissonMean);
 | 
				
			||||||
 | 
								while(virtualTime < simulationTime) {
 | 
				
			||||||
 | 
									double interval = rng.sample();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									if(interval <= 0){
 | 
				
			||||||
 | 
										SimLogger.printLine("Impossible is occured! interval is " + interval + " for device " + i + " time " + virtualTime);
 | 
				
			||||||
 | 
										continue;
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
									//SimLogger.printLine(virtualTime + " -> " + interval + " for device " + i + " time ");
 | 
				
			||||||
 | 
									virtualTime += interval;
 | 
				
			||||||
 | 
									
 | 
				
			||||||
 | 
									if(virtualTime > activePeriodStartTime + activePeriod){
 | 
				
			||||||
 | 
										activePeriodStartTime = activePeriodStartTime + activePeriod + idlePeriod;
 | 
				
			||||||
 | 
										virtualTime = activePeriodStartTime;
 | 
				
			||||||
 | 
										continue;
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									boolean requireCloud = false;
 | 
				
			||||||
 | 
									if(simScenario != SimSettings.SCENARIO_TYPES.SINGLE_TIER){
 | 
				
			||||||
 | 
										//decide to use cloud or cloudlet VM
 | 
				
			||||||
 | 
										int CloudVmPicker = SimUtils.getRandomNumber(0, 100);
 | 
				
			||||||
 | 
										
 | 
				
			||||||
 | 
										if(CloudVmPicker <= SimSettings.getInstance().getTaskLookUpTable()[randomTaskType.ordinal()][1])
 | 
				
			||||||
 | 
											requireCloud = true;
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
									
 | 
				
			||||||
 | 
									taskList.add(new EdgeTask(i,randomTaskType, virtualTime, requireCloud, poissonRngList));
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -0,0 +1,45 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Title:        EdgeCloudSim - Load Generator Model
 | 
				
			||||||
 | 
					 * 
 | 
				
			||||||
 | 
					 * Description: 
 | 
				
			||||||
 | 
					 * LoadGeneratorModel is an abstract class which is used for 
 | 
				
			||||||
 | 
					 * deciding task generation pattern via a task list. For those who
 | 
				
			||||||
 | 
					 * wants to add a custom Load Generator Model to EdgeCloudSim should
 | 
				
			||||||
 | 
					 * extend this class and provide a concreate instance via ScenarioFactory
 | 
				
			||||||
 | 
					 *               
 | 
				
			||||||
 | 
					 * Licence:      GPL - http://www.gnu.org/copyleft/gpl.html
 | 
				
			||||||
 | 
					 * Copyright (c) 2017, Bogazici University, Istanbul, Turkey
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package edu.boun.edgecloudsim.task_generator;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import java.util.List;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import edu.boun.edgecloudsim.core.SimSettings;
 | 
				
			||||||
 | 
					import edu.boun.edgecloudsim.utils.EdgeTask;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					public abstract class LoadGeneratorModel {
 | 
				
			||||||
 | 
						protected List<EdgeTask> taskList;
 | 
				
			||||||
 | 
						protected int numberOfMobileDevices;
 | 
				
			||||||
 | 
						protected double simulationTime;
 | 
				
			||||||
 | 
						protected SimSettings.SCENARIO_TYPES simScenario;
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						public LoadGeneratorModel(int _numberOfMobileDevices, double _simulationTime, SimSettings.SCENARIO_TYPES _simScenario){
 | 
				
			||||||
 | 
							numberOfMobileDevices=_numberOfMobileDevices;
 | 
				
			||||||
 | 
							simulationTime=_simulationTime;
 | 
				
			||||||
 | 
							simScenario=_simScenario;
 | 
				
			||||||
 | 
						};
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						/*
 | 
				
			||||||
 | 
						 * each task has a virtual start time
 | 
				
			||||||
 | 
						 * it will be used while generating task
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
						public List<EdgeTask> getTaskList() {
 | 
				
			||||||
 | 
							return taskList;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/*
 | 
				
			||||||
 | 
						 * fill task list according to related task generation model
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
						public abstract void initializeModel();
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										36
									
								
								src/edu/boun/edgecloudsim/utils/EdgeTask.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										36
									
								
								src/edu/boun/edgecloudsim/utils/EdgeTask.java
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,36 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Title:        EdgeCloudSim - EdgeTask
 | 
				
			||||||
 | 
					 * 
 | 
				
			||||||
 | 
					 * Description: 
 | 
				
			||||||
 | 
					 * A custom class used in Load Generator Model to store tasks information
 | 
				
			||||||
 | 
					 * 
 | 
				
			||||||
 | 
					 * Licence:      GPL - http://www.gnu.org/copyleft/gpl.html
 | 
				
			||||||
 | 
					 * Copyright (c) 2017, Bogazici University, Istanbul, Turkey
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package edu.boun.edgecloudsim.utils;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import edu.boun.edgecloudsim.core.SimSettings;
 | 
				
			||||||
 | 
					import edu.boun.edgecloudsim.core.SimSettings.APP_TYPES;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					public class EdgeTask {
 | 
				
			||||||
 | 
					    public APP_TYPES taskType;
 | 
				
			||||||
 | 
					    public boolean requireCloud;
 | 
				
			||||||
 | 
					    public double startTime;
 | 
				
			||||||
 | 
					    public long length, inputFileSize, outputFileSize;
 | 
				
			||||||
 | 
					    public int pesNumber;
 | 
				
			||||||
 | 
					    public int mobileDeviceId;
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    public EdgeTask(int _mobileDeviceId, APP_TYPES _taskType, double _startTime, boolean _requireCloud, PoissonDistr[][] poissonRngList) {
 | 
				
			||||||
 | 
					    	mobileDeviceId=_mobileDeviceId;
 | 
				
			||||||
 | 
					    	requireCloud=_requireCloud;
 | 
				
			||||||
 | 
					    	startTime=_startTime;
 | 
				
			||||||
 | 
					    	taskType=_taskType;
 | 
				
			||||||
 | 
					    	
 | 
				
			||||||
 | 
					    	inputFileSize = (long)poissonRngList[_taskType.ordinal()][0].sample();
 | 
				
			||||||
 | 
					    	outputFileSize =(long)poissonRngList[_taskType.ordinal()][1].sample();
 | 
				
			||||||
 | 
					    	length = (long)poissonRngList[_taskType.ordinal()][2].sample();
 | 
				
			||||||
 | 
					    	
 | 
				
			||||||
 | 
					    	pesNumber = (int)SimSettings.getInstance().getTaskLookUpTable()[_taskType.ordinal()][8];
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										55
									
								
								src/edu/boun/edgecloudsim/utils/Location.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										55
									
								
								src/edu/boun/edgecloudsim/utils/Location.java
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,55 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Title:        EdgeCloudSim - Location
 | 
				
			||||||
 | 
					 * 
 | 
				
			||||||
 | 
					 * Description:  Location class used in EdgeCloudSim
 | 
				
			||||||
 | 
					 * 
 | 
				
			||||||
 | 
					 * Licence:      GPL - http://www.gnu.org/copyleft/gpl.html
 | 
				
			||||||
 | 
					 * Copyright (c) 2017, Bogazici University, Istanbul, Turkey
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package edu.boun.edgecloudsim.utils;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import edu.boun.edgecloudsim.core.SimSettings;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					public class Location {
 | 
				
			||||||
 | 
						private int xPos;
 | 
				
			||||||
 | 
						private int yPos;
 | 
				
			||||||
 | 
						private int servingWlanId;
 | 
				
			||||||
 | 
						SimSettings.PLACE_TYPES placeType;
 | 
				
			||||||
 | 
						public Location(SimSettings.PLACE_TYPES _placeType, int _servingWlanId, int _xPos, int _yPos){
 | 
				
			||||||
 | 
							servingWlanId = _servingWlanId;
 | 
				
			||||||
 | 
							placeType=_placeType;
 | 
				
			||||||
 | 
							xPos = _xPos;
 | 
				
			||||||
 | 
							yPos = _yPos;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						@Override
 | 
				
			||||||
 | 
						public boolean equals(Object other){
 | 
				
			||||||
 | 
							boolean result = false;
 | 
				
			||||||
 | 
						    if (other == null) return false;
 | 
				
			||||||
 | 
						    if (!(other instanceof Location))return false;
 | 
				
			||||||
 | 
						    if (other == this) return true;
 | 
				
			||||||
 | 
						    
 | 
				
			||||||
 | 
						    Location otherLocation = (Location)other;
 | 
				
			||||||
 | 
						    if(this.xPos == otherLocation.xPos && this.yPos == otherLocation.yPos)
 | 
				
			||||||
 | 
						    	result = true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						    return result;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						public int getServingWlanId(){
 | 
				
			||||||
 | 
							return servingWlanId;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						public SimSettings.PLACE_TYPES getPlaceType(){
 | 
				
			||||||
 | 
							return placeType;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						public int getXPos(){
 | 
				
			||||||
 | 
							return xPos;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						public int getYPos(){
 | 
				
			||||||
 | 
							return yPos;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										63
									
								
								src/edu/boun/edgecloudsim/utils/PoissonDistr.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										63
									
								
								src/edu/boun/edgecloudsim/utils/PoissonDistr.java
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,63 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Title:        EdgeCloudSim - Poisson Distribution
 | 
				
			||||||
 | 
					 * 
 | 
				
			||||||
 | 
					 * Description:  Poisson Distribution implementation
 | 
				
			||||||
 | 
					 * 
 | 
				
			||||||
 | 
					 * Licence:      GPL - http://www.gnu.org/copyleft/gpl.html
 | 
				
			||||||
 | 
					 * Copyright (c) 2017, Bogazici University, Istanbul, Turkey
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package edu.boun.edgecloudsim.utils;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import java.util.Random;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					public class PoissonDistr {
 | 
				
			||||||
 | 
					    /** The num gen. */
 | 
				
			||||||
 | 
					    private final Random numGen;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** The mean. */
 | 
				
			||||||
 | 
					    private final double mean;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Creates a new exponential number generator.
 | 
				
			||||||
 | 
					     * 
 | 
				
			||||||
 | 
					     * @param seed the seed to be used.
 | 
				
			||||||
 | 
					     * @param mean the mean for the distribution.
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public PoissonDistr(long seed, double mean) {
 | 
				
			||||||
 | 
					        if (mean <= 0.0) {
 | 
				
			||||||
 | 
					            throw new IllegalArgumentException("Mean must be greater than 0.0");
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        numGen = new Random(seed);
 | 
				
			||||||
 | 
					        this.mean = mean;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Creates a new exponential number generator.
 | 
				
			||||||
 | 
					     * 
 | 
				
			||||||
 | 
					     * @param mean the mean for the distribution.
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public PoissonDistr(double mean) {
 | 
				
			||||||
 | 
					        if (mean <= 0.0) {
 | 
				
			||||||
 | 
					            throw new IllegalArgumentException("Mean must be greated than 0.0");
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        numGen = new Random(System.currentTimeMillis());
 | 
				
			||||||
 | 
					        this.mean = mean;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Generate a new random number.
 | 
				
			||||||
 | 
					     * 
 | 
				
			||||||
 | 
					     * @return the next random number in the sequence
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					        public double sample() {
 | 
				
			||||||
 | 
					            double L = Math.exp(-mean);
 | 
				
			||||||
 | 
					            int k = 0;
 | 
				
			||||||
 | 
					            double p = 1.0;
 | 
				
			||||||
 | 
					            do {
 | 
				
			||||||
 | 
					                p = p * numGen.nextDouble();
 | 
				
			||||||
 | 
					                k++;
 | 
				
			||||||
 | 
					            } while (p > L);
 | 
				
			||||||
 | 
					            return k - 1;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										467
									
								
								src/edu/boun/edgecloudsim/utils/SimLogger.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										467
									
								
								src/edu/boun/edgecloudsim/utils/SimLogger.java
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,467 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Title:        EdgeCloudSim - Simulation Logger
 | 
				
			||||||
 | 
					 * 
 | 
				
			||||||
 | 
					 * Description: 
 | 
				
			||||||
 | 
					 * SimLogger is responsible for storing simulation events/results
 | 
				
			||||||
 | 
					 * in to the files in a specific format.
 | 
				
			||||||
 | 
					 * Format is decided in a way to use results in matlab efficiently.
 | 
				
			||||||
 | 
					 * If you need more results or another file format, you should modify
 | 
				
			||||||
 | 
					 * this class.
 | 
				
			||||||
 | 
					 * 
 | 
				
			||||||
 | 
					 * Licence:      GPL - http://www.gnu.org/copyleft/gpl.html
 | 
				
			||||||
 | 
					 * Copyright (c) 2017, Bogazici University, Istanbul, Turkey
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package edu.boun.edgecloudsim.utils;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import java.io.BufferedWriter;
 | 
				
			||||||
 | 
					import java.io.File;
 | 
				
			||||||
 | 
					import java.io.FileWriter;
 | 
				
			||||||
 | 
					import java.io.IOException;
 | 
				
			||||||
 | 
					import java.util.HashMap;
 | 
				
			||||||
 | 
					import java.util.LinkedList;
 | 
				
			||||||
 | 
					import java.util.Map;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import edu.boun.edgecloudsim.core.SimManager;
 | 
				
			||||||
 | 
					import edu.boun.edgecloudsim.core.SimSettings;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					public class SimLogger {
 | 
				
			||||||
 | 
						public static enum TASK_STATUS {CREATED,
 | 
				
			||||||
 | 
														UPLOADING,
 | 
				
			||||||
 | 
														PROCESSING,
 | 
				
			||||||
 | 
														DOWNLOADING,
 | 
				
			||||||
 | 
														COMLETED,
 | 
				
			||||||
 | 
														REJECTED_DUE_TO_VM_CAPACITY,
 | 
				
			||||||
 | 
														REJECTED_DUE_TO_BANDWIDTH,
 | 
				
			||||||
 | 
														UNFINISHED_DUE_TO_BANDWIDTH,
 | 
				
			||||||
 | 
														UNFINISHED_DUE_TO_MOBILITY
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						private static boolean fileLogEnabled;
 | 
				
			||||||
 | 
						private static boolean printLogEnabled;
 | 
				
			||||||
 | 
						private String filePrefix;
 | 
				
			||||||
 | 
						private String outputFolder;
 | 
				
			||||||
 | 
						private Map<Integer, LogItem> taskMap;
 | 
				
			||||||
 | 
						private LinkedList<VmLoadLogItem> vmLoadList;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						private static SimLogger singleton = new SimLogger( );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* A private Constructor prevents any other 
 | 
				
			||||||
 | 
						 * class from instantiating.
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
						private SimLogger(){
 | 
				
			||||||
 | 
							fileLogEnabled = false;
 | 
				
			||||||
 | 
							printLogEnabled = false;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* Static 'instance' method */
 | 
				
			||||||
 | 
						public static SimLogger getInstance( ) {
 | 
				
			||||||
 | 
							return singleton;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						public static void enableFileLog() {
 | 
				
			||||||
 | 
							fileLogEnabled = true;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						public static void enablePrintLog() {
 | 
				
			||||||
 | 
							printLogEnabled = true;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						public static boolean isFileLogEnabled() {
 | 
				
			||||||
 | 
							return fileLogEnabled;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						public static void disablePrintLog() {
 | 
				
			||||||
 | 
							printLogEnabled = false;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						private void appendToFile(BufferedWriter bw, String line) throws IOException{
 | 
				
			||||||
 | 
							bw.write(line);
 | 
				
			||||||
 | 
							bw.newLine();
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						public static void printLine(String msg){
 | 
				
			||||||
 | 
							if(printLogEnabled)
 | 
				
			||||||
 | 
								System.out.println(msg);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						public static void print(String msg){
 | 
				
			||||||
 | 
							if(printLogEnabled)
 | 
				
			||||||
 | 
								System.out.print(msg);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						public void simStarted(String outFolder,String fileName) {
 | 
				
			||||||
 | 
							filePrefix = fileName;
 | 
				
			||||||
 | 
							outputFolder = outFolder;
 | 
				
			||||||
 | 
							taskMap = new HashMap<Integer, LogItem>();
 | 
				
			||||||
 | 
							vmLoadList = new LinkedList<VmLoadLogItem>();
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						public void addLog(double taskStartTime, int taskId, int taskType, int taskLenght, int taskInputType, int taskOutputSize) {
 | 
				
			||||||
 | 
							//printLine(taskId+"->"+taskStartTime);
 | 
				
			||||||
 | 
							taskMap.put(taskId, new LogItem(taskStartTime, taskType, taskLenght, taskInputType, taskOutputSize));
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						public void uploadStarted(int taskId, double taskUploadTime) {
 | 
				
			||||||
 | 
							taskMap.get(taskId).taskUploadStarted(taskUploadTime);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						public void uploaded(int taskId, int datacenterId, int hostId, int vmId, int vmType) {
 | 
				
			||||||
 | 
							taskMap.get(taskId).taskUploaded(datacenterId, hostId, vmId,vmType);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						public void downloadStarted(int taskId, double taskDownloadTime) {
 | 
				
			||||||
 | 
							taskMap.get(taskId).taskDownloadStarted(taskDownloadTime);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						public void downloaded(int taskId, double taskEndTime) {
 | 
				
			||||||
 | 
							taskMap.get(taskId).taskDownloaded(taskEndTime);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						public void rejectedDueToVMCapacity(int taskId, double taskRejectTime) {
 | 
				
			||||||
 | 
							taskMap.get(taskId).taskRejectedDueToVMCapacity(taskRejectTime);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						public void rejectedDueToBandwidth(int taskId, double taskRejectTime) {
 | 
				
			||||||
 | 
							taskMap.get(taskId).taskRejectedDueToBandwidth(taskRejectTime);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						public void failedDueToBandwidth(int taskId, double taskRejectTime) {
 | 
				
			||||||
 | 
							taskMap.get(taskId).taskFailedDueToBandwidth(taskRejectTime);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						public void failedDueToMobility(int taskId, double time) {
 | 
				
			||||||
 | 
							taskMap.get(taskId).taskFailedDueToMobility(time);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						public void addVmUtilizationLog(double time, double load) {
 | 
				
			||||||
 | 
							vmLoadList.add(new VmLoadLogItem(time, load));
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						public void simStopped() throws IOException {
 | 
				
			||||||
 | 
							File file1=null,file2=null,file3=null,file4=null,file5=null;
 | 
				
			||||||
 | 
							FileWriter fileWriter1=null,fileWriter2=null,fileWriter3=null,fileWriter4=null,fileWriter5=null;
 | 
				
			||||||
 | 
							BufferedWriter bufferedWriter1=null,bufferedWriter2=null,bufferedWriter3=null,bufferedWriter4=null,bufferedWriter5=null;
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							int uncompletedTaskOnCloudlet = 0;
 | 
				
			||||||
 | 
							int completedTaskOnCloudlet = 0;
 | 
				
			||||||
 | 
							int uncompletedTaskOnCloud = 0;
 | 
				
			||||||
 | 
							int completedTaskOnCloud = 0;
 | 
				
			||||||
 | 
							int rejectedTaskDoToVmCapacity = 0;
 | 
				
			||||||
 | 
							int rejectedTaskDoToBandwidth = 0;
 | 
				
			||||||
 | 
							int failedTaskDuetoBandwidth = 0;
 | 
				
			||||||
 | 
							int failedTaskDuetoMobility = 0;
 | 
				
			||||||
 | 
							int totalCompletedTask = 0;
 | 
				
			||||||
 | 
							int totalFailedTask = 0;
 | 
				
			||||||
 | 
							double totalCost = 0;
 | 
				
			||||||
 | 
							double totalLanDelay = 0;
 | 
				
			||||||
 | 
							double totalWanDelay = 0;
 | 
				
			||||||
 | 
							double totalServiceTime = 0;
 | 
				
			||||||
 | 
							double totalNetworkDelay = 0;
 | 
				
			||||||
 | 
							double totalProcessingTime = 0;
 | 
				
			||||||
 | 
							double totalVmLoad = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							//open all files and prepare them for write
 | 
				
			||||||
 | 
							if(fileLogEnabled){
 | 
				
			||||||
 | 
								if(SimSettings.getInstance().getDeepFileLoggingEnabled()){
 | 
				
			||||||
 | 
									file1 = new File(outputFolder, filePrefix+"_SUCCESS.log");
 | 
				
			||||||
 | 
									fileWriter1 = new FileWriter(file1, true);
 | 
				
			||||||
 | 
									bufferedWriter1 = new BufferedWriter(fileWriter1);
 | 
				
			||||||
 | 
									
 | 
				
			||||||
 | 
									file2 = new File(outputFolder, filePrefix+"_FAIL.log");
 | 
				
			||||||
 | 
									fileWriter2 = new FileWriter(file2, true);
 | 
				
			||||||
 | 
									bufferedWriter2 = new BufferedWriter(fileWriter2);
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								
 | 
				
			||||||
 | 
								file3 = new File(outputFolder, filePrefix+"_VM_LOAD.log");
 | 
				
			||||||
 | 
								fileWriter3 = new FileWriter(file3, true);
 | 
				
			||||||
 | 
								bufferedWriter3 = new BufferedWriter(fileWriter3);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								file4 = new File(outputFolder, filePrefix+"_GENERIC.log");
 | 
				
			||||||
 | 
								fileWriter4 = new FileWriter(file4, true);
 | 
				
			||||||
 | 
								bufferedWriter4 = new BufferedWriter(fileWriter4);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								file5 = new File(outputFolder, filePrefix+"_LOCATION.log");
 | 
				
			||||||
 | 
								fileWriter5 = new FileWriter(file5, true);
 | 
				
			||||||
 | 
								bufferedWriter5 = new BufferedWriter(fileWriter5);
 | 
				
			||||||
 | 
								
 | 
				
			||||||
 | 
								if(SimSettings.getInstance().getDeepFileLoggingEnabled()){
 | 
				
			||||||
 | 
									appendToFile(bufferedWriter1, "# taskId;dataCenterId;hostId;vmId;vmType;taskType;taskLenght;taskInputType;taskOutputSize;taskStartTime;taskEndTime;nwDelay");
 | 
				
			||||||
 | 
									appendToFile(bufferedWriter2, "# taskId;dataCenterId;hostId;vmId;vmType;taskType;taskLenght;taskInputType;taskOutputSize;taskStartTime;taskEndTime;failReason");
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								
 | 
				
			||||||
 | 
								appendToFile(bufferedWriter3, "# time;load");
 | 
				
			||||||
 | 
								appendToFile(bufferedWriter4, "# completedTask;uncompletedTask;rejectedTask;failedDueToMobilityTask;avgFailure;avgServiceTime;avgNetworkDelay;avgServerLoad;avgCost");
 | 
				
			||||||
 | 
								appendToFile(bufferedWriter5, "# time;#ofClient@PlaceType1;#ofClient@PlaceTypen");
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							//extract the result of each task and write it to the file if required
 | 
				
			||||||
 | 
							for (Map.Entry<Integer, LogItem> entry : taskMap.entrySet()) {
 | 
				
			||||||
 | 
								Integer key = entry.getKey();
 | 
				
			||||||
 | 
								LogItem value = entry.getValue();
 | 
				
			||||||
 | 
								
 | 
				
			||||||
 | 
								if(value.isInWarmUpPeriod())
 | 
				
			||||||
 | 
									continue;
 | 
				
			||||||
 | 
							    
 | 
				
			||||||
 | 
								if(value.getStatus() == SimLogger.TASK_STATUS.COMLETED){
 | 
				
			||||||
 | 
									if(value.getVmType() == SimSettings.VM_TYPES.CLOUD_VM.ordinal()){
 | 
				
			||||||
 | 
										completedTaskOnCloud++;
 | 
				
			||||||
 | 
										totalWanDelay += value.getNetworkDelay();
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
									else{
 | 
				
			||||||
 | 
										completedTaskOnCloudlet++;
 | 
				
			||||||
 | 
										totalLanDelay += value.getNetworkDelay();
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
									totalCost += value.getCost();
 | 
				
			||||||
 | 
									totalServiceTime += value.getServiceTime();
 | 
				
			||||||
 | 
									totalNetworkDelay += value.getNetworkDelay();
 | 
				
			||||||
 | 
									totalProcessingTime += (value.getServiceTime() - value.getNetworkDelay());
 | 
				
			||||||
 | 
									
 | 
				
			||||||
 | 
									if(fileLogEnabled && SimSettings.getInstance().getDeepFileLoggingEnabled())
 | 
				
			||||||
 | 
										appendToFile(bufferedWriter1, value.toString(key));
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								else if(value.getStatus() == SimLogger.TASK_STATUS.REJECTED_DUE_TO_VM_CAPACITY){
 | 
				
			||||||
 | 
									rejectedTaskDoToVmCapacity++;
 | 
				
			||||||
 | 
									if(fileLogEnabled && SimSettings.getInstance().getDeepFileLoggingEnabled())
 | 
				
			||||||
 | 
										appendToFile(bufferedWriter2, value.toString(key));
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								else if(value.getStatus() == SimLogger.TASK_STATUS.REJECTED_DUE_TO_BANDWIDTH){
 | 
				
			||||||
 | 
									rejectedTaskDoToBandwidth++;
 | 
				
			||||||
 | 
									if(fileLogEnabled && SimSettings.getInstance().getDeepFileLoggingEnabled())
 | 
				
			||||||
 | 
										appendToFile(bufferedWriter2, value.toString(key));
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								else if(value.getStatus() == SimLogger.TASK_STATUS.UNFINISHED_DUE_TO_BANDWIDTH){
 | 
				
			||||||
 | 
									failedTaskDuetoBandwidth++;
 | 
				
			||||||
 | 
									if(fileLogEnabled && SimSettings.getInstance().getDeepFileLoggingEnabled())
 | 
				
			||||||
 | 
										appendToFile(bufferedWriter2, value.toString(key));
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								else if(value.getStatus() == SimLogger.TASK_STATUS.UNFINISHED_DUE_TO_MOBILITY){
 | 
				
			||||||
 | 
									failedTaskDuetoMobility++;
 | 
				
			||||||
 | 
									if(fileLogEnabled && SimSettings.getInstance().getDeepFileLoggingEnabled())
 | 
				
			||||||
 | 
										appendToFile(bufferedWriter2, value.toString(key));
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								else {
 | 
				
			||||||
 | 
									if(value.getVmType() == SimSettings.VM_TYPES.CLOUD_VM.ordinal())
 | 
				
			||||||
 | 
										uncompletedTaskOnCloud++;
 | 
				
			||||||
 | 
									else
 | 
				
			||||||
 | 
										uncompletedTaskOnCloudlet++;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							totalFailedTask = rejectedTaskDoToVmCapacity+rejectedTaskDoToBandwidth+failedTaskDuetoBandwidth;
 | 
				
			||||||
 | 
							totalCompletedTask = completedTaskOnCloudlet+completedTaskOnCloud;
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							//calculate server load
 | 
				
			||||||
 | 
							for(VmLoadLogItem entry : vmLoadList){
 | 
				
			||||||
 | 
								totalVmLoad += entry.getLoad();
 | 
				
			||||||
 | 
								if(fileLogEnabled)
 | 
				
			||||||
 | 
									appendToFile(bufferedWriter3, entry.toString());
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
								
 | 
				
			||||||
 | 
							if(fileLogEnabled){
 | 
				
			||||||
 | 
								//write location info to file
 | 
				
			||||||
 | 
								for(int t=1; t<(SimSettings.getInstance().getSimulationTime()/SimSettings.getInstance().getVmLocationLogInterval()); t++){
 | 
				
			||||||
 | 
									int[] locationInfo = new int[SimSettings.PLACE_TYPES.values().length];
 | 
				
			||||||
 | 
									for(int i=0; i<SimManager.getInstance().getNumOfMobileDevice(); i++) {
 | 
				
			||||||
 | 
										
 | 
				
			||||||
 | 
										Location loc = SimManager.getInstance().getMobilityModel().getLocation(i, t*SimSettings.getInstance().getVmLocationLogInterval());
 | 
				
			||||||
 | 
										SimSettings.PLACE_TYPES placeType = loc.getPlaceType();
 | 
				
			||||||
 | 
										locationInfo[placeType.ordinal()]++;
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
									
 | 
				
			||||||
 | 
									Double time=t*SimSettings.getInstance().getVmLocationLogInterval();
 | 
				
			||||||
 | 
									bufferedWriter5.write(time.toString());
 | 
				
			||||||
 | 
									for(int i=0; i<locationInfo.length; i++)
 | 
				
			||||||
 | 
										bufferedWriter5.write(SimSettings.DELIMITER + locationInfo[i]);
 | 
				
			||||||
 | 
									
 | 
				
			||||||
 | 
									bufferedWriter5.newLine();
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								
 | 
				
			||||||
 | 
								//write generic results
 | 
				
			||||||
 | 
								String genericResult = Integer.toString(completedTaskOnCloudlet) + SimSettings.DELIMITER + 
 | 
				
			||||||
 | 
										Integer.toString(uncompletedTaskOnCloudlet) + SimSettings.DELIMITER +
 | 
				
			||||||
 | 
										Integer.toString(completedTaskOnCloud) + SimSettings.DELIMITER + 
 | 
				
			||||||
 | 
										Integer.toString(uncompletedTaskOnCloud) + SimSettings.DELIMITER +
 | 
				
			||||||
 | 
										Integer.toString(rejectedTaskDoToVmCapacity) + SimSettings.DELIMITER +
 | 
				
			||||||
 | 
										Integer.toString(rejectedTaskDoToBandwidth) + SimSettings.DELIMITER +
 | 
				
			||||||
 | 
										Integer.toString(failedTaskDuetoBandwidth) + SimSettings.DELIMITER +
 | 
				
			||||||
 | 
										Integer.toString(failedTaskDuetoMobility) + SimSettings.DELIMITER +
 | 
				
			||||||
 | 
										Double.toString(((double)totalFailedTask*(double)100)/(double)(totalCompletedTask+totalFailedTask)) + SimSettings.DELIMITER +
 | 
				
			||||||
 | 
										Double.toString(totalServiceTime/(double)totalCompletedTask) + SimSettings.DELIMITER +
 | 
				
			||||||
 | 
										Double.toString(totalNetworkDelay/(double)totalCompletedTask) + SimSettings.DELIMITER +
 | 
				
			||||||
 | 
										Double.toString(totalLanDelay/(double)totalCompletedTask) + SimSettings.DELIMITER +
 | 
				
			||||||
 | 
										Double.toString(totalWanDelay/(double)totalCompletedTask) + SimSettings.DELIMITER +
 | 
				
			||||||
 | 
										Double.toString(totalProcessingTime/(double)totalCompletedTask) + SimSettings.DELIMITER +
 | 
				
			||||||
 | 
										Double.toString(totalVmLoad/(double)vmLoadList.size()) + SimSettings.DELIMITER +
 | 
				
			||||||
 | 
										Double.toString(totalCost/(double)totalCompletedTask);
 | 
				
			||||||
 | 
								
 | 
				
			||||||
 | 
								appendToFile(bufferedWriter4,genericResult);
 | 
				
			||||||
 | 
								
 | 
				
			||||||
 | 
								//close open files
 | 
				
			||||||
 | 
								if(SimSettings.getInstance().getDeepFileLoggingEnabled()){
 | 
				
			||||||
 | 
									bufferedWriter1.close();
 | 
				
			||||||
 | 
									bufferedWriter2.close();
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								bufferedWriter3.close();
 | 
				
			||||||
 | 
								bufferedWriter4.close();
 | 
				
			||||||
 | 
								bufferedWriter5.close();
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							//printout important results
 | 
				
			||||||
 | 
							printLine("# of uncompleted tasks on Cloudlet/Cloud: " + uncompletedTaskOnCloudlet + "/" + uncompletedTaskOnCloud);
 | 
				
			||||||
 | 
							printLine("# of completed task on Cloudlet/Cloud: " + (completedTaskOnCloudlet+uncompletedTaskOnCloudlet) + "/" + (completedTaskOnCloud+uncompletedTaskOnCloud));
 | 
				
			||||||
 | 
							printLine("# of rejected tasks (due to vm capacity): " + rejectedTaskDoToVmCapacity);
 | 
				
			||||||
 | 
							printLine("# of rejected tasks (due to bandwidth): " + rejectedTaskDoToBandwidth);
 | 
				
			||||||
 | 
							printLine("# of failed tasks (due to bandwidth): " + failedTaskDuetoBandwidth);
 | 
				
			||||||
 | 
							printLine("# of failed tasks (due to mobility): " + failedTaskDuetoMobility);
 | 
				
			||||||
 | 
							printLine("percentage of failed task: " + String.format("%.6f", ((double)totalFailedTask*(double)100)/(double)(totalCompletedTask+totalFailedTask)) + "%");
 | 
				
			||||||
 | 
							printLine("average service time: " + String.format("%.6f", totalServiceTime/(double)totalCompletedTask) + " seconds. ("
 | 
				
			||||||
 | 
									+ "processing time: " + String.format("%.6f", totalProcessingTime/(double)totalCompletedTask) + ")");
 | 
				
			||||||
 | 
							printLine("average netwrok delay: " + String.format("%.6f", totalNetworkDelay/(double)totalCompletedTask) + " seconds. ("
 | 
				
			||||||
 | 
									+ "LAN delay: " + String.format("%.6f", totalLanDelay/(double)totalCompletedTask) + ", "
 | 
				
			||||||
 | 
									+ "WAN delay: " + String.format("%.6f", totalWanDelay/(double)totalCompletedTask) + ")");
 | 
				
			||||||
 | 
							printLine("average server utilization: " + String.format("%.6f", totalVmLoad/(double)vmLoadList.size()) + "%");
 | 
				
			||||||
 | 
							printLine("average cost: " + totalCost/totalCompletedTask + "$");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							//clear related collections (map list etc.)
 | 
				
			||||||
 | 
							taskMap.clear();
 | 
				
			||||||
 | 
							vmLoadList.clear();
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class VmLoadLogItem
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						private double time;
 | 
				
			||||||
 | 
						private double vmLoad;
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						VmLoadLogItem(double _time, double _vmLoad)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							time = _time;
 | 
				
			||||||
 | 
							vmLoad = _vmLoad;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						public double getLoad()
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							return vmLoad;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						public String toString()
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							return time + SimSettings.DELIMITER + vmLoad;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					class LogItem
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						private SimLogger.TASK_STATUS status;
 | 
				
			||||||
 | 
						private int datacenterId;
 | 
				
			||||||
 | 
						private int hostId;
 | 
				
			||||||
 | 
						private int vmId;
 | 
				
			||||||
 | 
						private int vmType;
 | 
				
			||||||
 | 
						private int taskType;
 | 
				
			||||||
 | 
						private int taskLenght;
 | 
				
			||||||
 | 
						private int taskInputType;
 | 
				
			||||||
 | 
						private int taskOutputSize;
 | 
				
			||||||
 | 
						private double taskStartTime;
 | 
				
			||||||
 | 
						private double taskEndTime;
 | 
				
			||||||
 | 
						private double networkDelay;
 | 
				
			||||||
 | 
						private double bwCost;
 | 
				
			||||||
 | 
						private double cpuCost;
 | 
				
			||||||
 | 
						private boolean isInWarmUpPeriod;
 | 
				
			||||||
 | 
						LogItem (double _taskStartTime, int _taskType, int _taskLenght, int _taskInputType, int _taskOutputSize)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							taskStartTime = _taskStartTime;
 | 
				
			||||||
 | 
							taskType=_taskType;
 | 
				
			||||||
 | 
							taskLenght=_taskLenght;
 | 
				
			||||||
 | 
							taskInputType=_taskInputType;
 | 
				
			||||||
 | 
							taskOutputSize=_taskOutputSize;
 | 
				
			||||||
 | 
							status = SimLogger.TASK_STATUS.CREATED;
 | 
				
			||||||
 | 
							taskEndTime = 0;
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							if(_taskStartTime < SimSettings.getInstance().getWarmUpPeriod())
 | 
				
			||||||
 | 
								isInWarmUpPeriod = true;
 | 
				
			||||||
 | 
							else
 | 
				
			||||||
 | 
								isInWarmUpPeriod = false;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						public void taskUploadStarted(double taskUploadTime) {
 | 
				
			||||||
 | 
							networkDelay += taskUploadTime;
 | 
				
			||||||
 | 
							status = SimLogger.TASK_STATUS.UPLOADING;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						public void taskUploaded(int _datacenterId, int _hostId, int _vmId, int _vmType) {
 | 
				
			||||||
 | 
							status = SimLogger.TASK_STATUS.PROCESSING;
 | 
				
			||||||
 | 
							datacenterId = _datacenterId;
 | 
				
			||||||
 | 
							hostId = _hostId;
 | 
				
			||||||
 | 
							vmId = _vmId;
 | 
				
			||||||
 | 
							vmType=_vmType;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						public void taskDownloadStarted(double taskDownloadTime) {
 | 
				
			||||||
 | 
							networkDelay += taskDownloadTime;
 | 
				
			||||||
 | 
							status = SimLogger.TASK_STATUS.DOWNLOADING;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						public void taskDownloaded(double _taskEndTime) {
 | 
				
			||||||
 | 
							taskEndTime = _taskEndTime;
 | 
				
			||||||
 | 
							status = SimLogger.TASK_STATUS.COMLETED;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						public void taskRejectedDueToVMCapacity(double _taskRejectTime) {
 | 
				
			||||||
 | 
							taskEndTime = _taskRejectTime;
 | 
				
			||||||
 | 
							status = SimLogger.TASK_STATUS.REJECTED_DUE_TO_VM_CAPACITY;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						public void taskRejectedDueToBandwidth(double _taskRejectTime) {
 | 
				
			||||||
 | 
							taskEndTime = _taskRejectTime;
 | 
				
			||||||
 | 
							status = SimLogger.TASK_STATUS.REJECTED_DUE_TO_BANDWIDTH;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						public void taskFailedDueToBandwidth(double _time) {
 | 
				
			||||||
 | 
							taskEndTime = _time;
 | 
				
			||||||
 | 
							status = SimLogger.TASK_STATUS.UNFINISHED_DUE_TO_BANDWIDTH;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						public void taskFailedDueToMobility(double _time) {
 | 
				
			||||||
 | 
							taskEndTime = _time;
 | 
				
			||||||
 | 
							status = SimLogger.TASK_STATUS.UNFINISHED_DUE_TO_MOBILITY;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						public void setCost(double _bwCost, double _cpuCos) {
 | 
				
			||||||
 | 
							bwCost = _bwCost;
 | 
				
			||||||
 | 
							cpuCost = _cpuCos;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						public boolean isInWarmUpPeriod(){
 | 
				
			||||||
 | 
							return isInWarmUpPeriod;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						public double getCost() {
 | 
				
			||||||
 | 
							return bwCost + cpuCost;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						public double getNetworkDelay() {
 | 
				
			||||||
 | 
							return networkDelay;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						public double getServiceTime() {
 | 
				
			||||||
 | 
							return taskEndTime - taskStartTime;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						public SimLogger.TASK_STATUS getStatus(){
 | 
				
			||||||
 | 
							return status;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						public int getVmType(){
 | 
				
			||||||
 | 
							return vmType;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						public String toString (int taskId)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							String result = taskId + SimSettings.DELIMITER +
 | 
				
			||||||
 | 
									datacenterId + SimSettings.DELIMITER +
 | 
				
			||||||
 | 
									hostId + SimSettings.DELIMITER +
 | 
				
			||||||
 | 
									vmId + SimSettings.DELIMITER +
 | 
				
			||||||
 | 
									vmType + SimSettings.DELIMITER +
 | 
				
			||||||
 | 
									taskType + SimSettings.DELIMITER +
 | 
				
			||||||
 | 
									taskLenght + SimSettings.DELIMITER +
 | 
				
			||||||
 | 
									taskInputType + SimSettings.DELIMITER +
 | 
				
			||||||
 | 
									taskOutputSize + SimSettings.DELIMITER +
 | 
				
			||||||
 | 
									taskStartTime +  SimSettings.DELIMITER +
 | 
				
			||||||
 | 
									taskEndTime +  SimSettings.DELIMITER;
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							if(status == SimLogger.TASK_STATUS.COMLETED)
 | 
				
			||||||
 | 
								result += networkDelay;
 | 
				
			||||||
 | 
							else if(status == SimLogger.TASK_STATUS.REJECTED_DUE_TO_VM_CAPACITY)
 | 
				
			||||||
 | 
								result +="1"; //failure reason 1
 | 
				
			||||||
 | 
							else if(status == SimLogger.TASK_STATUS.REJECTED_DUE_TO_BANDWIDTH)
 | 
				
			||||||
 | 
								result +="2"; //failure reason 2
 | 
				
			||||||
 | 
							else if(status == SimLogger.TASK_STATUS.UNFINISHED_DUE_TO_BANDWIDTH)
 | 
				
			||||||
 | 
								result +="3"; //failure reason 3
 | 
				
			||||||
 | 
							else if(status == SimLogger.TASK_STATUS.UNFINISHED_DUE_TO_MOBILITY)
 | 
				
			||||||
 | 
								result +="4"; //failure reason 4
 | 
				
			||||||
 | 
							else
 | 
				
			||||||
 | 
								result +="0"; //default failure reason
 | 
				
			||||||
 | 
							return result;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										103
									
								
								src/edu/boun/edgecloudsim/utils/SimUtils.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										103
									
								
								src/edu/boun/edgecloudsim/utils/SimUtils.java
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,103 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Title:        EdgeCloudSim - Simulation Utils
 | 
				
			||||||
 | 
					 * 
 | 
				
			||||||
 | 
					 * Description:  Utility class providing helper functions
 | 
				
			||||||
 | 
					 * 
 | 
				
			||||||
 | 
					 * Licence:      GPL - http://www.gnu.org/copyleft/gpl.html
 | 
				
			||||||
 | 
					 * Copyright (c) 2017, Bogazici University, Istanbul, Turkey
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package edu.boun.edgecloudsim.utils;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import java.io.File;
 | 
				
			||||||
 | 
					import java.util.Date;
 | 
				
			||||||
 | 
					import java.util.Random;
 | 
				
			||||||
 | 
					import java.util.concurrent.TimeUnit;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import edu.boun.edgecloudsim.core.SimSettings;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					public class SimUtils {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public static final Random RNG = new Random(System.currentTimeMillis());
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    public static int getRandomNumber(int start, int end) {
 | 
				
			||||||
 | 
					    	//return pd.sample();
 | 
				
			||||||
 | 
							long range = (long)end - (long)start + 1;
 | 
				
			||||||
 | 
							long fraction = (long)(range * RNG.nextDouble());
 | 
				
			||||||
 | 
							return (int)(fraction + start); 
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    public static double getRandomDoubleNumber(double start, double end) {
 | 
				
			||||||
 | 
					    	//return pd.sample();
 | 
				
			||||||
 | 
							double range = end - start;
 | 
				
			||||||
 | 
							double fraction = (range * RNG.nextDouble());
 | 
				
			||||||
 | 
							return (fraction + start); 
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    public static long getRandomLongNumber(int start, int end) {
 | 
				
			||||||
 | 
					    	//return pd.sample();
 | 
				
			||||||
 | 
							long range = (long)end - (long)start + 1;
 | 
				
			||||||
 | 
							long fraction = (long)(range * RNG.nextDouble());
 | 
				
			||||||
 | 
							return (fraction + start); 
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						public static void cleanOutputFolder(String outputFolder){
 | 
				
			||||||
 | 
							//clean the folder where the result files will be saved
 | 
				
			||||||
 | 
							File dir = new File(outputFolder);
 | 
				
			||||||
 | 
							if(dir.exists() && dir.isDirectory())
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								for (File f: dir.listFiles())
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									if (f.exists() && f.isFile())
 | 
				
			||||||
 | 
									{
 | 
				
			||||||
 | 
										if(!f.delete())
 | 
				
			||||||
 | 
										{
 | 
				
			||||||
 | 
											SimLogger.printLine("file cannot be cleared: " + f.getAbsolutePath());
 | 
				
			||||||
 | 
											System.exit(0);
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							else {
 | 
				
			||||||
 | 
								SimLogger.printLine("Output folder is not available: " + outputFolder);
 | 
				
			||||||
 | 
								System.exit(0);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						public static String getTimeDifference(Date startDate, Date endDate){
 | 
				
			||||||
 | 
							String result = "";
 | 
				
			||||||
 | 
							long duration  = endDate.getTime() - startDate.getTime();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							long diffInMilli = TimeUnit.MILLISECONDS.toMillis(duration);
 | 
				
			||||||
 | 
							long diffInSeconds = TimeUnit.MILLISECONDS.toSeconds(duration);
 | 
				
			||||||
 | 
							long diffInMinutes = TimeUnit.MILLISECONDS.toMinutes(duration);
 | 
				
			||||||
 | 
							long diffInHours = TimeUnit.MILLISECONDS.toHours(duration);
 | 
				
			||||||
 | 
							long diffInDays = TimeUnit.MILLISECONDS.toDays(duration);
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							if(diffInDays>0)
 | 
				
			||||||
 | 
								result += diffInDays + ((diffInDays>1 == true) ? " Days " : " Day ");
 | 
				
			||||||
 | 
							if(diffInHours>0)
 | 
				
			||||||
 | 
								result += diffInHours % 24 + ((diffInHours>1 == true) ? " Hours " : " Hour ");
 | 
				
			||||||
 | 
							if(diffInMinutes>0)
 | 
				
			||||||
 | 
								result += diffInMinutes % 60 + ((diffInMinutes>1 == true) ? " Minutes " : " Minute ");
 | 
				
			||||||
 | 
							if(diffInSeconds>0)
 | 
				
			||||||
 | 
								result += diffInSeconds % 60 + ((diffInSeconds>1 == true) ? " Seconds" : " Second");
 | 
				
			||||||
 | 
							if(diffInMilli>0 && result.isEmpty())
 | 
				
			||||||
 | 
								result += diffInMilli + ((diffInMilli>1 == true) ? " Milli Seconds" : " Milli Second");
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							return result;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						public static SimSettings.PLACE_TYPES stringToPlace(String attractiveness){
 | 
				
			||||||
 | 
							SimSettings.PLACE_TYPES placeType = null;
 | 
				
			||||||
 | 
							if(attractiveness.equals("1"))
 | 
				
			||||||
 | 
								placeType = SimSettings.PLACE_TYPES.ATTRACTIVENESS_L1;
 | 
				
			||||||
 | 
							else if(attractiveness.equals("2"))
 | 
				
			||||||
 | 
								placeType = SimSettings.PLACE_TYPES.ATTRACTIVENESS_L2;
 | 
				
			||||||
 | 
							else if(attractiveness.equals("3"))
 | 
				
			||||||
 | 
								placeType = SimSettings.PLACE_TYPES.ATTRACTIVENESS_L3;
 | 
				
			||||||
 | 
							else{
 | 
				
			||||||
 | 
								SimLogger.printLine("Unknown attractiveness level! Terminating simulation...");
 | 
				
			||||||
 | 
						    	System.exit(0);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							return placeType;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
		Reference in New Issue
	
	Block a user