Module: ProxmoxVMImageTemplateHelper

Included in:
ProxmoxVMHelper
Defined in:
app/helpers/proxmox_vm_image_template_helper.rb

Instance Method Summary collapse

Instance Method Details

#hard_disk_slot(attributes) ⇒ Object



49
50
51
52
53
54
# File 'app/helpers/proxmox_vm_image_template_helper.rb', line 49

def hard_disk_slot(attributes)
  volume = attributes.with_indifferent_access
  id = volume[:id]
  id if volume_type?(volume, 'hard_disk') &&
        Fog::Proxmox::DiskHelper.server_disk?(id)
end

#validate_image_template_disk_slots!(image, args) ⇒ Object



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