From 8239c283d3716a610c6059ab265ce3bff0d16f43 Mon Sep 17 00:00:00 2001 From: Daniel Molina Date: Fri, 2 Dec 2011 18:31:19 +0100 Subject: [PATCH] Fix STORAGE quota for save_as --- src/authm_mad/remotes/quota/quota.rb | 18 +++++++++++++++++- src/rm/RequestManagerVirtualMachine.cc | 24 +++++++++++++----------- 2 files changed, 30 insertions(+), 12 deletions(-) diff --git a/src/authm_mad/remotes/quota/quota.rb b/src/authm_mad/remotes/quota/quota.rb index 046bdc9493..9037c94510 100644 --- a/src/authm_mad/remotes/quota/quota.rb +++ b/src/authm_mad/remotes/quota/quota.rb @@ -81,8 +81,24 @@ class Quota :proc_info => lambda {|template| if template['TYPE'] == 'DATABLOCK' template['SIZE'].to_i - else + elsif template['PATH'] File.size(template['PATH']) + elsif template['SAVED_VM_ID'] + vm_id = template['SAVED_VM_ID'].to_i + disk_id = template['SAVED_DISK_ID'].to_i + + client = OpenNebula::Client.new + vm = OpenNebula::VirtualMachine.new_with_id(vm_id, client) + vm.info + + im_id = vm["DISK[DISK_ID=#{disk_id}]/IMAGE_ID"].to_i + + im = OpenNebula::Image.new_with_id(im_id, client) + im.info + + im['SIZE'].to_i + else + 0 end }, :xpath => 'SIZE' diff --git a/src/rm/RequestManagerVirtualMachine.cc b/src/rm/RequestManagerVirtualMachine.cc index 17dd537084..02d2755661 100644 --- a/src/rm/RequestManagerVirtualMachine.cc +++ b/src/rm/RequestManagerVirtualMachine.cc @@ -86,9 +86,9 @@ bool RequestManagerVirtualMachine::vm_authorization(int oid, /* -------------------------------------------------------------------------- */ /* -------------------------------------------------------------------------- */ -int RequestManagerVirtualMachine::get_host_information(int hid, - string& name, - string& vmm, +int RequestManagerVirtualMachine::get_host_information(int hid, + string& name, + string& vmm, string& tm, RequestAttributes& att) { @@ -160,7 +160,7 @@ int RequestManagerVirtualMachine::add_history(VirtualMachine * vm, if ( rc != 0 ) { - failure_response(INTERNAL, + failure_response(INTERNAL, request_error("Can not update virtual machine history",""), att); @@ -170,7 +170,7 @@ int RequestManagerVirtualMachine::add_history(VirtualMachine * vm, vmpool->update(vm); return 0; -} +} /* -------------------------------------------------------------------------- */ /* -------------------------------------------------------------------------- */ @@ -232,7 +232,7 @@ void VirtualMachineAction::request_execute(xmlrpc_c::paramList const& paramList, } switch (rc) - { + { case 0: success_response(id, att); break; @@ -247,7 +247,7 @@ void VirtualMachineAction::request_execute(xmlrpc_c::paramList const& paramList, att); break; case -3: - failure_response(ACTION, + failure_response(ACTION, request_error("Virtual machine action not supported",""), att); break; @@ -295,7 +295,7 @@ void VirtualMachineDeploy::request_execute(xmlrpc_c::paramList const& paramList, if ( vm->get_state() != VirtualMachine::PENDING ) { - failure_response(ACTION, + failure_response(ACTION, request_error("Wrong state to perform action",""), att); @@ -354,7 +354,7 @@ void VirtualMachineMigrate::request_execute(xmlrpc_c::paramList const& paramList (vm->get_lcm_state() != VirtualMachine::RUNNING) || (vm->hasPreviousHistory() && vm->get_previous_reason() == History::NONE)) { - failure_response(ACTION, + failure_response(ACTION, request_error("Wrong state to perform action",""), att); @@ -412,6 +412,8 @@ void VirtualMachineSaveDisk::request_execute(xmlrpc_c::paramList const& paramLis oss << "NAME= \"" << img_name << "\"" << endl; oss << "PUBLIC = NO " << endl; oss << "SOURCE = - " << endl; + oss << "SAVED_DISK_ID = " << disk_id << endl; + oss << "SAVED_VM_ID = " << id << endl; if ( img_type != "" ) { @@ -440,7 +442,7 @@ void VirtualMachineSaveDisk::request_execute(xmlrpc_c::paramList const& paramLis allocate_error(AuthRequest::IMAGE, error_str), att); return; } - + // ------------------ Store image id to save the disk ------------------ if ( (vm = get_vm(id, att)) == 0 ) @@ -479,7 +481,7 @@ void VirtualMachineSaveDisk::request_execute(xmlrpc_c::paramList const& paramLis img->unlock(); } - failure_response(INTERNAL, + failure_response(INTERNAL, request_error("Can not save_as disk",error_str), att); return;