GreenCloud Simulator
Public Member Functions | Private Attributes | List of all members
VmMigration Class Reference

#include <vmmigration.h>

Inheritance diagram for VmMigration:
Inheritance graph
[legend]
Collaboration diagram for VmMigration:
Collaboration graph
[legend]

Public Member Functions

 VmMigration ()
 
void initalizeMigration (VM *vm, ResourceProvider *target)
 
virtual ~VmMigration ()
 
virtual int command (int argc, const char *const *argv)
 
void finalizeMigration ()
 
void startMigration ()
 
- Public Member Functions inherited from ResourceConsumer
 ResourceConsumer ()
 
 ResourceConsumer (unsigned int size, std::vector< Resource * > dem, bool isTask, bool isVM)
 
virtual ~ResourceConsumer ()
 
unsigned int getSize ()
 
void setSize (unsigned int size)
 
void setCurrentPerformance (std::vector< double > newPerf)
 
void addUsedCapacity (double *cap)
 

Private Attributes

VMmigrated_vm_
 
ResourceProvidertarget_
 
VmMigrationSinkvm_migration_sink_
 
TcpAgent * vm_migration_sender_
 
int id_
 

Additional Inherited Members

- Public Attributes inherited from ResourceConsumer
bool isTask
 
bool isVM
 
double size_
 
double currProcRate_
 
std::vector< ResDemand * > res_demands
 

Detailed Description

Definition at line 17 of file vmmigration.h.

Constructor & Destructor Documentation

VmMigration::VmMigration ( )

Definition at line 18 of file vmmigration.cc.

18  {
19 
20 }
VmMigration::~VmMigration ( )
virtual

Definition at line 70 of file vmmigration.cc.

70  {
71  // TODO: How about memory management:
72  // delete vm_migration_sender_;
73  // delete vm_migration_sink_;
74 
75 }

Member Function Documentation

int VmMigration::command ( int  argc,
const char *const *  argv 
)
virtual

Definition at line 147 of file vmmigration.cc.

147  {
148  if (argc == 3) {
149  if (strcmp(argv[1], "set-sink") == 0) {
150  VmMigrationSink *vms = dynamic_cast<VmMigrationSink*> (TclObject::lookup(argv[2]));
151  if(vms){
152  vm_migration_sink_ = vms;
154  return (TCL_OK);
155  }
156  return (TCL_ERROR);
157  } else if (strcmp(argv[1], "set-source") == 0) {
158  TcpAgent *vma = dynamic_cast<TcpAgent*> (TcpAgent::lookup(argv[2]));
159  if(vma){
161  return (TCL_OK);
162  }
163  return (TCL_ERROR);
164  } else if (strcmp(argv[1], "set-id") == 0) {
165  char* stat;
166  int num = strtol(argv[2], &stat, 10);
167  if (!*stat){
168  id_=num;
169  return (TCL_OK);
170  }
171  else {
172  return (TCL_ERROR);
173  }
174  }
175  }
176  return TCL_ERROR;
177 }
TcpAgent * vm_migration_sender_
Definition: vmmigration.h:30
VmMigrationSink * vm_migration_sink_
Definition: vmmigration.h:29
void setVmMigration(VmMigration *vm_migration)
void VmMigration::finalizeMigration ( )

Definition at line 96 of file vmmigration.cc.

96  {
99 
100  Tcl& tcl = Tcl::instance();
101 
102  tcl.evalf("$hosts_(%d) detach-vm-mig-source $vmmigrationsource_(%d)",migrated_vm_->getHost()->id_,id_);
103  tcl.evalf("$hosts_(%d) detach-vm-mig-sink $vmmigrationsink_(%d)",target_->id_,id_);
104 
105  tcl.evalf("$ns detach-agent $servers_(%d) $vmmigrationsource_(%d)",migrated_vm_->getHost()->id_,id_);
106  tcl.evalf("$ns detach-agent $servers_(%d) $vmmigrationsink_(%d) ",target_->id_,id_);
107 
108 
109  target_->releaseAllocation(this);
110 
112  source->removeVM(migrated_vm_);
113  // Re-attach tasks sinks
114  tcl.evalf("$ns detach-agent $servers_(%d) $vmtsksink_(%d) ",source->id_,migrated_vm_->id_);
115  tcl.evalf("$ns attach-agent $servers_(%d) $vmtsksink_(%d) ",target_->id_,migrated_vm_->id_);
116 
117  // Re-attach tasks com agents:
118  tcl.evalf("$ns detach-agent $switch_C1_([expr %d/($top(NServers)/$NTSwitches)]) $vmtskcomagnt_C_(%d)",source->id_,migrated_vm_->id_);
119  tcl.evalf("$ns attach-agent $switch_C1_([expr %d/($top(NServers)/$NTSwitches)]) $vmtskcomagnt_C_(%d)",target_->id_,migrated_vm_->id_);
120  // Connect com agents with sinks:
121  tcl.evalf("$ns connect $vmtskcomagnt_C_(%d) $vmtsksink_(%d)",migrated_vm_->id_,migrated_vm_->id_);
122 
123  // Re-attach tasks output agent:
124  tcl.evalf("$ns detach-agent $servers_(%d) $vmtskoutputagent_(%d) ",source->id_,migrated_vm_->id_);
125  tcl.evalf("$ns attach-agent $servers_(%d) $vmtskoutputagent_(%d) ",target_->id_,migrated_vm_->id_);
126  // Re-attach tasks output sink:
127  tcl.evalf("$ns detach-agent $switch_C1_([expr %d/($top(NServers)/$NTSwitches)]) $vmtskoutputsink_(%d)",source->id_,migrated_vm_->id_);
128  tcl.evalf("$ns attach-agent $switch_C1_([expr %d/($top(NServers)/$NTSwitches)]) $vmtskoutputsink_(%d)",target_->id_,migrated_vm_->id_);
129  //Connect:
130  tcl.evalf("$ns connect $vmtskoutputagent_(%d) $vmtskoutputsink_(%d)",migrated_vm_->id_,migrated_vm_->id_);
131 
132 
133  tcl.evalf("$vms_(%d) attach-agent $vmtskoutputagent_(%d)",migrated_vm_->id_,migrated_vm_->id_);
134 
135  if(target_->addVM(migrated_vm_)){
136 // std::cerr << "Migrated VM successfully allocated on target.\n";
137  } else {
138  std::cerr << "Error: Migration object NOT successfully allocated on target.\n";
139  return;
140  }
141 
142  // Migration finalization finished.
143  // IFF the migration object is no longer needed:
144  delete this; // Nothing related to migration object after this point!
145 }
VM * migrated_vm_
Definition: vmmigration.h:27
bool addVM(VM *newVm)
bool removeVM(VM *vm)
bool releaseAllocation(ResourceConsumer *rc)
ResourceProvider * getHost()
virtual void updateEnergyAndConsumption()=0
ResourceProvider * target_
Definition: vmmigration.h:28
void VmMigration::initalizeMigration ( VM vm,
ResourceProvider target 
)

Definition at line 22 of file vmmigration.cc.

22  {
23 
24  migrated_vm_ = vm;
25  target_ = target;
26 
27  this->size_ = vm->size_;
28  this->isTask = false;
29  this->isVM = false;
30  res_demands.clear();
31  res_demands = std::vector<ResDemand *>(vm->res_demands.size(),NULL);
32 
33  std::vector <ResDemand*>::iterator iter;
34  std::vector <ResDemand*>::iterator iter2;
35  for (iter = vm->res_demands.begin(), iter2=res_demands.begin(); iter!=vm->res_demands.end(); iter++,iter2++)
36  {
37  (*iter2)=new ResDemand(*(*iter),NULL);
38  }
39 
40 
41  // Create new migration sink and source;
42 
43  Tcl& tcl = Tcl::instance();
44  // Create communication source and sink:
45  tcl.evalf("set vmmigrationsource_($next_migration_id) [new Agent/TCP/ProvOutAgent]");
46  tcl.evalf("set vmmigrationsink_($next_migration_id) [new Agent/TCPSink/VmMigrationSink]");
47 
48  //Attach source and sink in network topology
49  tcl.evalf("$ns attach-agent $servers_(%d) $vmmigrationsource_($next_migration_id)",migrated_vm_->getHost()->id_);
50  tcl.evalf("$ns attach-agent $servers_(%d) $vmmigrationsink_($next_migration_id)",target_->id_);
51  tcl.evalf("$ns connect $vmmigrationsource_($next_migration_id) $vmmigrationsink_($next_migration_id)");
52 
53 
54  //Attach source and sink to host to track network interface utilization
55  tcl.evalf("$hosts_(%d) attach-vm-mig-source $vmmigrationsource_($next_migration_id)",migrated_vm_->getHost()->id_);
56  tcl.evalf("$hosts_(%d) attach-vm-mig-sink $vmmigrationsink_($next_migration_id)",target_->id_);
57 
58 
59 
60  //Set source and destination in migration object itself:
61  tcl.evalf("$vmmigration_($next_migration_id) set-source $vmmigrationsource_($next_migration_id)");
62  tcl.evalf("$vmmigration_($next_migration_id) set-sink $vmmigrationsink_($next_migration_id)");
63 
64 
65 
66  tcl.evalf("incr next_migration_id");
67 
68 }
VM * migrated_vm_
Definition: vmmigration.h:27
std::vector< ResDemand * > res_demands
ResourceProvider * getHost()
ResourceProvider * target_
Definition: vmmigration.h:28
void VmMigration::startMigration ( )

Definition at line 77 of file vmmigration.cc.

77  {
80 
81  if(target_->tryToAllocate(this)){
82  // std::cerr << "Migration object successfully allocated on target.\n";
83  } else {
84  std::cerr << "Error: Migration object NOT successfully allocated on target.\n";
85  return;
86  }
87 
88  // Create, attach and allocate migration agents: source and sink
89  //TODO: change mig_s to USED capacity instead of total... (but right now there is no overhead of VM, so it could be 0 bytes for idle machine.)
90  int mig_s = migrated_vm_->getTotalCap(Memory); // migration size
91  int p_s = vm_migration_sender_->getPacketSize(); // packet size
92  vm_migration_sink_->seq_expected_ = mig_s % p_s ? ( mig_s / p_s ) + 1: mig_s / p_s; // Ceiling of the number of the last packet
93  vm_migration_sender_->sendmsg(mig_s, (void*) 1);
94 }
TcpAgent * vm_migration_sender_
Definition: vmmigration.h:30
VmMigrationSink * vm_migration_sink_
Definition: vmmigration.h:29
double getTotalCap(res_type type)
VM * migrated_vm_
Definition: vmmigration.h:27
int tryToAllocate(ResourceConsumer *rc)
ResourceProvider * getHost()
virtual void updateEnergyAndConsumption()=0
ResourceProvider * target_
Definition: vmmigration.h:28

Member Data Documentation

int VmMigration::id_
private

Definition at line 31 of file vmmigration.h.

VM* VmMigration::migrated_vm_
private

Definition at line 27 of file vmmigration.h.

ResourceProvider* VmMigration::target_
private

Definition at line 28 of file vmmigration.h.

TcpAgent* VmMigration::vm_migration_sender_
private

Definition at line 30 of file vmmigration.h.

VmMigrationSink* VmMigration::vm_migration_sink_
private

Definition at line 29 of file vmmigration.h.


The documentation for this class was generated from the following files: