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:
parent
36ce5e8233
commit
d409531237
@ -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})."\
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user