module Fog::Proxmox::DiskHelper

module Disk mixins

Constants

CDROM_REGEXP
CLOUD_INIT_REGEXP
DISKS_REGEXP
MOUNT_POINT_REGEXP
ROOTFS_REGEXP
SERVER_DISK_REGEXP
TEMPLATE_REGEXP

Public Class Methods

cdrom?(value) click to toggle source
# File lib/fog/proxmox/helpers/disk_helper.rb, line 147
def self.cdrom?(value)
  CDROM_REGEXP.match(value) ? true : false
end
cloud_init?(volid) click to toggle source
# File lib/fog/proxmox/helpers/disk_helper.rb, line 171
def self.cloud_init?(volid)
  CLOUD_INIT_REGEXP.match(volid) ? true : false
end
container_disk?(id) click to toggle source
# File lib/fog/proxmox/helpers/disk_helper.rb, line 163
def self.container_disk?(id)
  rootfs?(id) || mount_point?(id)
end
disk?(id) click to toggle source
# File lib/fog/proxmox/helpers/disk_helper.rb, line 143
def self.disk?(id)
  DISKS_REGEXP.match(id) ? true : false
end
extract(id) click to toggle source
# File lib/fog/proxmox/helpers/disk_helper.rb, line 68
def self.extract(id)
  id.scan(/(\w+)(\d+)/).first
end
extract_controller(id) click to toggle source
# File lib/fog/proxmox/helpers/disk_helper.rb, line 60
def self.extract_controller(id)
  extract(id)[0]
end
extract_device(id) click to toggle source
# File lib/fog/proxmox/helpers/disk_helper.rb, line 64
def self.extract_device(id)
  extract(id)[1].to_i
end
extract_option(name, disk_value) click to toggle source

Convert API Proxmox parameter string into attribute hash value

# File lib/fog/proxmox/helpers/disk_helper.rb, line 73
def self.extract_option(name, disk_value)
  values = disk_value.scan(/#{name}=(\w+)/)
  name_value = values.first if values
  name_value&.first
end
extract_size(disk_value) click to toggle source
# File lib/fog/proxmox/helpers/disk_helper.rb, line 137
def self.extract_size(disk_value)
  size = extract_option('size', disk_value)
  size = to_int_gb(to_bytes(size)).to_s if size.match?(/\d+(G)/)
  size
end
extract_storage_volid_size(disk_value) click to toggle source

Convert API Proxmox volume/disk parameter string into volume/disk attributes hash value

# File lib/fog/proxmox/helpers/disk_helper.rb, line 80
def self.extract_storage_volid_size(disk_value)
  # volid definition: <VOLUME_ID>:=<STORAGE_ID>:<storage type dependent volume name>
  values_a = disk_value.scan(%r{^(([\w-]+):{0,1}([\w/.-]+))})
  no_cdrom = !disk_value.match(CDROM_REGEXP)
  creation = disk_value.split(',')[0].match(/^(([\w-]+):{1}(\d+))$/)
  values = values_a.first if values_a
  if no_cdrom
    storage = values[1]
    if creation
      volid = nil
      size = values[2].to_i
    else
      volid = values[0]
      size = extract_size(disk_value)
    end
  else
    volid = values[0]
    storage = values[1] unless %w[none cdrom].include? volid
    size = nil
  end
  [storage, volid, size]
end
flatten(disk) click to toggle source

Convert disk attributes hash into API Proxmox parameters string

# File lib/fog/proxmox/helpers/disk_helper.rb, line 35
def self.flatten(disk)
  id = disk[:id]
  value = ''
  if disk[:volid]
    value += disk[:volid]
    value += ',size=' + disk[:size].to_s if disk[:size]
  elsif disk[:storage] && disk[:size]
    value += disk[:storage] + ':' + disk[:size].to_s
  elsif id == 'ide2'
    value += 'none'
  end
  opts = disk[:options] if disk[:options]
  main_a = %i[id volid storage size]
  opts ||= disk.reject { |key, _value| main_a.include? key }
  options = ''
  options += Fog::Proxmox::Hash.stringify(opts) if opts
  if id == 'ide2' && !cdrom?(options)
    options += ',' unless options.empty?
    options += 'media=cdrom'
  end
  value += ',' if !options.empty? && !value.empty?
  value += options
  { "#{id}": value }
end
modulo_bytes(size) click to toggle source
# File lib/fog/proxmox/helpers/disk_helper.rb, line 116
def self.modulo_bytes(size)
  size / 1024
end
mount_point?(id) click to toggle source
# File lib/fog/proxmox/helpers/disk_helper.rb, line 159
def self.mount_point?(id)
  MOUNT_POINT_REGEXP.match(id) ? true : false
end
of_type?(disk_h, vm_type) click to toggle source
# File lib/fog/proxmox/helpers/disk_helper.rb, line 175
def self.of_type?(disk_h, vm_type)
  id = disk_h['id'] if disk_h.key?('id')
  id = disk_h[:id] if disk_h.key?(:id)
  result = false
  result = server_disk?(id) if vm_type == 'qemu'
  result = container_disk?(id) if vm_type == 'lxc'
  result
end
rootfs?(id) click to toggle source
# File lib/fog/proxmox/helpers/disk_helper.rb, line 155
def self.rootfs?(id)
  ROOTFS_REGEXP.match(id) ? true : false
end
server_disk?(id) click to toggle source
# File lib/fog/proxmox/helpers/disk_helper.rb, line 151
def self.server_disk?(id)
  SERVER_DISK_REGEXP.match(id) ? true : false
end
template?(volid) click to toggle source
# File lib/fog/proxmox/helpers/disk_helper.rb, line 167
def self.template?(volid)
  TEMPLATE_REGEXP.match(volid) ? true : false
end
to_bytes(size) click to toggle source
# File lib/fog/proxmox/helpers/disk_helper.rb, line 103
def self.to_bytes(size)
  val = size.match(/\d+(\w?)/)
  m = 0
  case val[1]
  when 'K' then m = 1
  when 'M' then m = 2
  when 'G' then m = 3
  when 'T' then m = 4
  when 'P' then m = 5
  end
  val[0].to_i * 1024**m
end
to_human_bytes(size) click to toggle source
# File lib/fog/proxmox/helpers/disk_helper.rb, line 120
def self.to_human_bytes(size)
  units = %w[Kb Mb Gb]
  i = 0
  human_size = size.to_s + 'b'
  while i < 3 && size >= 1024
    size = modulo_bytes(size)
    human_size = size.to_s + units[i]
    i += 1
  end
  human_size
end
to_int_gb(size_bytes) click to toggle source
# File lib/fog/proxmox/helpers/disk_helper.rb, line 132
def self.to_int_gb(size_bytes)
  val = to_human_bytes(size_bytes.to_i).match(/\d+(Gb)/)
  val ? val[0].to_i : 0
end