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

F #4913: Undeployed VMs in FAILURE state are deleted in tm/delete even if DEPLOY_ID is not set B#5057

This commit is contained in:
mcabrerizo 2017-04-03 12:27:42 +02:00
parent 36ce5e8233
commit d409531237
3 changed files with 45 additions and 1 deletions

View File

@ -36,6 +36,8 @@ $: << File.dirname(__FILE__)
require 'vcenter_driver'
VM_PREFIX_DEFAULT = "one-$i-"
path = ARGV[0]
vmid = ARGV[1]
dsid = ARGV[2]
@ -54,9 +56,22 @@ host_id = host['ID']
one_vm = VCenterDriver::VIHelper.one_item(OpenNebula::VirtualMachine, vmid)
vm_ref = one_vm['DEPLOY_ID']
vm = nil
begin
vi_client = VCenterDriver::VIClient.new_from_host(host_id)
vm = VCenterDriver::VirtualMachine.new_from_ref(vm_ref, vi_client)
if !!vm_ref && !vm_ref.empty?
vm = VCenterDriver::VirtualMachine.new_from_ref(vm_ref, vi_client)
else
vcenter_vm = VCenterDriver::VIHelper.find_vcenter_vm_by_name(one_vm, host, vi_client)
# If no VM object retrieved, raise an exception
raise "Could not find the undeployed VM in vCenter's inventory using it's name" if !vcenter_vm
vm_ref = vcenter_vm._ref
vm = VCenterDriver::VirtualMachine.new_from_ref(vm_ref, vi_client)
end
rescue Exception => e
vi_client.close_connection if vi_client
@ -199,6 +214,8 @@ else
end
vm.poweroff_hard if vm.is_powered_on?
vm.destroy
rescue Exception => e
STDERR.puts "Error unregistering vm #{vmid} (#{vm_ref})."\

View File

@ -57,6 +57,29 @@ class VIHelper
return element
end
def self.find_vcenter_vm_by_name(one_vm, host, vi_client)
# Let's try to find the VM object only by its name
# Let's build the VM name
vm_prefix = host['TEMPLATE/VM_PREFIX']
vm_prefix = VM_PREFIX_DEFAULT if vm_prefix.nil? || vm_prefix.empty?
vm_prefix.gsub!("$i", one_vm['ID'])
vm_name = vm_prefix + one_vm['NAME']
# We have no DEPLOY_ID, the VM has never been deployed
# let's use a view to try to find the VM from the root folder
view = vi_client.vim.serviceContent.viewManager.CreateContainerView({
container: vi_client.vim.rootFolder,
type: ['VirtualMachine'],
recursive: true
})
vcenter_vm = view.view.find{ |v| v.name == vm_name } if view.view
view.DestroyView # Destroy the view
return vcenter_vm
end
def self.get_default(xpath)
begin
xml = OpenNebula::XMLElement.new

View File

@ -1834,6 +1834,10 @@ class VirtualMachine
@item.PowerOnVM_Task.wait_for_completion
end
def is_powered_on?
return @item.runtime.powerState == "poweredOn"
end
def poweroff_hard
@item.PowerOffVM_Task.wait_for_completion
end