From 7e24c066bd4150887a9b0197f05b96842e3bd263 Mon Sep 17 00:00:00 2001 From: Angel Luis Moya Gonzalez Date: Thu, 13 Jun 2019 19:04:52 +0200 Subject: [PATCH] B #3225: Fix bug with IDE master/slave Cdroms * M #-: Change require_relative to require Change require_relative to standard require using RUBY_LIB_LOCATION * B #3225: Fix bug with IDE master/slave Cdroms Change the algorithm to select free IDE device when a Cdrom is attached. https://github.com/OpenNebula/one/issues/3225 * M #-: Remove trailing spaces --- .../lib/vcenter_driver/virtual_machine.rb | 44 ++++++++----------- .../virtual_machine_device/vm_disk.rb | 2 - .../virtual_machine_device/vm_nic.rb | 2 - 3 files changed, 19 insertions(+), 29 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 6f8a90cb1f..522159b810 100644 --- a/src/vmm_mad/remotes/lib/vcenter_driver/virtual_machine.rb +++ b/src/vmm_mad/remotes/lib/vcenter_driver/virtual_machine.rb @@ -1910,50 +1910,44 @@ module VCenterDriver end def find_free_ide_controller(position=0) - free_ide_controllers = [] + free_ide_controller = nil ide_schema = {} - - used_numbers = [] - available_numbers = [] devices = @item.config.hardware.device + ideDeviceList = [] + # Iteration to initialize IDE Controllers devices.each do |dev| if dev.is_a? RbVmomi::VIM::VirtualIDEController if ide_schema[dev.key].nil? ide_schema[dev.key] = {} end - ide_schema[dev.key][:device] = dev + ide_schema[dev.key][:freeUnitNumber] = [0,1] end - - next if dev.class != RbVmomi::VIM::VirtualCdrom - used_numbers << dev.unitNumber end - 2.times do |ide_id| - available_numbers << ide_id if used_numbers.grep(ide_id).length <= 0 + # Iteration to match Disks and Cdroms with its controllers + devices.each do |dev| + if (dev.is_a? RbVmomi::VIM::VirtualDisk) || (dev.is_a? RbVmomi::VIM::VirtualCdrom) + if ide_schema.key?(dev.controllerKey) + ide_schema[dev.controllerKey][:freeUnitNumber].delete(dev.unitNumber) + end + end end ide_schema.keys.each do |controller| - free_ide_controllers << ide_schema[controller][:device].deviceInfo.label - end - - if free_ide_controllers.empty? - raise "There are no free IDE controllers to connect this CDROM device" - end - - available_controller_label = free_ide_controllers[0] - - controller = nil - - devices.each do |device| - if device.deviceInfo.label == available_controller_label - controller = device + if ide_schema[controller][:freeUnitNumber].length > 0 + free_ide_controller = ide_schema[controller] break end end - new_unit_number = available_numbers.sort[position] + if !free_ide_controller + raise "There are no free IDE controllers to connect this CDROM device" + end + + controller = free_ide_controller[:device] + new_unit_number = free_ide_controller[:freeUnitNumber][0] return controller, new_unit_number end diff --git a/src/vmm_mad/remotes/lib/vcenter_driver/virtual_machine_device/vm_disk.rb b/src/vmm_mad/remotes/lib/vcenter_driver/virtual_machine_device/vm_disk.rb index 7ebf32e81a..aba5a9867c 100644 --- a/src/vmm_mad/remotes/lib/vcenter_driver/virtual_machine_device/vm_disk.rb +++ b/src/vmm_mad/remotes/lib/vcenter_driver/virtual_machine_device/vm_disk.rb @@ -15,8 +15,6 @@ #--------------------------------------------------------------------------- # module VirtualMachineDevice - require_relative 'vm_device' - # Disk class class Disk < Device diff --git a/src/vmm_mad/remotes/lib/vcenter_driver/virtual_machine_device/vm_nic.rb b/src/vmm_mad/remotes/lib/vcenter_driver/virtual_machine_device/vm_nic.rb index 8e975c5683..371ba0d93d 100644 --- a/src/vmm_mad/remotes/lib/vcenter_driver/virtual_machine_device/vm_nic.rb +++ b/src/vmm_mad/remotes/lib/vcenter_driver/virtual_machine_device/vm_nic.rb @@ -15,8 +15,6 @@ #--------------------------------------------------------------------------- # module VirtualMachineDevice - require_relative 'vm_device' - # Nic class class Nic < Device