Documentation Added with Some updates on Code.

parent ecd0ad0b
......@@ -9,99 +9,131 @@ import org.cloudbus.cloudsim.core.CloudSimTags;
import org.cloudbus.cloudsim.core.SimEvent;
import org.cloudbus.cloudsim.core.predicates.PredicateType;
public class AggregateSwitch extends Switch{
/**
* This class allows to simulate aggregate switch for Datacenter network.
* It interacts with other switches in order to exchange
* packets. Please refer to following publication for more details:
*
* Saurabh Kumar Garg and Rajkumar Buyya, NetworkCloudSim: Modelling Parallel
* Applications in Cloud Simulations, Proceedings of the 4th IEEE/ACM International
* Conference on Utility and Cloud Computing (UCC 2011, IEEE CS Press, USA),
* Melbourne, Australia, December 5-7, 2011.
*
* @author Saurabh Kumar Garg
* @since CloudSim Toolkit 3.0
*
*/
public class AggregateSwitch extends Switch {
/**
* Constructor for Aggregate Switch
* We have to specify switches that are connected to its downlink and uplink ports,
* and corresponding bandwidths
*
* @param name Name of the switch
* @param level At which level switch is with respect to hosts.
* @param dc Pointer to Datacenter
*/
public AggregateSwitch(String name, int level, NetworkDatacenter dc) {
super(name, level, dc);
// TODO Auto-generated constructor stub
downlinkswitchpktlist=new HashMap<Integer,List<HostPacket>>();
uplinkswitchpktlist=new HashMap<Integer,List<HostPacket>>();
uplinkbandwidth=Constants.BandWidthAggRoot;
downlinkbandwidth=Constants.BandWidthEdgeAgg;
latency=Constants.SwitchingDelayAgg;
numport=Constants.AggSwitchPort;
uplinkswitches=new ArrayList<Switch>();
downlinkswitches=new ArrayList<Switch>();
}
private void processpacket_down(SimEvent ev) {
// TODO Auto-generated method stub
//packet coming from up level router.
//has to send downward
//check which switch to forward to
//add packet in the switch list
//add packet in the host list
//int src=ev.getSource();
HostPacket hspkt=(HostPacket) ev.getData();
int recvVMid=hspkt.pkt.reciever;
CloudSim.cancelAll(getId(), new PredicateType(CloudSimTags.Network_Event_send));
schedule(getId(),this.latency, CloudSimTags.Network_Event_send);
if(this.level==Constants.Agg_LEVEL)
{
//packet is coming from root so need to be sent to edgelevel swich
//find the id for edgelevel switch
int switchid=dc.VmToSwitchid.get(recvVMid);
List<HostPacket> pktlist=this.downlinkswitchpktlist.get(switchid);
if(pktlist==null){
pktlist=new ArrayList<HostPacket>();
this.downlinkswitchpktlist.put(switchid, pktlist);
}
pktlist.add(hspkt);
return;
}
downlinkswitchpktlist = new HashMap<Integer, List<NetworkPacket>>();
uplinkswitchpktlist = new HashMap<Integer, List<NetworkPacket>>();
uplinkbandwidth = NetworkConstants.BandWidthAggRoot;
downlinkbandwidth = NetworkConstants.BandWidthEdgeAgg;
latency = NetworkConstants.SwitchingDelayAgg;
numport = NetworkConstants.AggSwitchPort;
uplinkswitches = new ArrayList<Switch>();
downlinkswitches = new ArrayList<Switch>();
}
/**
* Send Packet to switch connected through a downlink port
*
* @param ev Event/packet to process
*/
@Override
protected void processpacket_down(SimEvent ev) {
// packet coming from up level router.
// has to send downward
// check which switch to forward to
// add packet in the switch list
// add packet in the host list
NetworkPacket hspkt = (NetworkPacket) ev.getData();
int recvVMid = hspkt.pkt.reciever;
CloudSim.cancelAll(getId(), new PredicateType(
CloudSimTags.Network_Event_send));
schedule(getId(), this.latency, CloudSimTags.Network_Event_send);
if (this.level == NetworkConstants.Agg_LEVEL) {
// packet is coming from root so need to be sent to edgelevel swich
// find the id for edgelevel switch
int switchid = dc.VmToSwitchid.get(recvVMid);
List<NetworkPacket> pktlist = this.downlinkswitchpktlist.get(switchid);
if (pktlist == null) {
pktlist = new ArrayList<NetworkPacket>();
this.downlinkswitchpktlist.put(switchid, pktlist);
}
pktlist.add(hspkt);
return;
}
private void processpacket_up(SimEvent ev) {
// TODO Auto-generated method stub
//packet coming from down level router.
//has to send up
//check which switch to forward to
//add packet in the switch list
//
//int src=ev.getSource();
HostPacket hspkt=(HostPacket) ev.getData();
int recvVMid=hspkt.pkt.reciever;
CloudSim.cancelAll(getId(), new PredicateType(CloudSimTags.Network_Event_send));
schedule(getId(),this.switching_delay, CloudSimTags.Network_Event_send);
if(this.level==Constants.Agg_LEVEL)
{
//packet is coming from edge level router so need to be sent to either root or another edge level swich
//find the id for edgelevel switch
int switchid=dc.VmToSwitchid.get(recvVMid);
boolean flagtoswtich=false;
for(Switch sw:this.downlinkswitches)
{
if(switchid==sw.getId()) flagtoswtich=true;
}
if(flagtoswtich)
{
List<HostPacket> pktlist=this.downlinkswitchpktlist.get(switchid);
if(pktlist==null){
pktlist=new ArrayList<HostPacket>();
this.downlinkswitchpktlist.put(switchid, pktlist);
}
pktlist.add(hspkt);
}
else//send to up
{
Switch sw=this.uplinkswitches.get(0);
List<HostPacket> pktlist=this.uplinkswitchpktlist.get(sw.getId());
if(pktlist==null){
pktlist=new ArrayList<HostPacket>();
this.uplinkswitchpktlist.put(sw.getId(), pktlist);
}
pktlist.add(hspkt);
}
}
}
/**
* Send Packet to switch connected through a uplink port
*
* @param ev Event/packet to process
*/
@Override
protected void processpacket_up(SimEvent ev) {
// packet coming from down level router.
// has to send up
// check which switch to forward to
// add packet in the switch list
//
// int src=ev.getSource();
NetworkPacket hspkt = (NetworkPacket) ev.getData();
int recvVMid = hspkt.pkt.reciever;
CloudSim.cancelAll(getId(), new PredicateType(
CloudSimTags.Network_Event_send));
schedule(getId(), this.switching_delay, CloudSimTags.Network_Event_send);
if (this.level == NetworkConstants.Agg_LEVEL) {
// packet is coming from edge level router so need to be sent to
// either root or another edge level swich
// find the id for edgelevel switch
int switchid = dc.VmToSwitchid.get(recvVMid);
boolean flagtoswtich = false;
for (Switch sw : this.downlinkswitches) {
if (switchid == sw.getId())
flagtoswtich = true;
}
if (flagtoswtich) {
List<NetworkPacket> pktlist = this.downlinkswitchpktlist
.get(switchid);
if (pktlist == null) {
pktlist = new ArrayList<NetworkPacket>();
this.downlinkswitchpktlist.put(switchid, pktlist);
}
pktlist.add(hspkt);
} else// send to up
{
Switch sw = this.uplinkswitches.get(0);
List<NetworkPacket> pktlist = this.uplinkswitchpktlist.get(sw
.getId());
if (pktlist == null) {
pktlist = new ArrayList<NetworkPacket>();
this.uplinkswitchpktlist.put(sw.getId(), pktlist);
}
pktlist.add(hspkt);
}
}
}
}
......@@ -7,59 +7,72 @@ import org.cloudbus.cloudsim.UtilizationModel;
import org.cloudbus.cloudsim.UtilizationModelFull;
import org.cloudbus.cloudsim.core.CloudSim;
/**
* AppCloudlet class represents an application which user submit for execution within datacenter.
* It consist of several networkClouds.
*
* Please refer to following publication for more details:
*
* Saurabh Kumar Garg and Rajkumar Buyya, NetworkCloudSim: Modelling Parallel
* Applications in Cloud Simulations, Proceedings of the 4th IEEE/ACM
* International Conference on Utility and Cloud Computing (UCC 2011, IEEE CS
* Press, USA), Melbourne, Australia, December 5-7, 2011.
*
*
* @author Saurabh Kumar Garg
* @since CloudSim Toolkit 1.0
*/
public class AppCloudlet {
public static final int APP_MC = 1;
public static final int APP_Workflow = 3;
public AppCloudlet(int type, int appID,
double deadline, int numbervm, int userId) {
public AppCloudlet(int type, int appID, double deadline, int numbervm,
int userId) {
super();
this.type = type;
this.appID = appID;
this.deadline = deadline;
this.numbervm = numbervm;
this.userId = userId;
clist=new ArrayList<NetworkCloudlet>();
clist = new ArrayList<NetworkCloudlet>();
}
public int type; //fft,fem
public int appID;
public ArrayList<NetworkCloudlet> clist;
public double deadline;
public double accuracy;
public int numbervm;
public int userId;
public int type;
public int appID;
public ArrayList<NetworkCloudlet> clist;
public double deadline;
public double accuracy;
public int numbervm;
public int userId;
public double exeTime;
public int requestclass;
public void createCloudletList(List<Integer> vmIdList)
{
for(int i=0;i<numbervm;i++){
long length = 4;
long fileSize = 300;
long outputSize = 300;
long memory = 256;
int pesNumber = 4;
UtilizationModel utilizationModel = new UtilizationModelFull();
//HPCCloudlet cl=new HPCCloudlet();
NetworkCloudlet cl = new NetworkCloudlet(Constants.currentCloudletId, length, pesNumber, fileSize, outputSize, memory, utilizationModel, utilizationModel, utilizationModel);
public int requestclass;
/**
* An example of creating APPcloudlet
* @param vmIdList VMs where Cloudlet will be executed
*/
public void createCloudletList(List<Integer> vmIdList) {
for (int i = 0; i < numbervm; i++) {
long length = 4;
long fileSize = 300;
long outputSize = 300;
long memory = 256;
int pesNumber = 4;
UtilizationModel utilizationModel = new UtilizationModelFull();
// HPCCloudlet cl=new HPCCloudlet();
NetworkCloudlet cl = new NetworkCloudlet(
NetworkConstants.currentCloudletId, length, pesNumber, fileSize,
outputSize, memory, utilizationModel, utilizationModel,
utilizationModel);
// setting the owner of these Cloudlets
Constants.currentCloudletId++;
cl.setUserId(userId);
cl.submittime=CloudSim.clock();
// TaskStage ts=new TaskStage(Constants.EXECUTION, 0, length, 0,memory, (i+1)%numbervm);
// TaskStage ts1=new TaskStage(Constants.WAIT_SEND, 100, 0, 0, memory, (i+1)%numbervm);
// TaskStage ts2=new TaskStage(Constants.WAIT_RECV, 100, 0, 0, memory, (i+1)%numbervm);
// TaskStage ts3=new TaskStage(Constants.EXECUTION, 0, length, 0, memory, (i+1)%numbervm);
// cl.stages.add(ts);
// cl.stages.add(ts1);
// cl.stages.add(ts2);
// cl.stages.add(ts3);
// cl.submittime=CloudSim.clock();
cl.currStagenum=-1;
clist.add(cl);
}
//based on type
}
NetworkConstants.currentCloudletId++;
cl.setUserId(userId);
cl.submittime = CloudSim.clock();
cl.currStagenum = -1;
clist.add(cl);
}
// based on type
}
}
package org.cloudbus.cloudsim.network.datacenter;
/**
* BagofTaskApp is an example of AppCloudlet having three noncommunicating tasks.
*
*
* Please refer to following publication for more details:
*
* Saurabh Kumar Garg and Rajkumar Buyya, NetworkCloudSim: Modelling Parallel
* Applications in Cloud Simulations, Proceedings of the 4th IEEE/ACM
* International Conference on Utility and Cloud Computing (UCC 2011, IEEE CS
* Press, USA), Melbourne, Australia, December 5-7, 2011.
*
*
* @author Saurabh Kumar Garg
* @since CloudSim Toolkit 1.0
*/
import java.util.List;
import org.cloudbus.cloudsim.UtilizationModel;
import org.cloudbus.cloudsim.UtilizationModelFull;
import org.cloudbus.cloudsim.core.CloudSim;
public class MonteCarloApp extends AppCloudlet {
public class BagofTaskApp extends AppCloudlet {
public MonteCarloApp(int type, int appID, double deadline, int numbervm, int userId) {
public BagofTaskApp(int type, int appID, double deadline, int numbervm, int userId) {
super(type, appID, deadline, numbervm,userId);
this.numbervm=this.getnumvm();
......@@ -19,34 +35,39 @@ public class MonteCarloApp extends AppCloudlet {
public void createCloudletList(List<Integer> vmIdList){
//basically, each task runs the simulation and then data is consolidated in one task
int executionTime = getExecTime();
long memory = accuracyToMemory();
long fileSize = Constants.FILE_SIZE;
long outputSize = Constants.OUTPUT_SIZE;
int pesNumber = Constants.PES_NUMBER;
long memory = 1000;
long fileSize = NetworkConstants.FILE_SIZE;
long outputSize = NetworkConstants.OUTPUT_SIZE;
int pesNumber = NetworkConstants.PES_NUMBER;
int stgId=0;
int t=Constants.currentCloudletId;
int t=NetworkConstants.currentCloudletId;
for(int i=0;i<numbervm;i++){
UtilizationModel utilizationModel = new UtilizationModelFull();
NetworkCloudlet cl = new NetworkCloudlet(Constants.currentCloudletId, executionTime/numbervm, pesNumber, fileSize, outputSize, memory, utilizationModel, utilizationModel, utilizationModel);
Constants.currentCloudletId++;
NetworkCloudlet cl = new NetworkCloudlet(NetworkConstants.currentCloudletId, executionTime/numbervm, pesNumber, fileSize, outputSize, memory, utilizationModel, utilizationModel, utilizationModel);
NetworkConstants.currentCloudletId++;
cl.setUserId(userId);
cl.submittime=CloudSim.clock();
cl.currStagenum=-1;
cl.setVmId(vmIdList.get(i));
//compute and send data to node 0
cl.stages.add(new TaskStage(Constants.EXECUTION, Constants.COMMUNICATION_LENGTH, executionTime/numbervm, stgId++, memory, vmIdList.get(0),cl.getCloudletId()));
cl.stages.add(new TaskStage(NetworkConstants.EXECUTION, NetworkConstants.COMMUNICATION_LENGTH, executionTime/numbervm, stgId++, memory, vmIdList.get(0),cl.getCloudletId()));
//0 has an extra stage of waiting for results; others send
if (i==0){
for(int j=1;j<numbervm;j++)
cl.stages.add(new TaskStage(Constants.WAIT_RECV, Constants.COMMUNICATION_LENGTH, 0, stgId++, memory, vmIdList.get(j),cl.getCloudletId()+j));
cl.stages.add(new TaskStage(NetworkConstants.WAIT_RECV, NetworkConstants.COMMUNICATION_LENGTH, 0, stgId++, memory, vmIdList.get(j),cl.getCloudletId()+j));
} else {
cl.stages.add(new TaskStage(Constants.WAIT_SEND, Constants.COMMUNICATION_LENGTH, 0, stgId++, memory, vmIdList.get(0),t));
cl.stages.add(new TaskStage(NetworkConstants.WAIT_SEND, NetworkConstants.COMMUNICATION_LENGTH, 0, stgId++, memory, vmIdList.get(0),t));
}
clist.add(cl);
}
}
/**
* One can generate number of VMs for each application based on deadline
* @return
*/
public int getnumvm(){
double exetime=getExecTime()/2;//for two vms
if(this.deadline>exetime)
......@@ -57,14 +78,10 @@ public class MonteCarloApp extends AppCloudlet {
}
private int getExecTime() {
//use exec constraints as Binomial
//use exec constraints
return 100;
}
private long accuracyToMemory() {
//use same memory constraints as Binomial
return 240076;
}
}
package org.cloudbus.cloudsim.network.datacenter;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.cloudbus.cloudsim.Cloudlet;
import org.cloudbus.cloudsim.CloudletScheduler;
import org.cloudbus.cloudsim.ResCloudlet;
import org.cloudbus.cloudsim.core.CloudSim;
import org.cloudbus.cloudsim.core.CloudSimTags;
public class CloudletHPCSpaceShared extends CloudletScheduler{
/*
* Title: CloudSim Toolkit
* Description: CloudSim (Cloud Simulation) Toolkit for Modeling and Simulation of Clouds
* Licence: GPL - http://www.gnu.org/copyleft/gpl.html
*
* Copyright (c) 2009-2010, The University of Melbourne, Australia
*/
/**
* CloudletSchedulerSpaceShared implements a policy of
* scheduling performed by a virtual machine. It consider
* that there will be only one cloudlet per VM. Other cloudlets will be in a
* waiting list. We consider that file transfer from cloudlets waiting happens
* before cloudlet execution. I.e., even though cloudlets must wait for CPU,
* data transfer happens as soon as cloudlets are submitted.
*
* @author Rodrigo N. Calheiros
* @author Anton Beloglazov
* @since CloudSim Toolkit 1.0
*/
/** The cloudlet waiting list. */
private List<? extends ResCloudlet> cloudletWaitingList;
/** The cloudlet exec list. */
private List<? extends ResCloudlet> cloudletExecList;
/** The cloudlet paused list. */
private List<? extends ResCloudlet> cloudletPausedList;
/** The cloudlet finished list. */
private List<? extends ResCloudlet> cloudletFinishedList;
/** The current CPUs. */
protected int currentCpus;
/** The used PEs. */
protected int usedPes;
//for network
public Map<Integer,List<NetPacket>> pkttosend;
public Map<Integer,List<NetPacket>> pktrecv;
/**
* Creates a new CloudletSchedulerSpaceShared object. This method must be invoked
* before starting the actual simulation.
*
* @pre $none
* @post $none
*/
public CloudletHPCSpaceShared() {
super();
this.cloudletWaitingList = new ArrayList<ResCloudlet>();
this.cloudletExecList = new ArrayList<ResCloudlet>();
this.cloudletPausedList = new ArrayList<ResCloudlet>();
this.cloudletFinishedList = new ArrayList<ResCloudlet>();
this.usedPes = 0;
this.currentCpus = 0;
this.pkttosend= new HashMap<Integer,List<NetPacket>>();
this.pktrecv= new HashMap<Integer,List<NetPacket>>();
}
/**
* Updates the processing of cloudlets running under management of this scheduler.
*
* @param currentTime current simulation time
* @param mipsShare array with MIPS share of each processor available to the scheduler
*
* @return time predicted completion time of the earliest finishing cloudlet, or 0
* if there is no next events
*
* @pre currentTime >= 0
* @post $none
*/
@Override
public double updateVmProcessing(double currentTime, List<Double> mipsShare) {
setCurrentMipsShare(mipsShare);
double timeSpam = currentTime - getPreviousTime(); // time since last update
double capacity = 0.0;
int cpus = 0;
for (Double mips : mipsShare) { // count the CPUs available to the VMM
capacity += mips;
if (mips > 0) {
cpus++;
}
}
currentCpus = cpus;
capacity /= cpus; // average capacity of each cpu
for (ResCloudlet rcl : getCloudletExecList()) { // each machine in the exec list has the same amount of cpu
NetworkCloudlet cl=(NetworkCloudlet) rcl.getCloudlet();
if((cl.currStagenum!=-1))
{
if(cl.currStagenum==Constants.FINISH){
//long len=rcl.getRemainingCloudletLength();
//rcl.updateCloudletFinishedSoFar(len);
break;
}
TaskStage st= cl.stages.get(cl.currStagenum);
if(st.type==Constants.EXECUTION)
{
//rcl.updateCloudletFinishedSoFar((long) (capacity * Math.round(timeSpam) * rcl.getPesNumber()));
//update the time
cl.timespentInStage=Math.round(CloudSim.clock()-cl.timetostartStage);
if(cl.timespentInStage>=st.time)
{
changetonextstage(cl,st);
//change the stage
}
}
if(st.type==Constants.WAIT_RECV)
{
List<NetPacket> pktlist=this.pktrecv.get(st.peer);
List<NetPacket> pkttoremove=new ArrayList<NetPacket>();
if(pktlist!=null)
{
Iterator it=pktlist.iterator();
NetPacket pkt=null;
if(it.hasNext())
{
pkt=(NetPacket)it.next();
if(pkt.reciever==cl.getVmId())//Asumption packet will not arrive in the same cycle
{
pkt.recievetime=CloudSim.clock();
st.time=CloudSim.clock()-pkt.sendtime;
changetonextstage(cl,st);
pkttoremove.add(pkt);
}
}
pktlist.removeAll(pkttoremove);
//if(pkt!=null)
//else wait for recieving the packet
}
}
}
else
{
cl.currStagenum=0;
cl.timetostartStage=CloudSim.clock();
if(cl.stages.get(0).type==Constants.EXECUTION)
NetDatacenterBroker.linkDC.schedule(NetDatacenterBroker.linkDC.getId(),cl.stages.get(0).time, CloudSimTags.VM_DATACENTER_EVENT);
else
NetDatacenterBroker.linkDC.schedule(NetDatacenterBroker.linkDC.getId(),0.0001, CloudSimTags.VM_DATACENTER_EVENT);
///sendstage///
}
//check status
//if execution stage
//update the cloudlet finishtime
//CHECK WHETHER IT IS WAITING FOR THE PACKET
// if packet received change the status of job and update the time.
//
//rcl.updateCloudletFinishedSoFar((long) (capacity * timeSpam * rcl.getPesNumber()));
}
if (getCloudletExecList().size() == 0 && getCloudletWaitingList().size() == 0) { // no more cloudlets in this scheduler
setPreviousTime(currentTime);
return 0.0;
}
//update each cloudlet
int finished = 0;
int cont = 0;
List<ResCloudlet> toRemove = new ArrayList<ResCloudlet>();
for (ResCloudlet rcl : getCloudletExecList()) {
//if (rcl.getRemainingCloudletLength() == 0.0) {// finished anyway, rounding issue...
if(((NetworkCloudlet)(rcl.getCloudlet())).currStagenum==Constants.FINISH){
//stage is changed and packet to send
((NetworkCloudlet)(rcl.getCloudlet())).finishtime=CloudSim.clock();
toRemove.add(rcl);
cloudletFinish(rcl);
finished++;
}
cont++;
}
getCloudletExecList().removeAll(toRemove);
//add all the CloudletExecList in waitingList.
//sort the waitinglist
//
//for each finished cloudlet, add a new one from the waiting list
if (!getCloudletWaitingList().isEmpty()) {
for (int i = 0; i < finished; i++) {
toRemove.clear();
for (ResCloudlet rcl : getCloudletWaitingList()) {
if ((currentCpus - usedPes) >= rcl.getPesNumber()) {
rcl.setCloudletStatus(Cloudlet.INEXEC);
for (int k = 0; k < rcl.getPesNumber(); k++) {
rcl.setMachineAndPeId(0, i);
}
getCloudletExecList().add(rcl);
usedPes += rcl.getPesNumber();
toRemove.add(rcl);
break;
}
}
getCloudletWaitingList().removeAll(toRemove);
}// for(cont)
}
//estimate finish time of cloudlets in the execution queue
double nextEvent = Double.MAX_VALUE;
for (ResCloudlet rcl : getCloudletExecList()) {
double remainingLength = rcl.getRemainingCloudletLength();
double estimatedFinishTime = currentTime + (remainingLength / (capacity * rcl.getPesNumber()));
if (estimatedFinishTime - currentTime < 0.1) {
estimatedFinishTime = currentTime + 0.1;
}
if (estimatedFinishTime < nextEvent) {
nextEvent = estimatedFinishTime;
}
}
setPreviousTime(currentTime);
return nextEvent;
}
private void changetonextstage(NetworkCloudlet cl, TaskStage st) {
// TODO Auto-generated method stub
cl.timespentInStage=0;
cl.timetostartStage=CloudSim.clock();
int currstage=cl.currStagenum;
if(currstage>=(cl.stages.size()-1))
cl.currStagenum=Constants.FINISH;
else{
cl.currStagenum=currstage+1;
TaskStage st1=cl.stages.get(cl.currStagenum);
int i=0;
for(i=cl.currStagenum;i<cl.stages.size();i++)
{
if(cl.stages.get(i).type==Constants.WAIT_SEND)
{
NetPacket pkt=new NetPacket(cl.getVmId(), cl.stages.get(i).peer, cl.stages.get(i).data, CloudSim.clock(),-1,cl.getCloudletId(),cl.stages.get(i).vpeer);
List<NetPacket> pktlist=this.pkttosend.get(cl.getVmId());
if(pktlist==null)
pktlist=new ArrayList<NetPacket>();
pktlist.add(pkt);
this.pkttosend.put(cl.getVmId(), pktlist);
}
else break;
}
NetDatacenterBroker.linkDC.schedule(NetDatacenterBroker.linkDC.getId(),0.0001, CloudSimTags.VM_DATACENTER_EVENT);
if(i==cl.stages.size()) cl.currStagenum=Constants.FINISH;
else {
cl.currStagenum=i;
if(cl.stages.get(i).type==Constants.EXECUTION)
NetDatacenterBroker.linkDC.schedule(NetDatacenterBroker.linkDC.getId(),cl.stages.get(i).time, CloudSimTags.VM_DATACENTER_EVENT);
}
}
}
/**
* Cancels execution of a cloudlet.
*
* @param cloudletId ID of the cloudlet being cancealed
*
* @return the canceled cloudlet, $null if not found
*
* @pre $none
* @post $none
*/
@Override
public Cloudlet cloudletCancel(int cloudletId) {
//First, looks in the finished queue
for (ResCloudlet rcl : getCloudletFinishedList()) {
if (rcl.getCloudletId() == cloudletId) {
getCloudletFinishedList().remove(rcl);
return rcl.getCloudlet();
}
}
//Then searches in the exec list
for (ResCloudlet rcl : getCloudletExecList()) {
if (rcl.getCloudletId() == cloudletId) {
getCloudletExecList().remove(rcl);
if (rcl.getRemainingCloudletLength() == 0.0) {
cloudletFinish(rcl);
} else {
rcl.setCloudletStatus(Cloudlet.CANCELED);
}
return rcl.getCloudlet();
}
}
//Now, looks in the paused queue
for (ResCloudlet rcl : getCloudletPausedList()) {
if (rcl.getCloudletId() == cloudletId) {
getCloudletPausedList().remove(rcl);
return rcl.getCloudlet();
}
}
//Finally, looks in the waiting list
for (ResCloudlet rcl : getCloudletWaitingList()) {
if (rcl.getCloudletId() == cloudletId) {
rcl.setCloudletStatus(Cloudlet.CANCELED);
getCloudletWaitingList().remove(rcl);
return rcl.getCloudlet();
}
}
return null;
}
/**
* Pauses execution of a cloudlet.
*
* @param cloudletId ID of the cloudlet being paused
*
* @return $true if cloudlet paused, $false otherwise
*
* @pre $none
* @post $none
*/
@Override
public boolean cloudletPause(int cloudletId) {
boolean found = false;
int position = 0;
//first, looks for the cloudlet in the exec list
for (ResCloudlet rcl : getCloudletExecList()) {
if (rcl.getCloudletId() == cloudletId) {
found = true;
break;
}
position++;
}
if (found){
//moves to the paused list
ResCloudlet rgl = getCloudletExecList().remove(position);
if (rgl.getRemainingCloudletLength() == 0.0) {
cloudletFinish(rgl);
} else {
rgl.setCloudletStatus(Cloudlet.PAUSED);
getCloudletPausedList().add(rgl);
}
return true;
}
//now, look for the cloudlet in the waiting list
position = 0;
found = false;
for (ResCloudlet rcl : getCloudletWaitingList()) {
if (rcl.getCloudletId() == cloudletId) {
found = true;
break;
}
position++;
}
if (found) {
// moves to the paused list
ResCloudlet rgl = getCloudletWaitingList().remove(position);
if (rgl.getRemainingCloudletLength() == 0.0) {
cloudletFinish(rgl);
} else {
rgl.setCloudletStatus(Cloudlet.PAUSED);
getCloudletPausedList().add(rgl);
}
return true;
}
return false;
}
/**
* Processes a finished cloudlet.
*
* @param rcl finished cloudlet
*
* @pre rgl != $null
* @post $none
*/
@Override
public void cloudletFinish(ResCloudlet rcl) {
rcl.setCloudletStatus(Cloudlet.SUCCESS);
rcl.finalizeCloudlet();
getCloudletFinishedList().add(rcl);
usedPes -= rcl.getPesNumber();
}
/**
* Resumes execution of a paused cloudlet.
*
* @param cloudletId ID of the cloudlet being resumed
*
* @return $true if the cloudlet was resumed, $false otherwise
*
* @pre $none
* @post $none
*/
@Override
public double cloudletResume(int cloudletId) {
boolean found=false;
int position=0;
//look for the cloudlet in the paused list
for (ResCloudlet rcl : getCloudletPausedList()) {
if (rcl.getCloudletId() == cloudletId) {
found = true;
break;
}
position++;
}
if (found){
ResCloudlet rcl = getCloudletPausedList().remove(position);
if ((currentCpus - usedPes) >= rcl.getPesNumber()) {// it can go to the exec list
rcl.setCloudletStatus(Cloudlet.INEXEC);
for (int i = 0; i < rcl.getPesNumber(); i++) {
rcl.setMachineAndPeId(0, i);
}
long size = rcl.getRemainingCloudletLength();
size *= rcl.getPesNumber();
rcl.getCloudlet().setCloudletLength(size);
getCloudletExecList().add(rcl);
usedPes += rcl.getPesNumber();
// calculate the expected time for cloudlet completion
double capacity = 0.0;
int cpus = 0;
for (Double mips : getCurrentMipsShare()) {
capacity += mips;
if (mips > 0) {
cpus++;
}
}
currentCpus = cpus;
capacity /= cpus;
long remainingLength = rcl.getRemainingCloudletLength();
double estimatedFinishTime = CloudSim.clock() + (remainingLength / (capacity * rcl.getPesNumber()));
return estimatedFinishTime;
} else {// no enough free PEs: go to the waiting queue
rcl.setCloudletStatus(Cloudlet.QUEUED);
long size = rcl.getRemainingCloudletLength();
size *= rcl.getPesNumber();
rcl.getCloudlet().setCloudletLength(size);
getCloudletWaitingList().add(rcl);
return 0.0;
}
}
//not found in the paused list: either it is in in the queue, executing or not exist
return 0.0;
}
/**
* Receives an cloudlet to be executed in the VM managed by this scheduler.
*
* @param cloudlet the submited cloudlet
* @param fileTransferTime time required to move the required files from the SAN to the VM
*
* @return expected finish time of this cloudlet, or 0 if it is in the waiting queue
*
* @pre gl != null
* @post $none
*/
@Override
public double cloudletSubmit(Cloudlet cloudlet, double fileTransferTime) {
if ((currentCpus - usedPes) >= cloudlet.getPesNumber()) {// it can go to the exec list
ResCloudlet rcl = new ResCloudlet(cloudlet);
rcl.setCloudletStatus(Cloudlet.INEXEC);
for (int i = 0; i < cloudlet.getPesNumber(); i++) {
rcl.setMachineAndPeId(0, i);
}
getCloudletExecList().add(rcl);
usedPes += cloudlet.getPesNumber();
} else {// no enough free PEs: go to the waiting queue
ResCloudlet rcl = new ResCloudlet(cloudlet);
rcl.setCloudletStatus(Cloudlet.QUEUED);
getCloudletWaitingList().add(rcl);
return 0.0;
}
// calculate the expected time for cloudlet completion
double capacity = 0.0;
int cpus = 0;
for (Double mips : getCurrentMipsShare()) {
capacity += mips;
if (mips > 0) {
cpus++;
}
}
currentCpus = cpus;
capacity /= cpus;
// use the current capacity to estimate the extra amount of
// time to file transferring. It must be added to the cloudlet length
double extraSize = capacity * fileTransferTime;
long length = cloudlet.getCloudletLength();
length += extraSize;
cloudlet.setCloudletLength(length);
return cloudlet.getCloudletLength() / capacity;
}
/* (non-Javadoc)
* @see cloudsim.CloudletScheduler#cloudletSubmit(cloudsim.Cloudlet)
*/
@Override
public double cloudletSubmit(Cloudlet cloudlet) {
cloudletSubmit(cloudlet, 0);
return 0;
}
/**
* Gets the status of a cloudlet.
*
* @param cloudletId ID of the cloudlet
*
* @return status of the cloudlet, -1 if cloudlet not found
*
* @pre $none
* @post $none
*/
@Override
public int getCloudletStatus(int cloudletId) {
for (ResCloudlet rcl : getCloudletExecList()) {
if (rcl.getCloudletId() == cloudletId) {
return rcl.getCloudletStatus();
}
}
for (ResCloudlet rcl : getCloudletPausedList()) {
if (rcl.getCloudletId() == cloudletId) {
return rcl.getCloudletStatus();
}
}
for (ResCloudlet rcl : getCloudletWaitingList()) {
if (rcl.getCloudletId() == cloudletId) {
return rcl.getCloudletStatus();
}
}
return -1;
}
/**
* Get utilization created by all cloudlets.
*
* @param time the time
*
* @return total utilization
*/
@Override
public double getTotalUtilizationOfCpu(double time) {
double totalUtilization = 0;
for (ResCloudlet gl : getCloudletExecList()) {
totalUtilization += gl.getCloudlet().getUtilizationOfCpu(time);
}
return totalUtilization;
}
/**
* Informs about completion of some cloudlet in the VM managed
* by this scheduler.
*
* @return $true if there is at least one finished cloudlet; $false otherwise
*
* @pre $none
* @post $none
*/
@Override
public boolean isFinishedCloudlets() {
return getCloudletFinishedList().size() > 0;
}
/**
* Returns the next cloudlet in the finished list, $null if this list is empty.
*
* @return a finished cloudlet
*
* @pre $none
* @post $none
*/
@Override
public Cloudlet getNextFinishedCloudlet() {
if (getCloudletFinishedList().size() > 0) {
return getCloudletFinishedList().remove(0).getCloudlet();
}
return null;
}
/**
* Returns the number of cloudlets runnning in the virtual machine.
*
* @return number of cloudlets runnning
*
* @pre $none
* @post $none
*/
@Override
public int runningCloudlets() {
return getCloudletExecList().size();
}
/**
* Returns one cloudlet to migrate to another vm.
*
* @return one running cloudlet
*
* @pre $none
* @post $none
*/
@Override
public Cloudlet migrateCloudlet() {
ResCloudlet rcl = getCloudletExecList().remove(0);
rcl.finalizeCloudlet();
Cloudlet cl = rcl.getCloudlet();
usedPes -= cl.getPesNumber();
return cl;
}
/**
* Gets the cloudlet waiting list.
*
* @param <T> the generic type
* @return the cloudlet waiting list
*/
@SuppressWarnings("unchecked")
protected <T extends ResCloudlet> List<T> getCloudletWaitingList() {
return (List<T>) cloudletWaitingList;
}
/**
* Cloudlet waiting list.
*
* @param <T> the generic type
* @param cloudletWaitingList the cloudlet waiting list
*/
protected <T extends ResCloudlet> void cloudletWaitingList(List<T> cloudletWaitingList) {
this.cloudletWaitingList = cloudletWaitingList;
}
/**
* Gets the cloudlet exec list.
*
* @param <T> the generic type
* @return the cloudlet exec list
*/
@SuppressWarnings("unchecked")
protected <T extends ResCloudlet> List<T> getCloudletExecList() {
return (List<T>) cloudletExecList;
}
/**
* Sets the cloudlet exec list.
*
* @param <T> the generic type
* @param cloudletExecList the new cloudlet exec list
*/
protected <T extends ResCloudlet> void setCloudletExecList(List<T> cloudletExecList) {
this.cloudletExecList = cloudletExecList;
}
/**
* Gets the cloudlet paused list.
*
* @param <T> the generic type
* @return the cloudlet paused list
*/
@SuppressWarnings("unchecked")
protected <T extends ResCloudlet> List<T> getCloudletPausedList() {
return (List<T>) cloudletPausedList;
}
/**
* Sets the cloudlet paused list.
*
* @param <T> the generic type
* @param cloudletPausedList the new cloudlet paused list
*/
protected <T extends ResCloudlet> void setCloudletPausedList(List<T> cloudletPausedList) {
this.cloudletPausedList = cloudletPausedList;
}
/**
* Gets the cloudlet finished list.
*
* @param <T> the generic type
* @return the cloudlet finished list
*/
@SuppressWarnings("unchecked")
protected <T extends ResCloudlet> List<T> getCloudletFinishedList() {
return (List<T>) cloudletFinishedList;
}
/**
* Sets the cloudlet finished list.
*
* @param <T> the generic type
* @param cloudletFinishedList the new cloudlet finished list
*/
protected <T extends ResCloudlet> void setCloudletFinishedList(List<T> cloudletFinishedList) {
this.cloudletFinishedList = cloudletFinishedList;
}
/* (non-Javadoc)
* @see org.cloudbus.cloudsim.CloudletScheduler#getCurrentRequestedMips()
*/
@Override
public List<Double> getCurrentRequestedMips() {
List<Double> mipsShare = new ArrayList<Double>();
if (getCurrentMipsShare() != null) {
for (Double mips : getCurrentMipsShare()) {
mipsShare.add(mips);
}
}
return mipsShare;
}
/* (non-Javadoc)
* @see org.cloudbus.cloudsim.CloudletScheduler#getTotalCurrentAvailableMipsForCloudlet(org.cloudbus.cloudsim.ResCloudlet, java.util.List)
*/
@Override
public double getTotalCurrentAvailableMipsForCloudlet(ResCloudlet rcl, List<Double> mipsShare) {
double capacity = 0.0;
int cpus = 0;
for (Double mips : mipsShare) { // count the cpus available to the vmm
capacity += mips;
if (mips > 0) {
cpus++;
}
}
currentCpus = cpus;
capacity /= cpus; // average capacity of each cpu
return capacity;
}
/* (non-Javadoc)
* @see org.cloudbus.cloudsim.CloudletScheduler#getTotalCurrentAllocatedMipsForCloudlet(org.cloudbus.cloudsim.ResCloudlet, double)
*/
@Override
public double getTotalCurrentAllocatedMipsForCloudlet(ResCloudlet rcl, double time) {
// TODO Auto-generated method stub
return 0.0;
}
/* (non-Javadoc)
* @see org.cloudbus.cloudsim.CloudletScheduler#getTotalCurrentRequestedMipsForCloudlet(org.cloudbus.cloudsim.ResCloudlet, double)
*/
@Override
public double getTotalCurrentRequestedMipsForCloudlet(ResCloudlet rcl, double time) {
// TODO Auto-generated method stub
return 0.0;
}
@Override
public double getCurrentRequestedUtilizationOfBw() {
// TODO Auto-generated method stub
return 0;
}
@Override
public double getCurrentRequestedUtilizationOfRam() {
// TODO Auto-generated method stub
return 0;
}
}
......@@ -11,26 +11,53 @@ import org.cloudbus.cloudsim.core.CloudSimTags;
import org.cloudbus.cloudsim.core.SimEvent;
import org.cloudbus.cloudsim.core.predicates.PredicateType;
/**
* This class allows to simulate Edge switch for Datacenter network.
* It interacts with other switches in order to exchange
* packets. Please refer to following publication for more details:
*
* Saurabh Kumar Garg and Rajkumar Buyya, NetworkCloudSim: Modelling Parallel
* Applications in Cloud Simulations, Proceedings of the 4th IEEE/ACM International
* Conference on Utility and Cloud Computing (UCC 2011, IEEE CS Press, USA),
* Melbourne, Australia, December 5-7, 2011.
*
* @author Saurabh Kumar Garg
* @since CloudSim Toolkit 3.0
*
*/
public class EdgeSwitch extends Switch{
public EdgeSwitch(String name, int dcid, NetworkDatacenter dc) {
super(name, dcid, dc);
/**
* Constructor for Edge Switch
* We have to specify switches that are connected to its downlink and uplink ports,
* and corresponding bandwidths. In this switch downlink ports are
* connected to hosts not to a switch.
*
* @param name Name of the switch
* @param level At which level switch is with respect to hosts.
* @param dc Pointer to Datacenter
*/
public EdgeSwitch(String name, int level, NetworkDatacenter dc) {
super(name, level, dc);
hostlist=new HashMap<Integer,NetworkHost>();
uplinkswitchpktlist=new HashMap<Integer,List<HostPacket>>();
packetTohost=new HashMap<Integer,List<HostPacket>>();
uplinkbandwidth=Constants.BandWidthEdgeAgg;
downlinkbandwidth=Constants.BandWidthEdgeHost;
this.switching_delay=Constants.SwitchingDelayEdge;
numport=Constants.EdgeSwitchPort;
uplinkswitchpktlist=new HashMap<Integer,List<NetworkPacket>>();
packetTohost=new HashMap<Integer,List<NetworkPacket>>();
uplinkbandwidth=NetworkConstants.BandWidthEdgeAgg;
downlinkbandwidth=NetworkConstants.BandWidthEdgeHost;
this.switching_delay=NetworkConstants.SwitchingDelayEdge;
numport=NetworkConstants.EdgeSwitchPort;
uplinkswitches=new ArrayList<Switch>();
// TODO Auto-generated constructor stub
}
private void registerHost(SimEvent ev) {
// TODO Auto-generated method stub
NetworkHost hs=(NetworkHost)ev.getData();
hostlist.put(hs.getId(),(NetworkHost)ev.getData());
}
private void processpacket_up(SimEvent ev) {
/**
* Send Packet to switch connected through a uplink port
*
* @param ev Event/packet to process
*/
@Override
protected void processpacket_up(SimEvent ev) {
// TODO Auto-generated method stub
//packet coming from down level router/host.
//has to send up
......@@ -38,7 +65,7 @@ public class EdgeSwitch extends Switch{
//add packet in the switch list
//
//int src=ev.getSource();
HostPacket hspkt=(HostPacket) ev.getData();
NetworkPacket hspkt=(NetworkPacket) ev.getData();
int recvVMid=hspkt.pkt.reciever;
CloudSim.cancelAll(getId(), new PredicateType(CloudSimTags.Network_Event_send));
schedule(getId(),this.switching_delay, CloudSimTags.Network_Event_send);
......@@ -54,9 +81,9 @@ public class EdgeSwitch extends Switch{
if(hs!=null)
{
//packet to be sent to host connected to the switch
List<HostPacket> pktlist=this.packetTohost.get(hostid);
List<NetworkPacket> pktlist=this.packetTohost.get(hostid);
if(pktlist==null){
pktlist=new ArrayList<HostPacket>();
pktlist=new ArrayList<NetworkPacket>();
this.packetTohost.put(hostid, pktlist);
}
pktlist.add(hspkt);
......@@ -69,9 +96,9 @@ public class EdgeSwitch extends Switch{
//if there are more than one Aggregate level switch one need to modify following code
Switch sw=this.uplinkswitches.get(0);
List<HostPacket> pktlist=this.uplinkswitchpktlist.get(sw.getId());
List<NetworkPacket> pktlist=this.uplinkswitchpktlist.get(sw.getId());
if(pktlist==null){
pktlist=new ArrayList<HostPacket>();
pktlist=new ArrayList<NetworkPacket>();
this.uplinkswitchpktlist.put(sw.getId(), pktlist);
}
pktlist.add(hspkt);
......@@ -79,24 +106,31 @@ public class EdgeSwitch extends Switch{
}
private void processpacketforward(SimEvent ev) {
/**
* Send Packet to hosts connected to the switch
*
* @param ev Event/packet to process
*/
@Override
protected void processpacketforward(SimEvent ev) {
// TODO Auto-generated method stub
//search for the host and packets..send to them
if(this.uplinkswitchpktlist!=null)
{
for(Entry<Integer, List<HostPacket>> es:uplinkswitchpktlist.entrySet())
for(Entry<Integer, List<NetworkPacket>> es:uplinkswitchpktlist.entrySet())
{
int tosend=es.getKey();
List<HostPacket> hspktlist=es.getValue();
List<NetworkPacket> hspktlist=es.getValue();
if(!hspktlist.isEmpty()){
//sharing bandwidth between packets
double avband=this.uplinkbandwidth/hspktlist.size();
Iterator<HostPacket> it=hspktlist.iterator();
Iterator<NetworkPacket> it=hspktlist.iterator();
while(it.hasNext())
{
HostPacket hspkt=it.next();
NetworkPacket hspkt=it.next();
double delay=1000*hspkt.pkt.data/avband;
this.send(tosend,delay,CloudSimTags.Network_Event_UP, hspkt);
......@@ -107,16 +141,16 @@ public class EdgeSwitch extends Switch{
}
if(this.packetTohost!=null)
{
for(Entry<Integer, List<HostPacket>> es:packetTohost.entrySet())
for(Entry<Integer, List<NetworkPacket>> es:packetTohost.entrySet())
{
int tosend=es.getKey();
NetworkHost hs=this.hostlist.get(tosend);
List<HostPacket> hspktlist=es.getValue();
List<NetworkPacket> hspktlist=es.getValue();
if(!hspktlist.isEmpty()){
double avband=this.downlinkbandwidth/hspktlist.size();
Iterator<HostPacket> it=hspktlist.iterator();
Iterator<NetworkPacket> it=hspktlist.iterator();
while(it.hasNext()){
HostPacket hspkt=it.next();
NetworkPacket hspkt=it.next();
//hspkt.recieverhostid=tosend;
//hs.packetrecieved.add(hspkt);
this.send(this.getId(),hspkt.pkt.data/avband,CloudSimTags.Network_Event_Host, hspkt);
......
package org.cloudbus.cloudsim.network.datacenter;
/**
* HostPacket represents the packet that travels through the virtual network with a Host.
* It contains information about cloudlets which are communicating
*
* Please refer to following publication for more details:
*
* Saurabh Kumar Garg and Rajkumar Buyya, NetworkCloudSim: Modelling Parallel
* Applications in Cloud Simulations, Proceedings of the 4th IEEE/ACM
* International Conference on Utility and Cloud Computing (UCC 2011, IEEE CS
* Press, USA), Melbourne, Australia, December 5-7, 2011.
*
*
* @author Saurabh Kumar Garg
* @since CloudSim Toolkit 1.0
*/
public class HostPacket {
public HostPacket(int id, NetPacket pkt2, int vmid, int cloudletid) {
// TODO Auto-generated constructor stub
this.pkt=pkt2;
this.sendervmid=vmid;
this.cloudletid=cloudletid;
this.senderhostid=id;
this.stime=pkt.sendtime;
this.recievervmid=pkt2.reciever;
public HostPacket(int sender, int reciever, double data, double sendtime,
double recievetime, int vsnd, int vrvd) {
super();
this.sender = sender;
this.reciever = reciever;
this.data = data;
this.sendtime = sendtime;
this.recievetime = recievetime;
this.virtualrecvid = vrvd;
this.virtualsendid = vsnd;
}
NetPacket pkt;
int senderhostid;
int recieverhostid;
int sendervmid;
int recievervmid;
int cloudletid;
double stime;//time when sent
double rtime;//time when received
int sender;
int virtualrecvid;
int virtualsendid;
int reciever;
double data;
double sendtime;
double recievetime;
}
......@@ -8,9 +8,6 @@ package org.cloudbus.cloudsim.network.datacenter;
* Copyright (c) 2009-2010, The University of Melbourne, Australia
*/
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedList;
......@@ -36,14 +33,13 @@ import org.cloudbus.cloudsim.lists.CloudletList;
import org.cloudbus.cloudsim.lists.VmList;
/**
* DatacentreBroker represents a broker
* acting on behalf of a user. It hides VM management,
* as vm creation, sumbission of cloudlets to this VMs
* and destruction of VMs.
*
* @author Rodrigo N. Calheiros
* @author Anton Beloglazov
* @since CloudSim Toolkit 1.0
* NetDatacentreBroker represents a broker acting on behalf of Datacenter
* provider. It hides VM management, as vm creation, submission of cloudlets to
* this VMs and destruction of VMs. NOTE- It is an example only. It work on behalf of a provider not for
* users. One has to implement interaction with user broker to this broker.
*
* @author Saurabh Kumar Garg
* @since CloudSim Toolkit 3.0
*/
public class NetDatacenterBroker extends SimEntity {
......@@ -54,20 +50,19 @@ public class NetDatacenterBroker extends SimEntity {
/** The vms created list. */
private List<? extends Vm> vmsCreatedList;
/** The cloudlet list. */
private List<? extends NetworkCloudlet> cloudletList;
private List<? extends AppCloudlet> appCloudletList;
/** The cloudlet submitted list. */
/** The Appcloudlet submitted list. */
private Map<Integer, Integer> appCloudletRecieved;
private List<? extends Cloudlet> cloudletSubmittedList;
/** The cloudlet received list. */
private List<? extends Cloudlet> cloudletReceivedList;
/** The cloudlets submitted. */
private int cloudletsSubmitted;
......@@ -93,18 +88,20 @@ public class NetDatacenterBroker extends SimEntity {
private Map<Integer, DatacenterCharacteristics> datacenterCharacteristicsList;
public static NetworkDatacenter linkDC;
public boolean createvmflag=true;
public static int cachedcloudlet=0;
public boolean createvmflag = true;
public static int cachedcloudlet = 0;
/**
* Created a new DatacenterBroker object.
*
* @param name name to be associated with this entity (as
* required by Sim_entity class from simjava package)
*
* @throws Exception the exception
*
*
* @param name
* name to be associated with this entity (as required by
* Sim_entity class from simjava package)
*
* @throws Exception
* the exception
*
* @pre name != null
* @post $none
*/
......@@ -117,9 +114,9 @@ public class NetDatacenterBroker extends SimEntity {
setAppCloudletList(new ArrayList<AppCloudlet>());
setCloudletSubmittedList(new ArrayList<Cloudlet>());
setCloudletReceivedList(new ArrayList<Cloudlet>());
this.appCloudletRecieved=new HashMap<Integer,Integer>();
cloudletsSubmitted=0;
this.appCloudletRecieved = new HashMap<Integer, Integer>();
cloudletsSubmitted = 0;
setVmsRequested(0);
setVmsAcks(0);
setVmsDestroyed(0);
......@@ -128,15 +125,16 @@ public class NetDatacenterBroker extends SimEntity {
setDatacenterRequestedIdsList(new ArrayList<Integer>());
setVmsToDatacentersMap(new HashMap<Integer, Integer>());
setDatacenterCharacteristicsList(new HashMap<Integer, DatacenterCharacteristics>());
}
/**
* This method is used to send to the broker the list with
* virtual machines that must be created.
*
* @param list the list
*
* This method is used to send to the broker the list with virtual machines
* that must be created.
*
* @param list
* the list
*
* @pre list !=null
* @post $none
*/
......@@ -145,90 +143,98 @@ public class NetDatacenterBroker extends SimEntity {
}
/**
* This method is used to send to the broker the list of
* cloudlets.
*
* @param list the list
*
* This method is used to send to the broker the list of cloudlets.
*
* @param list
* the list
*
* @pre list !=null
* @post $none
*/
public void submitCloudletList(List<? extends NetworkCloudlet> list){
public void submitCloudletList(List<? extends NetworkCloudlet> list) {
getCloudletList().addAll(list);
}
/**
* Specifies that a given cloudlet must run in a specific virtual machine.
*
* @param cloudletId ID of the cloudlet being bount to a vm
* @param vmId the vm id
*
*
* @param cloudletId
* ID of the cloudlet being bount to a vm
* @param vmId
* the vm id
*
* @pre cloudletId > 0
* @pre id > 0
* @post $none
*/
// public void bindCloudletToVm(int cloudletId, int vmId){
// CloudletList.getById(getCloudletList(), cloudletId).setVmId(vmId);
// }
// public void bindCloudletToVm(int cloudletId, int vmId){
// CloudletList.getById(getCloudletList(), cloudletId).setVmId(vmId);
// }
public void setLinkDC(NetworkDatacenter linkDC) {
this.linkDC = linkDC;
}
/**
* Processes events available for this Broker.
*
* @param ev a SimEvent object
*
* @pre ev != null
* @post $none
*/
/**
* Processes events available for this Broker.
*
* @param ev
* a SimEvent object
*
* @pre ev != null
* @post $none
*/
@Override
public void processEvent(SimEvent ev) {
//Log.printLine(CloudSim.clock()+"[Broker]: event received:"+ev.getTag());
switch (ev.getTag()){
// Resource characteristics request
case CloudSimTags.RESOURCE_CHARACTERISTICS_REQUEST:
processResourceCharacteristicsRequest(ev);
break;
// Resource characteristics answer
case CloudSimTags.RESOURCE_CHARACTERISTICS:
processResourceCharacteristics(ev);
break;
// VM Creation answer
//A finished cloudlet returned
case CloudSimTags.CLOUDLET_RETURN:
processCloudletReturn(ev);
break;
// if the simulation finishes
case CloudSimTags.END_OF_SIMULATION:
shutdownEntity();
break;
case CloudSimTags.NextCycle:
if(Constants.BASE)
this.createVmsInDatacenterBase(this.linkDC.getId());
break;
// other unknown tags are processed by this method
default:
processOtherEvent(ev);
break;
// Log.printLine(CloudSim.clock()+"[Broker]: event received:"+ev.getTag());
switch (ev.getTag()) {
// Resource characteristics request
case CloudSimTags.RESOURCE_CHARACTERISTICS_REQUEST:
processResourceCharacteristicsRequest(ev);
break;
// Resource characteristics answer
case CloudSimTags.RESOURCE_CHARACTERISTICS:
processResourceCharacteristics(ev);
break;
// VM Creation answer
// A finished cloudlet returned
case CloudSimTags.CLOUDLET_RETURN:
processCloudletReturn(ev);
break;
// if the simulation finishes
case CloudSimTags.END_OF_SIMULATION:
shutdownEntity();
break;
case CloudSimTags.NextCycle:
if (NetworkConstants.BASE)
this.createVmsInDatacenterBase(this.linkDC.getId());
break;
// other unknown tags are processed by this method
default:
processOtherEvent(ev);
break;
}
}
/**
* Process the return of a request for the characteristics of a PowerDatacenter.
*
* @param ev a SimEvent object
*
* Process the return of a request for the characteristics of a
* PowerDatacenter.
*
* @param ev
* a SimEvent object
*
* @pre ev != $null
* @post $none
*/
protected void processResourceCharacteristics(SimEvent ev) {
DatacenterCharacteristics characteristics = (DatacenterCharacteristics) ev.getData();
getDatacenterCharacteristicsList().put(characteristics.getId(), characteristics);
DatacenterCharacteristics characteristics = (DatacenterCharacteristics) ev
.getData();
getDatacenterCharacteristicsList().put(characteristics.getId(),
characteristics);
if (getDatacenterCharacteristicsList().size() == getDatacenterIdsList().size()) {
if (getDatacenterCharacteristicsList().size() == getDatacenterIdsList()
.size()) {
setDatacenterRequestedIdsList(new ArrayList<Integer>());
createVmsInDatacenterBase(getDatacenterIdsList().get(0));
}
......@@ -236,60 +242,63 @@ public class NetDatacenterBroker extends SimEntity {
/**
* Process a request for the characteristics of a PowerDatacenter.
*
* @param ev a SimEvent object
*
*
* @param ev
* a SimEvent object
*
* @pre ev != $null
* @post $none
*/
protected void processResourceCharacteristicsRequest(SimEvent ev) {
setDatacenterIdsList(CloudSim.getCloudResourceList());
setDatacenterCharacteristicsList(new HashMap<Integer, DatacenterCharacteristics>());
Log.printLine(CloudSim.clock()+": "+getName()+ ": Cloud Resource List received with "+getDatacenterIdsList().size()+" resource(s)");
Log.printLine(CloudSim.clock() + ": " + getName()
+ ": Cloud Resource List received with "
+ getDatacenterIdsList().size() + " resource(s)");
for (Integer datacenterId : getDatacenterIdsList()) {
sendNow(datacenterId, CloudSimTags.RESOURCE_CHARACTERISTICS, getId());
sendNow(datacenterId, CloudSimTags.RESOURCE_CHARACTERISTICS,
getId());
}
}
/**
* Process the ack received due to a request for VM creation.
*
* @param ev a SimEvent object
*
*
* @param ev
* a SimEvent object
*
* @pre ev != null
* @post $none
*/
/**
* Process a cloudlet return event.
*
* @param ev a SimEvent object
*
*
* @param ev
* a SimEvent object
*
* @pre ev != $null
* @post $none
*/
protected void processCloudletReturn(SimEvent ev) {
Cloudlet cloudlet = (Cloudlet) ev.getData();
getCloudletReceivedList().add(cloudlet);
//Log.printLine(CloudSim.clock()+": "+getName()+ ": Cloudlet "+cloudlet.getCloudletId()+" received");
// Log.printLine(CloudSim.clock()+": "+getName()+
// ": Cloudlet "+cloudlet.getCloudletId()+" received");
cloudletsSubmitted--;
if (getCloudletList().size()==0&&cloudletsSubmitted==0&& Constants.iteration>10) { //all cloudlets executed
Log.printLine(CloudSim.clock()+": "+getName()+ ": All Cloudlets executed. Finishing...");
if (getCloudletList().size() == 0 && cloudletsSubmitted == 0
&& NetworkConstants.iteration > 10) { // all cloudlets executed
Log.printLine(CloudSim.clock() + ": " + getName()
+ ": All Cloudlets executed. Finishing...");
clearDatacenters();
finishExecution();
} else { //some cloudlets haven't finished yet
if (getAppCloudletList().size()>0 && cloudletsSubmitted==0) {
//all the cloudlets sent finished. It means that some bount
//cloudlet is waiting its VM be created
} else { // some cloudlets haven't finished yet
if (getAppCloudletList().size() > 0 && cloudletsSubmitted == 0) {
// all the cloudlets sent finished. It means that some bount
// cloudlet is waiting its VM be created
clearDatacenters();
createVmsInDatacenterBase(0);
}
......@@ -300,154 +309,157 @@ public class NetDatacenterBroker extends SimEntity {
/**
* Overrides this method when making a new and different type of Broker.
* This method is called by {@link #body()} for incoming unknown tags.
*
* @param ev a SimEvent object
*
*
* @param ev
* a SimEvent object
*
* @pre ev != null
* @post $none
*/
protected void processOtherEvent(SimEvent ev){
if (ev == null){
Log.printLine(getName() + ".processOtherEvent(): " + "Error - an event is null.");
return;
}
Log.printLine(getName() + ".processOtherEvent(): " + "Error - event unknown by this DatacenterBroker.");
}
/**
* Create the virtual machines in a datacenter.
*
* @param datacenterId Id of the chosen PowerDatacenter
*
* @pre $none
* @post $none
*/
protected void createVmsInDatacenterBase(int datacenterId) {
// send as much vms as possible for this datacenter before trying the next one
protected void processOtherEvent(SimEvent ev) {
if (ev == null) {
Log.printLine(getName() + ".processOtherEvent(): "
+ "Error - an event is null.");
return;
}
Log.printLine(getName() + ".processOtherEvent(): "
+ "Error - event unknown by this DatacenterBroker.");
}
/**
* Create the virtual machines in a datacenter and submit/schedule cloudlets
* to them.
*
* @param datacenterId
* Id of the chosen PowerDatacenter
*
* @pre $none
* @post $none
*/
protected void createVmsInDatacenterBase(int datacenterId) {
// send as much vms as possible for this datacenter before trying the
// next one
int requestedVms = 0;
String datacenterName = CloudSim.getEntityName(datacenterId);
int j=0;
//All host will have two VMs (assumption) VM is the minimum unit
if(createvmflag)
{
CreateVMs(datacenterId);
createvmflag=false;
}
//generate Request
//RequestGenerator reqgen=new RequestGenerator();
//OptionPricingRequest[] reqs=reqgen.getNextRequests(1);
for(int i=0;i<100;i++)
{
this.getAppCloudletList().add(new WorkflowApp(AppCloudlet.APP_Workflow, Constants.currentAppId, 0, 0, this.getId()));
//this.getAppCloudletList().add(reqs[i].getAppCloudlet(0,));
Constants.currentAppId++;
int j = 0;
// All host will have two VMs (assumption) VM is the minimum unit
if (createvmflag) {
CreateVMs(datacenterId);
createvmflag = false;
}
// generate Application execution Requests
for (int i = 0; i < 100; i++) {
this.getAppCloudletList().add(
new WorkflowApp(AppCloudlet.APP_Workflow,
NetworkConstants.currentAppId, 0, 0, this.getId()));
NetworkConstants.currentAppId++;
}
int seed=5;
int k=0;
int totalvm=this.vmsCreatedList.size();
int currentvmid=0;
for(AppCloudlet app:this.getAppCloudletList())
{
List<Integer> vmids=new ArrayList<Integer>();
int numVms=this.linkDC.getVmList().size();
UniformDistr ufrnd=new UniformDistr(0,numVms,5);
for(int i=0;i<app.numbervm;i++)
{
// int vmid=currentvmid%numVms;//
int vmid=(int)ufrnd.sample();
currentvmid++;
vmids.add(vmid);
}
if(vmids!=null){
if(!vmids.isEmpty()){
int seed = 5;
int k = 0;
int totalvm = this.vmsCreatedList.size();
int currentvmid = 0;
//schedule the application on VMs
for (AppCloudlet app : this.getAppCloudletList()) {
List<Integer> vmids = new ArrayList<Integer>();
int numVms = this.linkDC.getVmList().size();
UniformDistr ufrnd = new UniformDistr(0, numVms, 5);
for (int i = 0; i < app.numbervm; i++) {
int vmid = (int) ufrnd.sample();
currentvmid++;
vmids.add(vmid);
}
if (vmids != null) {
if (!vmids.isEmpty()) {
app.createCloudletList(vmids);
for(int i=0;i<app.numbervm;i++)
{
for (int i = 0; i < app.numbervm; i++) {
app.clist.get(i).setUserId(this.getId());
//this.getCloudletList().add(app.clist.get(i));
// this.getCloudletList().add(app.clist.get(i));
this.appCloudletRecieved.put(app.appID, app.numbervm);
this.getCloudletSubmittedList().add(app.clist.get(i));
this.cloudletsSubmitted++;
//Log.printLine(CloudSim.clock()+": "+getName()+ ": Sending cloudlet "+app.clist.get(i).getCloudletId()+" to VM #"+app.clist.get(i).getVmId());
sendNow(getVmsToDatacentersMap().get(this.getVmList().get(0).getId()), CloudSimTags.CLOUDLET_SUBMIT, app.clist.get(i));
// Log.printLine(CloudSim.clock()+": "+getName()+
// Sending cloudlet
sendNow(getVmsToDatacentersMap().get(
this.getVmList().get(0).getId()),
CloudSimTags.CLOUDLET_SUBMIT, app.clist.get(i));
}
System.out.println("app"+(k++));
System.out.println("app" + (k++));
}
}
}
}
setAppCloudletList(new ArrayList<AppCloudlet>());
if(Constants.iteration<10){
Constants.iteration++;
this.schedule(this.getId(), Constants.nexttime, CloudSimTags.NextCycle);
if (NetworkConstants.iteration < 10) {
NetworkConstants.iteration++;
this.schedule(this.getId(), NetworkConstants.nexttime,
CloudSimTags.NextCycle);
}
getDatacenterRequestedIdsList().add(datacenterId);
setVmsRequested(requestedVms);
setVmsAcks(0);
}
private void CreateVMs(int datacenterId) {
private void CreateVMs(int datacenterId) {
// TODO Auto-generated method stub
int numVM=this.linkDC.getHostList().size()*Constants.maxhostVM; // two VMs per host
for(int i=0;i<numVM;i++)
{
int requestedVms = 0;
int vmid = i;
int numVM = this.linkDC.getHostList().size() * NetworkConstants.maxhostVM; // two
// VMs
// per
// host
for (int i = 0; i < numVM; i++) {
int requestedVms = 0;
int vmid = i;
int mips = 1;
long size = 10000; // image size (MB)
int ram = 512; // vm memory (MB)
long bw = 1000;
int pesNumber = Constants.HOST_PEs/Constants.maxhostVM; // number of cpus
int pesNumber = NetworkConstants.HOST_PEs / NetworkConstants.maxhostVM; // number
// of
// cpus
String vmm = "Xen"; // VMM name
// create VM
NetworkVm vm = new NetworkVm(vmid, this.getId(), mips, pesNumber, ram, bw, size, vmm, new CloudletHPCSpaceShared());
this.linkDC.processVmCreateHPC(vm);
NetworkVm vm = new NetworkVm(vmid, this.getId(), mips, pesNumber,
ram, bw, size, vmm, new NetworkCloudletSpaceSharedScheduler());
this.linkDC.processVmCreateNetwork(vm);
// add the VM to the vmList
getVmList().add(vm);
requestedVms++;
getVmsToDatacentersMap().put(vmid, datacenterId);
getVmsCreatedList().add(VmList.getById(getVmList(), vmid));
}
}
}
/**
* Submit cloudlets to the created VMs.
*
* @pre $none
* @post $none
/**
* Destroy the virtual machines running in datacenters.
*
* Submit cloudlets to the created VMs.
*
* @pre $none
* @post $none /** Destroy the virtual machines running in datacenters.
*
* @pre $none
* @post $none
*/
protected void clearDatacenters() {
for (Vm vm : getVmsCreatedList()) {
Log.printLine(CloudSim.clock() + ": " + getName() + ": Destroying VM #" + vm.getId());
sendNow(getVmsToDatacentersMap().get(vm.getId()), CloudSimTags.VM_DESTROY, vm);
Log.printLine(CloudSim.clock() + ": " + getName()
+ ": Destroying VM #" + vm.getId());
sendNow(getVmsToDatacentersMap().get(vm.getId()),
CloudSimTags.VM_DESTROY, vm);
}
getVmsCreatedList().clear();
......@@ -455,7 +467,7 @@ public class NetDatacenterBroker extends SimEntity {
/**
* Send an internal event communicating the end of the simulation.
*
*
* @pre $none
* @post $none
*/
......@@ -463,15 +475,19 @@ public class NetDatacenterBroker extends SimEntity {
sendNow(getId(), CloudSimTags.END_OF_SIMULATION);
}
/* (non-Javadoc)
/*
* (non-Javadoc)
*
* @see cloudsim.core.SimEntity#shutdownEntity()
*/
@Override
public void shutdownEntity() {
Log.printLine(getName() + " is shutting down...");
Log.printLine(getName() + " is shutting down...");
}
/* (non-Javadoc)
/*
* (non-Javadoc)
*
* @see cloudsim.core.SimEntity#startEntity()
*/
@Override
......@@ -482,8 +498,9 @@ public class NetDatacenterBroker extends SimEntity {
/**
* Gets the vm list.
*
* @param <T> the generic type
*
* @param <T>
* the generic type
* @return the vm list
*/
@SuppressWarnings("unchecked")
......@@ -493,19 +510,21 @@ public class NetDatacenterBroker extends SimEntity {
/**
* Sets the vm list.
*
* @param <T> the generic type
* @param vmList the new vm list
*
* @param <T>
* the generic type
* @param vmList
* the new vm list
*/
protected <T extends Vm> void setVmList(List<T> vmList) {
this.vmList = vmList;
}
/**
* Gets the cloudlet list.
*
* @param <T> the generic type
*
* @param <T>
* the generic type
* @return the cloudlet list
*/
@SuppressWarnings("unchecked")
......@@ -513,29 +532,33 @@ public class NetDatacenterBroker extends SimEntity {
return (List<T>) cloudletList;
}
/**
* Sets the cloudlet list.
*
* @param <T> the generic type
* @param cloudletList the new cloudlet list
*/
protected <T extends NetworkCloudlet> void setCloudletList(List<T> cloudletList) {
*
* @param <T>
* the generic type
* @param cloudletList
* the new cloudlet list
*/
protected <T extends NetworkCloudlet> void setCloudletList(
List<T> cloudletList) {
this.cloudletList = cloudletList;
}
public<T extends AppCloudlet> List<T>getAppCloudletList() {
return (List<T>)appCloudletList;
public <T extends AppCloudlet> List<T> getAppCloudletList() {
return (List<T>) appCloudletList;
}
public <T extends AppCloudlet> void setAppCloudletList(List<T> appCloudletList) {
public <T extends AppCloudlet> void setAppCloudletList(
List<T> appCloudletList) {
this.appCloudletList = appCloudletList;
}
/**
* Gets the cloudlet submitted list.
*
* @param <T> the generic type
*
* @param <T>
* the generic type
* @return the cloudlet submitted list
*/
@SuppressWarnings("unchecked")
......@@ -543,21 +566,24 @@ public class NetDatacenterBroker extends SimEntity {
return (List<T>) cloudletSubmittedList;
}
/**
* Sets the cloudlet submitted list.
*
* @param <T> the generic type
* @param cloudletSubmittedList the new cloudlet submitted list
*/
protected <T extends Cloudlet> void setCloudletSubmittedList(List<T> cloudletSubmittedList) {
*
* @param <T>
* the generic type
* @param cloudletSubmittedList
* the new cloudlet submitted list
*/
protected <T extends Cloudlet> void setCloudletSubmittedList(
List<T> cloudletSubmittedList) {
this.cloudletSubmittedList = cloudletSubmittedList;
}
/**
* Gets the cloudlet received list.
*
* @param <T> the generic type
*
* @param <T>
* the generic type
* @return the cloudlet received list
*/
@SuppressWarnings("unchecked")
......@@ -567,18 +593,22 @@ public class NetDatacenterBroker extends SimEntity {
/**
* Sets the cloudlet received list.
*
* @param <T> the generic type
* @param cloudletReceivedList the new cloudlet received list
*/
protected <T extends Cloudlet> void setCloudletReceivedList(List<T> cloudletReceivedList) {
*
* @param <T>
* the generic type
* @param cloudletReceivedList
* the new cloudlet received list
*/
protected <T extends Cloudlet> void setCloudletReceivedList(
List<T> cloudletReceivedList) {
this.cloudletReceivedList = cloudletReceivedList;
}
/**
* Gets the vm list.
*
* @param <T> the generic type
*
* @param <T>
* the generic type
* @return the vm list
*/
@SuppressWarnings("unchecked")
......@@ -588,9 +618,11 @@ public class NetDatacenterBroker extends SimEntity {
/**
* Sets the vm list.
*
* @param <T> the generic type
* @param vmsCreatedList the vms created list
*
* @param <T>
* the generic type
* @param vmsCreatedList
* the vms created list
*/
protected <T extends Vm> void setVmsCreatedList(List<T> vmsCreatedList) {
this.vmsCreatedList = vmsCreatedList;
......@@ -598,7 +630,7 @@ public class NetDatacenterBroker extends SimEntity {
/**
* Gets the vms requested.
*
*
* @return the vms requested
*/
protected int getVmsRequested() {
......@@ -607,8 +639,9 @@ public class NetDatacenterBroker extends SimEntity {
/**
* Sets the vms requested.
*
* @param vmsRequested the new vms requested
*
* @param vmsRequested
* the new vms requested
*/
protected void setVmsRequested(int vmsRequested) {
this.vmsRequested = vmsRequested;
......@@ -616,7 +649,7 @@ public class NetDatacenterBroker extends SimEntity {
/**
* Gets the vms acks.
*
*
* @return the vms acks
*/
protected int getVmsAcks() {
......@@ -625,8 +658,9 @@ public class NetDatacenterBroker extends SimEntity {
/**
* Sets the vms acks.
*
* @param vmsAcks the new vms acks
*
* @param vmsAcks
* the new vms acks
*/
protected void setVmsAcks(int vmsAcks) {
this.vmsAcks = vmsAcks;
......@@ -641,7 +675,7 @@ public class NetDatacenterBroker extends SimEntity {
/**
* Gets the vms destroyed.
*
*
* @return the vms destroyed
*/
protected int getVmsDestroyed() {
......@@ -650,8 +684,9 @@ public class NetDatacenterBroker extends SimEntity {
/**
* Sets the vms destroyed.
*
* @param vmsDestroyed the new vms destroyed
*
* @param vmsDestroyed
* the new vms destroyed
*/
protected void setVmsDestroyed(int vmsDestroyed) {
this.vmsDestroyed = vmsDestroyed;
......@@ -659,7 +694,7 @@ public class NetDatacenterBroker extends SimEntity {
/**
* Gets the datacenter ids list.
*
*
* @return the datacenter ids list
*/
protected List<Integer> getDatacenterIdsList() {
......@@ -668,8 +703,9 @@ public class NetDatacenterBroker extends SimEntity {
/**
* Sets the datacenter ids list.
*
* @param datacenterIdsList the new datacenter ids list
*
* @param datacenterIdsList
* the new datacenter ids list
*/
protected void setDatacenterIdsList(List<Integer> datacenterIdsList) {
this.datacenterIdsList = datacenterIdsList;
......@@ -677,7 +713,7 @@ public class NetDatacenterBroker extends SimEntity {
/**
* Gets the vms to datacenters map.
*
*
* @return the vms to datacenters map
*/
protected Map<Integer, Integer> getVmsToDatacentersMap() {
......@@ -686,16 +722,18 @@ public class NetDatacenterBroker extends SimEntity {
/**
* Sets the vms to datacenters map.
*
* @param vmsToDatacentersMap the vms to datacenters map
*
* @param vmsToDatacentersMap
* the vms to datacenters map
*/
protected void setVmsToDatacentersMap(Map<Integer, Integer> vmsToDatacentersMap) {
protected void setVmsToDatacentersMap(
Map<Integer, Integer> vmsToDatacentersMap) {
this.vmsToDatacentersMap = vmsToDatacentersMap;
}
/**
* Gets the datacenter characteristics list.
*
*
* @return the datacenter characteristics list
*/
protected Map<Integer, DatacenterCharacteristics> getDatacenterCharacteristicsList() {
......@@ -704,16 +742,18 @@ public class NetDatacenterBroker extends SimEntity {
/**
* Sets the datacenter characteristics list.
*
* @param datacenterCharacteristicsList the datacenter characteristics list
*
* @param datacenterCharacteristicsList
* the datacenter characteristics list
*/
protected void setDatacenterCharacteristicsList(Map<Integer, DatacenterCharacteristics> datacenterCharacteristicsList) {
protected void setDatacenterCharacteristicsList(
Map<Integer, DatacenterCharacteristics> datacenterCharacteristicsList) {
this.datacenterCharacteristicsList = datacenterCharacteristicsList;
}
/**
* Gets the datacenter requested ids list.
*
*
* @return the datacenter requested ids list
*/
protected List<Integer> getDatacenterRequestedIdsList() {
......@@ -722,10 +762,12 @@ public class NetDatacenterBroker extends SimEntity {
/**
* Sets the datacenter requested ids list.
*
* @param datacenterRequestedIdsList the new datacenter requested ids list
*
* @param datacenterRequestedIdsList
* the new datacenter requested ids list
*/
protected void setDatacenterRequestedIdsList(List<Integer> datacenterRequestedIdsList) {
protected void setDatacenterRequestedIdsList(
List<Integer> datacenterRequestedIdsList) {
this.datacenterRequestedIdsList = datacenterRequestedIdsList;
}
......
package org.cloudbus.cloudsim.network.datacenter;
public class NetPacket {
public NetPacket(int sender, int reciever, double data, double sendtime,
double recievetime,int vsnd,int vrvd) {
super();
this.sender = sender;
this.reciever = reciever;
this.data = data;
this.sendtime = sendtime;
this.recievetime = recievetime;
this.virtualrecvid=vrvd;
this.virtualsendid=vsnd;
}
int sender;
int virtualrecvid;
int virtualsendid;
int reciever;
double data;
double sendtime;
double recievetime;
}
package org.cloudbus.cloudsim.network.datacenter;
import java.util.ArrayList;
import java.util.Map;
import org.cloudbus.cloudsim.Cloudlet;
import org.cloudbus.cloudsim.UtilizationModel;
/**
* NetworkCloudlet class extends Cloudlet to support simulation of complex applications.
* Each such network Cloudlet represents a task of the application. Each task consists of several
* stages.
*
* Please refer to following publication for more details:
*
* Saurabh Kumar Garg and Rajkumar Buyya, NetworkCloudSim: Modelling Parallel
* Applications in Cloud Simulations, Proceedings of the 4th IEEE/ACM
* International Conference on Utility and Cloud Computing (UCC 2011, IEEE CS
* Press, USA), Melbourne, Australia, December 5-7, 2011.
*
*
* @author Saurabh Kumar Garg
* @since CloudSim Toolkit 1.0
*/
public class NetworkCloudlet extends Cloudlet implements Comparable {
public class NetworkCloudlet extends Cloudlet implements Comparable{
long memory;
public NetworkCloudlet(int cloudletId, long cloudletLength,
int pesNumber, long cloudletFileSize, long cloudletOutputSize, long memory,
public NetworkCloudlet(int cloudletId, long cloudletLength, int pesNumber,
long cloudletFileSize, long cloudletOutputSize, long memory,
UtilizationModel utilizationModelCpu,
UtilizationModel utilizationModelRam,
UtilizationModel utilizationModelBw) {
......@@ -21,41 +34,36 @@ public class NetworkCloudlet extends Cloudlet implements Comparable{
cloudletOutputSize, utilizationModelCpu, utilizationModelRam,
utilizationModelBw);
// TODO Auto-generated constructor stub
currStagenum=-1;
this.memory=memory;
stages=new ArrayList<TaskStage>();
currStagenum = -1;
this.memory = memory;
stages = new ArrayList<TaskStage>();
}
public double submittime;
public double finishtime;
public double exetime;
public double numStage;
public int currStagenum;
public double submittime; //time when cloudlet will be submitted
public double finishtime; //time when cloudlet finish execution
public double exetime; //execution time for cloudlet
public double numStage;//number of stages in cloudlet
public int currStagenum; //current stage of cloudlet execution
public double timetostartStage;
public double timespentInStage;
public Map<Double, NetPacket> timeCommunicate;
public ArrayList<TaskStage> stages;
public double starttime;
public double timespentInStage; //how much time spent in particular stage
public Map<Double, HostPacket> timeCommunicate;
public ArrayList<TaskStage> stages; //all stages which cloudlet execution consists of.
public double starttime;
@Override
public int compareTo(Object arg0) {
// TODO Auto-generated method stub
NetworkCloudlet s1=(NetworkCloudlet)arg0;
int alpha=0;
NetworkCloudlet s1 = (NetworkCloudlet) arg0;
int alpha = 0;
return 0;
}
public double getSubmittime() {
// TODO Auto-generated method stub
return submittime;
};
}
package org.cloudbus.cloudsim.network.datacenter;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
......@@ -16,30 +15,28 @@ import org.cloudbus.cloudsim.ResCloudlet;
import org.cloudbus.cloudsim.core.CloudSim;
import org.cloudbus.cloudsim.core.CloudSimTags;
public class CloudletHPCSpaceSharedO extends CloudletScheduler{
/*
* Title: CloudSim Toolkit
* Description: CloudSim (Cloud Simulation) Toolkit for Modeling and Simulation of Clouds
* Licence: GPL - http://www.gnu.org/copyleft/gpl.html
*
* Copyright (c) 2009-2010, The University of Melbourne, Australia
*/
public class NetworkCloudletSpaceSharedScheduler extends CloudletScheduler {
/*
* Title: CloudSim Toolkit Description: CloudSim (Cloud Simulation) Toolkit
* for Modeling and Simulation of Clouds Licence: GPL -
* http://www.gnu.org/copyleft/gpl.html
*
* Copyright (c) 2009-2010, The University of Melbourne, Australia
*/
/**
* CloudletSchedulerSpaceShared implements a policy of
* scheduling performed by a virtual machine. It consider
* that there will be only one cloudlet per VM. Other cloudlets will be in a
* waiting list. We consider that file transfer from cloudlets waiting happens
* before cloudlet execution. I.e., even though cloudlets must wait for CPU,
* data transfer happens as soon as cloudlets are submitted.
*
* @author Rodrigo N. Calheiros
* @author Anton Beloglazov
* @since CloudSim Toolkit 1.0
*/
/**
* CloudletSchedulerSpaceShared implements a policy of scheduling performed
* by a virtual machine. It consider that there will be only one cloudlet
* per VM. Other cloudlets will be in a waiting list. We consider that file
* transfer from cloudlets waiting happens before cloudlet execution. I.e.,
* even though cloudlets must wait for CPU, data transfer happens as soon as
* cloudlets are submitted.
*
* @author Saurabh Kumar Garg
* @author Saurabh Kumar Garg
* @since CloudSim Toolkit 3.0
*/
/** The cloudlet waiting list. */
private List<? extends ResCloudlet> cloudletWaitingList;
......@@ -58,23 +55,20 @@ public class CloudletHPCSpaceSharedO extends CloudletScheduler{
/** The used PEs. */
protected int usedPes;
//for network
private ResCloudlet buffered;//to overlap with communication
private double lastbufferUpdateTime;
public Map<Integer,List<NetPacket>> pkttosend;
public Map<Integer,List<NetPacket>> pktrecv;
// for network
public Map<Integer, List<HostPacket>> pkttosend;
public Map<Integer, List<HostPacket>> pktrecv;
/**
* Creates a new CloudletSchedulerSpaceShared object. This method must be invoked
* before starting the actual simulation.
*
* Creates a new CloudletSchedulerSpaceShared object. This method must be
* invoked before starting the actual simulation.
*
* @pre $none
* @post $none
*/
public CloudletHPCSpaceSharedO() {
public NetworkCloudletSpaceSharedScheduler() {
super();
this.cloudletWaitingList = new ArrayList<ResCloudlet>();
this.cloudletExecList = new ArrayList<ResCloudlet>();
......@@ -82,29 +76,34 @@ public class CloudletHPCSpaceSharedO extends CloudletScheduler{
this.cloudletFinishedList = new ArrayList<ResCloudlet>();
this.usedPes = 0;
this.currentCpus = 0;
this.pkttosend= new HashMap<Integer,List<NetPacket>>();
this.pktrecv= new HashMap<Integer,List<NetPacket>>();
//this.buffered=new ArrayList<ResCloudlet>();
this.pkttosend = new HashMap<Integer, List<HostPacket>>();
this.pktrecv = new HashMap<Integer, List<HostPacket>>();
}
/**
* Updates the processing of cloudlets running under management of this scheduler.
*
* @param currentTime current simulation time
* @param mipsShare array with MIPS share of each processor available to the scheduler
*
* @return time predicted completion time of the earliest finishing cloudlet, or 0
* if there is no next events
*
* Updates the processing of cloudlets running under management of this
* scheduler.
*
* @param currentTime
* current simulation time
* @param mipsShare
* array with MIPS share of each processor available to the
* scheduler
*
* @return time predicted completion time of the earliest finishing
* cloudlet, or 0 if there is no next events
*
* @pre currentTime >= 0
* @post $none
*/
@Override
public double updateVmProcessing(double currentTime, List<Double> mipsShare) {
setCurrentMipsShare(mipsShare);
double timeSpam = currentTime - getPreviousTime(); // time since last update
double timeSpam = currentTime - getPreviousTime(); // time since last
// update
double capacity = 0.0;
int cpus = 0;
for (Double mips : mipsShare) { // count the CPUs available to the VMM
capacity += mips;
if (mips > 0) {
......@@ -113,111 +112,102 @@ public class CloudletHPCSpaceSharedO extends CloudletScheduler{
}
currentCpus = cpus;
capacity /= cpus; // average capacity of each cpu
if(getCloudletExecList().size()>1)
System.out.println("Something is wrong "+getCloudletExecList().size());
for (ResCloudlet rcl : getCloudletExecList()) { // each machine in the exec list has the same amount of cpu
NetworkCloudlet cl=(NetworkCloudlet) rcl.getCloudlet();
if((cl.currStagenum!=-1))
{
if(cl.currStagenum==Constants.FINISH){
//long len=rcl.getRemainingCloudletLength();
//rcl.updateCloudletFinishedSoFar(len);
for (ResCloudlet rcl : getCloudletExecList()) { // each machine in the
// exec list has the
// same amount of cpu
NetworkCloudlet cl = (NetworkCloudlet) rcl.getCloudlet();
// check status
// if execution stage
// update the cloudlet finishtime
// CHECK WHETHER IT IS WAITING FOR THE PACKET
// if packet received change the status of job and update the time.
//
if ((cl.currStagenum != -1)) {
if (cl.currStagenum == NetworkConstants.FINISH) {
// long len=rcl.getRemainingCloudletLength();
// rcl.updateCloudletFinishedSoFar(len);
break;
}
TaskStage st= cl.stages.get(cl.currStagenum);
if(st.type==Constants.EXECUTION)
{
//if(Constants.logflag)
//System.out.println(cl.getCloudletId()+ "Cloudlet is in Execution: "+ CloudSim.clock());
//rcl.updateCloudletFinishedSoFar((long) (capacity * Math.round(timeSpam) * rcl.getPesNumber()));
//update the time
cl.timespentInStage+=Math.round(CloudSim.clock()-cl.timetostartStage);
if(cl.getCloudletId()==198)
System.out.println("I am in 198 "+CloudSim.clock());
if(cl.timespentInStage>=st.time)
{
if(cl.getCloudletId()==198)
System.out.println("I am in 198 "+CloudSim.clock());
changetonextstage(cl,st);
//change the stage
}
TaskStage st = cl.stages.get(cl.currStagenum);
if (st.type == NetworkConstants.EXECUTION) {
// rcl.updateCloudletFinishedSoFar((long) (capacity *
// Math.round(timeSpam) * rcl.getPesNumber()));
// update the time
cl.timespentInStage = Math.round(CloudSim.clock()
- cl.timetostartStage);
if (cl.timespentInStage >= st.time) {
changetonextstage(cl, st);
// change the stage
}
}
if(st.type==Constants.WAIT_RECV)
{
List<NetPacket> pktlist=this.pktrecv.get(st.vpeer);
if(Constants.logflag)
System.out.println(cl.getCloudletId()+ "Cloudlet is in Recieve: "+ CloudSim.clock());
List<NetPacket> pkttoremove=new ArrayList<NetPacket>();
if(pktlist!=null){
if(pktlist.size()!=0)
{
Iterator it=pktlist.iterator();
NetPacket pkt=null;
while(it.hasNext())
{
pkt=(NetPacket)it.next();
if(pkt.virtualrecvid==cl.getCloudletId())//Asumption packet will not arrive in the same cycle
{
pkt.recievetime=CloudSim.clock();
st.time=CloudSim.clock()-pkt.sendtime;
changetonextstage(cl,st);
pkttoremove.add(pkt);
}
}
pktlist.removeAll(pkttoremove);
//if(pkt!=null)
//else wait for recieving the packet
}
}
if(buffered!=null)
updatebuffered(CloudSim.clock());
else {
//System.out.println("Update Buffer");
}
if (st.type == NetworkConstants.WAIT_RECV) {
List<HostPacket> pktlist = this.pktrecv.get(st.peer);
List<HostPacket> pkttoremove = new ArrayList<HostPacket>();
if (pktlist != null) {
Iterator it = pktlist.iterator();
HostPacket pkt = null;
if (it.hasNext()) {
pkt = (HostPacket) it.next();
if (pkt.reciever == cl.getVmId())// Asumption packet
// will not
// arrive in the
// same cycle
{
pkt.recievetime = CloudSim.clock();
st.time = CloudSim.clock() - pkt.sendtime;
changetonextstage(cl, st);
pkttoremove.add(pkt);
}
}
pktlist.removeAll(pkttoremove);
// if(pkt!=null)
// else wait for recieving the packet
}
}
}
else
{
cl.currStagenum=0;
cl.timetostartStage=CloudSim.clock();
if(cl.stages.get(0).type==Constants.EXECUTION)
NetDatacenterBroker.linkDC.schedule(NetDatacenterBroker.linkDC.getId(),cl.stages.get(0).time, CloudSimTags.VM_DATACENTER_EVENT);
} else {
cl.currStagenum = 0;
cl.timetostartStage = CloudSim.clock();
if (cl.stages.get(0).type == NetworkConstants.EXECUTION)
NetDatacenterBroker.linkDC.schedule(
NetDatacenterBroker.linkDC.getId(),
cl.stages.get(0).time,
CloudSimTags.VM_DATACENTER_EVENT);
else
NetDatacenterBroker.linkDC.schedule(NetDatacenterBroker.linkDC.getId(),0.0001, CloudSimTags.VM_DATACENTER_EVENT);
///sendstage///
NetDatacenterBroker.linkDC.schedule(
NetDatacenterBroker.linkDC.getId(), 0.0001,
CloudSimTags.VM_DATACENTER_EVENT);
// /sendstage///
}
//check status
//if execution stage
//update the cloudlet finishtime
//CHECK WHETHER IT IS WAITING FOR THE PACKET
// if packet received change the status of job and update the time.
//
//rcl.updateCloudletFinishedSoFar((long) (capacity * timeSpam * rcl.getPesNumber()));
}
if (getCloudletExecList().size() == 0 && getCloudletWaitingList().size() == 0) { // no more cloudlets in this scheduler
if (getCloudletExecList().size() == 0
&& getCloudletWaitingList().size() == 0) { // no more cloudlets
// in this scheduler
setPreviousTime(currentTime);
return 0.0;
}
//update each cloudlet
// update each cloudlet
int finished = 0;
int cont = 0;
List<ResCloudlet> toRemove = new ArrayList<ResCloudlet>();
for (ResCloudlet rcl : getCloudletExecList()) {
//if (rcl.getRemainingCloudletLength() == 0.0) {// finished anyway, rounding issue...
if(((NetworkCloudlet)(rcl.getCloudlet())).currStagenum==Constants.FINISH){
//stage is changed and packet to send
System.out.println(rcl.getCloudletId()+ "Cloudlet is in finished: "+ CloudSim.clock());
((NetworkCloudlet)(rcl.getCloudlet())).finishtime=CloudSim.clock();
// if (rcl.getRemainingCloudletLength() == 0.0) {// finished anyway,
// rounding issue...
if (((NetworkCloudlet) (rcl.getCloudlet())).currStagenum == NetworkConstants.FINISH) {
// stage is changed and packet to send
((NetworkCloudlet) (rcl.getCloudlet())).finishtime = CloudSim
.clock();
toRemove.add(rcl);
cloudletFinish(rcl);
finished++;
......@@ -225,66 +215,36 @@ public class CloudletHPCSpaceSharedO extends CloudletScheduler{
cont++;
}
getCloudletExecList().removeAll(toRemove);
//add all the CloudletExecList in waitingList.
//sort the waitinglist
// add all the CloudletExecList in waitingList.
// sort the waitinglist
//
//for each finished cloudlet, add a new one from the waiting list
// for each finished cloudlet, add a new one from the waiting list
if (!getCloudletWaitingList().isEmpty()) {
if(this.buffered==null){
buffered=getCloudletWaitingList().get(0);
NetworkCloudlet cl=(NetworkCloudlet)(buffered.getCloudlet());
cl.currStagenum=0;
cl.timetostartStage=CloudSim.clock();
}
for (int i = 0; i < finished; i++) {
toRemove.clear();
for (ResCloudlet rcl : getCloudletWaitingList()) {
if ((currentCpus - usedPes) >= rcl.getPesNumber()) {
NetworkCloudlet cl1=(NetworkCloudlet)(rcl.getCloudlet());
if(cl1.currStagenum==Constants.FINISH)
{
System.out.println(rcl.getCloudletId()+ "Cloudlet is in finished: "+ CloudSim.clock());
((NetworkCloudlet)(rcl.getCloudlet())).finishtime=CloudSim.clock();
rcl.setCloudletStatus(Cloudlet.SUCCESS);
rcl.finalizeCloudlet();
getCloudletFinishedList().add(rcl);
toRemove.add(rcl);
continue;
}
rcl.setCloudletStatus(Cloudlet.INEXEC);
for (int k = 0; k < rcl.getPesNumber(); k++) {
rcl.setMachineAndPeId(0, i);
}
getCloudletExecList().add(rcl);
usedPes += rcl.getPesNumber();
toRemove.add(rcl);
// if(buffered!=null){
// HPCCloudlet cl=(HPCCloudlet)(buffered.getCloudlet());
// cl.timetostartStage=CloudSim.clock();
// }
buffered=null;
break;
}
}
getCloudletWaitingList().removeAll(toRemove);
}// for(cont)
}
}
//estimate finish time of cloudlets in the execution queue
// estimate finish time of cloudlets in the execution queue
double nextEvent = Double.MAX_VALUE;
for (ResCloudlet rcl : getCloudletExecList()) {
double remainingLength = rcl.getRemainingCloudletLength();
NetworkCloudlet cl=(NetworkCloudlet) rcl.getCloudlet();
if(cl.currStagenum==-1)
{
cl.currStagenum=0;
}
double estimatedFinishTime = currentTime+cl.stages.get(cl.currStagenum).time;//currentTime + (remainingLength / (capacity * rcl.getPesNumber()));
double estimatedFinishTime = currentTime
+ (remainingLength / (capacity * rcl.getPesNumber()));
if (estimatedFinishTime - currentTime < 0.1) {
estimatedFinishTime = currentTime + 0.1;
}
......@@ -296,96 +256,65 @@ public class CloudletHPCSpaceSharedO extends CloudletScheduler{
return nextEvent;
}
private void updatebuffered(double time) {
private void changetonextstage(NetworkCloudlet cl, TaskStage st) {
// TODO Auto-generated method stub
NetworkCloudlet cl=(NetworkCloudlet)(buffered.getCloudlet());
if(cl.currStagenum==Constants.FINISH){
System.out.println(cl.getCloudletId()+ "Cloudlet is in finished: "+ CloudSim.clock());
cl.finishtime=CloudSim.clock();
buffered.setCloudletStatus(Cloudlet.SUCCESS);
buffered.finalizeCloudlet();
getCloudletFinishedList().add(buffered);
this.getCloudletWaitingList().remove(buffered);
buffered=null;
return;
}
time=CloudSim.clock()-this.lastbufferUpdateTime;
TaskStage st= cl.stages.get(cl.currStagenum);
if(st.type==Constants.EXECUTION)
{
//rcl.updateCloudletFinishedSoFar((long) (capacity * Math.round(timeSpam) * rcl.getPesNumber()));
//update the time
cl.timespentInStage+=time;
//cl.timetostartStage=CloudSim.clock();
if(cl.timespentInStage>=st.time)
{
changetonextstage(cl,st);
//change the stage
}
cl.timespentInStage = 0;
cl.timetostartStage = CloudSim.clock();
int currstage = cl.currStagenum;
if (currstage >= (cl.stages.size() - 1))
cl.currStagenum = NetworkConstants.FINISH;
else {
cl.currStagenum = currstage + 1;
TaskStage st1 = cl.stages.get(cl.currStagenum);
int i = 0;
for (i = cl.currStagenum; i < cl.stages.size(); i++) {
if (cl.stages.get(i).type == NetworkConstants.WAIT_SEND) {
HostPacket pkt = new HostPacket(cl.getVmId(),
cl.stages.get(i).peer, cl.stages.get(i).data,
CloudSim.clock(), -1, cl.getCloudletId(),
cl.stages.get(i).vpeer);
List<HostPacket> pktlist = this.pkttosend.get(cl.getVmId());
if (pktlist == null)
pktlist = new ArrayList<HostPacket>();
pktlist.add(pkt);
this.pkttosend.put(cl.getVmId(), pktlist);
} else
break;
}
NetDatacenterBroker.linkDC.schedule(
NetDatacenterBroker.linkDC.getId(), 0.0001,
CloudSimTags.VM_DATACENTER_EVENT);
if (i == cl.stages.size())
cl.currStagenum = NetworkConstants.FINISH;
else {
cl.currStagenum = i;
if (cl.stages.get(i).type == NetworkConstants.EXECUTION)
NetDatacenterBroker.linkDC.schedule(
NetDatacenterBroker.linkDC.getId(),
cl.stages.get(i).time,
CloudSimTags.VM_DATACENTER_EVENT);
}
}
}
private void changetonextstage(NetworkCloudlet cl, TaskStage st) {
// TODO Auto-generated method stub
cl.timespentInStage=0;
cl.timetostartStage=CloudSim.clock();
int currstage=cl.currStagenum;
if(currstage>=(cl.stages.size()-1))
cl.currStagenum=Constants.FINISH;
else{
if(cl.currStagenum==Constants.FINISH) return;
cl.currStagenum=currstage+1;
TaskStage st1=cl.stages.get(cl.currStagenum);
int i=0;
for(i=cl.currStagenum;i<cl.stages.size();i++)
{
if(cl.stages.get(i).type==Constants.WAIT_SEND)
{
if(Constants.logflag)
System.out.println(cl.getCloudletId()+ "Cloudlet is in Sending: "+ CloudSim.clock());
NetPacket pkt=new NetPacket(cl.getVmId(), cl.stages.get(i).peer, cl.stages.get(i).data, CloudSim.clock(),-1,cl.getCloudletId(),cl.stages.get(i).vpeer);
List<NetPacket> pktlist=this.pkttosend.get(cl.getVmId());
if(pktlist==null)
pktlist=new ArrayList<NetPacket>();
pktlist.add(pkt);
this.pkttosend.put(cl.getVmId(), pktlist);
}
else break;
}
NetDatacenterBroker.linkDC.schedule(NetDatacenterBroker.linkDC.getId(),0.0001, CloudSimTags.VM_DATACENTER_EVENT);
if(i==cl.stages.size()) cl.currStagenum=Constants.FINISH;
else {
cl.currStagenum=i;
if(cl.stages.get(i).type==Constants.EXECUTION)
NetDatacenterBroker.linkDC.schedule(NetDatacenterBroker.linkDC.getId(),cl.stages.get(i).time, CloudSimTags.VM_DATACENTER_EVENT);
if(cl.stages.get(i).type==Constants.WAIT_RECV)
{ if(buffered!=null)
this.lastbufferUpdateTime=CloudSim.clock();
}
}
}
}
/**
* Cancels execution of a cloudlet.
*
* @param cloudletId ID of the cloudlet being cancealed
*
*
* @param cloudletId
* ID of the cloudlet being cancealed
*
* @return the canceled cloudlet, $null if not found
*
*
* @pre $none
* @post $none
*/
@Override
public Cloudlet cloudletCancel(int cloudletId) {
//First, looks in the finished queue
// First, looks in the finished queue
for (ResCloudlet rcl : getCloudletFinishedList()) {
if (rcl.getCloudletId() == cloudletId) {
getCloudletFinishedList().remove(rcl);
......@@ -393,7 +322,7 @@ public class CloudletHPCSpaceSharedO extends CloudletScheduler{
}
}
//Then searches in the exec list
// Then searches in the exec list
for (ResCloudlet rcl : getCloudletExecList()) {
if (rcl.getCloudletId() == cloudletId) {
getCloudletExecList().remove(rcl);
......@@ -406,7 +335,7 @@ public class CloudletHPCSpaceSharedO extends CloudletScheduler{
}
}
//Now, looks in the paused queue
// Now, looks in the paused queue
for (ResCloudlet rcl : getCloudletPausedList()) {
if (rcl.getCloudletId() == cloudletId) {
getCloudletPausedList().remove(rcl);
......@@ -414,7 +343,7 @@ public class CloudletHPCSpaceSharedO extends CloudletScheduler{
}
}
//Finally, looks in the waiting list
// Finally, looks in the waiting list
for (ResCloudlet rcl : getCloudletWaitingList()) {
if (rcl.getCloudletId() == cloudletId) {
rcl.setCloudletStatus(Cloudlet.CANCELED);
......@@ -429,11 +358,12 @@ public class CloudletHPCSpaceSharedO extends CloudletScheduler{
/**
* Pauses execution of a cloudlet.
*
* @param cloudletId ID of the cloudlet being paused
*
*
* @param cloudletId
* ID of the cloudlet being paused
*
* @return $true if cloudlet paused, $false otherwise
*
*
* @pre $none
* @post $none
*/
......@@ -442,7 +372,7 @@ public class CloudletHPCSpaceSharedO extends CloudletScheduler{
boolean found = false;
int position = 0;
//first, looks for the cloudlet in the exec list
// first, looks for the cloudlet in the exec list
for (ResCloudlet rcl : getCloudletExecList()) {
if (rcl.getCloudletId() == cloudletId) {
found = true;
......@@ -451,8 +381,8 @@ public class CloudletHPCSpaceSharedO extends CloudletScheduler{
position++;
}
if (found){
//moves to the paused list
if (found) {
// moves to the paused list
ResCloudlet rgl = getCloudletExecList().remove(position);
if (rgl.getRemainingCloudletLength() == 0.0) {
cloudletFinish(rgl);
......@@ -464,7 +394,7 @@ public class CloudletHPCSpaceSharedO extends CloudletScheduler{
}
//now, look for the cloudlet in the waiting list
// now, look for the cloudlet in the waiting list
position = 0;
found = false;
for (ResCloudlet rcl : getCloudletWaitingList()) {
......@@ -493,9 +423,10 @@ public class CloudletHPCSpaceSharedO extends CloudletScheduler{
/**
* Processes a finished cloudlet.
*
* @param rcl finished cloudlet
*
*
* @param rcl
* finished cloudlet
*
* @pre rgl != $null
* @post $none
*/
......@@ -509,20 +440,21 @@ public class CloudletHPCSpaceSharedO extends CloudletScheduler{
/**
* Resumes execution of a paused cloudlet.
*
* @param cloudletId ID of the cloudlet being resumed
*
*
* @param cloudletId
* ID of the cloudlet being resumed
*
* @return $true if the cloudlet was resumed, $false otherwise
*
*
* @pre $none
* @post $none
*/
@Override
public double cloudletResume(int cloudletId) {
boolean found=false;
int position=0;
boolean found = false;
int position = 0;
//look for the cloudlet in the paused list
// look for the cloudlet in the paused list
for (ResCloudlet rcl : getCloudletPausedList()) {
if (rcl.getCloudletId() == cloudletId) {
found = true;
......@@ -531,10 +463,11 @@ public class CloudletHPCSpaceSharedO extends CloudletScheduler{
position++;
}
if (found){
if (found) {
ResCloudlet rcl = getCloudletPausedList().remove(position);
if ((currentCpus - usedPes) >= rcl.getPesNumber()) {// it can go to the exec list
if ((currentCpus - usedPes) >= rcl.getPesNumber()) {// it can go to
// the exec list
rcl.setCloudletStatus(Cloudlet.INEXEC);
for (int i = 0; i < rcl.getPesNumber(); i++) {
rcl.setMachineAndPeId(0, i);
......@@ -560,7 +493,8 @@ public class CloudletHPCSpaceSharedO extends CloudletScheduler{
capacity /= cpus;
long remainingLength = rcl.getRemainingCloudletLength();
double estimatedFinishTime = CloudSim.clock() + (remainingLength / (capacity * rcl.getPesNumber()));
double estimatedFinishTime = CloudSim.clock()
+ (remainingLength / (capacity * rcl.getPesNumber()));
return estimatedFinishTime;
} else {// no enough free PEs: go to the waiting queue
......@@ -576,25 +510,32 @@ public class CloudletHPCSpaceSharedO extends CloudletScheduler{
}
//not found in the paused list: either it is in in the queue, executing or not exist
// not found in the paused list: either it is in in the queue, executing
// or not exist
return 0.0;
}
/**
* Receives an cloudlet to be executed in the VM managed by this scheduler.
*
* @param cloudlet the submited cloudlet
* @param fileTransferTime time required to move the required files from the SAN to the VM
*
* @return expected finish time of this cloudlet, or 0 if it is in the waiting queue
*
*
* @param cloudlet
* the submited cloudlet
* @param fileTransferTime
* time required to move the required files from the SAN to the
* VM
*
* @return expected finish time of this cloudlet, or 0 if it is in the
* waiting queue
*
* @pre gl != null
* @post $none
*/
@Override
public double cloudletSubmit(Cloudlet cloudlet, double fileTransferTime) {
if ((currentCpus - usedPes) >= cloudlet.getPesNumber()) {// it can go to the exec list
if ((currentCpus - usedPes) >= cloudlet.getPesNumber()) {// it can go to
// the exec
// list
ResCloudlet rcl = new ResCloudlet(cloudlet);
rcl.setCloudletStatus(Cloudlet.INEXEC);
for (int i = 0; i < cloudlet.getPesNumber(); i++) {
......@@ -632,7 +573,9 @@ public class CloudletHPCSpaceSharedO extends CloudletScheduler{
return cloudlet.getCloudletLength() / capacity;
}
/* (non-Javadoc)
/*
* (non-Javadoc)
*
* @see cloudsim.CloudletScheduler#cloudletSubmit(cloudsim.Cloudlet)
*/
@Override
......@@ -643,11 +586,12 @@ public class CloudletHPCSpaceSharedO extends CloudletScheduler{
/**
* Gets the status of a cloudlet.
*
* @param cloudletId ID of the cloudlet
*
*
* @param cloudletId
* ID of the cloudlet
*
* @return status of the cloudlet, -1 if cloudlet not found
*
*
* @pre $none
* @post $none
*/
......@@ -676,9 +620,10 @@ public class CloudletHPCSpaceSharedO extends CloudletScheduler{
/**
* Get utilization created by all cloudlets.
*
* @param time the time
*
*
* @param time
* the time
*
* @return total utilization
*/
@Override
......@@ -691,11 +636,12 @@ public class CloudletHPCSpaceSharedO extends CloudletScheduler{
}
/**
* Informs about completion of some cloudlet in the VM managed
* by this scheduler.
*
* @return $true if there is at least one finished cloudlet; $false otherwise
*
* Informs about completion of some cloudlet in the VM managed by this
* scheduler.
*
* @return $true if there is at least one finished cloudlet; $false
* otherwise
*
* @pre $none
* @post $none
*/
......@@ -705,10 +651,11 @@ public class CloudletHPCSpaceSharedO extends CloudletScheduler{
}
/**
* Returns the next cloudlet in the finished list, $null if this list is empty.
*
* Returns the next cloudlet in the finished list, $null if this list is
* empty.
*
* @return a finished cloudlet
*
*
* @pre $none
* @post $none
*/
......@@ -722,9 +669,9 @@ public class CloudletHPCSpaceSharedO extends CloudletScheduler{
/**
* Returns the number of cloudlets runnning in the virtual machine.
*
*
* @return number of cloudlets runnning
*
*
* @pre $none
* @post $none
*/
......@@ -735,9 +682,9 @@ public class CloudletHPCSpaceSharedO extends CloudletScheduler{
/**
* Returns one cloudlet to migrate to another vm.
*
*
* @return one running cloudlet
*
*
* @pre $none
* @post $none
*/
......@@ -752,8 +699,9 @@ public class CloudletHPCSpaceSharedO extends CloudletScheduler{
/**
* Gets the cloudlet waiting list.
*
* @param <T> the generic type
*
* @param <T>
* the generic type
* @return the cloudlet waiting list
*/
@SuppressWarnings("unchecked")
......@@ -763,18 +711,22 @@ public class CloudletHPCSpaceSharedO extends CloudletScheduler{
/**
* Cloudlet waiting list.
*
* @param <T> the generic type
* @param cloudletWaitingList the cloudlet waiting list
*
* @param <T>
* the generic type
* @param cloudletWaitingList
* the cloudlet waiting list
*/
protected <T extends ResCloudlet> void cloudletWaitingList(List<T> cloudletWaitingList) {
protected <T extends ResCloudlet> void cloudletWaitingList(
List<T> cloudletWaitingList) {
this.cloudletWaitingList = cloudletWaitingList;
}
/**
* Gets the cloudlet exec list.
*
* @param <T> the generic type
*
* @param <T>
* the generic type
* @return the cloudlet exec list
*/
@SuppressWarnings("unchecked")
......@@ -784,18 +736,22 @@ public class CloudletHPCSpaceSharedO extends CloudletScheduler{
/**
* Sets the cloudlet exec list.
*
* @param <T> the generic type
* @param cloudletExecList the new cloudlet exec list
*
* @param <T>
* the generic type
* @param cloudletExecList
* the new cloudlet exec list
*/
protected <T extends ResCloudlet> void setCloudletExecList(List<T> cloudletExecList) {
protected <T extends ResCloudlet> void setCloudletExecList(
List<T> cloudletExecList) {
this.cloudletExecList = cloudletExecList;
}
/**
* Gets the cloudlet paused list.
*
* @param <T> the generic type
*
* @param <T>
* the generic type
* @return the cloudlet paused list
*/
@SuppressWarnings("unchecked")
......@@ -805,18 +761,22 @@ public class CloudletHPCSpaceSharedO extends CloudletScheduler{
/**
* Sets the cloudlet paused list.
*
* @param <T> the generic type
* @param cloudletPausedList the new cloudlet paused list
*
* @param <T>
* the generic type
* @param cloudletPausedList
* the new cloudlet paused list
*/
protected <T extends ResCloudlet> void setCloudletPausedList(List<T> cloudletPausedList) {
protected <T extends ResCloudlet> void setCloudletPausedList(
List<T> cloudletPausedList) {
this.cloudletPausedList = cloudletPausedList;
}
/**
* Gets the cloudlet finished list.
*
* @param <T> the generic type
*
* @param <T>
* the generic type
* @return the cloudlet finished list
*/
@SuppressWarnings("unchecked")
......@@ -826,15 +786,20 @@ public class CloudletHPCSpaceSharedO extends CloudletScheduler{
/**
* Sets the cloudlet finished list.
*
* @param <T> the generic type
* @param cloudletFinishedList the new cloudlet finished list
*
* @param <T>
* the generic type
* @param cloudletFinishedList
* the new cloudlet finished list
*/
protected <T extends ResCloudlet> void setCloudletFinishedList(List<T> cloudletFinishedList) {
protected <T extends ResCloudlet> void setCloudletFinishedList(
List<T> cloudletFinishedList) {
this.cloudletFinishedList = cloudletFinishedList;
}
/* (non-Javadoc)
/*
* (non-Javadoc)
*
* @see org.cloudbus.cloudsim.CloudletScheduler#getCurrentRequestedMips()
*/
@Override
......@@ -848,11 +813,16 @@ public class CloudletHPCSpaceSharedO extends CloudletScheduler{
return mipsShare;
}
/* (non-Javadoc)
* @see org.cloudbus.cloudsim.CloudletScheduler#getTotalCurrentAvailableMipsForCloudlet(org.cloudbus.cloudsim.ResCloudlet, java.util.List)
/*
* (non-Javadoc)
*
* @see org.cloudbus.cloudsim.CloudletScheduler#
* getTotalCurrentAvailableMipsForCloudlet
* (org.cloudbus.cloudsim.ResCloudlet, java.util.List)
*/
@Override
public double getTotalCurrentAvailableMipsForCloudlet(ResCloudlet rcl, List<Double> mipsShare) {
public double getTotalCurrentAvailableMipsForCloudlet(ResCloudlet rcl,
List<Double> mipsShare) {
double capacity = 0.0;
int cpus = 0;
for (Double mips : mipsShare) { // count the cpus available to the vmm
......@@ -866,20 +836,30 @@ public class CloudletHPCSpaceSharedO extends CloudletScheduler{
return capacity;
}
/* (non-Javadoc)
* @see org.cloudbus.cloudsim.CloudletScheduler#getTotalCurrentAllocatedMipsForCloudlet(org.cloudbus.cloudsim.ResCloudlet, double)
/*
* (non-Javadoc)
*
* @see org.cloudbus.cloudsim.CloudletScheduler#
* getTotalCurrentAllocatedMipsForCloudlet
* (org.cloudbus.cloudsim.ResCloudlet, double)
*/
@Override
public double getTotalCurrentAllocatedMipsForCloudlet(ResCloudlet rcl, double time) {
public double getTotalCurrentAllocatedMipsForCloudlet(ResCloudlet rcl,
double time) {
// TODO Auto-generated method stub
return 0.0;
}
/* (non-Javadoc)
* @see org.cloudbus.cloudsim.CloudletScheduler#getTotalCurrentRequestedMipsForCloudlet(org.cloudbus.cloudsim.ResCloudlet, double)
/*
* (non-Javadoc)
*
* @see org.cloudbus.cloudsim.CloudletScheduler#
* getTotalCurrentRequestedMipsForCloudlet
* (org.cloudbus.cloudsim.ResCloudlet, double)
*/
@Override
public double getTotalCurrentRequestedMipsForCloudlet(ResCloudlet rcl, double time) {
public double getTotalCurrentRequestedMipsForCloudlet(ResCloudlet rcl,
double time) {
// TODO Auto-generated method stub
return 0.0;
}
......@@ -897,4 +877,3 @@ public class CloudletHPCSpaceSharedO extends CloudletScheduler{
}
}
......@@ -4,25 +4,29 @@ import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class Constants {
public class NetworkConstants {
public static final int FFT = 0;
public static int roundrobinRack=0;
public static int maxhostVM=2;
public static int HOST_PEs=8;
public static double maxMemperVM=1024*1024;//kb
public static final int BIN_NODE_TIME=10;
public static int currentCloudletId=0;
public static int currentAppId=0;
//stage type
public static final int EXECUTION=0;
public static final int WAIT_SEND=1;
public static final int WAIT_RECV=2;
public static final int FINISH=-2;
//number of switches at each level
public static final int ROOT_LEVEL=0;
public static final int Agg_LEVEL=1;
public static final int EDGE_LEVEL=2;
......@@ -30,17 +34,8 @@ public static final int EDGE_LEVEL=2;
public static final int PES_NUMBER=4;
public static final int FILE_SIZE=300;
public static final int OUTPUT_SIZE=300;
public static int REQUESTS_PER_SECOND=200;
public static final int COMMUNICATION_LENGTH=1;
public static int Requestspersecond = 2;
public static int REQUEST_CLASSES=10;
public static double LOW_ACCURACY_RATE=0.2;
public static double MEDIUM_ACCURACY_RATE=.3;
public static double HIGH_ACCURACY_RATE=0.9;
public static boolean schedulerOverlap=true;
public static final int COMMUNICATION_LENGTH=1;
public static boolean BASE = true;
......@@ -62,7 +57,7 @@ public static double RootSwitchPort=1;//number of Agg
public static double seed=199;
public static boolean logflag=false;
public static Map<Integer,Map<Integer,Boolean>> Cache=new HashMap<Integer,Map<Integer,Boolean>>();
public static int iteration=10;
public static int nexttime=1000;
......
package org.cloudbus.cloudsim.network.datacenter;
/*
* Title: CloudSim Toolkit
* Description: CloudSim (Cloud Simulation) Toolkit for Modeling and Simulation of Clouds
......@@ -7,8 +8,6 @@ package org.cloudbus.cloudsim.network.datacenter;
* Copyright (c) 2009-2010, The University of Melbourne, Australia
*/
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.HashMap;
......@@ -36,19 +35,53 @@ import org.cloudbus.cloudsim.core.SimEntity;
import org.cloudbus.cloudsim.core.SimEvent;
/**
* Datacenter class is a CloudResource whose hostList
* are virtualized. It deals with processing of VM queries (i.e., handling
* of VMs) instead of processing Cloudlet-related queries. So, even though an
* AllocPolicy will be instantiated (in the init() method of the superclass,
* it will not be used, as processing of cloudlets are handled by the CloudletScheduler
* and processing of VirtualMachines are handled by the VmAllocationPolicy.
*
* @author Rodrigo N. Calheiros
* @author Anton Beloglazov
* @since CloudSim Toolkit 1.0
* NetworkDatacenter class is a Datacenter whose hostList are virtualized and
* networked. It contains all the information about internal network. For example,
* which VM is connected to Switch etc.
* It deals with processing of VM queries (i.e., handling of VMs)
* instead of processing Cloudlet-related queries. So, even though an
* AllocPolicy will be instantiated (in the init() method of the superclass, it
* will not be used, as processing of cloudlets are handled by the
* CloudletScheduler and processing of VirtualMachines are handled by the
* VmAllocationPolicy.
*
* Please refer to following publication for more details:
*
* Saurabh Kumar Garg and Rajkumar Buyya, NetworkCloudSim: Modelling Parallel
* Applications in Cloud Simulations, Proceedings of the 4th IEEE/ACM
* International Conference on Utility and Cloud Computing (UCC 2011, IEEE CS
* Press, USA), Melbourne, Australia, December 5-7, 2011.
*
* @author Saurabh Kumar Garg
* @since CloudSim Toolkit 3.0
*/
public class NetworkDatacenter extends Datacenter {
/**
* Allocates a new NetworkDatacenter object.
*
* @param name the name to be associated with this entity (as
* required by Sim_entity class from simjava package)
* @param characteristics an object of DatacenterCharacteristics
* @param storageList a LinkedList of storage elements, for data simulation
* @param vmAllocationPolicy the vmAllocationPolicy
*
* @throws Exception This happens when one of the following scenarios occur:
* <ul>
* <li> creating this entity before initializing CloudSim package
* <li> this entity name is <tt>null</tt> or empty
* <li> this entity has <tt>zero</tt> number of PEs (Processing
* Elements). <br>
* No PEs mean the Cloudlets can't be processed.
* A CloudResource must contain one or more Machines.
* A Machine must contain one or more PEs.
* </ul>
*
* @pre name != null
* @pre resource != null
* @post $none
*/
public NetworkDatacenter(String name,
DatacenterCharacteristics characteristics,
VmAllocationPolicy vmAllocationPolicy, List<Storage> storageList,
......@@ -56,41 +89,50 @@ public class NetworkDatacenter extends Datacenter {
super(name, characteristics, vmAllocationPolicy, storageList,
schedulingInterval);
// TODO Auto-generated constructor stub
VmToSwitchid=new HashMap<Integer,Integer>();
HostToSwitchid=new HashMap<Integer,Integer>();
VmtoHostlist=new HashMap<Integer,Integer>();
Switchlist=new HashMap<Integer,Switch>();
VmToSwitchid = new HashMap<Integer, Integer>();
HostToSwitchid = new HashMap<Integer, Integer>();
VmtoHostlist = new HashMap<Integer, Integer>();
Switchlist = new HashMap<Integer, Switch>();
}
public Map<Integer,Integer> VmToSwitchid;
public Map<Integer,Integer> HostToSwitchid;
public Map<Integer,Switch> Switchlist;
public Map<Integer,Integer> VmtoHostlist;
public Map<Integer, Switch> getEdgeSwitch(){
Map<Integer,Switch> edgeswitch=new HashMap<Integer,Switch>();
for(Entry<Integer, Switch> es:Switchlist.entrySet()){
if(es.getValue().level==Constants.EDGE_LEVEL)
{
edgeswitch.put(es.getKey(), es.getValue());
}
}
public Map<Integer, Integer> VmToSwitchid;
public Map<Integer, Integer> HostToSwitchid;
public Map<Integer, Switch> Switchlist;
public Map<Integer, Integer> VmtoHostlist;
/**
* Get list of all EdgeSwitches in the Datacenter network
* One can design similar functions for other type of switches.
*
*/
public Map<Integer, Switch> getEdgeSwitch() {
Map<Integer, Switch> edgeswitch = new HashMap<Integer, Switch>();
for (Entry<Integer, Switch> es : Switchlist.entrySet()) {
if (es.getValue().level == NetworkConstants.EDGE_LEVEL) {
edgeswitch.put(es.getKey(), es.getValue());
}
}
return edgeswitch;
}
public boolean processVmCreateHPC(Vm vm) {
/**
* Create the VM within the NetworkDatacenter.
* It can be directly accessed by Datacenter Broker
* which manage allocation of Cloudlets.
*
*
*/
public boolean processVmCreateNetwork(Vm vm) {
boolean result = getVmAllocationPolicy().allocateHostForVm(vm);
boolean result = getVmAllocationPolicy().allocateHostForVm(vm);
if (result) {
this.VmToSwitchid.put(vm.getId(), ((NetworkHost)vm.getHost()).sw.getId());
this.VmtoHostlist.put(vm.getId(),vm.getHost().getId());
System.out.println(vm.getId()+" VM is created on "+vm.getHost().getId());
if (result) {
this.VmToSwitchid.put(vm.getId(),
((NetworkHost) vm.getHost()).sw.getId());
this.VmtoHostlist.put(vm.getId(), vm.getHost().getId());
System.out.println(vm.getId() + " VM is created on "
+ vm.getHost().getId());
double amount = 0.0;
if (getDebts().containsKey(vm.getUserId())) {
amount = getDebts().get(vm.getUserId());
......@@ -102,95 +144,116 @@ public class NetworkDatacenter extends Datacenter {
getVmList().add(vm);
vm.updateVmProcessing(CloudSim.clock(), getVmAllocationPolicy().getHost(vm).getVmScheduler().getAllocatedMipsForVm(vm));
}
return result;
}
vm.updateVmProcessing(CloudSim.clock(), getVmAllocationPolicy()
.getHost(vm).getVmScheduler().getAllocatedMipsForVm(vm));
}
return result;
}
/**
* Processes a Cloudlet submission.
*
* @param ev a SimEvent object
* @param ack an acknowledgement
*
* @pre ev != null
* @post $none
*/
protected void processCloudletSubmit(SimEvent ev, boolean ack) {
updateCloudletProcessing();
try {
// gets the Cloudlet object
Cloudlet cl = (Cloudlet) ev.getData();
// checks whether this Cloudlet has finished or not
if (cl.isFinished()){
String name = CloudSim.getEntityName(cl.getUserId());
Log.printLine(getName()+": Warning - Cloudlet #"+cl.getCloudletId()+" owned by "+name+" is already completed/finished.");
Log.printLine("Therefore, it is not being executed again");
Log.printLine();
// NOTE: If a Cloudlet has finished, then it won't be processed.
// So, if ack is required, this method sends back a result.
// If ack is not required, this method don't send back a result.
// Hence, this might cause CloudSim to be hanged since waiting
// for this Cloudlet back.
if (ack) {
int[] data = new int[3];
data[0] = getId();
data[1] = cl.getCloudletId();
data[2] = CloudSimTags.FALSE;
// unique tag = operation tag
int tag = CloudSimTags.CLOUDLET_SUBMIT_ACK;
sendNow(cl.getUserId(), tag, data);
}
sendNow(cl.getUserId(), CloudSimTags.CLOUDLET_RETURN, cl);
return;
}
// process this Cloudlet to this CloudResource
cl.setResourceParameter(getId(), getCharacteristics().getCostPerSecond(), getCharacteristics().getCostPerBw());
int userId = cl.getUserId();
int vmId = cl.getVmId();
double fileTransferTime = predictFileTransferTime(cl.getRequiredFiles()); //time to transfer the files
Host host = getVmAllocationPolicy().getHost(vmId, userId);
Vm vm = host.getVm(vmId, userId);
CloudletScheduler scheduler = vm.getCloudletScheduler();
//System.out.println("cloudlet recieved by VM"+vmId);
double estimatedFinishTime = scheduler.cloudletSubmit(cl,fileTransferTime);
//if (estimatedFinishTime > 0.0 && estimatedFinishTime < getSchedulingInterval()) { //if this cloudlet is in the exec queue
if (estimatedFinishTime > 0.0) { //if this cloudlet is in the exec queue
//double estimatedFinishTime = (cl.getCloudletTotalLength()/(capacity*cl.getPesNumber())); //time to process the cloudlet
//Log.printLine(estimatedFinishTime+"="+gl.getCloudletLength()+"/("+capacity+"*"+gl.getNumPE()+")");
estimatedFinishTime += fileTransferTime;
//estimatedFinishTime += CloudSim.clock();
//Log.printLine(CloudSim.clock()+": Next event scheduled to +"+estimatedFinishTime);
send(getId(), estimatedFinishTime, CloudSimTags.VM_DATACENTER_EVENT);
//event to update the stages
send(getId(), 0.0001, CloudSimTags.VM_DATACENTER_EVENT);
}
if (ack) {
int[] data = new int[3];
data[0] = getId();
data[1] = cl.getCloudletId();
data[2] = CloudSimTags.TRUE;
// unique tag = operation tag
int tag = CloudSimTags.CLOUDLET_SUBMIT_ACK;
sendNow(cl.getUserId(), tag, data);
}
}
catch (ClassCastException c) {
Log.printLine(getName() + ".processCloudletSubmit(): " + "ClassCastException error.");
c.printStackTrace();
}
catch (Exception e) {
Log.printLine(getName() + ".processCloudletSubmit(): " + "Exception error.");
e.printStackTrace();
}
checkCloudletCompletion();
}
updateCloudletProcessing();
try {
// gets the Cloudlet object
Cloudlet cl = (Cloudlet) ev.getData();
// checks whether this Cloudlet has finished or not
if (cl.isFinished()) {
String name = CloudSim.getEntityName(cl.getUserId());
Log.printLine(getName() + ": Warning - Cloudlet #"
+ cl.getCloudletId() + " owned by " + name
+ " is already completed/finished.");
Log.printLine("Therefore, it is not being executed again");
Log.printLine();
// NOTE: If a Cloudlet has finished, then it won't be processed.
// So, if ack is required, this method sends back a result.
// If ack is not required, this method don't send back a result.
// Hence, this might cause CloudSim to be hanged since waiting
// for this Cloudlet back.
if (ack) {
int[] data = new int[3];
data[0] = getId();
data[1] = cl.getCloudletId();
data[2] = CloudSimTags.FALSE;
// unique tag = operation tag
int tag = CloudSimTags.CLOUDLET_SUBMIT_ACK;
sendNow(cl.getUserId(), tag, data);
}
sendNow(cl.getUserId(), CloudSimTags.CLOUDLET_RETURN, cl);
return;
}
// process this Cloudlet to this CloudResource
cl.setResourceParameter(getId(), getCharacteristics()
.getCostPerSecond(), getCharacteristics().getCostPerBw());
int userId = cl.getUserId();
int vmId = cl.getVmId();
double fileTransferTime = predictFileTransferTime(cl
.getRequiredFiles()); // time to transfer the files
Host host = getVmAllocationPolicy().getHost(vmId, userId);
Vm vm = host.getVm(vmId, userId);
CloudletScheduler scheduler = vm.getCloudletScheduler();
// System.out.println("cloudlet recieved by VM"+vmId);
double estimatedFinishTime = scheduler.cloudletSubmit(cl,
fileTransferTime);
// if (estimatedFinishTime > 0.0 && estimatedFinishTime <
// getSchedulingInterval()) { //if this cloudlet is in the exec
// queue
if (estimatedFinishTime > 0.0) { // if this cloudlet is in the exec
// queue
// double estimatedFinishTime =
// (cl.getCloudletTotalLength()/(capacity*cl.getPesNumber()));
// //time to process the cloudlet
// Log.printLine(estimatedFinishTime+"="+gl.getCloudletLength()+"/("+capacity+"*"+gl.getNumPE()+")");
estimatedFinishTime += fileTransferTime;
// estimatedFinishTime += CloudSim.clock();
// Log.printLine(CloudSim.clock()+": Next event scheduled to +"+estimatedFinishTime);
send(getId(), estimatedFinishTime,
CloudSimTags.VM_DATACENTER_EVENT);
// event to update the stages
send(getId(), 0.0001, CloudSimTags.VM_DATACENTER_EVENT);
}
if (ack) {
int[] data = new int[3];
data[0] = getId();
data[1] = cl.getCloudletId();
data[2] = CloudSimTags.TRUE;
// unique tag = operation tag
int tag = CloudSimTags.CLOUDLET_SUBMIT_ACK;
sendNow(cl.getUserId(), tag, data);
}
} catch (ClassCastException c) {
Log.printLine(getName() + ".processCloudletSubmit(): "
+ "ClassCastException error.");
c.printStackTrace();
} catch (Exception e) {
Log.printLine(getName() + ".processCloudletSubmit(): "
+ "Exception error.");
e.printStackTrace();
}
checkCloudletCompletion();
}
}
......@@ -27,169 +27,192 @@ import org.cloudbus.cloudsim.provisioners.BwProvisioner;
import org.cloudbus.cloudsim.provisioners.RamProvisioner;
/**
* Host class extends a Machine to include other hostList beside PEs
* to support simulation of virtualized grids. It executes actions related
* to management of virtual machines (e.g., creation and destruction). A host has
* a defined policy for provisioning memory and bw, as well as an allocation policy
* for Pe's to virtual machines.
* NetworkHost class extends Host to support simulation of networked datacenters.
* It executes actions related to management of packets (send and receive)other than that of
* virtual machines (e.g., creation and destruction). A host has a defined
* policy for provisioning memory and bw, as well as an allocation policy for
* Pe's to virtual machines.
*
* Please refer to following publication for more details:
*
* Saurabh Kumar Garg and Rajkumar Buyya, NetworkCloudSim: Modelling Parallel
* Applications in Cloud Simulations, Proceedings of the 4th IEEE/ACM
* International Conference on Utility and Cloud Computing (UCC 2011, IEEE CS
* Press, USA), Melbourne, Australia, December 5-7, 2011.
*
* A host is associated to a datacenter. It can host virtual machines.
*
* @author Rodrigo N. Calheiros
* @author Anton Beloglazov
* @since CloudSim Toolkit 1.0
*
* @author Saurabh Kumar Garg
* @since CloudSim Toolkit 1.0
*/
public class NetworkHost extends Host {
public List <HostPacket> packetTosendLocal;
public List <HostPacket> packetTosendGlobal;
public List <HostPacket> packetrecieved;
public List<NetworkPacket> packetTosendLocal;
public List<NetworkPacket> packetTosendGlobal;
public List<NetworkPacket> packetrecieved;
public double memory;
public Switch sw;
public double bandwidth;//latency
public List<Double> CPUfinTimeCPU=new ArrayList<Double>();//time when last job will finish on CPU1
public double fintime=0;
public Switch sw; //Edge switch in general
public double bandwidth;// latency
public List<Double> CPUfinTimeCPU = new ArrayList<Double>();// time when
// last job will
// finish on
// CPU1
public double fintime = 0;
public NetworkHost(int id, RamProvisioner ramProvisioner,
BwProvisioner bwProvisioner, long storage,
List<? extends Pe> peList, VmScheduler vmScheduler) {
super(id, ramProvisioner, bwProvisioner, storage, peList, vmScheduler);
// TODO Auto-generated constructor stub
this.packetrecieved=new ArrayList<HostPacket>();
this.packetTosendGlobal=new ArrayList<HostPacket>();
this.packetTosendLocal=new ArrayList<HostPacket>();
this.packetrecieved = new ArrayList<NetworkPacket>();
this.packetTosendGlobal = new ArrayList<NetworkPacket>();
this.packetTosendLocal = new ArrayList<NetworkPacket>();
}
/**
* Requests updating of processing of cloudlets in the VMs running in this host.
*
* @param currentTime the current time
*
* @return expected time of completion of the next cloudlet in all VMs in this host. Double.MAX_VALUE
* if there is no future events expected in this host
*
* @pre currentTime >= 0.0
* @post $none
/**
* Requests updating of processing of cloudlets in the VMs running in this
* host.
*
* @param currentTime
* the current time
*
* @return expected time of completion of the next cloudlet in all VMs in
* this host. Double.MAX_VALUE if there is no future events expected
* in th is host
*
* @pre currentTime >= 0.0
* @post $none
*/
public double updateVmsProcessing(double currentTime) {
double smallerTime = Double.MAX_VALUE;
//insert in each vm packet recieved
// insert in each vm packet recieved
recvpackets();
for (Vm vm : super.getVmList()) {
// if (vm.isInMigration()) {
// continue;
// }
double time = ((NetworkVm)vm).updateVmProcessing(currentTime, getVmScheduler().getAllocatedMipsForVm(vm));
// if (vm.isInMigration()) {
// continue;
// }
double time = ((NetworkVm) vm).updateVmProcessing(currentTime,
getVmScheduler().getAllocatedMipsForVm(vm));
if (time > 0.0 && time < smallerTime) {
smallerTime = time;
}
}
sendpackets();
return smallerTime;
}
//send the packets to other hosts/VMs
sendpackets();
return smallerTime;
}
/**
* Receives packet and forward it to the corresponding VM for processing
* host.
*
*
*/
private void recvpackets() {
// TODO Auto-generated method stub
for(HostPacket hs:packetrecieved)
{
//hs.stime=hs.rtime;
hs.pkt.recievetime=CloudSim.clock();
for (NetworkPacket hs : packetrecieved) {
// hs.stime=hs.rtime;
hs.pkt.recievetime = CloudSim.clock();
// insertthe packet in recievedlist of VM
Vm vm = VmList.getById(getVmList(), hs.pkt.reciever);
List<HostPacket> pktlist = ((NetworkCloudletSpaceSharedScheduler) vm
.getCloudletScheduler()).pktrecv.get(hs.pkt.sender);
//insertthe packet in recievedlist
Vm vm=VmList.getById(getVmList(), hs.pkt.reciever);
List<NetPacket> pktlist=((CloudletHPCSpaceShared)vm.getCloudletScheduler()).pktrecv.get(hs.pkt.sender);
//List<NetPacket> pktlist=((CloudletHPCSpaceSharedO)vm.getCloudletScheduler()).pktrecv.get(hs.pkt.virtualsendid);
if(pktlist==null){
pktlist=new ArrayList<NetPacket>();
((CloudletHPCSpaceShared)vm.getCloudletScheduler()).pktrecv.put(hs.pkt.sender, pktlist);
// ((CloudletHPCSpaceSharedO)vm.getCloudletScheduler()).pktrecv.put(hs.pkt.virtualsendid, pktlist);
if (pktlist == null) {
pktlist = new ArrayList<HostPacket>();
((NetworkCloudletSpaceSharedScheduler) vm.getCloudletScheduler()).pktrecv
.put(hs.pkt.sender, pktlist);
}
pktlist.add(hs.pkt);
}
packetrecieved.clear();
}
/**
* Send packet check whether a packet belongs to a local VM or to a VM hosted on other machine.
*
*
*/
private void sendpackets() {
// TODO Auto-generated method stub
for(Vm vm:super.getVmList())
{
for(Entry<Integer, List<NetPacket>> es:((CloudletHPCSpaceShared)vm.getCloudletScheduler()).pkttosend.entrySet())
//for(Entry<Integer, List<NetPacket>> es:((CloudletHPCSpaceSharedO)vm.getCloudletScheduler()).pkttosend.entrySet())
for (Vm vm : super.getVmList()) {
for (Entry<Integer, List<HostPacket>> es : ((NetworkCloudletSpaceSharedScheduler) vm
.getCloudletScheduler()).pkttosend.entrySet())
{
List<NetPacket> pktlist=es.getValue();
for(NetPacket pkt:pktlist)
{
HostPacket hpkt=new HostPacket(this.getId(),pkt,vm.getId(),pkt.sender);
Vm vm2=VmList.getById(this.getVmList(), hpkt.recievervmid);
if(vm2!=null) this.packetTosendLocal.add(hpkt);
else this.packetTosendGlobal.add(hpkt);
}
pktlist.clear();
List<HostPacket> pktlist = es.getValue();
for (HostPacket pkt : pktlist) {
NetworkPacket hpkt = new NetworkPacket(this.getId(), pkt,
vm.getId(), pkt.sender);
Vm vm2 = VmList
.getById(this.getVmList(), hpkt.recievervmid);
if (vm2 != null)
this.packetTosendLocal.add(hpkt);
else
this.packetTosendGlobal.add(hpkt);
}
pktlist.clear();
}
}
boolean flag=false;
for(HostPacket hs:packetTosendLocal)
{
flag=true;
hs.stime=hs.rtime;
hs.pkt.recievetime=CloudSim.clock();
//insertthe packet in recievedlist
Vm vm=VmList.getById(getVmList(), hs.pkt.reciever);
//Vm vm=getVmList().get(hs.pkt.reciever);
List<NetPacket> pktlist=((CloudletHPCSpaceShared)vm.getCloudletScheduler()).pktrecv.get(hs.pkt.sender);
//List<NetPacket> pktlist=((CloudletHPCSpaceSharedO)vm.getCloudletScheduler()).pktrecv.get(hs.pkt.virtualsendid);
if(pktlist==null){
pktlist=new ArrayList<NetPacket>();
((CloudletHPCSpaceShared)vm.getCloudletScheduler()).pktrecv.put(hs.pkt.sender, pktlist);
// ((CloudletHPCSpaceSharedO)vm.getCloudletScheduler()).pktrecv.put(hs.pkt.virtualsendid, pktlist);
boolean flag = false;
for (NetworkPacket hs : packetTosendLocal) {
flag = true;
hs.stime = hs.rtime;
hs.pkt.recievetime = CloudSim.clock();
// insertthe packet in recievedlist
Vm vm = VmList.getById(getVmList(), hs.pkt.reciever);
// Vm vm=getVmList().get(hs.pkt.reciever);
List<HostPacket> pktlist = ((NetworkCloudletSpaceSharedScheduler) vm
.getCloudletScheduler()).pktrecv.get(hs.pkt.sender);
if (pktlist == null) {
pktlist = new ArrayList<HostPacket>();
((NetworkCloudletSpaceSharedScheduler) vm.getCloudletScheduler()).pktrecv
.put(hs.pkt.sender, pktlist);
}
pktlist.add(hs.pkt);
}
if(flag){
for (Vm vm : super.getVmList()) {
// if (vm.isInMigration()) {
// continue;
// }
double time = ((NetworkVm)vm).updateVmProcessing(CloudSim.clock(), getVmScheduler().getAllocatedMipsForVm(vm));
}
if (flag) {
for (Vm vm : super.getVmList()) {
// if (vm.isInMigration()) {
// continue;
// }
double time = ((NetworkVm) vm).updateVmProcessing(CloudSim
.clock(), getVmScheduler().getAllocatedMipsForVm(vm));
}
}
//Sending packet to other VMs therefore packet is forwarded to a Edge switch
this.packetTosendLocal.clear();
double avband=this.bandwidth/packetTosendGlobal.size();
for(HostPacket hs:packetTosendGlobal)
{
double delay=(1000*hs.pkt.data)/avband;
Constants.totaldatatransfer+=hs.pkt.data;
//System.out.println(hs.pkt.virtualsendid+" "+hs.pkt.virtualrecvid+" "+hs.pkt.data);
CloudSim.send(this.getDatacenter().getId(), this.sw.getId(), delay, CloudSimTags.Network_Event_UP, hs);
//send to switch with delay
double avband = this.bandwidth / packetTosendGlobal.size();
for (NetworkPacket hs : packetTosendGlobal) {
double delay = (1000 * hs.pkt.data) / avband;
NetworkConstants.totaldatatransfer += hs.pkt.data;
// System.out.println(hs.pkt.virtualsendid+" "+hs.pkt.virtualrecvid+" "+hs.pkt.data);
CloudSim.send(this.getDatacenter().getId(), this.sw.getId(), delay,
CloudSimTags.Network_Event_UP, hs);
// send to switch with delay
}
this.packetTosendGlobal.clear();
}
@SuppressWarnings("unchecked")
public double getMaxUtilizationAmongVmsPes(Vm vm) {
return PeList.getMaxUtilizationAmongVmsPes((List<Pe>) getPeList(), vm);
}
}
package org.cloudbus.cloudsim.network.datacenter;
/**
* NewtorkPacket represents the packet which travel from one server to another.
* Each packet contains ids of the sender VM and receiver VM,
* time at which it is send and received, type and virtual ids of tasks, which are communicating.
*
* Please refer to following publication for more details:
*
* Saurabh Kumar Garg and Rajkumar Buyya, NetworkCloudSim: Modelling Parallel
* Applications in Cloud Simulations, Proceedings of the 4th IEEE/ACM
* International Conference on Utility and Cloud Computing (UCC 2011, IEEE CS
* Press, USA), Melbourne, Australia, December 5-7, 2011.
*
*
* @author Saurabh Kumar Garg
* @since CloudSim Toolkit 1.0
*/
public class NetworkPacket {
public NetworkPacket(int id, HostPacket pkt2, int vmid, int cloudletid) {
// TODO Auto-generated constructor stub
this.pkt = pkt2;
this.sendervmid = vmid;
this.cloudletid = cloudletid;
this.senderhostid = id;
this.stime = pkt.sendtime;
this.recievervmid = pkt2.reciever;
}
HostPacket pkt;
int senderhostid;
int recieverhostid;
int sendervmid;
int recievervmid;
int cloudletid;
double stime;// time when sent
double rtime;// time when received
}
......@@ -6,29 +6,49 @@ import java.util.List;
import org.cloudbus.cloudsim.CloudletScheduler;
import org.cloudbus.cloudsim.Vm;
/**
* NetworkVm class extends Vm to support simulation of networked datacenters.
* It executes actions related to management of packets (send and receive).
*
* Please refer to following publication for more details:
*
* Saurabh Kumar Garg and Rajkumar Buyya, NetworkCloudSim: Modelling Parallel
* Applications in Cloud Simulations, Proceedings of the 4th IEEE/ACM
* International Conference on Utility and Cloud Computing (UCC 2011, IEEE CS
* Press, USA), Melbourne, Australia, December 5-7, 2011.
*
*
* @author Saurabh Kumar Garg
* @since CloudSim Toolkit 1.0
*/
public class NetworkVm extends Vm implements Comparable{
public class NetworkVm extends Vm implements Comparable {
public NetworkVm(int id, int userId, double mips, int pesNumber, int ram,
long bw, long size, String vmm, CloudletScheduler cloudletScheduler) {
super(id, userId, mips, pesNumber, ram, bw, size, vmm, cloudletScheduler);
super(id, userId, mips, pesNumber, ram, bw, size, vmm,
cloudletScheduler);
// TODO Auto-generated constructor stub
cloudletlist=new ArrayList<NetworkCloudlet>();
cloudletlist = new ArrayList<NetworkCloudlet>();
}
public ArrayList<NetworkCloudlet> cloudletlist;
int type;
public ArrayList<NetPacket> recvPktlist;
int type;
public ArrayList<HostPacket> recvPktlist;
public double memory;
public boolean flagfree;//if true it is free
public boolean flagfree;// if true it is free
public double finishtime;
public boolean isFree()
{
public boolean isFree() {
return flagfree;
}
public int compareTo(Object arg0) {
NetworkVm hs=(NetworkVm)arg0;
if(hs.finishtime>this.finishtime) return -1;
if(hs.finishtime<this.finishtime) return 1;
NetworkVm hs = (NetworkVm) arg0;
if (hs.finishtime > this.finishtime)
return -1;
if (hs.finishtime < this.finishtime)
return 1;
return 0;
}
}
......@@ -21,15 +21,16 @@ import org.cloudbus.cloudsim.core.CloudSim;
import org.cloudbus.cloudsim.power.PowerHost;
/**
* VmAllocationPolicySimple is an VmAllocationPolicy that
* NetworkVmAllocationPolicy is an VmAllocationPolicy that
* chooses, as the host for a VM, the host with
* less PEs in use.
*
* @author Rodrigo N. Calheiros
* @author Anton Beloglazov
* @author Saurabh Kumar Garg
* @since CloudSim Toolkit 1.0
*/
public class VmHPCAllocationPolicySimple extends VmAllocationPolicy {
public class NetworkVmAllocationPolicy extends VmAllocationPolicy {
/** The vm table. */
private Map<String, Host> vmTable;
......@@ -48,7 +49,7 @@ public class VmHPCAllocationPolicySimple extends VmAllocationPolicy {
* @pre $none
* @post $none
*/
public VmHPCAllocationPolicySimple(List<? extends Host> list) {
public NetworkVmAllocationPolicy(List<? extends Host> list) {
super(list);
setFreePes(new ArrayList<Integer>());
......@@ -74,34 +75,51 @@ public class VmHPCAllocationPolicySimple extends VmAllocationPolicy {
@Override
public boolean allocateHostForVm(Vm vm) {
NetworkHost allocatedHost = findHostForVm(vm);
if (allocatedHost != null && allocatedHost.vmCreate(vm)) { //if vm has been succesfully created in the host
getVmTable().put(vm.getUid(), allocatedHost);
if (!Log.isDisabled()) {
Log.print(String.format("%.2f: VM #" + vm.getId() + " has been allocated to the host #" + allocatedHost.getId() + "\n", CloudSim.clock()));
}
return true;
int requiredPes = vm.getPesNumber();
boolean result = false;
int tries = 0;
List<Integer> freePesTmp = new ArrayList<Integer>();
for (Integer freePes : getFreePes()) {
freePesTmp.add(freePes);
}
return false;
}
public NetworkHost findHostForVm(Vm vm) {
double minPower = Double.MAX_VALUE;
NetworkHost allocatedHost = null;
if (!getVmTable().containsKey(vm.getUid())) { //if this vm was not created
do {//we still trying until we find a host or until we try all of them
int moreFree = Integer.MIN_VALUE;
int idx = -1;
//we want the host with less pes in use
for (int i=0; i < freePesTmp.size(); i++) {
if (freePesTmp.get(i) > moreFree) {
moreFree = freePesTmp.get(i);
idx = i;
}
}
NetworkHost host =this.<NetworkHost>getHostList().get(idx);
result = host.vmCreate(vm);
if (result) { //if vm were succesfully created in the host
//Log.printLine("VmAllocationPolicy: VM #"+vm.getVmId()+ "Chosen host: #"+host.getMachineID()+" idx:"+idx);
getVmTable().put(vm.getUid(), host);
getUsedPes().put(vm.getUid(), requiredPes);
getFreePes().set(idx, getFreePes().get(idx) - requiredPes);
result = true;
break;
} else {
freePesTmp.set(idx, Integer.MIN_VALUE);
}
tries++;
} while (!result && tries < getFreePes().size());
for (NetworkHost host : this.<NetworkHost>getHostList()) {
if (host.isSuitableForVm(vm)) {
double maxUtilization = getMaxUtilizationAfterAllocation(host, vm);
if ((!vm.isRecentlyCreated() && maxUtilization > 1) || (vm.isRecentlyCreated() && maxUtilization > 1.0)) {
continue;
}
allocatedHost = host;
}
return result;
}
return allocatedHost;
}
protected double getMaxUtilizationAfterAllocation(NetworkHost host, Vm vm) {
List<Double> allocatedMipsForVm = null;
NetworkHost allocatedHost = (NetworkHost) vm.getHost();
......@@ -248,6 +266,12 @@ public class VmHPCAllocationPolicySimple extends VmAllocationPolicy {
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);
int requiredPes = vm.getPesNumber();
int idx = getHostList().indexOf(host);
getUsedPes().put(vm.getUid(), requiredPes);
getFreePes().set(idx, getFreePes().get(idx) - requiredPes);
Log.formatLine("%.2f: VM #" + vm.getId() + " has been allocated to the host #" + host.getId(), CloudSim.clock());
return true;
}
......
......@@ -9,60 +9,92 @@ import org.cloudbus.cloudsim.core.CloudSimTags;
import org.cloudbus.cloudsim.core.SimEvent;
import org.cloudbus.cloudsim.core.predicates.PredicateType;
public class RootSwitch extends Switch{
/**
* This class allows to simulate Root switch which connects Datacenter to
* external network. It interacts with other switches in order to exchange
* packets. Please refer to following publication for more details:
*
* Saurabh Kumar Garg and Rajkumar Buyya, NetworkCloudSim: Modelling Parallel
* Applications in Cloud Simulations, Proceedings of the 4th IEEE/ACM
* International Conference on Utility and Cloud Computing (UCC 2011, IEEE CS
* Press, USA), Melbourne, Australia, December 5-7, 2011.
*
* @author Saurabh Kumar Garg
* @since CloudSim Toolkit 3.0
*
*/
public class RootSwitch extends Switch {
/**
* Constructor for Root Switch We have to specify switches that are
* connected to its downlink ports, and corresponding bandwidths
*
* @param name
* Name of the switch
* @param level
* At which level switch is with respect to hosts.
* @param dc
* Pointer to Datacenter
*/
public RootSwitch(String name, int level, NetworkDatacenter dc) {
super(name, level, dc);
downlinkswitchpktlist=new HashMap<Integer,List<HostPacket>>();
downlinkswitches=new ArrayList<Switch>();
downlinkbandwidth=Constants.BandWidthAggRoot;
latency=Constants.SwitchingDelayRoot;
numport=Constants.RootSwitchPort;
downlinkswitchpktlist = new HashMap<Integer, List<NetworkPacket>>();
downlinkswitches = new ArrayList<Switch>();
downlinkbandwidth = NetworkConstants.BandWidthAggRoot;
latency = NetworkConstants.SwitchingDelayRoot;
numport = NetworkConstants.RootSwitchPort;
// TODO Auto-generated constructor stub
}
private void processpacket_up(SimEvent ev) {
// TODO Auto-generated method stub
//packet coming from down level router.
//has to send up
//check which switch to forward to
//add packet in the switch list
/**
* Send Packet to switch connected through a downlink port
*
* @param ev
* Event/packet to process
*/
@Override
protected void processpacket_up(SimEvent ev) {
// packet coming from down level router.
// has to send up
// check which switch to forward to
// add packet in the switch list
//
//int src=ev.getSource();
HostPacket hspkt=(HostPacket) ev.getData();
int recvVMid=hspkt.pkt.reciever;
CloudSim.cancelAll(getId(), new PredicateType(CloudSimTags.Network_Event_send));
schedule(getId(),this.switching_delay, CloudSimTags.Network_Event_send);
if(this.level==Constants.ROOT_LEVEL)
{
//get id of edge router
int edgeswitchid=dc.VmToSwitchid.get(recvVMid);
//search which aggregate switch has it
int aggSwtichid=-1;;
for(Switch sw:this.downlinkswitches)
{
for(Switch edge:sw.downlinkswitches)
{
if(edge.getId()==edgeswitchid){
aggSwtichid=sw.getId();
break;
}
}
}
if(aggSwtichid<0) System.out.println(" No destination for this packet");
else{
List<HostPacket> pktlist=this.downlinkswitchpktlist.get(aggSwtichid);
if(pktlist==null){
pktlist=new ArrayList<HostPacket>();
this.downlinkswitchpktlist.put(aggSwtichid, pktlist);
}
pktlist.add(hspkt);
}
}
}
NetworkPacket hspkt = (NetworkPacket) ev.getData();
int recvVMid = hspkt.pkt.reciever;
CloudSim.cancelAll(getId(), new PredicateType(
CloudSimTags.Network_Event_send));
schedule(getId(), this.switching_delay, CloudSimTags.Network_Event_send);
if (this.level == NetworkConstants.ROOT_LEVEL) {
// get id of edge router
int edgeswitchid = dc.VmToSwitchid.get(recvVMid);
// search which aggregate switch has it
int aggSwtichid = -1;
;
for (Switch sw : this.downlinkswitches) {
for (Switch edge : sw.downlinkswitches) {
if (edge.getId() == edgeswitchid) {
aggSwtichid = sw.getId();
break;
}
}
}
if (aggSwtichid < 0)
System.out.println(" No destination for this packet");
else {
List<NetworkPacket> pktlist = this.downlinkswitchpktlist
.get(aggSwtichid);
if (pktlist == null) {
pktlist = new ArrayList<NetworkPacket>();
this.downlinkswitchpktlist.put(aggSwtichid, pktlist);
}
pktlist.add(hspkt);
}
}
}
}
......@@ -21,484 +21,402 @@ import org.cloudbus.cloudsim.core.SimEvent;
import org.cloudbus.cloudsim.core.predicates.PredicateType;
import org.cloudbus.cloudsim.lists.VmList;
public class Switch extends SimEntity{
public class Switch extends SimEntity {
//switch level
// switch level
public int id;
public int level;//three levels
public int level;// three levels
public int datacenterid;
public Map<Integer,List<HostPacket>> uplinkswitchpktlist;
public Map<Integer,List<HostPacket>> downlinkswitchpktlist;
public Map<Integer,NetworkHost> hostlist;
public List<Switch>uplinkswitches;
public List <Switch>downlinkswitches;
public Map<Integer,List<HostPacket>> packetTohost;
int type;//edge switch or aggregation switch
public Map<Integer, List<NetworkPacket>> uplinkswitchpktlist;
public Map<Integer, List<NetworkPacket>> downlinkswitchpktlist;
public Map<Integer, NetworkHost> hostlist;
public List<Switch> uplinkswitches;
public List<Switch> downlinkswitches;
public Map<Integer, List<NetworkPacket>> packetTohost;
int type;// edge switch or aggregation switch
public double uplinkbandwidth;
public double downlinkbandwidth;
public double latency;
public double numport;
public NetworkDatacenter dc;
public SortedMap<Double,List<NetworkHost>> fintimelistHost=new TreeMap<Double,List<NetworkHost>>();//something is running on these hosts
public SortedMap<Double,List<NetworkVm>> fintimelistVM=new TreeMap<Double,List<NetworkVm>>();//something is running on these hosts
public ArrayList<HostPacket> pktlist;
public List<Vm> BagofTaskVm=new ArrayList<Vm>();
public SortedMap<Double, List<NetworkHost>> fintimelistHost = new TreeMap<Double, List<NetworkHost>>();// something
// is
// running
// on
// these
// hosts
public SortedMap<Double, List<NetworkVm>> fintimelistVM = new TreeMap<Double, List<NetworkVm>>();// something
// is
// running
// on
// these
// hosts
public ArrayList<NetworkPacket> pktlist;
public List<Vm> BagofTaskVm = new ArrayList<Vm>();
public double switching_delay;
public Map<Integer,NetworkVm> Vmlist;
public Switch(String name,int level,NetworkDatacenter dc) {
public Map<Integer, NetworkVm> Vmlist;
public Switch(String name, int level, NetworkDatacenter dc) {
super(name);
this.level=level;
/* if(level==Constants.EDGE_LEVEL)
{
hostlist=new HashMap<Integer,HPCHost>();
uplinkswitchpktlist=new HashMap<Integer,List<HostPacket>>();
packetTohost=new HashMap<Integer,List<HostPacket>>();
uplinkbandwidth=Constants.BandWidthEdgeAgg;
downlinkbandwidth=Constants.BandWidthEdgeHost;
latency=Constants.SwitchingDelayEdge;
numport=Constants.EdgeSwitchPort;
uplinkswitches=new ArrayList<Switch>();
}
if(level==Constants.Agg_LEVEL)
{
downlinkswitchpktlist=new HashMap<Integer,List<HostPacket>>();
uplinkswitchpktlist=new HashMap<Integer,List<HostPacket>>();
uplinkbandwidth=Constants.BandWidthAggRoot;
downlinkbandwidth=Constants.BandWidthEdgeAgg;
latency=Constants.SwitchingDelayAgg;
numport=Constants.AggSwitchPort;
uplinkswitches=new ArrayList<Switch>();
downlinkswitches=new ArrayList<Switch>();
}
if(level==Constants.ROOT_LEVEL)
{
downlinkswitchpktlist=new HashMap<Integer,List<HostPacket>>();
downlinkswitches=new ArrayList<Switch>();
downlinkbandwidth=Constants.BandWidthAggRoot;
latency=Constants.SwitchingDelayRoot;
numport=Constants.RootSwitchPort;
}*/
this.dc=dc;
this.level = level;
/*
* if(level==Constants.EDGE_LEVEL) { hostlist=new
* HashMap<Integer,HPCHost>(); uplinkswitchpktlist=new
* HashMap<Integer,List<HostPacket>>(); packetTohost=new
* HashMap<Integer,List<HostPacket>>();
* uplinkbandwidth=Constants.BandWidthEdgeAgg;
* downlinkbandwidth=Constants.BandWidthEdgeHost;
* latency=Constants.SwitchingDelayEdge;
* numport=Constants.EdgeSwitchPort; uplinkswitches=new
* ArrayList<Switch>();
*
* } if(level==Constants.Agg_LEVEL) { downlinkswitchpktlist=new
* HashMap<Integer,List<HostPacket>>(); uplinkswitchpktlist=new
* HashMap<Integer,List<HostPacket>>();
* uplinkbandwidth=Constants.BandWidthAggRoot;
* downlinkbandwidth=Constants.BandWidthEdgeAgg;
* latency=Constants.SwitchingDelayAgg; numport=Constants.AggSwitchPort;
* uplinkswitches=new ArrayList<Switch>(); downlinkswitches=new
* ArrayList<Switch>(); } if(level==Constants.ROOT_LEVEL) {
* downlinkswitchpktlist=new HashMap<Integer,List<HostPacket>>();
* downlinkswitches=new ArrayList<Switch>();
*
* downlinkbandwidth=Constants.BandWidthAggRoot;
* latency=Constants.SwitchingDelayRoot;
* numport=Constants.RootSwitchPort;
*
* }
*/
this.dc = dc;
// TODO Auto-generated constructor stub
}
@Override
public void startEntity() {
Log.printLine(getName() + " is starting...");
schedule(getId(), 0, CloudSimTags.RESOURCE_CHARACTERISTICS_REQUEST);
}
@Override
public void processEvent(SimEvent ev) {
//Log.printLine(CloudSim.clock()+"[Broker]: event received:"+ev.getTag());
switch (ev.getTag()){
// Resource characteristics request
case CloudSimTags.Network_Event_UP:
//process the packet from down switch or host
processpacket_up(ev);
break;
case CloudSimTags.Network_Event_DOWN:
//process the packet from uplink
processpacket_down(ev);
break;
case CloudSimTags.Network_Event_send:
processpacketforward(ev);
break;
case CloudSimTags.Network_Event_Host:
processhostpacket(ev);
break;
// Resource characteristics answer
case CloudSimTags.RESOURCE_Register:
registerHost(ev);
break;
// other unknown tags are processed by this method
default:
processOtherEvent(ev);
break;
// Log.printLine(CloudSim.clock()+"[Broker]: event received:"+ev.getTag());
switch (ev.getTag()) {
// Resource characteristics request
case CloudSimTags.Network_Event_UP:
// process the packet from down switch or host
processpacket_up(ev);
break;
case CloudSimTags.Network_Event_DOWN:
// process the packet from uplink
processpacket_down(ev);
break;
case CloudSimTags.Network_Event_send:
processpacketforward(ev);
break;
case CloudSimTags.Network_Event_Host:
processhostpacket(ev);
break;
// Resource characteristics answer
case CloudSimTags.RESOURCE_Register:
registerHost(ev);
break;
// other unknown tags are processed by this method
default:
processOtherEvent(ev);
break;
}
}
private void processhostpacket(SimEvent ev) {
protected void processhostpacket(SimEvent ev) {
// TODO Auto-generated method stub
//Send packet to host
HostPacket hspkt=(HostPacket) ev.getData();
NetworkHost hs=this.hostlist.get(hspkt.recieverhostid);
// Send packet to host
NetworkPacket hspkt = (NetworkPacket) ev.getData();
NetworkHost hs = this.hostlist.get(hspkt.recieverhostid);
hs.packetrecieved.add(hspkt);
}
private void processpacket_down(SimEvent ev) {
protected void processpacket_down(SimEvent ev) {
// TODO Auto-generated method stub
//packet coming from up level router.
//has to send downward
//check which switch to forward to
//add packet in the switch list
//add packet in the host list
//int src=ev.getSource();
HostPacket hspkt=(HostPacket) ev.getData();
int recvVMid=hspkt.pkt.reciever;
CloudSim.cancelAll(getId(), new PredicateType(CloudSimTags.Network_Event_send));
schedule(getId(),this.latency, CloudSimTags.Network_Event_send);
if(this.level==Constants.EDGE_LEVEL)
{
// packet is to be recieved by host
int hostid=dc.VmtoHostlist.get(recvVMid);
hspkt.recieverhostid=hostid;
List<HostPacket> pktlist=this.packetTohost.get(hostid);
if(pktlist==null){
pktlist=new ArrayList<HostPacket>();
this.packetTohost.put(hostid, pktlist);
}
pktlist.add(hspkt);
return;
}
if(this.level==Constants.Agg_LEVEL)
{
//packet is coming from root so need to be sent to edgelevel swich
//find the id for edgelevel switch
int switchid=dc.VmToSwitchid.get(recvVMid);
List<HostPacket> pktlist=this.downlinkswitchpktlist.get(switchid);
if(pktlist==null){
pktlist=new ArrayList<HostPacket>();
this.downlinkswitchpktlist.put(switchid, pktlist);
}
pktlist.add(hspkt);
return;
}
}
// packet coming from up level router.
// has to send downward
// check which switch to forward to
// add packet in the switch list
// add packet in the host list
// int src=ev.getSource();
NetworkPacket hspkt = (NetworkPacket) ev.getData();
int recvVMid = hspkt.pkt.reciever;
CloudSim.cancelAll(getId(), new PredicateType(
CloudSimTags.Network_Event_send));
schedule(getId(), this.latency, CloudSimTags.Network_Event_send);
if (this.level == NetworkConstants.EDGE_LEVEL) {
// packet is to be recieved by host
int hostid = dc.VmtoHostlist.get(recvVMid);
hspkt.recieverhostid = hostid;
List<NetworkPacket> pktlist = this.packetTohost.get(hostid);
if (pktlist == null) {
pktlist = new ArrayList<NetworkPacket>();
this.packetTohost.put(hostid, pktlist);
}
pktlist.add(hspkt);
return;
}
if (this.level == NetworkConstants.Agg_LEVEL) {
// packet is coming from root so need to be sent to edgelevel swich
// find the id for edgelevel switch
int switchid = dc.VmToSwitchid.get(recvVMid);
List<NetworkPacket> pktlist = this.downlinkswitchpktlist.get(switchid);
if (pktlist == null) {
pktlist = new ArrayList<NetworkPacket>();
this.downlinkswitchpktlist.put(switchid, pktlist);
}
pktlist.add(hspkt);
return;
}
}
private void processpacket_up(SimEvent ev) {
protected void processpacket_up(SimEvent ev) {
// TODO Auto-generated method stub
//packet coming from down level router.
//has to send up
//check which switch to forward to
//add packet in the switch list
// packet coming from down level router.
// has to send up
// check which switch to forward to
// add packet in the switch list
//
//int src=ev.getSource();
HostPacket hspkt=(HostPacket) ev.getData();
int recvVMid=hspkt.pkt.reciever;
CloudSim.cancelAll(getId(), new PredicateType(CloudSimTags.Network_Event_send));
schedule(getId(),this.switching_delay, CloudSimTags.Network_Event_send);
if(this.level==Constants.EDGE_LEVEL)
{
// packet is recieved from host
//packet is to be sent to aggregate level or to another host in the same level
int hostid=dc.VmtoHostlist.get(recvVMid);
NetworkHost hs=this.hostlist.get(hostid);
hspkt.recieverhostid=hostid;
if(hs!=null)
{
//packet to be sent to host connected to the switch
List<HostPacket> pktlist=this.packetTohost.get(hostid);
if(pktlist==null){
pktlist=new ArrayList<HostPacket>();
this.packetTohost.put(hostid, pktlist);
}
pktlist.add(hspkt);
return;
}
//packet is to be sent to upper switch
//ASSUMPTION EACH EDGE is Connected to one aggregate level switch
Switch sw=this.uplinkswitches.get(0);
List<HostPacket> pktlist=this.uplinkswitchpktlist.get(sw.getId());
if(pktlist==null){
pktlist=new ArrayList<HostPacket>();
this.uplinkswitchpktlist.put(sw.getId(), pktlist);
}
pktlist.add(hspkt);
return;
}
if(this.level==Constants.Agg_LEVEL)
{
//packet is coming from edge level router so need to be sent to either root or another edge level swich
//find the id for edgelevel switch
int switchid=dc.VmToSwitchid.get(recvVMid);
boolean flagtoswtich=false;
for(Switch sw:this.downlinkswitches)
{
if(switchid==sw.getId()) flagtoswtich=true;
}
if(flagtoswtich)
{
List<HostPacket> pktlist=this.downlinkswitchpktlist.get(switchid);
if(pktlist==null){
pktlist=new ArrayList<HostPacket>();
this.downlinkswitchpktlist.put(switchid, pktlist);
}
pktlist.add(hspkt);
}
else//send to up
{
Switch sw=this.uplinkswitches.get(0);
List<HostPacket> pktlist=this.uplinkswitchpktlist.get(sw.getId());
if(pktlist==null){
pktlist=new ArrayList<HostPacket>();
this.uplinkswitchpktlist.put(sw.getId(), pktlist);
}
pktlist.add(hspkt);
}
}
if(this.level==Constants.ROOT_LEVEL)
{
//get id of edge router
int edgeswitchid=dc.VmToSwitchid.get(recvVMid);
//search which aggregate switch has it
int aggSwtichid=-1;;
for(Switch sw:this.downlinkswitches)
{
for(Switch edge:sw.downlinkswitches)
{
if(edge.getId()==edgeswitchid){
aggSwtichid=sw.getId();
break;
}
}
}
if(aggSwtichid<0) System.out.println(" No destination for this packet");
else{
List<HostPacket> pktlist=this.downlinkswitchpktlist.get(aggSwtichid);
if(pktlist==null){
pktlist=new ArrayList<HostPacket>();
this.downlinkswitchpktlist.put(aggSwtichid, pktlist);
}
pktlist.add(hspkt);
}
}
}
// int src=ev.getSource();
NetworkPacket hspkt = (NetworkPacket) ev.getData();
int recvVMid = hspkt.pkt.reciever;
CloudSim.cancelAll(getId(), new PredicateType(
CloudSimTags.Network_Event_send));
schedule(getId(), this.switching_delay, CloudSimTags.Network_Event_send);
if (this.level == NetworkConstants.EDGE_LEVEL) {
// packet is recieved from host
// packet is to be sent to aggregate level or to another host in the
// same level
int hostid = dc.VmtoHostlist.get(recvVMid);
NetworkHost hs = this.hostlist.get(hostid);
hspkt.recieverhostid = hostid;
if (hs != null) {
// packet to be sent to host connected to the switch
List<NetworkPacket> pktlist = this.packetTohost.get(hostid);
if (pktlist == null) {
pktlist = new ArrayList<NetworkPacket>();
this.packetTohost.put(hostid, pktlist);
}
pktlist.add(hspkt);
return;
}
// packet is to be sent to upper switch
// ASSUMPTION EACH EDGE is Connected to one aggregate level switch
Switch sw = this.uplinkswitches.get(0);
List<NetworkPacket> pktlist = this.uplinkswitchpktlist.get(sw.getId());
if (pktlist == null) {
pktlist = new ArrayList<NetworkPacket>();
this.uplinkswitchpktlist.put(sw.getId(), pktlist);
}
pktlist.add(hspkt);
return;
}
if (this.level == NetworkConstants.Agg_LEVEL) {
// packet is coming from edge level router so need to be sent to
// either root or another edge level swich
// find the id for edgelevel switch
int switchid = dc.VmToSwitchid.get(recvVMid);
boolean flagtoswtich = false;
for (Switch sw : this.downlinkswitches) {
if (switchid == sw.getId())
flagtoswtich = true;
}
if (flagtoswtich) {
List<NetworkPacket> pktlist = this.downlinkswitchpktlist
.get(switchid);
if (pktlist == null) {
pktlist = new ArrayList<NetworkPacket>();
this.downlinkswitchpktlist.put(switchid, pktlist);
}
pktlist.add(hspkt);
} else// send to up
{
Switch sw = this.uplinkswitches.get(0);
List<NetworkPacket> pktlist = this.uplinkswitchpktlist.get(sw
.getId());
if (pktlist == null) {
pktlist = new ArrayList<NetworkPacket>();
this.uplinkswitchpktlist.put(sw.getId(), pktlist);
}
pktlist.add(hspkt);
}
}
if (this.level == NetworkConstants.ROOT_LEVEL) {
// get id of edge router
int edgeswitchid = dc.VmToSwitchid.get(recvVMid);
// search which aggregate switch has it
int aggSwtichid = -1;
;
for (Switch sw : this.downlinkswitches) {
for (Switch edge : sw.downlinkswitches) {
if (edge.getId() == edgeswitchid) {
aggSwtichid = sw.getId();
break;
}
}
}
if (aggSwtichid < 0)
System.out.println(" No destination for this packet");
else {
List<NetworkPacket> pktlist = this.downlinkswitchpktlist
.get(aggSwtichid);
if (pktlist == null) {
pktlist = new ArrayList<NetworkPacket>();
this.downlinkswitchpktlist.put(aggSwtichid, pktlist);
}
pktlist.add(hspkt);
}
}
}
private void registerHost(SimEvent ev) {
// TODO Auto-generated method stub
NetworkHost hs=(NetworkHost)ev.getData();
hostlist.put(hs.getId(),(NetworkHost)ev.getData());
NetworkHost hs = (NetworkHost) ev.getData();
hostlist.put(hs.getId(), (NetworkHost) ev.getData());
}
private void processpacket(SimEvent ev) {
protected void processpacket(SimEvent ev) {
// TODO Auto-generated method stub
//send packet to itself with switching delay (discarding other)
CloudSim.cancelAll(getId(), new PredicateType(CloudSimTags.Network_Event_UP));
schedule(getId(),this.switching_delay, CloudSimTags.Network_Event_UP);
pktlist.add((HostPacket)ev.getData());
//add the packet in the list
}
// send packet to itself with switching delay (discarding other)
CloudSim.cancelAll(getId(), new PredicateType(
CloudSimTags.Network_Event_UP));
schedule(getId(), this.switching_delay, CloudSimTags.Network_Event_UP);
pktlist.add((NetworkPacket) ev.getData());
// add the packet in the list
}
private void processOtherEvent(SimEvent ev) {
// TODO Auto-generated method stub
}
private void processpacketforward(SimEvent ev) {
protected void processpacketforward(SimEvent ev) {
// TODO Auto-generated method stub
//search for the host and packets..send to them
if(this.downlinkswitchpktlist!=null)
{
for(Entry<Integer, List<HostPacket>> es:downlinkswitchpktlist.entrySet())
{
int tosend=es.getKey();
List<HostPacket> hspktlist=es.getValue();
if(!hspktlist.isEmpty()){
double avband=this.downlinkbandwidth/hspktlist.size();
Iterator<HostPacket> it=hspktlist.iterator();
while(it.hasNext()){
HostPacket hspkt=it.next();
double delay=1000*hspkt.pkt.data/avband;
this.send(tosend,delay,CloudSimTags.Network_Event_DOWN, hspkt);
// search for the host and packets..send to them
if (this.downlinkswitchpktlist != null) {
for (Entry<Integer, List<NetworkPacket>> es : downlinkswitchpktlist
.entrySet()) {
int tosend = es.getKey();
List<NetworkPacket> hspktlist = es.getValue();
if (!hspktlist.isEmpty()) {
double avband = this.downlinkbandwidth / hspktlist.size();
Iterator<NetworkPacket> it = hspktlist.iterator();
while (it.hasNext()) {
NetworkPacket hspkt = it.next();
double delay = 1000 * hspkt.pkt.data / avband;
this.send(tosend, delay,
CloudSimTags.Network_Event_DOWN, hspkt);
}
hspktlist.clear();
}
}
}
if(this.uplinkswitchpktlist!=null)
{
for(Entry<Integer, List<HostPacket>> es:uplinkswitchpktlist.entrySet())
{
int tosend=es.getKey();
List<HostPacket> hspktlist=es.getValue();
if(!hspktlist.isEmpty()){
double avband=this.uplinkbandwidth/hspktlist.size();
Iterator<HostPacket> it=hspktlist.iterator();
while(it.hasNext())
{
HostPacket hspkt=it.next();
double delay=1000*hspkt.pkt.data/avband;
this.send(tosend,delay,CloudSimTags.Network_Event_UP, hspkt);
if (this.uplinkswitchpktlist != null) {
for (Entry<Integer, List<NetworkPacket>> es : uplinkswitchpktlist
.entrySet()) {
int tosend = es.getKey();
List<NetworkPacket> hspktlist = es.getValue();
if (!hspktlist.isEmpty()) {
double avband = this.uplinkbandwidth / hspktlist.size();
Iterator<NetworkPacket> it = hspktlist.iterator();
while (it.hasNext()) {
NetworkPacket hspkt = it.next();
double delay = 1000 * hspkt.pkt.data / avband;
this.send(tosend, delay, CloudSimTags.Network_Event_UP,
hspkt);
}
hspktlist.clear();
}
}
}
if(this.packetTohost!=null)
{
for(Entry<Integer, List<HostPacket>> es:packetTohost.entrySet())
{
int tosend=es.getKey();
NetworkHost hs=this.hostlist.get(tosend);
List<HostPacket> hspktlist=es.getValue();
if(!hspktlist.isEmpty()){
double avband=this.downlinkbandwidth/hspktlist.size();
Iterator<HostPacket> it=hspktlist.iterator();
while(it.hasNext()){
HostPacket hspkt=it.next();
//hspkt.recieverhostid=tosend;
//hs.packetrecieved.add(hspkt);
this.send(this.getId(),hspkt.pkt.data/avband,CloudSimTags.Network_Event_Host, hspkt);
if (this.packetTohost != null) {
for (Entry<Integer, List<NetworkPacket>> es : packetTohost.entrySet()) {
int tosend = es.getKey();
NetworkHost hs = this.hostlist.get(tosend);
List<NetworkPacket> hspktlist = es.getValue();
if (!hspktlist.isEmpty()) {
double avband = this.downlinkbandwidth / hspktlist.size();
Iterator<NetworkPacket> it = hspktlist.iterator();
while (it.hasNext()) {
NetworkPacket hspkt = it.next();
// hspkt.recieverhostid=tosend;
// hs.packetrecieved.add(hspkt);
this.send(this.getId(), hspkt.pkt.data / avband,
CloudSimTags.Network_Event_Host, hspkt);
}
hspktlist.clear();
}
}
}
}
//or to switch at next level.
//clear the list
}
// or to switch at next level.
// clear the list
}
private NetworkHost getHostwithVM(int vmid) {
// TODO Auto-generated method stub
for(Entry<Integer, NetworkHost> es:this.hostlist.entrySet())
{
Vm vm=VmList.getById(es.getValue().getVmList(),vmid);
if(vm!=null) return es.getValue();
for (Entry<Integer, NetworkHost> es : this.hostlist.entrySet()) {
Vm vm = VmList.getById(es.getValue().getVmList(), vmid);
if (vm != null)
return es.getValue();
}
return null;
}
public List<NetworkHost> gethostsWithAvailability(int numHostReq,
double deadline, double exeTime) {
// TODO Auto-generated method stub
List<NetworkHost> ls=null;
for(Entry<Double,List<NetworkHost>> es:this.fintimelistHost.entrySet()){
if((es.getKey()+exeTime)>=deadline){
ls= null;
break;}
else{
if(es.getValue().size()>=numHostReq)
{
ls= es.getValue();
break;
}
}
}
// if(ls==null)
// {
// List<HPCHost> freehostlist=getfreehostlist(numHostReq);
// if(freehostlist.size()>=numHostReq) ls=freehostlist;
// }
return ls;
}
public List<NetworkVm> getVmsWithAvailability(int numVMReq,
double deadline, double exeTime) {
// TODO Auto-generated method stub
List<NetworkVm> ls=new ArrayList<NetworkVm>();
// SortedMap<Double,HPCVm> vmlst=getfintimelistVM();
int i =0;
for(Entry<Integer,NetworkHost> es:this.hostlist.entrySet()){
for(Vm vm:es.getValue().getVmList())
{
NetworkVm v=(NetworkVm)vm;
if((v.finishtime+exeTime)<deadline)
{
ls.add(v);
i++;
}
if(i>=numVMReq) break;
}
if(i>=numVMReq) break;
}
// if((es.getKey()+exeTime)>=deadline){
// ls= null;
// break;}
// else{
// if(es.getValue().size()>=numVMReq)
// {
// ls= es.getValue();
// break;
// }
// }
// }
// if(ls==null)
// {
// List<HPCVm> freeVMlist=getfreeVmlist(numVMReq);
// if(freeVMlist.size()>=numVMReq) ls=freeVMlist;
// }
return ls;
}
// private SortedMap<Double, HPCVm> getfintimelistVM() {
// // TODO Auto-generated method stub
// SortedMap<Double,HPCVm> getfintimelis
// return null;
// }
private List<NetworkVm> getfreeVmlist(int numVMReq) {
// TODO Auto-generated method stub
List<NetworkVm> freehostls=new ArrayList<NetworkVm>();
for(Entry<Integer,NetworkVm> et:this.Vmlist.entrySet())
{
if(et.getValue().isFree())
{
List<NetworkVm> freehostls = new ArrayList<NetworkVm>();
for (Entry<Integer, NetworkVm> et : this.Vmlist.entrySet()) {
if (et.getValue().isFree()) {
freehostls.add(et.getValue());
}
if(freehostls.size()==numVMReq)
if (freehostls.size() == numVMReq)
break;
}
return freehostls;
}
private List<NetworkHost> getfreehostlist(int numhost) {
// TODO Auto-generated method stub
List<NetworkHost> freehostls=new ArrayList<NetworkHost>();
for(Entry<Integer,NetworkHost> et:this.hostlist.entrySet())
{
if(et.getValue().getFreePesNumber()==et.getValue().getPesNumber())
{
List<NetworkHost> freehostls = new ArrayList<NetworkHost>();
for (Entry<Integer, NetworkHost> et : this.hostlist.entrySet()) {
if (et.getValue().getFreePesNumber() == et.getValue()
.getPesNumber()) {
freehostls.add(et.getValue());
}
if(freehostls.size()==numhost)
if (freehostls.size() == numhost)
break;
}
return freehostls;
}
@Override
public void shutdownEntity() {
Log.printLine(getName() + " is shutting down...");
Log.printLine(getName() + " is shutting down...");
}
}
package org.cloudbus.cloudsim.network.datacenter;
/**
* Taskstage represents various stages a networkCloudlet can have during execution.
* Four stage types which are possible-> EXECUTION=0; WAIT_SEND=1; WAIT_RECV=2; FINISH=-2;
* Check NeworkConstants.java file for that.
*
* Please refer to following publication for more details:
*
* Saurabh Kumar Garg and Rajkumar Buyya, NetworkCloudSim: Modelling Parallel
* Applications in Cloud Simulations, Proceedings of the 4th IEEE/ACM
* International Conference on Utility and Cloud Computing (UCC 2011, IEEE CS
* Press, USA), Melbourne, Australia, December 5-7, 2011.
*
*
* @author Saurabh Kumar Garg
* @since CloudSim Toolkit 1.0
*/
public class TaskStage {
public TaskStage(int type, double data, double time, double stageid,long memory,
int peer,int vpeer) {
public TaskStage(int type, double data, double time, double stageid,
long memory, int peer, int vpeer) {
super();
this.type = type;
this.data = data;
......@@ -10,14 +27,15 @@ public class TaskStage {
this.stageid = stageid;
this.memory = memory;
this.peer = peer;
this.vpeer=vpeer;
this.vpeer = vpeer;
}
int vpeer;
int type;//execution, recv, send,
double data;//data generated or send or recv
double time;//execution time for this stage
int type;// execution, recv, send,
double data;// data generated or send or recv
double time;// execution time for this stage
double stageid;
long memory;
int peer;//from whom data needed to be recieved or send
int peer;// from whom data needed to be recieved or send
}
package org.cloudbus.cloudsim.network.datacenter;
/**
* WorkflowApp is an example of AppCloudlet having three communicating tasks.
* Task A and B sends the data (packet) while Task C receives them
*
* Please refer to following publication for more details:
*
* Saurabh Kumar Garg and Rajkumar Buyya, NetworkCloudSim: Modelling Parallel
* Applications in Cloud Simulations, Proceedings of the 4th IEEE/ACM
* International Conference on Utility and Cloud Computing (UCC 2011, IEEE CS
* Press, USA), Melbourne, Australia, December 5-7, 2011.
*
*
* @author Saurabh Kumar Garg
* @since CloudSim Toolkit 1.0
*/
import java.util.List;
import org.cloudbus.cloudsim.UtilizationModel;
......@@ -16,30 +32,30 @@ public class WorkflowApp extends AppCloudlet{
this.numbervm=3;
}
public void createCloudletList(List<Integer> vmIdList){
long fileSize = Constants.FILE_SIZE;
long outputSize = Constants.OUTPUT_SIZE;
int pesNumber = Constants.PES_NUMBER;
long fileSize = NetworkConstants.FILE_SIZE;
long outputSize = NetworkConstants.OUTPUT_SIZE;
int pesNumber = NetworkConstants.PES_NUMBER;
int memory=100;
UtilizationModel utilizationModel = new UtilizationModelFull();
int i=0;
//Task A
NetworkCloudlet cl = new NetworkCloudlet(Constants.currentCloudletId, 0, 1, fileSize, outputSize, memory, utilizationModel, utilizationModel, utilizationModel);
NetworkCloudlet cl = new NetworkCloudlet(NetworkConstants.currentCloudletId, 0, 1, fileSize, outputSize, memory, utilizationModel, utilizationModel, utilizationModel);
cl.numStage=2;
Constants.currentCloudletId++;
NetworkConstants.currentCloudletId++;
cl.setUserId(userId);
cl.submittime=CloudSim.clock();
cl.currStagenum=-1;
cl.setVmId(vmIdList.get(i));
//first stage: big computation
cl.stages.add(new TaskStage(Constants.EXECUTION, 0, 1000*0.8, 0, memory, vmIdList.get(0),cl.getCloudletId()));
cl.stages.add(new TaskStage(Constants.WAIT_SEND, 1000, 0, 1, memory, vmIdList.get(2),cl.getCloudletId()+2));
cl.stages.add(new TaskStage(NetworkConstants.EXECUTION, 0, 1000*0.8, 0, memory, vmIdList.get(0),cl.getCloudletId()));
cl.stages.add(new TaskStage(NetworkConstants.WAIT_SEND, 1000, 0, 1, memory, vmIdList.get(2),cl.getCloudletId()+2));
clist.add(cl);
i++;
//Task B
NetworkCloudlet clb = new NetworkCloudlet(Constants.currentCloudletId, 0, 1, fileSize, outputSize, memory, utilizationModel, utilizationModel, utilizationModel);
NetworkCloudlet clb = new NetworkCloudlet(NetworkConstants.currentCloudletId, 0, 1, fileSize, outputSize, memory, utilizationModel, utilizationModel, utilizationModel);
clb.numStage=2;
Constants.currentCloudletId++;
NetworkConstants.currentCloudletId++;
clb.setUserId(userId);
clb.submittime=CloudSim.clock();
clb.currStagenum=-1;
......@@ -47,24 +63,24 @@ public class WorkflowApp extends AppCloudlet{
//first stage: big computation
clb.stages.add(new TaskStage(Constants.EXECUTION, 0, 1000*0.8, 0, memory, vmIdList.get(1),clb.getCloudletId()));
clb.stages.add(new TaskStage(Constants.WAIT_SEND, 1000, 0, 1, memory, vmIdList.get(2),clb.getCloudletId()+1));
clb.stages.add(new TaskStage(NetworkConstants.EXECUTION, 0, 1000*0.8, 0, memory, vmIdList.get(1),clb.getCloudletId()));
clb.stages.add(new TaskStage(NetworkConstants.WAIT_SEND, 1000, 0, 1, memory, vmIdList.get(2),clb.getCloudletId()+1));
clist.add(clb);
i++;
//Task C
NetworkCloudlet clc = new NetworkCloudlet(Constants.currentCloudletId, 0, 1, fileSize, outputSize, memory, utilizationModel, utilizationModel, utilizationModel);
NetworkCloudlet clc = new NetworkCloudlet(NetworkConstants.currentCloudletId, 0, 1, fileSize, outputSize, memory, utilizationModel, utilizationModel, utilizationModel);
clc.numStage=2;
Constants.currentCloudletId++;
NetworkConstants.currentCloudletId++;
clc.setUserId(userId);
clc.submittime=CloudSim.clock();
clc.currStagenum=-1;
clc.setVmId(vmIdList.get(i));
//first stage: big computation
clc.stages.add(new TaskStage(Constants.WAIT_RECV, 1000, 0, 0, memory, vmIdList.get(0),cl.getCloudletId()));
clc.stages.add(new TaskStage(Constants.WAIT_RECV, 1000, 0, 1, memory, vmIdList.get(1),cl.getCloudletId()+1));
clc.stages.add(new TaskStage(Constants.EXECUTION, 0, 1000*0.8, 1, memory, vmIdList.get(0),clc.getCloudletId()));
clc.stages.add(new TaskStage(NetworkConstants.WAIT_RECV, 1000, 0, 0, memory, vmIdList.get(0),cl.getCloudletId()));
clc.stages.add(new TaskStage(NetworkConstants.WAIT_RECV, 1000, 0, 1, memory, vmIdList.get(1),cl.getCloudletId()+1));
clc.stages.add(new TaskStage(NetworkConstants.EXECUTION, 0, 1000*0.8, 1, memory, vmIdList.get(0),clc.getCloudletId()));
clist.add(clc);
......
......@@ -33,275 +33,301 @@ public class testMainclass {
* @param args
*/
/** The cloudlet list. */
private static List<AppCloudlet> cloudletList;
/** The cloudlet list. */
private static List<AppCloudlet> cloudletList;
/** The vmlist. */
private static List<NetworkVm> vmlist;
/**
* Creates main() to run this example.
*
* @param args the args
*/
public static void main(String[] args) {
Log.printLine("Starting CloudSimExample1...");
try {
int num_user = 1; // number of cloud users
Calendar calendar = Calendar.getInstance();
boolean trace_flag = false; // mean trace events
// Initialize the CloudSim library
CloudSim.init(num_user, calendar, trace_flag);
// Second step: Create Datacenters
// Datacenters are the resource providers in CloudSim. We need at
// list one of them to run a CloudSim simulation
NetworkDatacenter datacenter0 = createDatacenter("Datacenter_0");
// Third step: Create Broker
NetDatacenterBroker broker = createBroker();
int brokerId = broker.getId();
broker.setLinkDC(datacenter0);
//broker.setLinkDC(datacenter0);
// Fifth step: Create one Cloudlet
cloudletList = new ArrayList<AppCloudlet>();
vmlist = new ArrayList<NetworkVm>();
// submit vm list to the broker
broker.submitVmList(vmlist);
// Sixth step: Starts the simulation
CloudSim.startSimulation();
CloudSim.stopSimulation();
//Final step: Print results when simulation is over
List<Cloudlet> newList = broker.getCloudletReceivedList();
printCloudletList(newList);
System.out.println("numberofcloudlet "+newList.size()+" Cached "+NetDatacenterBroker.cachedcloudlet+" Data transfered "+Constants.totaldatatransfer);
// Print the debt of each user to each datacenter
datacenter0.printDebts();
Log.printLine("CloudSimExample1 finished!");
} catch (Exception e) {
e.printStackTrace();
Log.printLine("Unwanted errors happen");
}
/** The vmlist. */
private static List<NetworkVm> vmlist;
/**
* Creates main() to run this example.
*
* @param args
* the args
*/
public static void main(String[] args) {
Log.printLine("Starting CloudSimExample1...");
try {
int num_user = 1; // number of cloud users
Calendar calendar = Calendar.getInstance();
boolean trace_flag = false; // mean trace events
// Initialize the CloudSim library
CloudSim.init(num_user, calendar, trace_flag);
// Second step: Create Datacenters
// Datacenters are the resource providers in CloudSim. We need at
// list one of them to run a CloudSim simulation
NetworkDatacenter datacenter0 = createDatacenter("Datacenter_0");
// Third step: Create Broker
NetDatacenterBroker broker = createBroker();
int brokerId = broker.getId();
broker.setLinkDC(datacenter0);
// broker.setLinkDC(datacenter0);
// Fifth step: Create one Cloudlet
cloudletList = new ArrayList<AppCloudlet>();
vmlist = new ArrayList<NetworkVm>();
// submit vm list to the broker
broker.submitVmList(vmlist);
// Sixth step: Starts the simulation
CloudSim.startSimulation();
CloudSim.stopSimulation();
// Final step: Print results when simulation is over
List<Cloudlet> newList = broker.getCloudletReceivedList();
printCloudletList(newList);
System.out.println("numberofcloudlet " + newList.size()
+ " Cached " + NetDatacenterBroker.cachedcloudlet
+ " Data transfered " + NetworkConstants.totaldatatransfer);
// Print the debt of each user to each datacenter
datacenter0.printDebts();
Log.printLine("CloudSimExample1 finished!");
} catch (Exception e) {
e.printStackTrace();
Log.printLine("Unwanted errors happen");
}
}
/**
* Creates the datacenter.
*
* @param name
* the name
*
* @return the datacenter
*/
private static NetworkDatacenter createDatacenter(String name) {
/**
* Creates the datacenter.
*
* @param name the name
*
* @return the datacenter
*/
private static NetworkDatacenter createDatacenter(String name) {
// Here are the steps needed to create a PowerDatacenter:
// 1. We need to create a list to store
// our machine
List<NetworkHost> hostList = new ArrayList<NetworkHost>();
// Here are the steps needed to create a PowerDatacenter:
// 1. We need to create a list to store
// our machine
List<NetworkHost> hostList = new ArrayList<NetworkHost>();
// 2. A Machine contains one or more PEs or CPUs/Cores.
// In this example, it will have only one core.
// List<Pe> peList = new ArrayList<Pe>();
int mips = 1;
// 3. Create PEs and add these into a list.
// peList.add(new Pe(0, new PeProvisionerSimple(mips))); // need to
// store Pe id and MIPS Rating
// 4. Create Host with its id and list of PEs and add them to the list
// of machines
int hostId = 0;
int ram = 2048; // host memory (MB)
long storage = 1000000; // host storage
int bw = 10000;
for (int i = 0; i < NetworkConstants.EdgeSwitchPort
* NetworkConstants.AggSwitchPort
* NetworkConstants.RootSwitchPort; i++) {
// 2. A Machine contains one or more PEs or CPUs/Cores.
// In this example, it will have only one core.
//List<Pe> peList = new ArrayList<Pe>();
int mips = 1;
// 3. Create PEs and add these into a list.
//peList.add(new Pe(0, new PeProvisionerSimple(mips))); // need to store Pe id and MIPS Rating
// 4. Create Host with its id and list of PEs and add them to the list
// of machines
int hostId = 0;
int ram = 2048; // host memory (MB)
long storage = 1000000; // host storage
int bw = 10000;
for (int i = 0; i < Constants.EdgeSwitchPort*Constants.AggSwitchPort*Constants.RootSwitchPort; i++) {
// 2. A Machine contains one or more PEs or CPUs/Cores.
// In this example, it will have only one core.
// 3. Create PEs and add these into an object of PowerPeList.
List<Pe> peList = new ArrayList<Pe>();
peList.add(new Pe(0, new PeProvisionerSimple(mips))); // need to store PowerPe id and MIPS Rating
peList.add(new Pe(1, new PeProvisionerSimple(mips))); // need to store PowerPe id and MIPS Rating
peList.add(new Pe(2, new PeProvisionerSimple(mips))); // need to store PowerPe id and MIPS Rating
peList.add(new Pe(3, new PeProvisionerSimple(mips))); // need to store PowerPe id and MIPS Rating
peList.add(new Pe(4, new PeProvisionerSimple(mips))); // need to store PowerPe id and MIPS Rating
peList.add(new Pe(5, new PeProvisionerSimple(mips))); // need to store PowerPe id and MIPS Rating
peList.add(new Pe(6, new PeProvisionerSimple(mips))); // need to store PowerPe id and MIPS Rating
peList.add(new Pe(7, new PeProvisionerSimple(mips))); // need to store PowerPe id and MIPS Rating
// 4. Create PowerHost with its id and list of PEs and add them to the list of machines
hostList.add(
new NetworkHost(
i,
new RamProvisionerSimple(ram),
new BwProvisionerSimple(bw),
storage,
peList,
new VmSchedulerTimeShared(peList)
)
); // This is our machine
}
// 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).
String arch = "x86"; // system architecture
String os = "Linux"; // operating system
String vmm = "Xen";
double time_zone = 10.0; // time zone this resource located
double cost = 3.0; // the cost of using processing in this resource
double costPerMem = 0.05; // the cost of using memory in this resource
double costPerStorage = 0.001; // the cost of using storage in this
// resource
double costPerBw = 0.0; // the cost of using bw in this resource
LinkedList<Storage> storageList = new LinkedList<Storage>(); // we are not adding SAN
// devices by now
DatacenterCharacteristics characteristics = new DatacenterCharacteristics(
arch, os, vmm, hostList, time_zone, cost, costPerMem,
costPerStorage, costPerBw);
// 6. Finally, we need to create a PowerDatacenter object.
NetworkDatacenter datacenter = null;
try {
datacenter = new NetworkDatacenter(name, characteristics, new VmHPCAllocationPolicySimple(hostList), storageList, 0);
//datacenter = new HPCDatacenter(name, characteristics, new VmAllocationPolicySimple(hostList), storageList, 0.0001);
} catch (Exception e) {
e.printStackTrace();
}
CreateNetwork(2,datacenter);
return datacenter;
// 3. Create PEs and add these into an object of PowerPeList.
List<Pe> peList = new ArrayList<Pe>();
peList.add(new Pe(0, new PeProvisionerSimple(mips))); // need to
// store
// PowerPe
// id and
// MIPS
// Rating
peList.add(new Pe(1, new PeProvisionerSimple(mips))); // need to
// store
// PowerPe
// id and
// MIPS
// Rating
peList.add(new Pe(2, new PeProvisionerSimple(mips))); // need to
// store
// PowerPe
// id and
// MIPS
// Rating
peList.add(new Pe(3, new PeProvisionerSimple(mips))); // need to
// store
// PowerPe
// id and
// MIPS
// Rating
peList.add(new Pe(4, new PeProvisionerSimple(mips))); // need to
// store
// PowerPe
// id and
// MIPS
// Rating
peList.add(new Pe(5, new PeProvisionerSimple(mips))); // need to
// store
// PowerPe
// id and
// MIPS
// Rating
peList.add(new Pe(6, new PeProvisionerSimple(mips))); // need to
// store
// PowerPe
// id and
// MIPS
// Rating
peList.add(new Pe(7, new PeProvisionerSimple(mips))); // need to
// store
// PowerPe
// id and
// MIPS
// Rating
// 4. Create PowerHost with its id and list of PEs and add them to
// the list of machines
hostList.add(new NetworkHost(i, new RamProvisionerSimple(ram),
new BwProvisionerSimple(bw), storage, peList,
new VmSchedulerTimeShared(peList))); // This is our machine
}
// We strongly encourage users to develop their own broker policies, to
// submit vms and cloudlets according
// to the specific rules of the simulated scenario
/**
* Creates the broker.
*
* @return the datacenter broker
*/
private static NetDatacenterBroker createBroker() {
NetDatacenterBroker broker = null;
try {
broker = new NetDatacenterBroker("Broker");
} catch (Exception e) {
e.printStackTrace();
return null;
}
return broker;
// 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).
String arch = "x86"; // system architecture
String os = "Linux"; // operating system
String vmm = "Xen";
double time_zone = 10.0; // time zone this resource located
double cost = 3.0; // the cost of using processing in this resource
double costPerMem = 0.05; // the cost of using memory in this resource
double costPerStorage = 0.001; // the cost of using storage in this
// resource
double costPerBw = 0.0; // the cost of using bw in this resource
LinkedList<Storage> storageList = new LinkedList<Storage>(); // we are
// not
// adding
// SAN
// devices by now
DatacenterCharacteristics characteristics = new DatacenterCharacteristics(
arch, os, vmm, hostList, time_zone, cost, costPerMem,
costPerStorage, costPerBw);
// 6. Finally, we need to create a NetworkDatacenter object.
NetworkDatacenter datacenter = null;
try {
datacenter = new NetworkDatacenter(name, characteristics,
new NetworkVmAllocationPolicy(hostList), storageList, 0);
} catch (Exception e) {
e.printStackTrace();
}
// Create Internal Datacenter network
CreateNetwork(2, datacenter);
return datacenter;
}
/**
* Prints the Cloudlet objects.
*
* @param list list of Cloudlets
* @throws IOException
*/
private static void printCloudletList(List<Cloudlet> list) throws IOException {
int size = list.size();
Cloudlet cloudlet;
double fintime=0;
String indent = " ";
Log.printLine();
Log.printLine("========== OUTPUT ==========");
Log.printLine("Cloudlet ID" + indent + "STATUS" + indent
+ "Data center ID" + indent + "VM ID" + indent + "Time" + indent
+ "Start Time" + indent + "Finish Time");
DecimalFormat dft = new DecimalFormat("###.##");
for (int i = 0; i < size; i++) {
cloudlet = list.get(i);
Log.print(indent + cloudlet.getCloudletId() + indent + indent);
if (cloudlet.getCloudletStatus() == Cloudlet.SUCCESS) {
Log.print("SUCCESS");
fintime=cloudlet.getFinishTime();
Log.printLine(indent + indent + cloudlet.getResourceId()
+ indent + indent + indent + cloudlet.getVmId()
+ indent + indent
+ dft.format(cloudlet.getActualCPUTime()) + indent
+ indent + dft.format(cloudlet.getExecStartTime())
+ indent + indent
+ dft.format(cloudlet.getFinishTime()));
}
// We strongly encourage users to develop their own broker policies, to
// submit vms and cloudlets according
// to the specific rules of the simulated scenario
/**
* Creates the broker.
*
* @return the datacenter broker
*/
private static NetDatacenterBroker createBroker() {
NetDatacenterBroker broker = null;
try {
broker = new NetDatacenterBroker("Broker");
} catch (Exception e) {
e.printStackTrace();
return null;
}
return broker;
}
/**
* Prints the Cloudlet objects.
*
* @param list
* list of Cloudlets
* @throws IOException
*/
private static void printCloudletList(List<Cloudlet> list)
throws IOException {
int size = list.size();
Cloudlet cloudlet;
double fintime = 0;
String indent = " ";
Log.printLine();
Log.printLine("========== OUTPUT ==========");
Log.printLine("Cloudlet ID" + indent + "STATUS" + indent
+ "Data center ID" + indent + "VM ID" + indent + "Time"
+ indent + "Start Time" + indent + "Finish Time");
DecimalFormat dft = new DecimalFormat("###.##");
for (int i = 0; i < size; i++) {
cloudlet = list.get(i);
Log.print(indent + cloudlet.getCloudletId() + indent + indent);
if (cloudlet.getCloudletStatus() == Cloudlet.SUCCESS) {
Log.print("SUCCESS");
fintime = cloudlet.getFinishTime();
Log.printLine(indent + indent + cloudlet.getResourceId()
+ indent + indent + indent + cloudlet.getVmId()
+ indent + indent
+ dft.format(cloudlet.getActualCPUTime()) + indent
+ indent + dft.format(cloudlet.getExecStartTime())
+ indent + indent
+ dft.format(cloudlet.getFinishTime()));
}
File f=new File("outputmine.csv");
if(!f.exists())
{
f.createNewFile();
}
FileOutputStream fop1=new FileOutputStream(f,true);
fop1.write(("RequestClass ,"+Constants.REQUEST_CLASSES+",numberofcloudlet, "+list.size()+" ,Cached, "+NetDatacenterBroker.cachedcloudlet+" ,Data transfered, "+Constants.totaldatatransfer+ " ,Process Time, "+fintime+"\n").getBytes());
fop1.close();
}
}
static void CreateNetwork(int numhost, NetworkDatacenter dc)
{
// //Root Switch
// Switch swroot=new Switch("Root", Constants.ROOT_LEVEL, dc);
// dc.Switchlist.put(swroot.getId(), swroot);
// //Agg Switch
// Switch aggswitch[]=new Switch[(int) Constants.RootSwitchPort];
// for(int j=0;j<Constants.RootSwitchPort;j++)
// {
// aggswitch[j]=new Switch("Agg"+j, Constants.Agg_LEVEL, dc);
// swroot.downlinkswitches.add(aggswitch[j]);
// aggswitch[j].uplinkswitches.add(swroot);
// dc.Switchlist.put(aggswitch[j].getId(), aggswitch[j]);
// }
//Edge Switch
EdgeSwitch edgeswitch[]=new EdgeSwitch[1];
for(int i=0;i<1;i++)
{
edgeswitch[i]=new EdgeSwitch("Edge"+i, Constants.EDGE_LEVEL, dc);
//edgeswitch[i].uplinkswitches.add(null);
static void CreateNetwork(int numhost, NetworkDatacenter dc) {
// //Root Switch
// Switch swroot=new Switch("Root", Constants.ROOT_LEVEL, dc);
// dc.Switchlist.put(swroot.getId(), swroot);
// //Agg Switch
// Switch aggswitch[]=new Switch[(int) Constants.RootSwitchPort];
// for(int j=0;j<Constants.RootSwitchPort;j++)
// {
// aggswitch[j]=new Switch("Agg"+j, Constants.Agg_LEVEL, dc);
// swroot.downlinkswitches.add(aggswitch[j]);
// aggswitch[j].uplinkswitches.add(swroot);
// dc.Switchlist.put(aggswitch[j].getId(), aggswitch[j]);
// }
// Edge Switch
EdgeSwitch edgeswitch[] = new EdgeSwitch[1];
for (int i = 0; i < 1; i++) {
edgeswitch[i] = new EdgeSwitch("Edge" + i,
NetworkConstants.EDGE_LEVEL, dc);
// edgeswitch[i].uplinkswitches.add(null);
dc.Switchlist.put(edgeswitch[i].getId(), edgeswitch[i]);
//aggswitch[(int) (i/Constants.AggSwitchPort)].downlinkswitches.add(edgeswitch[i]);
// aggswitch[(int)
// (i/Constants.AggSwitchPort)].downlinkswitches.add(edgeswitch[i]);
}
for(Host hs:dc.getHostList())
{
NetworkHost hs1=(NetworkHost)hs;
hs1.bandwidth=Constants.BandWidthEdgeHost;
int switchnum=(int) (hs.getId()/Constants.EdgeSwitchPort);
for (Host hs : dc.getHostList()) {
NetworkHost hs1 = (NetworkHost) hs;
hs1.bandwidth = NetworkConstants.BandWidthEdgeHost;
int switchnum = (int) (hs.getId() / NetworkConstants.EdgeSwitchPort);
edgeswitch[switchnum].hostlist.put(hs.getId(), hs1);
dc.HostToSwitchid.put(hs.getId(),edgeswitch[switchnum].getId());
hs1.sw=edgeswitch[switchnum];
List<NetworkHost> hslist=hs1.sw.fintimelistHost.get(0D);
if(hslist==null)
{
hslist=new ArrayList<NetworkHost>();
hs1.sw.fintimelistHost.put(0D,hslist);
dc.HostToSwitchid.put(hs.getId(), edgeswitch[switchnum].getId());
hs1.sw = edgeswitch[switchnum];
List<NetworkHost> hslist = hs1.sw.fintimelistHost.get(0D);
if (hslist == null) {
hslist = new ArrayList<NetworkHost>();
hs1.sw.fintimelistHost.put(0D, hslist);
}
hslist.add(hs1);
}
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment