1
0
mirror of https://github.com/OpenNebula/one.git synced 2025-03-22 18:50:08 +03:00

B #5106: rollback quotas when when RESUME fails (#246)

Signed-off-by: Christian González <cgonzalez@opennebula.io>
This commit is contained in:
Christian González 2020-09-25 12:31:47 +02:00 committed by GitHub
parent 4443b290dd
commit cfb8f823d8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -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(&quota_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(&quota_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(&quota_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: