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 f3343d47da..a180932f79 100644 --- a/src/vmm_mad/remotes/lib/vcenter_driver/virtual_machine.rb +++ b/src/vmm_mad/remotes/lib/vcenter_driver/virtual_machine.rb @@ -1252,6 +1252,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) @@ -1637,6 +1638,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 @@ -1673,7 +1705,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 @@ -1758,6 +1790,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