From eed0ac324d02d5f0b86aa550bee9005fe495d05c Mon Sep 17 00:00:00 2001 From: Angel Luis Moya Gonzalez Date: Fri, 17 Jan 2020 13:57:36 +0100 Subject: [PATCH] B 4087: Fix incorrect disk keys (#4101) Fix an error when creating a new disk. The key value stored into the extraconfig in the vm could have a different value than the value into the vcenter managed object browser (MOB). (cherry picked from commit 588f7084c59703aff75d9f30d7ddb98f54be4e01) --- .../lib/vcenter_driver/virtual_machine.rb | 36 ++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) 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 3f19e84695..5a4c1e7dd1 100644 --- a/src/vmm_mad/remotes/lib/vcenter_driver/virtual_machine.rb +++ b/src/vmm_mad/remotes/lib/vcenter_driver/virtual_machine.rb @@ -1191,6 +1191,7 @@ module VCenterDriver spec = RbVmomi::VIM.VirtualMachineConfigSpec(spec_hash) @item.ReconfigVM_Task(:spec => spec).wait_for_completion + sync_extraconfig_disk(spec_hash) end def extraconfig_file(file, id) @@ -1576,6 +1577,37 @@ module VCenterDriver return detach_disk_array, extra_config end + def different_key?(change_disk, vc_disk) + change_disk[:device].controllerKey == vc_disk.controllerKey && + change_disk[:device].unitNumber == vc_disk.unitNumber && + change_disk[:device].key != vc_disk.key + end + + def sync_extraconfig_disk(spec_hash) + return if spec_hash[:deviceChange].empty? + extraconfig_new = [] + # vCenter mob disks + vc_disks = @item["config.hardware.device"].select do |vc_device| + is_disk?(vc_device) + end + return unless vc_disks + # For each changed disk, compare with vcenter mob disk + spec_hash[:deviceChange].each_with_index do |device, index| + change_disk = spec_hash[:deviceChange][index] + vc_disks.each do |vc_disk| + if different_key?(change_disk, vc_disk) + extraconfig_new << {key: spec_hash[:extraConfig][index][:key], + value: vc_disk.key.to_s} + end + end + end + unless extraconfig_new.empty? + spec_hash = {:extraConfig => extraconfig_new} + spec = RbVmomi::VIM.VirtualMachineConfigSpec(spec_hash) + @item.ReconfigVM_Task(:spec => spec).wait_for_completion + end + end + # sync OpenNebula disk model with vCenter # # @param option [symbol] if :all is provided the method will try to sync @@ -1612,7 +1644,7 @@ module VCenterDriver spec = RbVmomi::VIM.VirtualMachineConfigSpec(spec_hash) @item.ReconfigVM_Task(:spec => spec).wait_for_completion - + ###sync_extraconfig_disk(spec_hash) info_disks end @@ -1697,6 +1729,8 @@ module VCenterDriver else @item.ReconfigVM_Task(:spec => spec).wait_for_completion end + # Modify extraConfig if disks has a bad key + sync_extraconfig_disk(spec_hash) rescue Exception => e raise "Cannot attach DISK to VM: #{e.message}\n#{e.backtrace.join("\n")}" end