opennebula-3.3.80-nichotplug.patch
| opennebula-3.3.80-nichotplug/include/RequestManagerVirtualMachine.h 2012-04-13 14:58:14.000000000 -0400 | ||
|---|---|---|
| 140 | 140 |
RequestAttributes& att); |
| 141 | 141 |
}; |
| 142 | 142 | |
| 143 |
/* ------------------------------------------------------------------------- */ |
|
| 144 |
/* ------------------------------------------------------------------------- */ |
|
| 145 | ||
| 146 |
class VirtualMachineAddNic : public RequestManagerVirtualMachine |
|
| 147 |
{
|
|
| 148 |
public: |
|
| 149 |
VirtualMachineAddNic(): |
|
| 150 |
RequestManagerVirtualMachine("VirtualMachineAddNic",
|
|
| 151 |
"Add NIC to running virtual machine", |
|
| 152 |
"A:sis"){};
|
|
| 153 | ||
| 154 |
~VirtualMachineAddNic(){};
|
|
| 155 | ||
| 156 |
void request_execute(xmlrpc_c::paramList const& _paramList, |
|
| 157 |
RequestAttributes& att); |
|
| 158 |
}; |
|
| 159 | ||
| 160 |
/* -------------------------------------------------------------------------- */ |
|
| 161 |
/* -------------------------------------------------------------------------- */ |
|
| 162 | ||
| 163 |
class VirtualMachineRemoveNic : public RequestManagerVirtualMachine |
|
| 164 |
{
|
|
| 165 |
public: |
|
| 166 |
VirtualMachineRemoveNic(): |
|
| 167 |
RequestManagerVirtualMachine("VirtualMachineRemoveNic",
|
|
| 168 |
"Remove NIC from running virtual machine", |
|
| 169 |
"A:sis"){};
|
|
| 170 | ||
| 171 |
~VirtualMachineRemoveNic(){};
|
|
| 172 | ||
| 173 |
void request_execute(xmlrpc_c::paramList const& _paramList, |
|
| 174 |
RequestAttributes& att); |
|
| 175 |
}; |
|
| 176 | ||
| 143 | 177 |
/* -------------------------------------------------------------------------- */ |
| 144 | 178 |
/* -------------------------------------------------------------------------- */ |
| 145 | 179 |
/* -------------------------------------------------------------------------- */ |
| opennebula-3.3.80-nichotplug/include/VirtualMachineManagerDriver.h 2012-04-14 11:26:37.000000000 -0400 | ||
|---|---|---|
| 164 | 164 |
const string& drv_msg) const; |
| 165 | 165 | |
| 166 | 166 |
/** |
| 167 |
* Sends a save request to the MAD: "RESTORE ID XML_DRV_MSG"
|
|
| 167 |
* Sends a restore request to the MAD: "RESTORE ID XML_DRV_MSG"
|
|
| 168 | 168 |
* @param oid the virtual machine id. |
| 169 | 169 |
* @param drv_msg xml data for the mad operation |
| 170 | 170 |
*/ |
| ... | ... | |
| 189 | 189 |
void poll ( |
| 190 | 190 |
const int oid, |
| 191 | 191 |
const string& drv_msg) const; |
| 192 | ||
| 193 |
/** |
|
| 194 |
* Sends a addnic request to the MAD: "ADDNIC ID XML_DRV_MSG" |
|
| 195 |
* @param oid the virtual machine id. |
|
| 196 |
* @param drv_msg xml data for the mad operation |
|
| 197 |
*/ |
|
| 198 |
void addnic ( |
|
| 199 |
const int oid, |
|
| 200 |
const string& drv_msg) const; |
|
| 201 | ||
| 202 |
/** |
|
| 203 |
* Sends a rmnic request to the MAD: "RMNIC ID XML_DRV_MSG" |
|
| 204 |
* @param oid the virtual machine id. |
|
| 205 |
* @param drv_msg xml data for the mad operation |
|
| 206 |
*/ |
|
| 207 |
void rmnic ( |
|
| 208 |
const int oid, |
|
| 209 |
const string& drv_msg) const; |
|
| 210 | ||
| 192 | 211 |
}; |
| 193 | 212 | |
| 194 | 213 |
/* -------------------------------------------------------------------------- */ |
| opennebula-3.3.80-nichotplug/include/VirtualMachineManager.h 2012-04-14 11:23:28.000000000 -0400 | ||
|---|---|---|
| 53 | 53 |
RESTORE, |
| 54 | 54 |
REBOOT, |
| 55 | 55 |
POLL, |
| 56 |
ADDNIC, |
|
| 57 |
RMNIC, |
|
| 56 | 58 |
TIMER, |
| 57 | 59 |
DRIVER_CANCEL, |
| 58 | 60 |
FINALIZE |
| ... | ... | |
| 278 | 280 |
int vid); |
| 279 | 281 |
|
| 280 | 282 |
/** |
| 283 |
* Add NIC to a running VM. |
|
| 284 |
* @param vid the id of the VM. |
|
| 285 |
*/ |
|
| 286 |
void addnic_action( |
|
| 287 |
int vid); |
|
| 288 | ||
| 289 |
/** |
|
| 290 |
* Remove NIC from a running VM. |
|
| 291 |
* @param vid the id of the VM. |
|
| 292 |
*/ |
|
| 293 |
void rmnic_action( |
|
| 294 |
int vid); |
|
| 295 | ||
| 296 |
/** |
|
| 281 | 297 |
* This function is executed periodically to poll the running VMs |
| 282 | 298 |
*/ |
| 283 | 299 |
void timer_action(); |
| opennebula-3.3.80-nichotplug/src/mad/ruby/VirtualMachineDriver.rb 2012-04-14 11:07:58.000000000 -0400 | ||
|---|---|---|
| 42 | 42 |
:restore => "RESTORE", |
| 43 | 43 |
:migrate => "MIGRATE", |
| 44 | 44 |
:poll => "POLL", |
| 45 |
:log => "LOG" |
|
| 45 |
:log => "LOG", |
|
| 46 |
:addnic => "ADDNIC", |
|
| 47 |
:rmnic => "RMNIC" |
|
| 46 | 48 |
} |
| 47 | 49 | |
| 48 | 50 |
POLL_ATTRIBUTE = {
|
| ... | ... | |
| 87 | 89 |
register_action(ACTION[:restore].to_sym, method("restore"))
|
| 88 | 90 |
register_action(ACTION[:migrate].to_sym, method("migrate"))
|
| 89 | 91 |
register_action(ACTION[:poll].to_sym, method("poll"))
|
| 92 |
register_action(ACTION[:addnic].to_sym, method("addnic"))
|
|
| 93 |
register_action(ACTION[:rmnic].to_sym, method("rmnic"))
|
|
| 90 | 94 |
end |
| 91 | 95 | |
| 92 | 96 |
# Decodes the encoded XML driver message received from the core |
| ... | ... | |
| 151 | 155 |
send_message(ACTION[:poll],RESULT[:failure],id,error) |
| 152 | 156 |
end |
| 153 | 157 | |
| 158 |
def addnic(id, drv_message) |
|
| 159 |
error = "Action not implemented by driver #{self.class}"
|
|
| 160 |
send_message(ACTION[:addnic],RESULT[:failure],id,error) |
|
| 161 |
end |
|
| 162 | ||
| 163 |
def rmnic(id, drv_message) |
|
| 164 |
error = "Action not implemented by driver #{self.class}"
|
|
| 165 |
send_message(ACTION[:rmnic],RESULT[:failure],id,error) |
|
| 166 |
end |
|
| 167 | ||
| 154 | 168 |
private |
| 155 | 169 |
# Interface to handle the pending events from the ActionManager Interface |
| 156 | 170 |
def delete_running_action(action_id) |
| opennebula-3.3.80-nichotplug/src/rm/RequestManager.cc 2012-04-13 14:51:57.000000000 -0400 | ||
|---|---|---|
| 242 | 242 |
xmlrpc_c::methodPtr vm_migrate(new VirtualMachineMigrate()); |
| 243 | 243 |
xmlrpc_c::methodPtr vm_action(new VirtualMachineAction()); |
| 244 | 244 |
xmlrpc_c::methodPtr vm_savedisk(new VirtualMachineSaveDisk()); |
| 245 |
xmlrpc_c::methodPtr vm_addnic(new VirtualMachineAddNic()); |
|
| 246 |
xmlrpc_c::methodPtr vm_rmnic(new VirtualMachineRemoveNic()); |
|
| 245 | 247 | |
| 246 | 248 |
// VirtualNetwork Methods |
| 247 | 249 |
xmlrpc_c::methodPtr vn_addleases(new VirtualNetworkAddLeases()); |
| ... | ... | |
| 345 | 347 |
RequestManagerRegistry.addMethod("one.vm.info", vm_info);
|
| 346 | 348 |
RequestManagerRegistry.addMethod("one.vm.chown", vm_chown);
|
| 347 | 349 |
RequestManagerRegistry.addMethod("one.vm.chmod", vm_chmod);
|
| 350 |
RequestManagerRegistry.addMethod("one.vm.addnic", vm_addnic);
|
|
| 351 |
RequestManagerRegistry.addMethod("one.vm.rmnic", vm_rmnic);
|
|
| 348 | 352 | |
| 349 | 353 |
RequestManagerRegistry.addMethod("one.vmpool.info", vm_pool_info);
|
| 350 | 354 | |
| opennebula-3.3.80-nichotplug/src/rm/RequestManagerVirtualMachine.cc 2012-04-14 20:57:49.000000000 -0400 | ||
|---|---|---|
| 553 | 553 | |
| 554 | 554 |
/* -------------------------------------------------------------------------- */ |
| 555 | 555 |
/* -------------------------------------------------------------------------- */ |
| 556 | ||
| 557 |
void VirtualMachineAddNic::request_execute(xmlrpc_c::paramList const& paramList, |
|
| 558 |
RequestAttributes& att) |
|
| 559 |
{
|
|
| 560 |
Nebula& nd = Nebula::instance(); |
|
| 561 | ||
| 562 |
int id = xmlrpc_c::value_int(paramList.getInt(1)); |
|
| 563 |
string str_tmpl = xmlrpc_c::value_string(paramList.getString(2)); |
|
| 564 | ||
| 565 |
VirtualMachinePool * vmpool = nd.get_vmpool(); |
|
| 566 |
VirtualNetworkPool * vnpool = nd.get_vnpool(); |
|
| 567 |
VirtualMachineManager * vmm = nd.get_vmm(); |
|
| 568 | ||
| 569 |
VirtualMachine * vm; |
|
| 570 | ||
| 571 |
VirtualNetworkTemplate tmpl; |
|
| 572 |
string error_str; |
|
| 573 |
int rc; |
|
| 574 | ||
| 575 |
// ------------------------------------------------------------------------- |
|
| 576 |
// Authorize the operation |
|
| 577 |
// ------------------------------------------------------------------------- |
|
| 578 | ||
| 579 |
if ( vm_authorization(id, 0, att, 0, 0) == false ) |
|
| 580 |
{
|
|
| 581 |
return; |
|
| 582 |
} |
|
| 583 | ||
| 584 |
if ( (vm = get_vm(id, att)) == 0 ) |
|
| 585 |
{
|
|
| 586 |
return; |
|
| 587 |
} |
|
| 588 | ||
| 589 |
if (vm->get_state() != VirtualMachine::ACTIVE) {
|
|
| 590 |
failure_response(ACTION, request_error("Wrong state to perform action",""), att);
|
|
| 591 |
vm->unlock(); |
|
| 592 |
return; |
|
| 593 |
} |
|
| 594 | ||
| 595 |
// ------------------------------------------------------------------------- |
|
| 596 |
// Parse passed template into a NIC description |
|
| 597 |
// ------------------------------------------------------------------------- |
|
| 598 | ||
| 599 |
rc = tmpl.parse_str_or_xml(str_tmpl, error_str); |
|
| 600 | ||
| 601 |
if ( rc != 0 ) |
|
| 602 |
{
|
|
| 603 |
failure_response(INTERNAL, request_error(error_str, ""), att); |
|
| 604 |
vm->unlock(); |
|
| 605 |
return; |
|
| 606 |
} |
|
| 607 | ||
| 608 |
vector<Attribute*> vector_nic; |
|
| 609 |
tmpl.get(string("NIC"), vector_nic);
|
|
| 610 |
VectorAttribute * single_attr_nic = 0; |
|
| 611 | ||
| 612 |
if ( vector_nic.size() > 0 ) |
|
| 613 |
{
|
|
| 614 |
single_attr_nic = dynamic_cast<VectorAttribute *>(vector_nic[0]); |
|
| 615 |
} |
|
| 616 | ||
| 617 |
if( single_attr_nic == 0 ) |
|
| 618 |
{
|
|
| 619 |
failure_response(INTERNAL, request_error("Empty NIC description.", ""), att);
|
|
| 620 |
vm->unlock(); |
|
| 621 |
return; |
|
| 622 |
} |
|
| 623 | ||
| 624 |
// ------------------------------------------------------------------------- |
|
| 625 |
// Obtain auth for the requested Virtual network |
|
| 626 |
// ------------------------------------------------------------------------- |
|
| 627 | ||
| 628 |
AuthRequest ar(att.uid, att.gid); |
|
| 629 |
vnpool->authorize_nic(single_attr_nic,att.uid,&ar); |
|
| 630 | ||
| 631 |
if (UserPool::authorize(ar) == -1) |
|
| 632 |
{
|
|
| 633 |
failure_response(AUTHORIZATION, authorization_error(ar.message, att), att); |
|
| 634 |
vm->unlock(); |
|
| 635 |
return; |
|
| 636 |
} |
|
| 637 | ||
| 638 |
// ------------------------------------------------------------------------- |
|
| 639 |
// Assign new NIC to VM |
|
| 640 |
// ------------------------------------------------------------------------- |
|
| 641 | ||
| 642 |
rc = vnpool->nic_attribute(single_attr_nic, att.uid, id, error_str); |
|
| 643 | ||
| 644 |
if (rc != 0) {
|
|
| 645 |
if (error_str.empty()) {
|
|
| 646 |
error_str = "Invalid network or no leases available."; |
|
| 647 |
} |
|
| 648 |
failure_response(INTERNAL,request_error(error_str,""), att); |
|
| 649 |
vm->unlock(); |
|
| 650 |
return; |
|
| 651 |
} |
|
| 652 |
|
|
| 653 |
// ------------------------------------------------------------------------- |
|
| 654 |
// Append new NIC to VM template |
|
| 655 |
// ------------------------------------------------------------------------- |
|
| 656 | ||
| 657 |
string vm_xml; |
|
| 658 |
vm->to_xml(vm_xml); |
|
| 659 |
vm_xml = vm_xml.substr(vm_xml.find("<TEMPLATE>"));
|
|
| 660 |
vm_xml = vm_xml.substr(0, vm_xml.rfind("</TEMPLATE>"));
|
|
| 661 |
string * nic_xml = single_attr_nic->to_xml(); |
|
| 662 |
vm_xml.append(*nic_xml).append("</TEMPLATE>");
|
|
| 663 |
delete nic_xml; |
|
| 664 | ||
| 665 |
// ------------------------------------------------------------------------- |
|
| 666 |
// Update the VM template |
|
| 667 |
// ------------------------------------------------------------------------- |
|
| 668 | ||
| 669 |
rc = vm->replace_template(vm_xml, error_str); |
|
| 670 |
vmpool->update(vm); |
|
| 671 | ||
| 672 |
if (rc != 0) {
|
|
| 673 |
failure_response(INTERNAL,request_error(error_str,""), att); |
|
| 674 |
vm->unlock(); |
|
| 675 |
return; |
|
| 676 |
} |
|
| 677 |
|
|
| 678 |
// ------------------------------------------------------------------------- |
|
| 679 |
// Trigger the ADDNIC action |
|
| 680 |
// ------------------------------------------------------------------------- |
|
| 681 | ||
| 682 |
vmm->trigger(VirtualMachineManager::ADDNIC, id); |
|
| 683 | ||
| 684 |
vm->unlock(); |
|
| 685 |
success_response(true, att); |
|
| 686 |
} |
|
| 687 | ||
| 688 |
/* ------------------------------------------------------------------------- */ |
|
| 689 |
/* ------------------------------------------------------------------------- */ |
|
| 690 | ||
| 691 |
void VirtualMachineRemoveNic::request_execute(xmlrpc_c::paramList const& paramList, |
|
| 692 |
RequestAttributes& att) |
|
| 693 |
{
|
|
| 694 |
Nebula& nd = Nebula::instance(); |
|
| 695 | ||
| 696 |
int id = xmlrpc_c::value_int(paramList.getInt(1)); |
|
| 697 |
string str_tmpl = xmlrpc_c::value_string(paramList.getString(2)); |
|
| 698 | ||
| 699 |
VirtualMachinePool * vmpool = nd.get_vmpool(); |
|
| 700 |
VirtualNetworkPool * vnpool = nd.get_vnpool(); |
|
| 701 |
VirtualMachineManager * vmm = nd.get_vmm(); |
|
| 702 | ||
| 703 |
VirtualMachine * vm; |
|
| 704 | ||
| 705 |
VirtualNetworkTemplate tmpl; |
|
| 706 |
string error_str; |
|
| 707 |
int rc; |
|
| 708 |
string ip; |
|
| 709 |
string vnid; |
|
| 710 | ||
| 711 |
// ------------------------------------------------------------------------- |
|
| 712 |
// Authorize the operation |
|
| 713 |
// ------------------------------------------------------------------------- |
|
| 714 | ||
| 715 |
if ( vm_authorization(id, 0, att, 0, 0) == false ) |
|
| 716 |
{
|
|
| 717 |
return; |
|
| 718 |
} |
|
| 719 | ||
| 720 |
if ( (vm = get_vm(id, att)) == 0 ) |
|
| 721 |
{
|
|
| 722 |
return; |
|
| 723 |
} |
|
| 724 | ||
| 725 |
if (vm->get_state() != VirtualMachine::ACTIVE) {
|
|
| 726 |
failure_response(ACTION, request_error("Wrong state to perform action",""), att);
|
|
| 727 |
vm->unlock(); |
|
| 728 |
return; |
|
| 729 |
} |
|
| 730 | ||
| 731 |
// ------------------------------------------------------------------------- |
|
| 732 |
// Parse passed template into a NIC description |
|
| 733 |
// ------------------------------------------------------------------------- |
|
| 734 | ||
| 735 |
rc = tmpl.parse_str_or_xml(str_tmpl, error_str); |
|
| 736 | ||
| 737 |
if ( rc != 0 ) |
|
| 738 |
{
|
|
| 739 |
failure_response(INTERNAL, request_error(error_str, ""), att); |
|
| 740 |
vm->unlock(); |
|
| 741 |
return; |
|
| 742 |
} |
|
| 743 | ||
| 744 |
vector<Attribute*> vector_nic; |
|
| 745 |
tmpl.get(string("NIC"), vector_nic);
|
|
| 746 |
VectorAttribute * single_attr_nic = 0; |
|
| 747 | ||
| 748 |
if ( vector_nic.size() > 0 ) |
|
| 749 |
{
|
|
| 750 |
single_attr_nic = dynamic_cast<VectorAttribute *>(vector_nic[0]); |
|
| 751 |
} |
|
| 752 | ||
| 753 |
if( single_attr_nic == 0 ) |
|
| 754 |
{
|
|
| 755 |
failure_response(INTERNAL, request_error("Empty NIC description.", ""), att);
|
|
| 756 |
vm->unlock(); |
|
| 757 |
return; |
|
| 758 |
} |
|
| 759 | ||
| 760 |
ip = single_attr_nic->vector_value("IP");
|
|
| 761 |
vnid = single_attr_nic->vector_value("NETWORK_ID");
|
|
| 762 | ||
| 763 |
if( ip.empty() || vnid.empty() ) |
|
| 764 |
{
|
|
| 765 |
failure_response(INTERNAL, request_error("Missing IP and/or NETWORK_ID from NIC description.", ""), att);
|
|
| 766 |
vm->unlock(); |
|
| 767 |
return; |
|
| 768 |
} |
|
| 769 | ||
| 770 |
// ------------------------------------------------------------------------- |
|
| 771 |
// Search VM template for requested NIC to be removed |
|
| 772 |
// ------------------------------------------------------------------------- |
|
| 773 | ||
| 774 |
vector<Attribute const * > nics; |
|
| 775 |
int num_nics = vm->get_template_attribute("NIC",nics);
|
|
| 776 | ||
| 777 |
const VectorAttribute * nic; |
|
| 778 |
bool found = false; |
|
| 779 | ||
| 780 |
for(int i=0; i<num_nics; i++) |
|
| 781 |
{
|
|
| 782 |
nic = dynamic_cast<VectorAttribute const * >(nics[i]); |
|
| 783 | ||
| 784 |
if (nic->vector_value("IP") == ip && nic->vector_value("NETWORK_ID") == vnid) {
|
|
| 785 |
found = true; |
|
| 786 |
break; |
|
| 787 |
} |
|
| 788 |
} |
|
| 789 | ||
| 790 |
if ( found == false ) {
|
|
| 791 |
failure_response(INTERNAL, request_error("No leases matched the requested network.",""), att);
|
|
| 792 |
vm->unlock(); |
|
| 793 |
return; |
|
| 794 |
} |
|
| 795 | ||
| 796 |
// ------------------------------------------------------------------------- |
|
| 797 |
// Release IP address back into the pool |
|
| 798 |
// ------------------------------------------------------------------------- |
|
| 799 | ||
| 800 |
VirtualNetwork * vn = vnpool->get(atoi(vnid.c_str()),true); |
|
| 801 |
vn->release_lease(ip); |
|
| 802 |
vnpool->update(vn); |
|
| 803 |
vn->unlock(); |
|
| 804 | ||
| 805 |
// ------------------------------------------------------------------------- |
|
| 806 |
// Remove NIC from VM template |
|
| 807 |
// ------------------------------------------------------------------------- |
|
| 808 | ||
| 809 |
string vm_xml; |
|
| 810 |
vm->to_xml(vm_xml); |
|
| 811 |
vm_xml = vm_xml.substr(vm_xml.find("<TEMPLATE>"));
|
|
| 812 |
vm_xml = vm_xml.substr(0, vm_xml.rfind("</TEMPLATE>") + 11);
|
|
| 813 |
string * nic_xml = nic->to_xml(); |
|
| 814 |
vm_xml.replace(vm_xml.find(*nic_xml), nic_xml->length(), ""); |
|
| 815 |
delete nic_xml; |
|
| 816 | ||
| 817 |
// ------------------------------------------------------------------------- |
|
| 818 |
// Update the VM template |
|
| 819 |
// ------------------------------------------------------------------------- |
|
| 820 | ||
| 821 |
rc = vm->replace_template(vm_xml, error_str); |
|
| 822 |
vmpool->update(vm); |
|
| 823 | ||
| 824 |
if (rc != 0) {
|
|
| 825 |
failure_response(INTERNAL,request_error(error_str,""), att); |
|
| 826 |
vm->unlock(); |
|
| 827 |
return; |
|
| 828 |
} |
|
| 829 | ||
| 830 |
// ------------------------------------------------------------------------- |
|
| 831 |
// Trigger the RMNIC action |
|
| 832 |
// ------------------------------------------------------------------------- |
|
| 833 | ||
| 834 |
vmm->trigger(VirtualMachineManager::RMNIC,id); |
|
| 835 | ||
| 836 |
vm->unlock(); |
|
| 837 |
success_response(true, att); |
|
| 838 |
} |
|
| 839 | ||
| 840 |
/* -------------------------------------------------------------------------- */ |
|
| 841 |
/* -------------------------------------------------------------------------- */ |
|
| 842 |
/* -------------------------------------------------------------------------- */ |
|
| opennebula-3.3.80-nichotplug/src/vmm/VirtualMachineManager.cc 2012-04-14 11:17:38.000000000 -0400 | ||
|---|---|---|
| 130 | 130 |
aname = "REBOOT"; |
| 131 | 131 |
break; |
| 132 | 132 | |
| 133 |
case ADDNIC: |
|
| 134 |
aname = "ADDNIC"; |
|
| 135 |
break; |
|
| 136 | ||
| 137 |
case RMNIC: |
|
| 138 |
aname = "RMNIC"; |
|
| 139 |
break; |
|
| 140 | ||
| 133 | 141 |
case SHUTDOWN: |
| 134 | 142 |
aname = "SHUTDOWN"; |
| 135 | 143 |
break; |
| ... | ... | |
| 226 | 234 |
{
|
| 227 | 235 |
poll_action(vid); |
| 228 | 236 |
} |
| 237 |
else if (action == "ADDNIC") |
|
| 238 |
{
|
|
| 239 |
addnic_action(vid); |
|
| 240 |
} |
|
| 241 |
else if (action == "RMNIC") |
|
| 242 |
{
|
|
| 243 |
rmnic_action(vid); |
|
| 244 |
} |
|
| 229 | 245 |
else if (action == "DRIVER_CANCEL") |
| 230 | 246 |
{
|
| 231 | 247 |
driver_cancel_action(vid); |
| ... | ... | |
| 1020 | 1036 | |
| 1021 | 1037 |
error_common: |
| 1022 | 1038 |
vm->log("VMM", Log::ERROR, os);
|
| 1039 |
vm->unlock(); |
|
| 1040 |
return; |
|
| 1041 |
} |
|
| 1042 | ||
| 1043 |
/* -------------------------------------------------------------------------- */ |
|
| 1044 |
/* -------------------------------------------------------------------------- */ |
|
| 1045 | ||
| 1046 |
void VirtualMachineManager::addnic_action( |
|
| 1047 |
int vid) |
|
| 1048 |
{
|
|
| 1049 |
VirtualMachine * vm; |
|
| 1050 |
const VirtualMachineManagerDriver * vmd; |
|
| 1051 | ||
| 1052 |
string vm_tmpl; |
|
| 1053 |
string * drv_msg; |
|
| 1054 |
ostringstream os; |
|
| 1055 | ||
| 1056 |
// Get the VM from the pool |
|
| 1057 |
vm = vmpool->get(vid,true); |
|
| 1058 | ||
| 1059 |
if (vm == 0) |
|
| 1060 |
{
|
|
| 1061 |
return; |
|
| 1062 |
} |
|
| 1063 | ||
| 1064 |
if (!vm->hasHistory()) |
|
| 1065 |
{
|
|
| 1066 |
goto error_history; |
|
| 1067 |
} |
|
| 1068 | ||
| 1069 |
// Get the driver for this VM |
|
| 1070 |
vmd = get(vm->get_vmm_mad()); |
|
| 1071 | ||
| 1072 |
if ( vmd == 0 ) |
|
| 1073 |
{
|
|
| 1074 |
goto error_driver; |
|
| 1075 |
} |
|
| 1076 | ||
| 1077 |
// Invoke driver method |
|
| 1078 |
drv_msg = format_message( |
|
| 1079 |
vm->get_hostname(), |
|
| 1080 |
vm->get_vnm_mad(), |
|
| 1081 |
"", |
|
| 1082 |
"", |
|
| 1083 |
vm->get_deploy_id(), |
|
| 1084 |
"", |
|
| 1085 |
"", |
|
| 1086 |
"", |
|
| 1087 |
vm->to_xml(vm_tmpl)); |
|
| 1088 | ||
| 1089 |
vmd->addnic(vid, *drv_msg); |
|
| 1090 | ||
| 1091 |
delete drv_msg; |
|
| 1092 | ||
| 1093 |
vm->unlock(); |
|
| 1094 | ||
| 1095 |
return; |
|
| 1096 | ||
| 1097 |
error_history: |
|
| 1098 |
os.str("");
|
|
| 1099 |
os << "addnic_action, VM has no history"; |
|
| 1100 |
goto error_common; |
|
| 1101 | ||
| 1102 |
error_driver: |
|
| 1103 |
os.str("");
|
|
| 1104 |
os << "addnic_action, error getting driver " << vm->get_vmm_mad(); |
|
| 1105 | ||
| 1106 |
error_common: |
|
| 1107 |
vm->log("VMM", Log::ERROR, os);
|
|
| 1108 |
vm->unlock(); |
|
| 1109 |
return; |
|
| 1110 |
} |
|
| 1111 | ||
| 1112 |
/* -------------------------------------------------------------------------- */ |
|
| 1113 |
/* -------------------------------------------------------------------------- */ |
|
| 1114 | ||
| 1115 |
void VirtualMachineManager::rmnic_action( |
|
| 1116 |
int vid) |
|
| 1117 |
{
|
|
| 1118 |
VirtualMachine * vm; |
|
| 1119 |
const VirtualMachineManagerDriver * vmd; |
|
| 1120 | ||
| 1121 |
string vm_tmpl; |
|
| 1122 |
string * drv_msg; |
|
| 1123 |
ostringstream os; |
|
| 1124 | ||
| 1125 |
// Get the VM from the pool |
|
| 1126 |
vm = vmpool->get(vid,true); |
|
| 1127 | ||
| 1128 |
if (vm == 0) |
|
| 1129 |
{
|
|
| 1130 |
return; |
|
| 1131 |
} |
|
| 1132 | ||
| 1133 |
if (!vm->hasHistory()) |
|
| 1134 |
{
|
|
| 1135 |
goto error_history; |
|
| 1136 |
} |
|
| 1137 | ||
| 1138 |
// Get the driver for this VM |
|
| 1139 |
vmd = get(vm->get_vmm_mad()); |
|
| 1140 | ||
| 1141 |
if ( vmd == 0 ) |
|
| 1142 |
{
|
|
| 1143 |
goto error_driver; |
|
| 1144 |
} |
|
| 1145 | ||
| 1146 |
// Invoke driver method |
|
| 1147 |
drv_msg = format_message( |
|
| 1148 |
vm->get_hostname(), |
|
| 1149 |
vm->get_vnm_mad(), |
|
| 1150 |
"", |
|
| 1151 |
"", |
|
| 1152 |
vm->get_deploy_id(), |
|
| 1153 |
"", |
|
| 1154 |
"", |
|
| 1155 |
"", |
|
| 1156 |
vm->to_xml(vm_tmpl)); |
|
| 1157 | ||
| 1158 |
vmd->rmnic(vid, *drv_msg); |
|
| 1159 | ||
| 1160 |
delete drv_msg; |
|
| 1161 | ||
| 1162 |
vm->unlock(); |
|
| 1163 | ||
| 1164 |
return; |
|
| 1165 | ||
| 1166 |
error_history: |
|
| 1167 |
os.str("");
|
|
| 1168 |
os << "rmnic_action, VM has no history"; |
|
| 1169 |
goto error_common; |
|
| 1170 | ||
| 1171 |
error_driver: |
|
| 1172 |
os.str("");
|
|
| 1173 |
os << "rmnic_action, error getting driver " << vm->get_vmm_mad(); |
|
| 1174 | ||
| 1175 |
error_common: |
|
| 1176 |
vm->log("VMM", Log::ERROR, os);
|
|
| 1023 | 1177 |
vm->unlock(); |
| 1024 | 1178 |
return; |
| 1025 | 1179 |
} |
| opennebula-3.3.80-nichotplug/src/vmm/VirtualMachineManagerDriver.cc 2012-04-14 11:30:57.000000000 -0400 | ||
|---|---|---|
| 225 | 225 |
write(os); |
| 226 | 226 |
}; |
| 227 | 227 | |
| 228 |
/* -------------------------------------------------------------------------- */ |
|
| 229 |
/* -------------------------------------------------------------------------- */ |
|
| 230 | ||
| 231 |
void VirtualMachineManagerDriver::addnic ( |
|
| 232 |
const int oid, |
|
| 233 |
const string& drv_msg) const |
|
| 234 |
{
|
|
| 235 |
ostringstream os; |
|
| 236 | ||
| 237 |
os << "ADDNIC " << oid << " " << drv_msg << endl; |
|
| 238 | ||
| 239 |
write(os); |
|
| 240 |
}; |
|
| 241 | ||
| 242 |
/* -------------------------------------------------------------------------- */ |
|
| 243 |
/* -------------------------------------------------------------------------- */ |
|
| 244 | ||
| 245 |
void VirtualMachineManagerDriver::rmnic ( |
|
| 246 |
const int oid, |
|
| 247 |
const string& drv_msg) const |
|
| 248 |
{
|
|
| 249 |
ostringstream os; |
|
| 250 | ||
| 251 |
os << "RMNIC " << oid << " " << drv_msg << endl; |
|
| 252 | ||
| 253 |
write(os); |
|
| 254 |
}; |
|
| 255 | ||
| 228 | 256 |
/* ************************************************************************** */ |
| 229 | 257 |
/* MAD Interface */ |
| 230 | 258 |
/* ************************************************************************** */ |
| opennebula-3.3.80-nichotplug/src/vmm_mad/exec/one_vmm_exec.rb 2012-04-11 15:09:51.000000000 -0400 | ||
|---|---|---|
| 470 | 470 | |
| 471 | 471 |
do_action("#{deploy_id} #{host}", id, host, ACTION[:reboot])
|
| 472 | 472 |
end |
| 473 | ||
| 474 |
# |
|
| 475 |
# ADDNIC action, add NIC to a running VM |
|
| 476 |
# |
|
| 477 |
def addnic(id, drv_message) |
|
| 478 |
action=VmmAction.new(self, id, :addnic, drv_message) |
|
| 479 | ||
| 480 |
steps=[ |
|
| 481 |
# Execute networking addnic operations |
|
| 482 |
{
|
|
| 483 |
:driver => :vnm, |
|
| 484 |
:action => :addnic, |
|
| 485 |
}, |
|
| 486 |
] |
|
| 487 | ||
| 488 |
action.run(steps) |
|
| 489 |
end |
|
| 490 | ||
| 491 |
# |
|
| 492 |
# RMNIC action, remove NIC from a running VM |
|
| 493 |
# |
|
| 494 |
def rmnic(id, drv_message) |
|
| 495 |
action=VmmAction.new(self, id, :rmnic, drv_message) |
|
| 496 | ||
| 497 |
steps=[ |
|
| 498 |
# Execute networking rmnic operations |
|
| 499 |
{
|
|
| 500 |
:driver => :vnm, |
|
| 501 |
:action => :rmnic, |
|
| 502 |
}, |
|
| 503 |
] |
|
| 504 | ||
| 505 |
action.run(steps) |
|
| 506 |
end |
|
| 473 | 507 |
end |
| 474 | 508 | |
| 475 | 509 |
################################################################################ |