diff --git a/src/tm_mad/vcenter/delete b/src/tm_mad/vcenter/delete index 94405cb21b..e968d6694c 100755 --- a/src/tm_mad/vcenter/delete +++ b/src/tm_mad/vcenter/delete @@ -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})."\ diff --git a/src/vmm_mad/remotes/lib/vcenter_driver/vi_helper.rb b/src/vmm_mad/remotes/lib/vcenter_driver/vi_helper.rb index 8af01d69bd..8090272a95 100644 --- a/src/vmm_mad/remotes/lib/vcenter_driver/vi_helper.rb +++ b/src/vmm_mad/remotes/lib/vcenter_driver/vi_helper.rb @@ -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 diff --git a/src/vmm_mad/remotes/lib/vcenter_driver/virtual_machine.rb b/src/vmm_mad/remotes/lib/vcenter_driver/virtual_machine.rb index 15bdb4326f..f4588a61f9 100644 --- a/src/vmm_mad/remotes/lib/vcenter_driver/virtual_machine.rb +++ b/src/vmm_mad/remotes/lib/vcenter_driver/virtual_machine.rb @@ -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