From cfb8f823d8a07b64fcd8b0de0bb83e9f27ecdbe4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Gonz=C3=A1lez?= Date: Fri, 25 Sep 2020 12:31:47 +0200 Subject: [PATCH] B #5106: rollback quotas when when RESUME fails (#246) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Christian González --- src/rm/RequestManagerVirtualMachine.cc | 66 ++++++++++++++------------ 1 file changed, 35 insertions(+), 31 deletions(-) diff --git a/src/rm/RequestManagerVirtualMachine.cc b/src/rm/RequestManagerVirtualMachine.cc index 0f4cddba42..8e8059559c 100644 --- a/src/rm/RequestManagerVirtualMachine.cc +++ b/src/rm/RequestManagerVirtualMachine.cc @@ -505,6 +505,8 @@ void VirtualMachineAction::request_execute(xmlrpc_c::paramList const& paramList, VirtualMachine * vm; + RequestAttributes& att_aux(att); + // Compatibility with 4.x if (action_st == "shutdown-hard" || action_st == "delete" ) { @@ -520,12 +522,12 @@ void VirtualMachineAction::request_execute(xmlrpc_c::paramList const& paramList, // Update the authorization level for the action att.set_auth_op(action); - if (vm_authorization(id, 0, 0, att, 0, 0, 0) == false) + if ((vm = get_vm_ro(id, att)) == nullptr) { return; } - if ((vm = get_vm(id, att)) == nullptr) + if (vm_authorization(id, 0, 0, att, 0, 0, 0) == false) { return; } @@ -542,35 +544,6 @@ void VirtualMachineAction::request_execute(xmlrpc_c::paramList const& paramList, return; } - // Generate quota information for resume action - RequestAttributes& att_aux(att); - - if (action == VMActions::RESUME_ACTION) - { - vm->get_template_attribute("MEMORY", memory); - vm->get_template_attribute("CPU", cpu); - - quota_tmpl.add("RUNNING_MEMORY", memory); - quota_tmpl.add("RUNNING_CPU", cpu); - quota_tmpl.add("RUNNING_VMS", 1); - - quota_tmpl.add("VMS", 0); - quota_tmpl.add("MEMORY", 0); - quota_tmpl.add("CPU", 0); - - att_aux.uid = vm->get_uid(); - att_aux.gid = vm->get_gid(); - } - - vm->unlock(); - - if (action == VMActions::RESUME_ACTION && !quota_authorization("a_tmpl, - Quotas::VIRTUALMACHINE, att_aux, att.resp_msg)) - { - failure_response(ACTION, att); - return; - } - switch (action) { case VMActions::TERMINATE_ACTION: @@ -592,7 +565,36 @@ void VirtualMachineAction::request_execute(xmlrpc_c::paramList const& paramList, rc = dm->suspend(id, att, error); break; case VMActions::RESUME_ACTION: + // Generate quota information for resume action + vm->get_template_attribute("MEMORY", memory); + vm->get_template_attribute("CPU", cpu); + + quota_tmpl.add("RUNNING_MEMORY", memory); + quota_tmpl.add("RUNNING_CPU", cpu); + quota_tmpl.add("RUNNING_VMS", 1); + + quota_tmpl.add("VMS", 0); + quota_tmpl.add("MEMORY", 0); + quota_tmpl.add("CPU", 0); + + att_aux.uid = vm->get_uid(); + att_aux.gid = vm->get_gid(); + + + if (!quota_authorization("a_tmpl, Quotas::VIRTUALMACHINE, att_aux, att.resp_msg)) + { + vm->unlock(); + failure_response(ACTION, att); + return; + } + rc = dm->resume(id, att, error); + + if (rc < 0) + { + quota_rollback("a_tmpl, Quotas::VIRTUALMACHINE, att_aux); + } + break; case VMActions::REBOOT_ACTION: rc = dm->reboot(id, false, att, error); @@ -623,6 +625,8 @@ void VirtualMachineAction::request_execute(xmlrpc_c::paramList const& paramList, break; } + vm->unlock(); + switch (rc) { case 0: