From ccf16a7205065b483588e35e0efa9339f94e7f36 Mon Sep 17 00:00:00 2001 From: sergio semedi Date: Thu, 20 Dec 2018 15:04:28 +0100 Subject: [PATCH] vCenter fix migration between clusters, ds migration(WIP) --- src/tm_mad/vcenter/mv | 4 +-- .../lib/vcenter_driver/virtual_machine.rb | 34 ++++++++++++------- src/vmm_mad/remotes/vcenter/migrate | 1 + 3 files changed, 25 insertions(+), 14 deletions(-) diff --git a/src/tm_mad/vcenter/mv b/src/tm_mad/vcenter/mv index c00d16769e..1a2cce4d7c 100755 --- a/src/tm_mad/vcenter/mv +++ b/src/tm_mad/vcenter/mv @@ -36,14 +36,14 @@ dsid = ARGV[3] begin dst_path = OpenNebula.arg_path(dst) - host_orig = OpenNebula.arg_host(src) host_dest = OpenNebula.arg_host(dst) exit 0 if OpenNebula.is_disk?(dst_path) exit 0 if src == dst - VCenterDriver::VirtualMachine.migrate_routine(vmid, host_orig, host_dest, dsid) + # TODO: considerations about dsid argument, should be different to origin dsid + VCenterDriver::VirtualMachine.migrate_routine(vmid, host_orig, host_dest) rescue StandardError => e message = "Cannot migrate for VM #{vmid}"\ 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 178181990a..f0b6ba6508 100644 --- a/src/vmm_mad/remotes/lib/vcenter_driver/virtual_machine.rb +++ b/src/vmm_mad/remotes/lib/vcenter_driver/virtual_machine.rb @@ -2457,19 +2457,24 @@ class VirtualMachine < VCenterDriver::Template end def migrate(config = {}) - raise "You need at least 1 parameter" if config.size == 0 + raise "You need at least 1 parameter to perform a migration" if config.size == 0 begin # retrieve host from DRS resourcepool = config[:cluster].resourcePool + datastore = config[:datastore] - relocate_spec_params = {} - relocate_spec_params[:pool] = resourcepool - relocate_spec_params[:datastore] = config[:datastore] - relocate_spec = RbVmomi::VIM.VirtualMachineRelocateSpec(relocate_spec_params) - @item.RelocateVM_Task(spec: relocate_spec, priority: "defaultPriority").wait_for_completion + if datastore + relocate_spec_params = { + pool: resourcepool, + datastore: datastore, + } - @item.MigrateVM_Task(:pool=> resourcepool, :priority => "defaultPriority").wait_for_completion + relocate_spec = RbVmomi::VIM.VirtualMachineRelocateSpec(relocate_spec_params) + @item.RelocateVM_Task(spec: relocate_spec, priority: "defaultPriority").wait_for_completion + else + @item.MigrateVM_Task(:pool=> resourcepool, :priority => "defaultPriority").wait_for_completion + end rescue Exception => e raise "Cannot migrate VM #{e.message}\n#{e.backtrace.join("\n")}" @@ -2923,12 +2928,15 @@ class VirtualMachine < VCenterDriver::Template pool = OpenNebula::HostPool.new(one_client) pool.info - datastores = OpenNebula::DatastorePool.new(one_client) - datastores.info - src_id = pool["/HOST_POOL/HOST[NAME='#{src_host}']/ID"].to_i dst_id = pool["/HOST_POOL/HOST[NAME='#{dst_host}']/ID"].to_i - datastore = datastores["/DATASTORE_POOL/DATASTORE[ID='#{ds}']/TEMPLATE/VCENTER_DS_REF"] + + # diferent destination ds + if ds + ds_pool = OpenNebula::DatastorePool.new(one_client) + ds_pool.info + datastore = ds_pool["/DATASTORE_POOL/DATASTORE[ID='#{ds}']/TEMPLATE/VCENTER_DS_REF"] + end vi_client = VCenterDriver::VIClient.new_from_host(src_id) @@ -2945,7 +2953,9 @@ class VirtualMachine < VCenterDriver::Template ccr_ref = dst_host['/HOST/TEMPLATE/VCENTER_CCR_REF'] vc_host = VCenterDriver::ClusterComputeResource.new_from_ref(ccr_ref, vi_client).item - config = { :cluster => vc_host, :datastore => datastore } + config = { :cluster => vc_host } + + config[:datastore] = datastore if datastore vc_vm.migrate(config) vm.replace({ 'VCENTER_CCR_REF' => ccr_ref}) diff --git a/src/vmm_mad/remotes/vcenter/migrate b/src/vmm_mad/remotes/vcenter/migrate index e358c6175c..57fd79f6f6 100755 --- a/src/vmm_mad/remotes/vcenter/migrate +++ b/src/vmm_mad/remotes/vcenter/migrate @@ -34,6 +34,7 @@ src_host = ARGV[-3] dst_host = ARGV[-4] begin + # TODO: grab destination ds VCenterDriver::VirtualMachine.migrate_routine(vm_id, src_host, dst_host)