1
0
mirror of https://github.com/OpenNebula/one.git synced 2025-03-01 20:58:18 +03:00

F #4913: tm/delete detaches each disk first and destroys the VM

This commit is contained in:
Jaime Melis 2017-02-21 15:55:52 +01:00
parent 3e7fb4e3e6
commit 6b450ce1eb

View File

@ -21,14 +21,6 @@
# - remote_system_ds is the path for the system datastore in the host
# - vmid is the id of the VM
# - dsid is the target datastore (0 is the system datastore)
# Return if this has called for the whole directory, instead of for a specific
# disk.
if !ARGV[0].match(/disk\.\d+$/)
exit(0)
end
# ---------------------------------------------------------------------------- #
ONE_LOCATION=ENV["ONE_LOCATION"] if !defined?(ONE_LOCATION)
@ -58,7 +50,7 @@ end
path = ARGV[0]
vmid = ARGV[1]
dsid = ARGV[2]
dsid = ARGV[2]
check_valid path, "path"
check_valid vmid, "vmid"
@ -70,26 +62,64 @@ hostname, img_path = path.split(":")
host = VCenterDriver::VIHelper.find_by_name(OpenNebula::HostPool, hostname)
host_id = host['ID']
# Get DS ref
one_ds = VCenterDriver::VIHelper.one_item(OpenNebula::Datastore, dsid)
ds_ref = one_ds['TEMPLATE/VCENTER_DS_REF']
check_valid ds_ref, "ds_ref"
# Get image path
disk_id = img_path.split(".")[-1]
# Get VM
one_vm = VCenterDriver::VIHelper.one_item(OpenNebula::VirtualMachine, vmid)
disks = one_vm.retrieve_xmlelements("TEMPLATE/DISK[DISK_ID=#{disk_id}]")
img_path = VCenterDriver::FileHelper.get_img_name(disks.first, vmid)
vm_ref = one_vm['DEPLOY_ID']
begin
vi_client = VCenterDriver::VIClient.new_from_host(host_id)
ds_vc = VCenterDriver::Datastore.new_from_ref(ds_ref, vi_client)
ds_vc.delete_virtual_disk(img_path)
vm = VCenterDriver::VirtualMachine.new_from_ref(vm_ref, vi_client)
rescue Exception => e
STDERR.puts "Error delete virtual disk #{img_path} in datastore #{dsid}."\
vi_client.close_connection
STDERR.puts "Error obtaining the vCenter client and VM object."\
" Reason: #{e.message}\n#{e.backtrace}"
exit -1
end
if path.match(/disk\.\d+$/)
# Detach and remove the disk
# Get DS ref
one_ds = VCenterDriver::VIHelper.one_item(OpenNebula::Datastore, dsid)
ds_ref = one_ds['TEMPLATE/VCENTER_DS_REF']
# Get image path
disk_id = img_path.split(".")[-1]
disk = one_vm.retrieve_xmlelements("TEMPLATE/DISK[DISK_ID=#{disk_id}]").first
img_path = VCenterDriver::FileHelper.get_img_name(disk, vmid)
begin
# TODO: if the deploy has failed, the disks may exist, but the vm may
# not exist...
# detach the disk
vm.detach_disk(disk)
# delete the disk
ds = VCenterDriver::Datastore.new_from_ref(ds_ref, vi_client)
ds.delete_virtual_disk(img_path)
rescue Exception => e
STDERR.puts "Error delete virtual disk #{img_path} in datastore #{dsid}."\
" Reason: #{e.message}\n#{e.backtrace}"
exit -1
ensure
vi_client.close_connection
end
else
# Remove the VM
begin
# All OpenNebula managed disks have been detached. The VM may have still
# disks that belong to the template (VCENTER_MANAGED disks). These disks
# will be deleted with the destroy operation. If the user wants to
# save them to a VM, it can be done using the disk-saveas operation.
vm.destroy
rescue Exception => e
STDERR.puts "Error unregistering vm #{vmid} (#{vm_ref})."\
" Reason: #{e.message}\n#{e.backtrace}"
exit -1
ensure
vi_client.close_connection
end
end