Lists the main changes in the project.
- xxx
- Renamed the
DatacenterBroker
getVmsCreatedList()
method togetVmCreatedList()
and added agetVmExecList()
one (#100). Now thegetVmExecList()
method is the one which stores the list of all currently running VMs. These VMs may or may not be running Cloudlets, but they are available for new submitted Cloudlets to be placed into them. The oldgetVmCreatedList()
stores all created VMs for the broker along the entire simulation time. This way, the list of all created VMs can be queried after the simulation finishes.
- Updates Host Fault Injection Mechanism (#105).
- Amazon EC2 instance templates in JSON format (#97).
Vm.getStartTime()
,Vm.getStopTime()
andVm.getTotalExecutionTime()
methods to, respectively: get the time a VM started running for the first time; the time it was destroyed in the last Host it executed; and the total execution time across all Hosts the VM possibly have migrated across (#98).- Allow a VM belonging to a broker to be destroyed after all its Cloudlets have finished, independently of the state of other running VMs and according to a given delay (#99).
- Host Fault Injection Mechanism (#81).
- Cloudlets executed with
CloudletSchedulerSpaceShared
were giving incorrect results (#96).
PowerVmAllocationPolicyMigrationBestFitStaticThreshold
to select the Host to place or migrate a VM using a Best Fit policy, that is, it selects the Host with less available resources that is enough to place a given VM.- Enables dynamically adding new columns to the simulation results table (#87).
- Enables changing the CPU migration overhead for any VmScheduler. A new constructor was added to these schedulers to enable setting this value once (#88).
- Enables Hosts to be powered on and off (#89).
EventListener
to notify subscribers when all VMs in theDatacenterBroker
waiting list were created (#92).
- Updates the Host Fault Injection Mechanism to allow creating a snapshot of a VM when all VMs belonging to a broker have failed (#93).
- Allocated MIPS for VM was not being reduced during VM migration (#95)
- Vertical VM Scaling Mechanism (#7) for up and down scaling of VM resources such as Ram, Bandwidth and PEs (CPUs).
double getUtilization()
method in theUtilizationModel
class to get the utilization percentage of a given resource at the current simulation time.- Methods
getUtilizationOfRam()
,getUtilizationOfBw()
,getUtilizationOfCpu()
added to Cloudlet in order to get utilization percentage of RAM, BW and CPU, respectively, for the current simulation time. UtilizationModel.Unit
enum to define the measuring unit in which a Cloudlet resource, to which aUtilizationModel
is associated to, will be used. The enum values can bePERCENTAGE
orABSOLUTE
, that respectively defines that the Cloudlet resource usage will be in percentage or absolute values. The existing UtilizationModels continue to define the value in percentage, as describe in their documentation. TheUtilizationModelDynamic
(previously calledUtilizationModelArithmeticProgression
) allows setting a different unit for such anUtilizationModel
(#62).UtilizationModelDynamic
now allows defining the resource usage increment behavior using a Lambda Expression, enabling the developer to give a function that performs the increment in an arithmetic, geometric, exponential or any other kind of progression he/she needs (#64).- Updated the
DatacenterBroker
interface and implementing classes, including the methodssetVmComparator
andsetCloudletComparator
to enable a developer to set aComparator
object (which can be given as a Lambda Expression) to sort VMs and Cloudlets before they are actually requested to be created in some Datacenter. This enables defining priorities to request the creation of such objects. If noComparator
is defined, the objects creation request follows the order in which they were submitted. - Host Fault Injection Mechanism (under development) to enable injection of random failures into Hosts PEs: it injects failures into Host PEs and reallocates working PEs to running VMs. When all PEs from a Host fail, it starts clones of failed VMs to recovery from failure. This way, it is simulated the instantiation of VM snapshots into different Hosts (#81).
- Added the method Host.getWorkingPesList().
- Poisson Distribution implementation enabling the simulation of inter-arrival times of events such as Host failures.
- Added the method void
submitCloudletList(List<? extends Cloudlet> list, Vm vm)
to theDatacenterBroker
, enabling submission of a list of cloudlets to run inside a specific VM. - Added the method void
submitCloudletList(List<? extends Cloudlet> list, Vm vm, double submissionDelay)
to theDatacenterBroker
, enabling submission of a list of cloudlets to run inside a specific VM, and at the same time, allowing delaying the creation of such cloudlets. - Added a
getCloudletList()
method int theCloudletScheduler
to get the list of all cloudlets which are executing or waiting inside a given VM. - Includes new boolean methods to the Pe interface to make easier to check the PE status.
New methods are
isFree()
,isBuzy()
,isFailed(
) andisWorking()
. - Allowed disabling log on every
SimEntity
by calling the new methodSimEntity.setLog()
. IfLog.disable(
) is called, it disables all simulation logs, independent of the configuration on each entity. This new feature enables fine-grained control of entities log.
- Changed the methods
getRam()
,getBw()
andgetSize()
from Vm interface to instead of returning a long value that represents the resource capacity, to return an actual Resource object that provides information about the capacity and usage. The method getSize() was renamed to getStorage(). - Changed the methods
getRamCapacity()
,getBwCapacity()
andgetStorageCapacity()
from Host interface to instead of returning a long value that represents the resource capacity, to return an actual Resource object that provides information about the capacity and usage. The methods were renamed, removing the "Capacity" suffix. - Automatic generation of IDs for Hosts, VMs and Cloudlets.
- Hosts IDs can be manually defined using the
setId()
method, but the constructor parameter was removed. The IDs of Hosts across different Datacenters can be duplicated, since when a search for a Host is made using the HostList method, just the Hosts of a given Datacenter are considered. - Hosts IDs are generated when a List of Hosts is attached to a Datacenter.
- Cloudlets and VMs IDs are generated when they are submitted to a Broker.
- Hosts IDs can be manually defined using the
- Hosts constructors require the RAM and bandwidth capacity, since storage already was required.
- Instantiating a
ResourceProvisionerSimple
now requires just a default no-args constructor. - The
DatacenterBroker
interfaces now allow using Java 8 Lambda Expressions to define selection policies.- It provides a functional way of defining the policies to select a Datacenter to host a Vm, a fallback Datacenter when the creation of requested VMs failed in the previous selected Datacenter and to select a VM to run a Cloudlet.
- The DatacenterBrokerSimple is yet selecting the first Datacenter to place VMs and uses a round-robin policy to select a VM to run the Cloudlets. If such behaviors need to be changed, it is not required to create a new DatacenterBroker class.
- Since there are 3 selection policies to override (the selection of default datacenter, fallback datacenter and VM), the combination of different implementations for these 3 policies will require the creation of several DatacenterBroker implementations that will be impossible to maintain.
- Using the new functional implementation there is no need to create a new DatacenterBroker class and the implementations can be exchanged just using the new
setDatacenterSupplier
,setFallbackDatacenterSupplier
andsetVmMapper
methods, passing a Lambda Expression to them. - Automatically set the DatacenterBroker when Cloudlets and VMS are submitted. (#83)
- Refactored the method
CloudletScheduler.getCloudletFinishedList()
to keep the list of finished Cloudlets after the simulation ends. TheDatacenterBroker.getCloudletsFinishedList()
method returns the list of finished Cloudlets, but for all VMs of the broker. TheCloudletScheduler
method allows getting the finished list for a specific VM, enabling the researcher to compute some metrics using the data stored in Cloudlets attributes after the simulation ends. (#78)
- Removed all the duplicated code from
PeProvioner
implementations (#60) - Fixed the issue of allocating the same physical PE for multiple Virtual PEs inside the
VmSchedulerTimeShared
class.
- Changed the signature of the
PeSimple
constructor that now requires the PE MIPS capacity instead of an ID, because it is in fact an attribute that must belong to a PE. The PE is the one that has a MIPS capacity. If a PE ID is not defined, when a PE list is assigned to a Host, the host automatically defines the IDs. - The
PeProvisionerSimple
constructor doesn't require any parameter anymore. It internally creates an association with the PE that receives thePeProvisioner
instance when a Pe is created. - All the duplicated code inside the
PeProvisioner
andPeProvisionerSimple
were removed. ThePeProvisionerSimple
class now extends theResourceProvisionerSimple
and thePeProvisioner
is now an interface.
- Removed the
NetworkCloudletSchedulerSpaceShared
and moved the specific code that was dealing with packets forwarding to the newPacketSchedulerSimple
class. The network examples just worked with theNetworkCloudletSchedulerSpaceShared
and providing such a class also required other schedulers such as aNetworkCloudletSchedulerTimeShared
to include the same packets forwarding code. Further, there was no way to force the developer to use such specific schedulers for network examples and using a different one caused runtime errors. With the newPacketSchedulerSimple
class, there is no need to use a specific scheduler such as theNetworkCloudletSchedulerSpaceShared
. Just a regular one like theCloudletSchedulerSpaceShared
or any other works accordingly. The developer doesn't even have to create instances of the newPacketSchedulerSimple
, since aNetworkHost
does this job automatically (#57.)
- Introduced Horizontal Vm Scaling, allowing dynamic creation of VMs according to an overload condition. Such a condition is defined by a predicate that can check different VM resources usage such as CPU, RAM or BW (#41). See the new LoadBalancerByHorizontalVmScalingExample for a usage example.
- Added the methods
addOnClockTickListener
andremoveOnClockTickListener
toSimulation
interface to allow defining a Listener to be notified every time the simulation clock advances. - Added methods
addOnClockTickListener()
andremoveOnClockTickListener()
in Simulation interface in order to add and remove listeners for the new OnClockTick event, that is fired every time that the simulation clock advances. - Added
Vm.getTotalUtilizationOfCpu()
to get Vm's CPU utilization percentage for the current simulation time. - Added
Broker.submitVm
andBroker.submitCloudlet
to add a single Vm or Cloudlet to a broker.
- Renamed the class
GraphReader
toTopologyReader
. - Network module was almost totally refactored and redesigned to provide a module that just works. The module was not reusasble at all and it had a huge amount of duplicated code. Some classes such as Switch were just an entire copy from each other. The packet classes relied on ID to identify the sender and receiver entities and it was very difficult to know if a given packet class was storing the ID of a Host, Vm or Cloudlet. Now the packets use actual objects such as Host, Vm and Cloudlet to make clear what kind of entities are communicating.
- The network examples were just confusing and useless. They have been completely refactored and redesigned in order to provide a clear and understandable code that can in fact be reusable.
- Allowed to delay the submission of VMs by a
DatacenterBroker
, simulating the dynamic arrival of VMs (closes the feature request #23) - Included extremelly helpful package documentation that can be viewed directly on your IDE or online here. Such a package documentation gives a general overview of the classes used to build a cloud simulation.
- Renamed
Simulation
class methodabruptallyTerminate
toabort
. - Renamed the class
HostPacket
toVmPacket
because such a kind of packet is sent between VMs. - Renamed the class
NetworkPacket
toHostPacket
because such a kind of packet is sent between Hosts. - Renamed the class
InfoPacket
toIcmpPacket
because such a kind of packet is sent to simulate ping requests (ICMP protocol). - Classes
IcmpPacket
,HostPacket
andVmPacket
now implement the new interfaceNetworkPacket
- Re-designed event notification mechanisms that use the
EventListener
class to enable researchers to get notifications about some events during simulation execution. The changes are described below:- Classes renamed:
HostToVmEventInfo
toVmHostEventInfo
,DatacenterToVmEventInfo
toVmDatacenterEventInfo
,VmToCloudletEventInfo
toCloudletVmEventInfo
; - Methods
Vm.setOnHostAllocationListener
,Vm.setOnHostDeallocationListener
,Vm.setOnVmCreationFailureListener
,Vm.setOnUpdateVmProcessingListener
,Cloudlet.setOnUpdateCloudletProcessingListener
,Cloudlet.setOnCloudletFinishListener
,Simulation.setOnSimulationPausedListener
,Simulation.setOnEventProcessingListener
andSimulation.setOnEventProcessingListener
were renamed, changing the prefix set to add because now it is possible to add multipleEventListener
s to the same event that you want to be notified about; - Respective methods starting with the prefix remove were added for each one of the methods presented above,
allowing to remove (unregister) an
EventListener
from the list.
- Classes renamed:
- Enabled dynamic creation of VMs and Cloudlets without requiring creation of Datacenter Brokers at runtime, enabling VMs to be created on-demand according to arrived cloudlets.
During simulation execution, new VMs and Cloudlets can be submitted using the methods
submitVmList
andsubmitCloudletList
that they will be dynamically created. See the DynamicCreationOfVmsAndCloudlets.java example for more details. - Enabled the complete navigation from Cloudlet up to the Datacenter. Now it is possible to call
cloudlet.getVm().getHost().getDatacenter()
and navigate between all the relationships that were introduced in CloudSim Plus for such classes. And it is totally safe to make such a call, even before starting the simulation, that you will not get aNullPointerException
. In case you make such a call before the simulation starts, as any allocation of Cloudlet or VMs was made, you will get default objects that follow the Null - Included the example [/cloudsim-plus-examples/src/main/java/org/cloudsimplus/examples/ParallelSimulationsExample.java] that shows how to use Java 8 Parallel Streams to execute mutiple simulations scenarios in parallel. Object Design Pattern, namelyVm.NULL
forgetVm()
,Host.NULL
forgetHost()
andDatacenter.NULL
forgetDatacenter()
. - Included examples that show how to schedule the simulation termination at a given time, how to terminate it when a specific condition is met and how to schedule a simulation pause at an specific time, before the simulation has started, and collect partial results and at a given time, after the simulation has started.
- Changed requirement of cloudsim-plus-examples to Java 8 in order to start providing more advanced examples using Java 8 Lambda Expressions and Streams API. Existing examples were not changed and run as before in Java 7.
- Renamed method in Simulation interface:
pause(int src, double delay)
toSimulation.pauseEntity(int src, double delay)
;hold(int src, long delay)
toholdEntity(int src, long delay)
andrunning()
toisRunning()
.
- Removed the
numUsers
parameter, that represents the number of created DatacenterBrokers, from CloudSim constructor. Now when a Broker is created, it automatically increases thenumberOfUsers
attribute in the given CloudSim instance. This automatically makes possible to create brokers dynamically (during simulation execution) without worring about such an attribute. Usually, dynamic creation of brokers was performed to allow dynamic submission of VMs and Cloudlets during simulation execution. However, as currently thesubmitVmList
andsubmitCloudletList
methods in DatacenterBroker implementations in CloudSim Plus allow submission of Cloudlets and VMs even after the simulation has started, it is not a requirement anymore to create a new broker just to perform such tasks. - Removed the
Simulation.stop()
method because it in fact was doing nothing. When the Simulation.start() is called, it already waits for the simulation to finish executing and automatically stops when there is not more events to process.
- Removed the PE list parameter from the VmScheduler constructors. Now classes that implement VmScheduler have a host attribute from where the PE list is got directly. This attribute is automatically set by a host when the Host.setScheduler setter is called. By this way, the user doesn't have to worry about this VmScheduler attribute. This change makes it easier to create a VmScheduler and consequently a Host.
- Changed DatacenterBroker.bindCloudletToVm(int cloudletId, int vmId) to DatacenterBroker.bindCloudletToVm(Cloudlet cloudlet, Vm vm), requiring a Cloudlet and a Vm instead of just int values. Once that the method accepted any int value, even an inexisting Vm or Cloudlet ID could be given, what caused NullPointerException when trying to find the Vm or Cloudlet. Now this problem is completely avoided.
- Changed Cloudlet's vmId attribute from int to Vm and renamed it to vm to conform with the previous change.
- Packages restructuring by placing classes with similar responsibilities together, that makes the project more organized and easier to understand:
- Moved Datacenter, DatacenterSimple, DatacenterCharacteristics and DatacenterCharacteristicsSimple to
org.cloudbus.cloudsim.datacenters
new package. - Moved Host, HostSimple, HostDynamicWorkload, HostDynamicWorkloadSimple and HostStateHistoryEntry to
org.cloudbus.cloudsim.hosts
new package. - Moved Vm, VmSimple and VmStateHistoryEntry to
org.cloudbus.cloudsim.vms
new package. - Moved Cloudlet, CloudletAbstract, CloudletExecutionInfo and CloudletSimple to
org.cloudbus.cloudsim.cloudlets
new package. - Moved CloudletScheduler interface and implementing classes to
org.cloudbus.cloudsim.schedulers.cloudlet
new package. - Moved VmScheduler interface and implementing classes to
org.cloudbus.cloudsim.schedulers.vm
new package. - As the package org.cloudbus.cloudsim.power contained a lot of classes with completely different responsibilities (such as Datacenters, Hosts, VMs),
such classes were moved to appropriate packages as presented below:
- Moved PowerDatacenter and PowerDatacenterNonPowerAware to
org.cloudbus.cloudsim.datacenters.power
new package. - Moved PowerHost, PowerHostSimple and PowerHostUtilizationHistory to
org.cloudbus.cloudsim.hosts.power
new package. - Moved PowerVm to org.cloudbus.cloudsim.vms.power new package.
- Moved PowerVmAllocationPolicy interface and implementing classes to
org.cloudbus.cloudsim.allocationpolicies.power
new package. - Moved PowerVmSelectionPolicy interface and implementing classes to
org.cloudbus.cloudsim.selectionpolicies.power
new package.
- Moved PowerDatacenter and PowerDatacenterNonPowerAware to
- Classes from org.cloudbus.cloudsim.brokers.network also were moved to specific packages:
- Moved PowerDatacenterBroker to
org.cloudbus.cloudsim.brokers.power
new package. - Renamed NetDatacenterBroker to NetworkDatacenterBroker and moved it to
org.cloudbus.cloudsim.brokers.network
new package. - Moved NetworkDatacenter to
org.cloudbus.cloudsim.datacenters.network
new package. - Moved NetworkHost to
org.cloudbus.cloudsim.hosts.network
new package. - Moved AppCloudlet, NetworkCloudlet, CloudletTask, CloudletExecutionTask, CloudletReceiveTask and CloudletSendTask to
org.cloudbus.cloudsim.cloudlets.network
new package. - Moved NetworkVm to
org.cloudbus.cloudsim.vms.network
new package. - Moved NetworkCloudletSpaceSharedScheduler to
org.cloudbus.cloudsim.schedulers.cloudlet.network
new package. - Renamed package org.cloudbus.cloudsim.network.datacenter to
org.cloudbus.cloudsim.network.switches
. - Moved HostPacket, NetworkPacket one package up.
- Renamed GraphReaderIF to GraphReader.
- Moved TopologicalNode, TopologicalLink, TopologicalGraph, NetworkTopology to
org.cloudbus.cloudsim.network.topologies
new package. - Moved GraphReader and GraphReaderBrite to
org.cloudbus.cloudsim.network.topologies.readers
new package.
- Moved PowerDatacenterBroker to
- Moved Datacenter, DatacenterSimple, DatacenterCharacteristics and DatacenterCharacteristicsSimple to
- Enabled parallel execution of simulation scenarios
Methods and attributes of the CloudSim
class aren't static anymore. By this way, each simulation now requires an instance of CloudSim
instead of calling methods directly from such a class. Despite this change appears to introduce more complexity when creating a simulation, in fact, it makes it simpler. All classes that extend SimEntity
required a name to be passed when calling their constructors. Since that name usually was just the name of the class followed by its id, it wasn't meaningful.
The name is just used for log purposes. Accordingly, such constructor parameter was removed and a default name is given for each SimEntity
object. All SimEntity
objects now require an CloudSim
instance. Thus, the constructor parameter "name" was removed and in its place a CloudSim simulation
parameter was introduced.
Classes such as Datacenter
, DatacenterBroker
, Host
, Vm
and Cloudlet
all require a CloudSim
instance. However, just for the classes that extend SimEntity
that a CloudSim
instance has to be manually provided when calling the constructor. For other objects such as Host
, Vm
and Cloudlet
, a CloudSim
instance is set automatically and the framework users don't have to worry about it.
The code snippet below shows what changed for creating a simulation scenario:
//Initialization is now performed by instantianting a CloudSim object:
//See that currently just the number of cloud users (the number of brokers) is required
CloudSim simulation = new CloudSim(numberOfCloudUsers);
//CloudSim.init(numberOfCloudUsers, Calendar.getInstance(), traceEvents); //old way
//Creating a Datacenter:
//See that instead of passing a name, it is now passed a CloudSim instance
Datacenter datacenter = new DatacenterSimple(simulation, characteristics, new VmAllocationPolicySimple());
//Datacenter datacenter = new DatacenterSimple(name, characteristics, new VmAllocationPolicySimple()); //old way
//Creating a Broker:
//The DatacenterBroker (and any SimEntity subclass) requires a CloudSim instance not a name anymore.
//If you want to define a specific name, you can call the setName method yet.
DatacenterBroker broker0 = new DatacenterBrokerSimple(simulation);
//DatacenterBroker broker0 = new DatacenterBrokerSimple("Broker0"); //old way
//Methods to start and stop the simulation now are called from a CloudSim instance and
//are named just start and stop.
simulation.start();
simulation.stop();
As can be seen, this improvement makes it easier to create simulations and brings great benefits:
- Allows several simulation scenarios to be instantiated and executed in parallel. Using Java 8 Lambda Expressions and Streams API it is extremely easy to run such simulations in parallel, that are just possible because CloudSim Plus does not rely on static classes that store attributes shared among every simulation.
- Since
CloudSim
class no longer has static attributes that store data specific to a given simulation scenario, it is possible to run multiple simulations at the same time. - It makes easier to write unit tests for classes that depends on
CloudSim
methods. As allCloudSim
methods were static, this made very difficult to write tests that depend on it, since the class initialization was complex. Due to that complexity, the most obvious way was to create mock objects forCloudSim
. But as the class has just static methods and it in fact couldn't be instantiated, the regular approach to create a mock object using libraries such as EasyMock couldn't be applied. The PowerMock library provides a way to mock static methods, but it adds more complexity for test writing. Now that the simulation in fact required aCloudSim
instance, it is very easy to create a mockCloudSim
object using EasyMock.
Additional changes are presented as follows.
- Introduction of public constructors for
CloudSim
class, that now must be used to create simulations. Such constructors are in fact the old CloudSim.init methods. - The most useful constructor introduced accepts just the number of cloud users (number of brokers). The traceFlag and calendar attributes
are set to default values in this constructor, since the examples commonly use the same values for such parameters. Using such a constructor
makes it easier to create a
CloudSim
instance (that in fact initializes the simulation).
- Removed the
name
parameter fromSimEntity
constructors and included a parameterCloudSim simulation
. - Remomve the word "Simulation" from the name of the methods
startSimulation
,stopSimulation
,pauseSimulation
,terminateSimulation
. - The method
boolean terminateSimulation(double time)
was renamed toboolean terminateAt(double time)
to provide a clear name, indicanting that it, different from theterminate
method, will terminate the simulation just at the given time.
Introduction of the class CloudletSchedulerCompletelyFair that implements the Completely Fair Scheduler used in recent version of the Linux Kernel. The scheduler performs an actual Cloudlet preemption, assigning a timeslice for each Cloudlet (according to its priority), that allow it to use the CPU for a specific time interval. After this time slice expires, such Cloudlets are moved to the waiting list, allowing previous waiting ones to execute. This is the first scheduler that in fact considers Cloudlets priorities.
The CloudletSchedulerTimeShared does not implements a preemption mechanism and makes an oversimplification assuming that all Cloudlets can run simultaneously, even there are less PEs in the Vm than required by all Cloudlets.
Such a scheduler assumes that if two Cloudlets are concurring for the same PE, they will execute simultaneously by assigning 50% of the PE capacity to each PE. This oversimplification makes that all Cloudlets finish at the exact same time, what is not possible in a real scheduler. Furthermore, it increases the task completion time of all cloudlets, because it simply distribute the waiting time among all submited Cloudlets, harming all Cloudelets performance.
- Constructors of Cloudlet, Vm, Host, Datacenter and DatacenterCharacteristics with a too long parameter list were deprecated and simpler constructors were introduced.
- Refactored Resource and ResourceProvisioner classes to remove the generic type for Number, simplifying the class usage.
- Standardized the type to represent amount of RAM, Bandwidth (BW) and Storage to the primitive type long.
- Clearly defined the unit for some resources, updating the documentation. The units are as follows:
- MB for RAM and Storage
- Megabits/s for Bandwidth
- Removed the hostList parameter from the VmAllocationPolicy constructors. The host list is now automatically got directly from the Datacenter.
An example of Datacenter instantiation can be
new DatacenterSimple(name, characteristics, new VmAllocationPolicySimple());
- Moved almost all exclusive features of CloudSim Plus to specific packages prefixed with org.cloudsimplus
- The exclusive features moved are now in packages:
- org.cloudsimplus.builders
- org.cloudsimplus.heuristics
- org.cloudsimplus.listeners
- org.cloudsimplus.util
- org.cloudsimplus.util.tablebuilder
- The exclusive examples are now in packages:
- org.cloudsimplus.examples
- org.cloudsimplus.examples.listeners
- org.cloudsimplus.examples.migration
- org.cloudsimplus.examples.workload
- Simplified the CloudletsTableBuilderHelper used to print simulation results in examples
- Several internal refactorings for upcoming features
- Just remembering that all the Testbeds module is exclusive of CloudSim Plus
- Included documentation about CloudSim Plus modules into the README file
- Inclusion of new module "cloudsim-plus-benchmarks" that uses JMH (Java Microbenchmark Harness framework) that implement some benchmarks in order to assess CloudSim Plus performance.
- Inclusion of new module "cloudsim-plus-testbeds" to provide a set of more complex and comprehensive testbeds used to assess implementation of algorithms for different purposes such as: mapping of Cloudlets to VMs, allocation and scheduling policies, resource utilization models or VM placement and migration policies. These testbeds also show how to apply statistical methods to get scientifically valid simulation results. Some method to reduce confidence interval and correlation are implemented and can be used for several experiments.
- The examples module now generates an uber jar file, a jar containing all required dependencies,
including CloudSim Plus itself. This jar makes easier to run the examples directly from the terminal
using the traditional java command. Having Maven installed, below are the command line instructions to build and run the examples:
- at the root folder of the CloudSim Plus, build the project typing
mvn package
- at the cloudsim-plus-examples/target folder, run a example (such as the number 1), typing
java -cp cloudsim-plus-examples-1.0-with-dependencies.jar org.cloudbus.cloudsim.examples.CloudSimExample1
- realise that you have to change the 1.0 version at the name of the jar file in the instruction above to the actual CloudSim Plus version you are using
- at the root folder of the CloudSim Plus, build the project typing
- The script in
script/bootstrap.sh
was also updated to make it easier to use. Now, if it is called whitout parameters, it shows an usage help. It is in fact the easier way to build the project and run examples. To run the same example 1, it is as easy as typing./bootstrap.sh org.cloudbus.cloudsim.examples.CloudSimExample1
inside thescript
folder. It will automatically discover the exact name of the examples jar file to run, whatever its version number is. - Some issues closed.
- Introduction of classes and interfaces to allow implementation of heuristics such as Tabu Search, Simulated Annealing, Ant Colony Systems and so on.
- Introduction of new package
org.cloudsimplus.heuristics
with classes and interfaces that are the base for implementation of heuristics. TheHeuristic
is the base interface and classes such as theSimulatedAnnealing
one implements it. It is an abstract class to be extended in order to provide a simulated annealing implementation for specific problems such as mapping of Cloudlets to Vm's. - A first implementation of a Simulated Annealing heuristic to find a suboptimal mapping between Cloudlets and Vm's
is provided by class
CloudletToVmMappingSimulatedAnnealing
. - The new
DatacenterBrokerHeuristic
extends theDatacenterBrokerSimple
and receives a heuristic implementation to find a suboptimal mapping between submitted Cloudlets and Vm's. - New examples for these features were included in the package
org.cloudsimplus.experiments
of the examples project.
- Completey refactored
DatacenterBroker
classes and interface. TheDatacenterBrokerSimple
class had methods with several lines of code performing several different tasks that were very confusing. Method names were completely difficult to understand. These classes and interfaces were refactored in order to provide methods that have just one goal. - A new
DatacenterBrokerAbstract
class was introduced as the base implementation forDatacenterBroker
s. Such an interface now enables real extensibility, providing methods to allow defining specific policies for: selection ofVm
s to hostCloudlet
s; selection ofDatacenter
s to hostVm
s; and fallback policies to select a differentDatacenter
forVm
s when the previous selected one fails to host the requestedVm
s. - Now, implementations such as
DatacenterBrokerSimple
are very reduced and completely clear.
- A new feature of subtitle columns was added to the TableBuilder interface in order to allow adding a subtitle row below the title row of a table. The CloudletsTableBuilderHelper class uses this new feature to make the examples to show the unit of some data presented in the simulation results table. By this way, the presented data will be clearer, mainly for new users.
- Included an AbstractCloudlet class that is the base class for Cloudlet implementations.
- Finished re-engineering of network.datacenter package, making it now re-usable, without hard-coded values defined inside core classes.
- Renamed the ResCloudlet class to CloudletExecutionInfo, giving a clear and helpful name
- Renamed the internal Cloudlet's Resource class to ExecutionInDatacenterInfo, giving a clear and helpful name
- Renamed and changed the setSubmissionTime(double clockTime) of the Cloudlet interface to registerArrivalOfCloudletIntoDatacenter that now doesn't accept any parameter and sets the current simulation time as the cloudlet arrival time at the datacenter. The name of the method was causing confusion, because it in fact doesn't represent the submission time, but the time that the cloudlet arrived at a datacenter.
- The getter getSubmissionTime was renamed to getDatacenterArrivalTime. Both methods now return Cloudlet.NOT_ASSIGNED when the cloudlet hasn't been assigned to a datacenter yet.
- Examples using the new listener features of Vm and Cloudlet classes.
- Examples showing how to create listeners objects to be notified when: a host is allocated to a VM; a host is desallocated for a VM (that can mean the VM finished executing or was migrated); the placement of a VM fails due to lack of a suitable host.
- Examples showing how to reuse the same listener objects to several VMs.
- Example showing how to dynamically create a VM when another one finishes executing, simulating dynamic VM arrival. It allows the sequential execution of VMs into a host that just have resources for a VM a time. The use of listeners simplify the dynamic creation of VMs and allows the code to be clear and direct, without recurring to threads and sleep tricks.
- Converted the relationship between Vm and CloudletScheduler to a bi-directional one (now CloudletScheduler has access to Vm).
- Included new listener
onUpdateCloudletProcessingListener
for Cloudlet, that gets notified when the execution of the Cloudlet inside a Vm is updated. A new example of this feature was introduced in the
listeners example package. - Allowed to delay the submission of cloudlets by a
DatacenterBroker
, simulating the dynamic arrival of Cloudlets (closes the feature request #11)
- Changed the name of the method getCloudResourceList at CloudSim class to getDatacenterIdsList once it in fact returns only Datacenter IDs and is only used by DatacenterBroker classes.
- Changed the name of the method getList at CloudInformationService class to getDatacenterIdsList once it in fact returns only Datacenter IDs and is only used by CloudSim class.
- Changed the name of the protected method submitCloudlets() at DatacenterBrokerSimple class to createCloudletsInVms() because it in fact create each cloudlet into some Vm. The method was changed to avoid confusion with the submitCloudletList too and to conform the name convention used in the createVmInDatacenter method.
- Changed the name of the method getCloudletList() at the DatacenterBroker interface to getCloudletsWaitingList() because in fact, this is the list of cloudlets that were submitted and are waiting to be created inside some Vm.
- Changed the name of the method getVmList() at the DatacenterBroker interface to getVmsWaitingList() because in fact, this is the list of VMs that were submitted and are waiting to be created inside some Datacenter. The method name was changed to conform the name convention used by the getCloudletsWaitingList method.
- Changed the name of the method getCloudletReceivedList() at the DatacenterBroker interface to getCloudletsFinishedList() because in fact, this is the list of cloudlets that have finished executing.
- Changed the name of the method getDatacenterCharacteristicsList at the DatacenterBrokerSimple class to getDatacenterCharacteristicsMap because in fact it is returning a map, not a list.
- Renamed the class TaskStage at the package org.cloudbus.cloudsim.network.datacenter to CloudletTask and made it an abstract class, because it in fact doesn't represent the stage of a task but a task itself. New sub-classes were introduced. See the section "Added" below.
- Created new subclasses CloudletDataTask and CloudletExecutionTask from CloudletTask. The CloudletDataTask can be used to send or receive data, according to it's type attribute (that now is an enum).
-
The
HarddriveStorage
class had an issue when calling the methodaddReservedFile
without priorly reserving space for the file by calling thereserveSpace
method. Consider the situation where the allocated space is 0. When adding a reserved file of size 50 without reserving the space, the methodaddReservedFile
was decreasing the allocated space to -50. After adding the file it increased the allocated space to 0 again. However, the allocated space couldn't be zero once a file (reserved or not) was added. Other issue occurred when reserving a space and adding a file of size different from the reserved. These issues were corrected by introducing thereservedStorage
attribute to control the reserved space. Several unit tests were included to test the class. -
Corrected the value of the const org.cloudbus.cloudsim.Consts.WEEK that the values was duplicated from the DAY constant.
-
Updated the DatacenterSimple class to use the scheduleInterval to define the interval to update cloudlets processing, in the same way as in PowerDatacenter class
-
All the implementations of the method VmAllocationPolicy.optimizeAllocation are now returning an empty map instead of null when the method in fact doesn't perform any VM placement optimization. This change was performed to reduce null checks and avoid NullPointerException's.
-
The method getCloudletFinishedSoFar of CloudletSimple class now returns 0 when the cloudlet hasn't started executing yet, instead of returning the cloudlet length. If it hasn't started yet, the executed length is abviously 0.
-
Changed the return value of the VmAllocationPolicy.optimizeAllocation method from List<Map<String, Object>> to Map<Vm, Host>
-
The return value was completely strange and didn't correctly use generics. The method return was a List of Maps where the keys were either the strings "vm" or "host". If the key was the string "vm", it meant the value was a Vm instance. If the key was the string "host", it meant the value was a Host instance. Thus, each Map represented the relation between a Vm and the Host where it was to be placed.
-
This design was very confusing, requiring a lot of explanation and several unsafe typecasts. Now the method, and all related ones that were returning a List<Map<String, Object>>, are returning a Map<Vm, Host> that doesn't need many explanation. It is the map between a Vm and the Host where it has to be placed.
-
The method DatacenterSimple.processVmMigrate that expected the ev.getData() to be a Map<String, Object>, now expects a Map.Entry<Vm, Host>, making to code clearer, less error-prone and reduces typecasts.
-
-
The parameters of the method
File.deleteFile(final String fileName, File file)
were not being used as defined in the method documentation. It was supposed to pass the name of the file to be removed and thefile
parameter should return the removedFile
object. By this way, it was supposed to pass aFile
object as parameter and get the deletedFile
into this object. However, Java passes object references by value (not by reference), what means that if the reference to thefile
parameter is changed inside the method, the reference of the original object outside the method is not updated. Such a Java behaviour makes impossible to the method to work as proposed. Therefore, the method was removed. -
Removal of duplicated
fileSize
andfileName
attributes atFileAttribute
class. NowFileAttribute
class has a relationship withFile
. -
Classes
RamProvisioner
,RamProvisionerSimple
,BwProvisioner
andBwProvisionerSimple
were deleted and new classes and interfaces were introduced (PeProvisioner and PeProvisionerSimple are working in progress yet). The newResourceProvisionerSimple
class is the only concrete class that you have to use in order to instantiate a provisioner forRam
,Bandwidth
or aFileStorage
(such as aHarddriveStorage
) resource object. See more details of what changed in the items below. -
Deleted the ParameterException class and changed its use to the unchecked native InvalidArgumentException. Unchecked exceptions doesn't oblige the developer to always insert try ... catch blocks, makes the code clearer and is the default exception used to invalidate given parameters. Lets say that a method "A" throws a checked exception, and it is called by method "B", that is called by method "C". All these methods are required to throws the exception or catch them. Using unchecked exception you just have to place your try...catch at the last method that called method (method "C" in this example), reducing boilerplate code.
-
The class NetworkConstants was deleted because all of its values were just values used by the network examples. Thus, they were accordingly moved to the classes that they belong. Some constants included in this class were just values to be used by Switch related classes. Placing these constants outside the classes that in fact use them makes the classes design low cohesive. Accordingly, to increase the cohesion, making easy to understand how the elements are related, the constants were moved to the appropriated classes.
-
Classes WorkflowApp and BagOfTasksAppCloudlet were deleted because they were in fact just creating hard-coded VMs and Cloudlets and they weren't providing any specific code. In replacement, they were created the NetworkVmsExampleWorkflowAppCloudlet and NetworkVmsExampleBagOfTasksAppCloudlet classes that just instantiate regular AppCloudlet and NetworkCloudlet classes with specific values, in order to provide the desired kind of tasks to be simulated.
-
See more details about network changes below.
-
Throughout documentation update and improvement
-
It was changed the requirements of the cloudsim project to Java 8 (the examples remain in Java 7).
-
Updated CloudSimExample7
- Moved the anonymous Thread class to a specific class named MonitorThread, outside the CloudSimExample7 class, but in the same file.
- Included the attribute DatacenterBroker broker inside the MonitorThread class in order to get the broker dynamically created inside the Thread.
- Printed the list of cloudlets submitted to the broker created by the MonitorThread.
-
Changed the Vm.addStateHistoryEntry method to receive a VmStateHistoryEntry object instead of a separated value for each of its attributes, providing a more OO design
-
Renamed the methods getBw and getRam to getBwCapacity and getRamCapacity
-
Refactored the WorkloadFileReader to completely remove code duplication. Included new test cases for gz, zip and swf workload files.
-
All classes that usually have to be extended by CloudSim users in order to provide some specific features for their simulations were moved to new appropriated packages in order to increase class's organization:
- Moved all UtilizationModel classes and interfaces to new package org.cloudbus.cloudsim.utilizationmodels
- Moved all DatacenterBroker classes and interfaces to new package org.cloudbus.cloudsim.brokers
- Moved all CloudletScheduler and VmScheduler classes and interfaces to new package org.cloudbus.cloudsim.schedulers
- Moved all VmAllocationPolicy classes and interfaces to new package org.cloudbus.cloudsim.allocationpolicies
- Moved classes Packet, InfoPacket and NetworkTopology to the network package
-
Moved the duplicated methods updateVmProcessing, getNextFinishedCloudlet, areThereFinishedCloudlets, getTotalUtilizationOfCpu, cloudletCancel, cloudletStatus, cloudletPause, cloudletSubmit(Cloudlet cloudlet) and other ones from CloudletSchedulerSpaceShared and CloudletSchedulerTimeShared to CloudletSchedulerAbstract class.
- Some of these methods were exactly equal. Other ones such as the updateVmProcessing, cloudletCancel and cloudletPause at the CloudletSchedulerSpaceShared class were just looking at the list of waiting cloudlets. However, this list can be just empty in the CloudletSchedulerTimeShared class, since all cloudlets will share the processor time (not waiting for a previous cloudlet to completely finishe executing after it can start running). By this way, moving the methods to the super class doesn't change the behaviour of these different schedulers. Other subclasses in fact completely override methods such as updateVmProcessing.
- By this way, now it is easier to extend and test these classes, since a bunch of duplicated code was removed, increasing code reuse.
-
THE MOST CRITICAL UPDATE IN NETWORK RELATED CLASSES
- The classes related to the examples at the org.cloudbus.cloudsim.network.datacenter package of the cloudsim-examples project were almost totally remade.
- The network related classes such as AppCloudlet, NetworkCloudlet, NetDatacenterBroker had an extremely amount of duplicated code. The NetDatacenterBroker was a copy of the original DatacenterBroker class, instead of extending it and overriding necessary methods. It was noticed that a lot of code in the created class was exactly equal to the DatacenterBroker, which shows that such methods should be inherited from the already existing class.
- The code that in fact belonged only to the NetDatacenterBroker class was completely repetitive and confuse. There were very long methods that should be divided into smaller and specific ones in order to avoid code redundancy and make clear what the code does.
- The class used a lot of hard-coded values for creating objects such as Cloudlets and VMs, that doesn't make sense once these values have to be defined by the developer creating the simulation. It was clear that the values were defined just to perform the simulations presented at the paper "NetworkCloudSim: Modelling Parallel Applications in Cloud Simulations". By this way, they aren't useful for other users which desire to create their own simulations. Further, the creation of hard-coded Cloudlets and VMs inside the NetDatacenterBroker doesn't make it to be reusable and even violates the Open/Closed Principle (OCP).
- Once the mentioned paper doesn't provide low level details about how every class's method works (and it is not supposed that a paper will present such in deep code details) and that there weren't any unit test for the network related classes, it was not even feasible to know if the classes and examples were working correctly. The examples didn't show any useful information, just some vague messages such as "App1, App2, ... AppN" to inform the creation of AppCloudlets, not providing actual information. In face of that, the best to do was to perform a in-depth refactoring of the classes and examples in order to define a actual class hierarchy, eliminate code redundancy and provide short and meaningful methods that make clear to understand the code and to just further (unfortunately) introduced test units.
- Refactoring of Switch classes in order to move constants from NetworkConstants to them, removing unnecessary parameters in their constructors
-
A complete new set of interfaces was introduced in order to start providing a more structured class hierarchy and to reduce code duplication. The classes
Datacenter
,DatacenterCharacteristics
,DatacenterBroker
,Host
,PowerHost
,Pe
,Vm
,VmAllocationPolicy
,VmScheduler
,Cloudlet
andCloudletScheduler
(and maybe others) had their names suffixed with the word "Simple", as already has been used in other classes such asVmAllocationPolicySimple
. Further, they were introduced new interfaces with the same name of the original classes (without the suffix "Simple"), defining the common public methods to be present in each class that implements one of these interfaces. By this way, it was paved the way to start applying the "Liskov Substitution Principle", one of the SOLID principles that says to "program to an interface, not to an implementation". -
All the examples were accordingly updated in order to use the new classes. Thus, for all mentioned classes, instead of instantiating an object such as
Cloudlet cloudlet = new Cloudlet(required_parameters_here)
you have to use the new corresponding class. In the example, code line of cloud would beCloudlet cloudlet = new CloudletSimple(required_parameters_here)
. Realize that the declared variable doesn't have to be declared as CloudletSimple, but just as Cloudlet (as previously). This follows the "program to an interface" principle just mentioned. However, you can declare and instantiate the object usingCloudletSimple cloudlet = new CloudletSimple(required_parameters_here)
. -
Implementation of the Null Object Design Pattern in order to start avoiding null checks and
NullPointerException
when using the classes just mentioned above. TheNULL
attributes created are broadly used by classes of the neworg.cloudsimplus.builders
package in order to avoidNullPointerException
. This package will be presented in the next sections. -
Each interface that implements the Null Object Design Pattern has a public static final attribute named
NULL
, that implements the interface itself, returning: zero for all numeric methods; false for all boolean methods; an empty string for all String methods; an empty unmodifiable list for all List methods; and an empty unmodifiable Map for all Map methods. Taking theVm
interface as example, using the newNULL
attribute defined on it, instead of returningnull
when a method doesn't find aVm
, such a method can returnVm.NULL
. To verify if a validVm
was returned, you have to useif(!vm.equals(Vm.NULL))
instead ofif(vm == null)
. -
Created an enum Cloudlet.Status and changed the cloudlet status to that type. The use of an integer attribute to define the status of the cloudlet inccurs more code to validate the attribute. It is not transparent to the user what are the acceptable values. Further, passing an integer value out of the acceptable range will only raise exception in runtime. With the enum these problems were solved.
-
Created an enum Pe.Status and changed the status of a Pe to that type, avoiding the use of int constants
-
Several refactorings to: reduce code duplication; improve class hierarchy and project’s extensibility; reduce bug probability; clean the code and unit tests in order to improve code readability; correct minor bugs; reduce code duplication of unit tests; include extensive set of unit tests to validate performed changes.
-
Refactorings in classes such as
HostSimple
,VmSimple
and provisioners, changing the way that the capacity and allocated resources are stored. -
It has been noticed a repetitive set of attributes and methods over several classes. For instance: attributes to store resource capacity and allocation; and methods to get the amount of free available resource and amount of allocated resource. These repetitive codes were found in classes such as VmSimple and provisioners, what made clear the need of a new class with these behaviours and data. Accordingly, a new set of classes was created inside the new package
org.cloudbus.cloudsim.resources
. -
A
Resource
interface was created, that is used to define resource capacity and allocation for Hosts and VMs. It uses generics to identify the type associated with the resource (ifDouble
,Long
,Integer
, etc). It defines the signature of methods to manage a given resource such as CPU, RAM or BW of VMs and Hosts. -
The new
ResourceAbstract
class implements basic behaviours of aResource
, managing its capacity, allocated and available amount of resources. New validations were introduced to avoid setting invalid values to the resource, such as negative values or a zero capacity. The class also has a new setter that allows changing the capacity, provided that the new one is greater or equals to the amount of allocated resource. It is also avoided to set an available resource amount greater than the capacity. All methods that try to change the resource capacity or allocated size now returns a boolean to indicate if the operation succeeded or not. -
The method
isSuitablForVm
of provisioner classes previously changed the current allocated VM resource just to check if it was possible to change the total allocated resource to another value. The method was changed to perform the verification, without actually changing the current allocated resource. It only performs the necessary calculations to find out that. The method in fact was moved to the newResource
interface and is just calledisSuitable
. -
Concrete classes were created for specific resources, namely
Ram
andBandwidth
classes (the already existingHarddriveStorage
andSanStorage
classes now implementFileStorage
interface that is presented in the next item). They hide the abstract type of theResource
(ifDouble
,Integer
, etc), facilitating the class use and ensuring that the same type is always used for a given resource (Bandwidth
always useLong
,Ram
always useInteger
,FileStorage
always useLong
). It also standardize the type of each resource, avoiding some inconsistencies found throughout the code. -
Several refactoring on classes that control storage space, in order to remove code duplication, improve class hierarchy and reduce bugs probabilities (once that duplicated code doesn't have to be tested several times in different classes). The major part of duplicated code was related to dealing with storage capacity, used space and available space. As the introduced
Resource
interface and related classes implement these features, there isn't duplicated code for that anymore.- The interface
Storage
is now calledFileStorage
in order to differentiate it from the new classRawStorage
. The first one has methods to perform file system operations (such as add and delete a file). The last one is a raw storage that doesn't keep track of files, but just manages the capacity, used space and free space. For instance, theHost
andVm
objects just control their storage capacity and available space. Accordingly, they just use a storage attribute (an instance of the previously mentionedResource
interface) to manage this storage data. - The
HarddriveStorage
class now implements theFileStorage
interface. - With the new
FileStorage
interface, the public interface of theDatacenterSimple
class changed. Now, to instantiate aDatacenterSimple
it has to be passed aList<FileStorage>
instead ofList<Storage>
. - The classes
HarddriveStorage
andSanStorage
were moved to the new packageorg.cloudbus.cloudsim.resources
, including theFileStorage
interface. - The public interface of the
Datacenter
class and all its subclasses was changed due to renaming theStorage
interface to FileStorage. Now the constructor of these classes has to receive aList<FileStorage>
instead ofList<Storage>
. - The "double storage" attribute of the
HostSimple
class originally was being decreased every time a newVm
was placed at the host, instead of managing the current allocated storage (as it is being made for other resources such asRam
andBandwidth
). Now, theHostSimple
uses an internalRawStorage
object to manage the capacity and allocated space instead of just a primitive double attribute. The methodgetStorage
now always return the actual host storage capacity, not the remaining space. The data returned by the method changed, however, it was verified that just theHost
itself was calling this public method. Thus, the method was renamed togetStorageCapacity
(and the setter tosetStorageCapacity
) to avoid confusion. A new protected methodgetStorage
was introduced to return theRawStorage
object.
- The interface
-
Now that each kind of resource uses a specific generic class, the
Vm
andVmSimple
had to conform with these new changes, in order to get the object that represents a specific resource of the VM (such asRam
orBandwidth
) from the class of such a resource. To implement that, a newMap
was introduced in theVmSimple
class, where: each key is a resource class; each value is the object that represents such a VM resource. By this way, the new methodVm.getResource
is used by classes such as theResourceProvisionerSimple
to get information of a givenVm
resource (such as capacity and available amount). For instance, if aResourceProvisioner
manages allocation ofRam
resource, the class uses the getResource method of theVm
interface to get the information about theRam
object assigned to the VM. Despite these modifications, it doesn't change how a Vm is used. -
Now, when instantiating a
Host
, it doesn’t have to be used a differentResourceProvisioner
class for each resource such as Ram and Bw (at least if you don’t want to). It only has to be passed a different instance of aResourceRrovisioner
for eachHost
resource. Instead of each provisioner instance receiving the resource capacity (int, long or double), now each one has to receive an instance of aResource
, which in turn receives the resource capacity. So, theResourceProvisioner
interface was changed to receive aResource
object, that will store all information about itself (such as its capacity, the amount of free resource, etc). Below it is shown a example of how to instantiate aHost
, before and after the performed changes:- Before changes :
new Host(hostId, new RamProvisionerSimple(ram), new BwProvisionerSimple(bw), new VmSchedulerTimeShared(peList));
- After changes:
new HostSimple(hostId, new ResourceProvisionerSimple<>(new Ram(ram)), new ResourceProvisionerSimple<>(new Bandwidth(bw)), storage, peList, new VmSchedulerTimeShared(peList);
- Before changes :
-
-
Added the SwfWorkloadFormatExample1 example that shows how to use the WorkloadFileReader to create cloudlets from a trace file in the Standard Workload Format from the Hebrew University of Jerusalem. The example uses a new DatacenterBroker class created to allow submission of VMs to a datacenter, ordering VMs descendingly, according to their PEs number. By this way, VMs requiring more PEs will be submitted first for creation inside a datacenter's host.
-
Inclusion of MigrationExample1 class, a simple simulation example that performs VM migration due to under and over host utilization.
- The original examples inside packages org.cloudbus.cloudsim.examples.power.planetlab and org.cloudbus.cloudsim.examples.power.random are over complex to allow a novice CloudSim user to understand how to perform VM migration simulations. These examples create too much Hosts, VMs and Cloudlets to enable any reasoning about the obtained results. They don't make clear why, how and when the migrations were performed.
- The included example implements a Worst Fit VmAllocationPolicy that selects the first host with the most available CPU capacity to host a VM.
- It was also included a custom UtilizationModel to implement progressive cloudlet CPU usage along the simulation time. The cloudlet CPU usage changes by Arithmetic Progression, allowing to know exactly how it will be along the time. By this way, it is easy to understand simulation results.
-
Added the interface TableBuilder and classes AbstractTableBuilder, TextTableBuilder, CsvTableBuilder and HtmlTableBuilder to the org.cloudsimplus.util.tablebuilder package
-
They provide standard features for printing CloudSim generated data. The set of classes use the Builder Design Pattern in order to create a table in different formats such as Text, CSV and HTML. The class hierarchy was designed to enable the easy creation of new table formats (such as Latex and others). Any kind of data can be printed into the tables, enabling the specification of a format for each column (if desired).
-
Updated all examples in order to remove the duplicated code to print simulation results (the list of executed cloudlets) and start using the new set of classes for generating tabular data. Simulation results were presented in a not completely organized tabular format, that caused some data to appear misplaced. A new CloudletsTableBuilderHelper class was created into the package org.cloudsimplus.util.tablebuilder in order to easily print simulation results and to present them in a well formatted table that makes results analysis easier.
-
-
Inclusion of Integration Tests (IT)
- Configuration of the pom.xml file of the cloudsim project to perform execution of Functional/Integration Tests
in order to test entire simulation scenarios instead of just isolated units.
With the integration tests, it is safer to perform changes in the code and make sure that
changes don't brake anything. For instance, the created Integration Test called
VmCreationFailureIntegrationTest
, verifies if:- a given VM failed to be created due to lack of host resources;
- the time a host is allocated or deallocated to a given VM;
- finishing and execution time of different cloudlets using a specific
CloudletScheduler
.
- It was used the already included maven-surefire-plugin instead of the maven-failsafe-plugin to run these new tests. By this way, it is possible to see the Integration/Functional tests results directly at the NetBeans JUnit graphical test results interface.
- Functional/Integration Tests have to be included in the package
org.cloudsimplus.IntegrationTests
(as configured in maven profiles inside the pom.xml). - To run all tests at NetBeans, including the Functional/Integration ones, you can right click on the project root, select "Set Configurtion >> integration-test", right click again and select "Custom >> integration-tests" (that is configured in the nbactions.xml). To run in other IDE's, you can see the maven parameters at the nbactions.xml file.
- Included the CheckHostAvailableMips Integration Test. The IT checks if the Host CPU utilization is as expected along the simulation run.
- Configuration of the pom.xml file of the cloudsim project to perform execution of Functional/Integration Tests
in order to test entire simulation scenarios instead of just isolated units.
With the integration tests, it is safer to perform changes in the code and make sure that
changes don't brake anything. For instance, the created Integration Test called
-
Inclusion of the interface
EventListener
in order to provide event notification features for user applications running CloudSim simulations. These notifications can be about the change in state of CloudSim entities.-
The package
org.cloudsimplus.listeners
was introduced to place the classes and interfaces related to event listeners. -
First listeners were included in the
Vm
class. The following listeners attributes were introduced to allow CloudSim users to set listeners to receive notifications about Vm state changes:onHostAllocationListener
: gets notified when a Host is allocated to a VmonHostDeallocationListener
: gets notified when a Host is deallocated to a VmonVmCreationFailureListener:
gets notified when a Vm fail being placed at a Host due to lack of resources
-
The inclusion of the Vm listeners doesn't change the way VMs are instantiated.
-
The
EventListener
interface implements the Null Object Design Pattern in order to avoidNullPointerException
when a EventListener is not set. In order to ensure that, listener properties are being initialized with theListener.NULL
object. -
These listeners allow CloudSim users to perform specific tasks when different events happen, enabling implementation of comprehensive functional and integration tests. Examples of these new features can be seen in the
VmCreationFailureIntegrationTest
Integration Test class. -
Introduced a onUpdateVmsProcessingListener on the Host interface in order to notify listeners when a host updates its VMs processing
-
Update the CloudSim class to include the EventListener eventProcessingListener attribute. It uses the new EventListener interface to notify observer objects when any event of any kind is processed by CloudSim simulator. See the setEventProcessingListener method to define a observer object to get notified when any event is processed. The inclusion of the listener doesn't break applications using previous CloudSim versions.
-
Due to the use of the new eventProcessingListener at the CloudSim class, it was introduced the method getInstance() that implements the Singleton Design Pattern in order to avoid multiple instances of the CloudSim class. However, CloudSim continues working through its static method calls.
-
-
Inclusion of the package
org.cloudsimplus.builders
with classes and interfaces that implement the Builder Design Pattern-
These classes and interfaces were introduced as an alternative way to help creating CloudSim objects, such as
Host
,Datacenter
,DatacenterBroker
,Vm
andCloudlet
. -
The creation of these objects requires a lot of parameters and some of them have to be created before other ones (e.g: Hosts have to be created before a
Datacenter
). The constructor of these objects are complex and the creation of multiple objects of the same class is a repetitive task that can lead to code redundancy. -
The table classes were introduced to reduce complexity when creating these objects. They help setting values to be used when creating such objects, by providing default values for each object property. Once these values are set, just one method needs to be called to create as many copies of the object as desired. For instance, if you want to create 2 hosts with the same configuration, you just have to set the host attributes first and then, call the
createHosts(int amount).getHosts()
method of theHostBuilder
class in order to create the amount of Hosts you want and get the list of created hosts. -
The new builders use the Decorator Design Pattern in order to ensure a given object creation flow. For instance, VMs and Cloudlets have to be submitted to a given
DatacenterBroker
. By this way, just after calling thecreateBroker()
method at theBrokerBuilder
class that is possible to make a chained call to thegetVmBuilderForTheCreatedBroker().createAndSubmitVms(int amount)
. This method allows the creation of VM and submission to the broker just created. For instance, you can't make the callbrokerBuilder.getVmBuilderForTheCreatedBroker().createAndSubmitVms(2)
. You have to callbrokerBuilder.createBroker().getVmBuilderForTheCreatedBroker().createAndSubmitVms(2)
which ensures that VMs are created only after creating a broker. -
An entire example of the use of these builders can be seen at the
VmCreationFailureIntegrationTest
Integration Test class. -
The builders can be used by Unit and Integration Tests and by CloudSim users that want to create cloud simulations.
-