21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
|
# File 'app/helpers/proxmox_vm_image_template_helper.rb', line 21
def validate_image_template_disk_slots!(image, args)
reserved_slots = image.config.disks.select(&:hard_disk?).map(&:id)
limits = ProxmoxComputeControllersHelper::CONTROLLER_LIMITS
volumes = args['volumes_attributes']&.values || []
used_slots = reserved_slots + volumes.filter_map { |volume| hard_disk_slot(volume) }
volumes.each do |volume_attributes|
volume = volume_attributes.with_indifferent_access
slot = hard_disk_slot(volume_attributes)
next unless slot
controller = volume[:controller]
if reserved_slots.include?(slot)
device = (0..limits.fetch(controller, -1)).find do |number|
!used_slots.include?("#{controller}#{number}")
end
unless device
raise ::Foreman::Exception,
format(_('No free disk device is available for the %<controller>s controller.'), controller: controller)
end
volume_attributes['device'] = device.to_s
volume_attributes['id'] = slot = "#{controller}#{device}"
end
used_slots << slot
end
end
|