From 5d4e7daf8610dd5f2ee2d3917ac447948298bf5d Mon Sep 17 00:00:00 2001 From: Sergio Vega Date: Wed, 9 Jan 2019 14:01:36 -0600 Subject: [PATCH 1/7] vCenter DS migration --- src/tm_mad/vcenter/mv | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/tm_mad/vcenter/mv b/src/tm_mad/vcenter/mv index 1a2cce4d7c..3b10d555e9 100755 --- a/src/tm_mad/vcenter/mv +++ b/src/tm_mad/vcenter/mv @@ -42,8 +42,16 @@ begin exit 0 if OpenNebula.is_disk?(dst_path) exit 0 if src == dst - # TODO: considerations about dsid argument, should be different to origin dsid - VCenterDriver::VirtualMachine.migrate_routine(vmid, host_orig, host_dest) + one_client = OpenNebula::Client.new + vm = OpenNebula::VirtualMachine.new_with_id(vmid, one_client) + vm.info + src_ds = vm.to_hash["VM"]["HISTORY_RECORDS"]["HISTORY"][-2]["DS_ID"] + + if src_ds == dsid + VCenterDriver::VirtualMachine.migrate_routine(vmid, host_orig, host_dest) + else + VCenterDriver::VirtualMachine.migrate_routine(vmid, host_orig, host_dest, dsid) + end rescue StandardError => e message = "Cannot migrate for VM #{vmid}"\ From a177d6fc48e04ce060e0a7002dfd2bd801b354f8 Mon Sep 17 00:00:00 2001 From: Sergio Vega Date: Thu, 10 Jan 2019 10:38:43 -0600 Subject: [PATCH 2/7] Replace to_hash with XPATH --- src/tm_mad/vcenter/mv | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tm_mad/vcenter/mv b/src/tm_mad/vcenter/mv index 3b10d555e9..d9561aeabe 100755 --- a/src/tm_mad/vcenter/mv +++ b/src/tm_mad/vcenter/mv @@ -45,7 +45,7 @@ begin one_client = OpenNebula::Client.new vm = OpenNebula::VirtualMachine.new_with_id(vmid, one_client) vm.info - src_ds = vm.to_hash["VM"]["HISTORY_RECORDS"]["HISTORY"][-2]["DS_ID"] + src_ds = vm.retrieve_elements("HISTORY_RECORDS/HISTORY/DS_ID")[-2] if src_ds == dsid VCenterDriver::VirtualMachine.migrate_routine(vmid, host_orig, host_dest) From 7309696678f06d3b08b607ffddae618dd8d3e5fe Mon Sep 17 00:00:00 2001 From: Sergio Vega Date: Mon, 28 Jan 2019 13:52:15 -0600 Subject: [PATCH 3/7] Support for live migration --- .../lib/vcenter_driver/virtual_machine.rb | 2 ++ src/vmm_mad/remotes/vcenter/migrate | 17 +++++++++++++---- 2 files changed, 15 insertions(+), 4 deletions(-) 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 e212c29bf4..ff22ce2e7c 100644 --- a/src/vmm_mad/remotes/lib/vcenter_driver/virtual_machine.rb +++ b/src/vmm_mad/remotes/lib/vcenter_driver/virtual_machine.rb @@ -2460,11 +2460,13 @@ class VirtualMachine < VCenterDriver::Template begin # retrieve host from DRS resourcepool = config[:cluster].resourcePool + host = config[:cluster].host.first datastore = config[:datastore] if datastore relocate_spec_params = { pool: resourcepool, + host: host, datastore: datastore, } diff --git a/src/vmm_mad/remotes/vcenter/migrate b/src/vmm_mad/remotes/vcenter/migrate index 175ed1e22c..c1f4d6d9ec 100755 --- a/src/vmm_mad/remotes/vcenter/migrate +++ b/src/vmm_mad/remotes/vcenter/migrate @@ -32,12 +32,21 @@ require 'vcenter_driver' vm_id = ARGV[-2] src_host = ARGV[-3] dst_host = ARGV[-4] +dsid = "111" begin - # TODO: grab destination ds - VCenterDriver::VirtualMachine.migrate_routine(vm_id, - src_host, - dst_host) + + one_client = OpenNebula::Client.new + vm = OpenNebula::VirtualMachine.new_with_id(vm_id, one_client) + vm.info + src_ds = vm.retrieve_elements("HISTORY_RECORDS/HISTORY/DS_ID")[-2] + + if src_ds == dsid + VCenterDriver::VirtualMachine.migrate_routine(vm_id, src_host, dst_host) + else + VCenterDriver::VirtualMachine.migrate_routine(vm_id, src_host, dst_host, dsid) + end + rescue StandardError => e message = "Cannot migrate for VM #{vm_id}"\ 'failed due to '\ From 1e445b83a777ed4711ed41deddfde71ef547ca5c Mon Sep 17 00:00:00 2001 From: Sergio Vega Date: Wed, 30 Jan 2019 18:44:04 -0600 Subject: [PATCH 4/7] Live migration using RR and host tag --- src/tm_mad/vcenter/mv | 2 +- .../lib/vcenter_driver/virtual_machine.rb | 22 ++++++++++++++++--- src/vmm_mad/remotes/vcenter/migrate | 4 ++-- 3 files changed, 22 insertions(+), 6 deletions(-) diff --git a/src/tm_mad/vcenter/mv b/src/tm_mad/vcenter/mv index 19b2b280e6..dac4b13926 100755 --- a/src/tm_mad/vcenter/mv +++ b/src/tm_mad/vcenter/mv @@ -50,7 +50,7 @@ begin if src_ds == dsid VCenterDriver::VirtualMachine.migrate_routine(vmid, host_orig, host_dest) else - VCenterDriver::VirtualMachine.migrate_routine(vmid, host_orig, host_dest, dsid) + VCenterDriver::VirtualMachine.migrate_routine(vmid, host_orig, host_dest, false, dsid) end rescue StandardError => e 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 ff22ce2e7c..38ad9e4cdd 100644 --- a/src/vmm_mad/remotes/lib/vcenter_driver/virtual_machine.rb +++ b/src/vmm_mad/remotes/lib/vcenter_driver/virtual_machine.rb @@ -2460,16 +2460,24 @@ class VirtualMachine < VCenterDriver::Template begin # retrieve host from DRS resourcepool = config[:cluster].resourcePool - host = config[:cluster].host.first datastore = config[:datastore] if datastore relocate_spec_params = { pool: resourcepool, - host: host, datastore: datastore, } + if config[:esx_migration_list].is_a?(String) + if config[:esx_migration_list]=="" + relocate_spec_params[:host] = config[:cluster].host.sample + elsif config[:esx_migration_list]!="Selected_by_DRS" + hosts = config[:esx_migration_list].split(' ') + relocate_spec_params[:host] = hosts.sample + end + end + + relocate_spec = RbVmomi::VIM.VirtualMachineRelocateSpec(relocate_spec_params) @item.RelocateVM_Task(spec: relocate_spec, priority: "defaultPriority").wait_for_completion else @@ -2923,7 +2931,7 @@ class VirtualMachine < VCenterDriver::Template return one_vm end - def self.migrate_routine(vm_id, src_host, dst_host, ds = nil) + def self.migrate_routine(vm_id, src_host, dst_host, hot_ds = false, ds = nil) one_client = OpenNebula::Client.new pool = OpenNebula::HostPool.new(one_client) pool.info @@ -2948,6 +2956,8 @@ class VirtualMachine < VCenterDriver::Template vm.info dst_host.info + esx_migration_list = dst_host['/HOST/TEMPLATE/ESX_MIGRATION_LIST'] + # required vcenter objects vc_vm = VCenterDriver::VirtualMachine.new_without_id(vi_client, vm['/VM/DEPLOY_ID']) ccr_ref = dst_host['/HOST/TEMPLATE/VCENTER_CCR_REF'] @@ -2956,6 +2966,12 @@ class VirtualMachine < VCenterDriver::Template config = { :cluster => vc_host } config[:datastore] = datastore if datastore + if hot_ds + config[:esx_migration_list] = esx_migration_list if esx_migration_list + else + config[:esx_migration_list] = "Selected_by_DRS" + end + 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 c1f4d6d9ec..c87775fb54 100755 --- a/src/vmm_mad/remotes/vcenter/migrate +++ b/src/vmm_mad/remotes/vcenter/migrate @@ -32,7 +32,7 @@ require 'vcenter_driver' vm_id = ARGV[-2] src_host = ARGV[-3] dst_host = ARGV[-4] -dsid = "111" +#dsid = "111" begin @@ -44,7 +44,7 @@ begin if src_ds == dsid VCenterDriver::VirtualMachine.migrate_routine(vm_id, src_host, dst_host) else - VCenterDriver::VirtualMachine.migrate_routine(vm_id, src_host, dst_host, dsid) + VCenterDriver::VirtualMachine.migrate_routine(vm_id, src_host, dst_host, true, dsid) end rescue StandardError => e From 0616fb78fe07164db6ec82b583db3def7b98d27b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tino=20V=C3=A1zquez?= Date: Thu, 31 Jan 2019 10:01:02 +0100 Subject: [PATCH 5/7] Update migrate --- src/vmm_mad/remotes/vcenter/migrate | 1 - 1 file changed, 1 deletion(-) diff --git a/src/vmm_mad/remotes/vcenter/migrate b/src/vmm_mad/remotes/vcenter/migrate index c87775fb54..d6b8c4c4b6 100755 --- a/src/vmm_mad/remotes/vcenter/migrate +++ b/src/vmm_mad/remotes/vcenter/migrate @@ -32,7 +32,6 @@ require 'vcenter_driver' vm_id = ARGV[-2] src_host = ARGV[-3] dst_host = ARGV[-4] -#dsid = "111" begin From 3322f367141c2b59cc66eae2db3cff55110eda53 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tino=20V=C3=A1zquez?= Date: Thu, 31 Jan 2019 10:13:27 +0100 Subject: [PATCH 6/7] Update virtual_machine.rb --- src/vmm_mad/remotes/lib/vcenter_driver/virtual_machine.rb | 6 ++++++ 1 file changed, 6 insertions(+) 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 38ad9e4cdd..06ec99d1b0 100644 --- a/src/vmm_mad/remotes/lib/vcenter_driver/virtual_machine.rb +++ b/src/vmm_mad/remotes/lib/vcenter_driver/virtual_machine.rb @@ -2931,6 +2931,12 @@ class VirtualMachine < VCenterDriver::Template return one_vm end + # Migrate a VM to another cluster and/or datastore + # @params [int] vm_id ID of the VM to be migrated + # params [String] src_host Name of the source cluster + # params [String] dst_host Name of the target cluster + # params [Bool] hot_ds Wether this is a DS migration with the VM running or not + # params [int] Destination datastore ID def self.migrate_routine(vm_id, src_host, dst_host, hot_ds = false, ds = nil) one_client = OpenNebula::Client.new pool = OpenNebula::HostPool.new(one_client) From f426406515985b62f5cc0a598ea751ee7bebce58 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tino=20V=C3=A1zquez?= Date: Thu, 31 Jan 2019 10:42:53 +0100 Subject: [PATCH 7/7] Update migrate --- src/vmm_mad/remotes/vcenter/migrate | 1 + 1 file changed, 1 insertion(+) diff --git a/src/vmm_mad/remotes/vcenter/migrate b/src/vmm_mad/remotes/vcenter/migrate index d6b8c4c4b6..1f19775b79 100755 --- a/src/vmm_mad/remotes/vcenter/migrate +++ b/src/vmm_mad/remotes/vcenter/migrate @@ -32,6 +32,7 @@ require 'vcenter_driver' vm_id = ARGV[-2] src_host = ARGV[-3] dst_host = ARGV[-4] +dsid = ARGV[-5] begin