From 186694626a66a0449cfc6d41e7db0c9f38fbc806 Mon Sep 17 00:00:00 2001
From: "Carlos J. Herrera" <cherrera@opennebula.io>
Date: Fri, 11 Feb 2022 06:41:49 -0500
Subject: [PATCH] B #5689: allow import wilds with same moref (#1747)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Co-authored-by: Tino Vázquez <cvazquez@opennebula.io>
(cherry picked from commit 1fc5b5afe67d643d042c8b9c5a3f7cde0ee474bc)
---
 src/vmm_mad/remotes/lib/vcenter_driver/host.rb         |  2 +-
 src/vmm_mad/remotes/lib/vcenter_driver/vi_helper.rb    | 10 ++++++++++
 .../remotes/lib/vcenter_driver/virtual_machine.rb      |  1 +
 src/vmm_mad/remotes/lib/vcenter_driver/vmm_importer.rb |  1 +
 src/vmm_mad/remotes/vcenter/deploy                     |  3 ++-
 5 files changed, 15 insertions(+), 2 deletions(-)
 mode change 100755 => 100644 src/vmm_mad/remotes/vcenter/deploy

diff --git a/src/vmm_mad/remotes/lib/vcenter_driver/host.rb b/src/vmm_mad/remotes/lib/vcenter_driver/host.rb
index d532c92033..55b588ba71 100644
--- a/src/vmm_mad/remotes/lib/vcenter_driver/host.rb
+++ b/src/vmm_mad/remotes/lib/vcenter_driver/host.rb
@@ -712,7 +712,7 @@ module VCenterDriver
 
                 # Only take care of VMs, not templates
                 if !hashed_properties['config.template']
-                    vms[r.obj._ref] = hashed_properties
+                    vms[r.obj._ref + "_" + vc_uuid] = hashed_properties
                     vm_objects << r.obj
                 end
             end
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 b3c4d84a30..a8d74659dd 100644
--- a/src/vmm_mad/remotes/lib/vcenter_driver/vi_helper.rb
+++ b/src/vmm_mad/remotes/lib/vcenter_driver/vi_helper.rb
@@ -117,6 +117,16 @@ module VCenterDriver
 
             return_if_error(rc, item, exit_if_fail)
         end
+        
+        # Since https://github.com/OpenNebula/one/issues/5689
+        # there two deploy_ids allowed:
+        #    * moref, eg: vm-567
+        #    * moref +"_" + vcenter uuid, eg: 
+        #           2499952a-6c85-480e-b7df-4cbd2137eb69_vm-456 
+        # This function will always return the moref
+        def self.get_deploy_id(deploy_id)
+            return deploy_id.split("_")[0]
+        end
 
         def self.find_by_name(the_class, name, pool = nil, raise_if_fail = true)
             pool = one_pool(the_class, raise_if_fail) if pool.nil?
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 8fca76b10f..4d76898d52 100644
--- a/src/vmm_mad/remotes/lib/vcenter_driver/virtual_machine.rb
+++ b/src/vmm_mad/remotes/lib/vcenter_driver/virtual_machine.rb
@@ -103,6 +103,7 @@ end
 
         def initialize(vi_client, ref, one_id)
             if ref
+                ref = VCenterDriver::VIHelper.get_deploy_id(ref)
                 @item = RbVmomi::VIM::VirtualMachine.new(vi_client.vim, ref)
                 check_item(@item, RbVmomi::VIM::VirtualMachine)
             end
diff --git a/src/vmm_mad/remotes/lib/vcenter_driver/vmm_importer.rb b/src/vmm_mad/remotes/lib/vcenter_driver/vmm_importer.rb
index 6660ded825..95850babb1 100644
--- a/src/vmm_mad/remotes/lib/vcenter_driver/vmm_importer.rb
+++ b/src/vmm_mad/remotes/lib/vcenter_driver/vmm_importer.rb
@@ -46,6 +46,7 @@ module VCenterDriver
             vm_ref     = selected['DEPLOY_ID'] || selected[:wild]['DEPLOY_ID']
             vm         = selected[:one_item]   || build
             template   = selected[:template]   || import_tmplt
+            template = "DEPLOY_ID = #{vm_ref}\n" + template
             host_id    = selected[:host]       || @list.keys[0]
 
             vc_uuid    = @vi_client.vim.serviceContent.about.instanceUuid
diff --git a/src/vmm_mad/remotes/vcenter/deploy b/src/vmm_mad/remotes/vcenter/deploy
old mode 100755
new mode 100644
index 6c6e1cd828..cfe0ca4250
--- a/src/vmm_mad/remotes/vcenter/deploy
+++ b/src/vmm_mad/remotes/vcenter/deploy
@@ -75,6 +75,7 @@ deploy[:boot] = drv_action['TEMPLATE/OS/BOOT'] \
 begin
     retries ||= 0
     vi_client = VCenterDriver::VIClient.new_from_host(host_id)
+    vc_uuid = vi_client.vim.serviceContent.about.instanceUuid
     one_vm = VCenterDriver::VIHelper.one_item(OpenNebula::VirtualMachine, vm_id)
 
     if !drv_action.retrieve_xmlelements('USER_TEMPLATE/VCENTER_TAG').empty? &&
@@ -132,7 +133,7 @@ begin
         vm.poweron(set_running)
     end
 
-    puts vm['_ref']
+    puts vm['_ref'] + "_" + vc_uuid
 rescue StandardError => e
     message =  "Deploy of VM #{vm_id} on vCenter cluster #{cluster_name} " \
                "with #{dfile} failed due to \"#{e.message}\"" \