mirror of
https://github.com/OpenNebula/one.git
synced 2025-03-16 22:50:10 +03:00
F #1246 Add recover --delete-db option
co-authored-by: Christian González <cgonzalez@opennebula.systems> (cherry picked from commit 1dd6cab6af088324d7aaf7d5d67775d33d7f950f)
This commit is contained in:
parent
f11c050e26
commit
a5e1331aec
@ -296,6 +296,15 @@ public:
|
||||
int delete_recreate(VirtualMachine * vm, const RequestAttributes& ra,
|
||||
string& error_str);
|
||||
|
||||
/**
|
||||
* Ends a VM life cycle inside ONE but let the VM running at the Hipervisor.
|
||||
* @param vm VirtualMachine object
|
||||
* @param ra information about the API call request
|
||||
* @return 0 on success, the VM mutex is unlocked
|
||||
*/
|
||||
int delete_vm_db(VirtualMachine * vm, const RequestAttributes& ra,
|
||||
string& error_str);
|
||||
|
||||
/**
|
||||
* Recover the last operation on the VM
|
||||
* @param vm VirtualMachine object
|
||||
@ -541,7 +550,7 @@ private:
|
||||
/**
|
||||
* Frees the resources associated to a VM: disks, ip addresses and Quotas
|
||||
*/
|
||||
void free_vm_resources(VirtualMachine * vm);
|
||||
void free_vm_resources(VirtualMachine * vm, bool check_images);
|
||||
|
||||
//--------------------------------------------------------------------------
|
||||
// DM Actions associated with a VM state transition
|
||||
|
@ -1045,8 +1045,9 @@ public:
|
||||
/**
|
||||
* Releases all disk images taken by this Virtual Machine
|
||||
* @param quotas disk space to free from image datastores
|
||||
* @param check_state to update image state based on VM state
|
||||
*/
|
||||
void release_disk_images(vector<Template *>& quotas);
|
||||
void release_disk_images(vector<Template *>& quotas, bool check_state);
|
||||
|
||||
/**
|
||||
* @return reference to the VirtualMachine disks
|
||||
|
@ -116,6 +116,13 @@ cmd=CommandParser::CmdParser.new(ARGV) do
|
||||
:description => "No recover action possible, delete and recreate the VM"
|
||||
}
|
||||
|
||||
DELETE_DB={
|
||||
:name => "deletedb",
|
||||
:large => "--delete-db",
|
||||
:description => "No recover action possible, delete the VM from the DB"<<
|
||||
". It does not trigger any action on the hypervisor"
|
||||
}
|
||||
|
||||
INTERACTIVE={
|
||||
:name => "interactive",
|
||||
:large => "--interactive",
|
||||
@ -586,10 +593,11 @@ cmd=CommandParser::CmdParser.new(ARGV) do
|
||||
States for a retry recover: Any *FAILURE state
|
||||
States for delete: Any
|
||||
States for delete-recreate: Any but STOP/UNDEPLOYED
|
||||
States for delete-db: Any
|
||||
EOT
|
||||
|
||||
command :recover, recover_desc, [:range,:vmid_list],
|
||||
:options => [SUCCESS, FAILURE, RETRY, INTERACTIVE, DELETE, RECREATE] do
|
||||
:options => [SUCCESS, FAILURE, RETRY, INTERACTIVE, DELETE, RECREATE, DELETE_DB] do
|
||||
if !options[:success].nil?
|
||||
result = 1
|
||||
elsif !options[:failure].nil?
|
||||
@ -600,6 +608,8 @@ cmd=CommandParser::CmdParser.new(ARGV) do
|
||||
result = 3
|
||||
elsif !options[:recreate].nil?
|
||||
result = 4
|
||||
elsif !options[:deletedb].nil?
|
||||
result = 5
|
||||
else
|
||||
STDERR.puts "Need to specify the result of the pending action."
|
||||
STDERR.puts "\t--success recover the VM by succeeding the missing action."
|
||||
@ -607,6 +617,7 @@ cmd=CommandParser::CmdParser.new(ARGV) do
|
||||
STDERR.puts "\t--retry recover the VM by retrying the last failed action."
|
||||
STDERR.puts "\t--delete no recover possible, delete the VM."
|
||||
STDERR.puts "\t--recreate no recover possible, delete and recreate the VM."
|
||||
STDERR.puts "\t--delete-db no recover possible, delete the VM from the DB. No action performed on the hypervisor"
|
||||
exit -1
|
||||
end
|
||||
|
||||
|
@ -263,7 +263,7 @@ error:
|
||||
/* ************************************************************************** */
|
||||
/* ************************************************************************** */
|
||||
|
||||
void DispatchManager::free_vm_resources(VirtualMachine * vm)
|
||||
void DispatchManager::free_vm_resources(VirtualMachine * vm, bool check_images)
|
||||
{
|
||||
vector<Template *> ds_quotas;
|
||||
|
||||
@ -298,7 +298,7 @@ void DispatchManager::free_vm_resources(VirtualMachine * vm)
|
||||
|
||||
vm->release_vmgroup();
|
||||
|
||||
vm->release_disk_images(ds_quotas);
|
||||
vm->release_disk_images(ds_quotas, check_images);
|
||||
|
||||
vm->set_state(VirtualMachine::DONE);
|
||||
|
||||
@ -397,7 +397,7 @@ int DispatchManager::terminate(int vid, bool hard, const RequestAttributes& ra,
|
||||
case VirtualMachine::HOLD:
|
||||
case VirtualMachine::CLONING:
|
||||
case VirtualMachine::CLONING_FAILURE:
|
||||
free_vm_resources(vm);
|
||||
free_vm_resources(vm, true);
|
||||
break;
|
||||
|
||||
case VirtualMachine::DONE:
|
||||
@ -1115,7 +1115,7 @@ int DispatchManager::delete_vm(VirtualMachine * vm, const RequestAttributes& ra,
|
||||
tm->trigger(TMAction::EPILOG_DELETE, vid);
|
||||
}
|
||||
|
||||
free_vm_resources(vm);
|
||||
free_vm_resources(vm, true);
|
||||
break;
|
||||
|
||||
case VirtualMachine::STOPPED:
|
||||
@ -1129,7 +1129,7 @@ int DispatchManager::delete_vm(VirtualMachine * vm, const RequestAttributes& ra,
|
||||
tm->trigger(TMAction::EPILOG_DELETE, vid);
|
||||
}
|
||||
|
||||
free_vm_resources(vm);
|
||||
free_vm_resources(vm, true);
|
||||
break;
|
||||
|
||||
case VirtualMachine::INIT:
|
||||
@ -1137,7 +1137,7 @@ int DispatchManager::delete_vm(VirtualMachine * vm, const RequestAttributes& ra,
|
||||
case VirtualMachine::HOLD:
|
||||
case VirtualMachine::CLONING:
|
||||
case VirtualMachine::CLONING_FAILURE:
|
||||
free_vm_resources(vm);
|
||||
free_vm_resources(vm, true);
|
||||
break;
|
||||
|
||||
case VirtualMachine::ACTIVE:
|
||||
@ -1259,6 +1259,49 @@ int DispatchManager::delete_recreate(VirtualMachine * vm,
|
||||
/* -------------------------------------------------------------------------- */
|
||||
/* -------------------------------------------------------------------------- */
|
||||
|
||||
int DispatchManager::delete_vm_db(VirtualMachine * vm,
|
||||
const RequestAttributes& ra, string& error_str)
|
||||
{
|
||||
ostringstream oss;
|
||||
|
||||
int cpu, mem, disk;
|
||||
vector<VectorAttribute *> pci;
|
||||
|
||||
int vid = vm->get_oid();
|
||||
|
||||
oss << "Deleting VM from DB " << vm->get_oid();
|
||||
NebulaLog::log("DiM",Log::DEBUG,oss);
|
||||
|
||||
switch (vm->get_state())
|
||||
{
|
||||
case VirtualMachine::SUSPENDED:
|
||||
case VirtualMachine::POWEROFF:
|
||||
case VirtualMachine::ACTIVE:
|
||||
vm->get_requirements(cpu, mem, disk, pci);
|
||||
|
||||
hpool->del_capacity(vm->get_hid(), vid, cpu, mem, disk, pci);
|
||||
|
||||
case VirtualMachine::STOPPED:
|
||||
case VirtualMachine::UNDEPLOYED:
|
||||
case VirtualMachine::INIT:
|
||||
case VirtualMachine::PENDING:
|
||||
case VirtualMachine::HOLD:
|
||||
case VirtualMachine::CLONING:
|
||||
case VirtualMachine::CLONING_FAILURE:
|
||||
free_vm_resources(vm, false);
|
||||
break;
|
||||
|
||||
case VirtualMachine::DONE:
|
||||
vm->unlock();
|
||||
break;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* -------------------------------------------------------------------------- */
|
||||
/* -------------------------------------------------------------------------- */
|
||||
|
||||
int DispatchManager::attach(int vid, VirtualMachineTemplate * tmpl,
|
||||
const RequestAttributes& ra, string & err)
|
||||
{
|
||||
|
@ -277,7 +277,7 @@ void DispatchManager::done_action(int vid)
|
||||
(lcm_state == VirtualMachine::EPILOG ||
|
||||
lcm_state == VirtualMachine::CLEANUP_DELETE))
|
||||
{
|
||||
free_vm_resources(vm);
|
||||
free_vm_resources(vm, true);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -662,7 +662,7 @@ module OpenNebula
|
||||
# Recovers an ACTIVE VM
|
||||
#
|
||||
# @param result [Integer] Recover with failure (0), success (1),
|
||||
# retry (2), delete (3), delete-recreate (4)
|
||||
# retry (2), delete (3), delete-recreate (4), delete-db (5)
|
||||
# @param result [info] Additional information needed to recover the VM
|
||||
# @return [nil, OpenNebula::Error] nil in case of success, Error
|
||||
# otherwise
|
||||
|
@ -2496,6 +2496,7 @@ void VirtualMachineRecover::request_execute(
|
||||
|
||||
case 3: //delete
|
||||
case 4: //delete-recreate set same as delete in OpenNebulaTemplate
|
||||
case 5: //delete-db
|
||||
aop = nd.get_vm_auth_op(History::DELETE_ACTION);
|
||||
break;
|
||||
|
||||
@ -2540,6 +2541,9 @@ void VirtualMachineRecover::request_execute(
|
||||
case 4: //delete-recreate
|
||||
rc = dm->delete_recreate(vm, att, error);
|
||||
break;
|
||||
case 5:
|
||||
rc = dm->delete_vm_db(vm, att, error);
|
||||
break;
|
||||
}
|
||||
|
||||
if ( rc == 0 )
|
||||
|
@ -1108,7 +1108,7 @@ error_graphics:
|
||||
goto error_rollback;
|
||||
|
||||
error_rollback:
|
||||
release_disk_images(quotas);
|
||||
release_disk_images(quotas, true);
|
||||
|
||||
error_leases_rollback:
|
||||
release_network_leases();
|
||||
@ -2933,11 +2933,21 @@ int VirtualMachine::get_disk_images(string& error_str)
|
||||
/* -------------------------------------------------------------------------- */
|
||||
/* -------------------------------------------------------------------------- */
|
||||
|
||||
void VirtualMachine::release_disk_images(vector<Template *>& quotas)
|
||||
void VirtualMachine::release_disk_images(vector<Template *>& quotas,
|
||||
bool set_state)
|
||||
{
|
||||
bool image_error = (state == ACTIVE && lcm_state != EPILOG) &&
|
||||
state != PENDING && state != HOLD &&
|
||||
state != CLONING && state != CLONING_FAILURE;
|
||||
bool image_error;
|
||||
|
||||
if ( set_state )
|
||||
{
|
||||
image_error = (state == ACTIVE && lcm_state != EPILOG) &&
|
||||
state != PENDING && state != HOLD &&
|
||||
state != CLONING && state != CLONING_FAILURE;
|
||||
}
|
||||
else
|
||||
{
|
||||
image_error = false;
|
||||
}
|
||||
|
||||
disks.release_images(oid, image_error, quotas);
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user