Module: Fog::Proxmox::DiskHelper

Defined in:
lib/fog/proxmox/helpers/disk_helper.rb

Overview

module Disk mixins

Constant Summary collapse

DISKS_REGEXP =
/^(scsi|sata|mp|rootfs|virtio|ide)(\d+){0,1}$/
SERVER_DISK_REGEXP =
/^(scsi|sata|virtio|ide)(\d+)$/
MOUNT_POINT_REGEXP =
/^(mp)(\d+)$/
ROOTFS_REGEXP =
/^(rootfs)$/
CDROM_REGEXP =
/^(.*),{0,1}(media=cdrom),{0,1}(.*)$/
TEMPLATE_REGEXP =
/^(.*)(base-)(.*)$/
CLOUD_INIT_REGEXP =
/^(.*)(cloudinit)(.*)$/

Class Method Summary collapse

Class Method Details

.cdrom?(value) ⇒ Boolean

Returns:

  • (Boolean)


147
148
149
# File 'lib/fog/proxmox/helpers/disk_helper.rb', line 147

def self.cdrom?(value)
  CDROM_REGEXP.match(value) || false
end

.cloud_init?(volid) ⇒ Boolean

Returns:

  • (Boolean)


171
172
173
# File 'lib/fog/proxmox/helpers/disk_helper.rb', line 171

def self.cloud_init?(volid)
  CLOUD_INIT_REGEXP.match(volid) || false
end

.container_disk?(id) ⇒ Boolean

Returns:

  • (Boolean)


163
164
165
# File 'lib/fog/proxmox/helpers/disk_helper.rb', line 163

def self.container_disk?(id)
  rootfs?(id) || mount_point?(id)
end

.disk?(id) ⇒ Boolean

Returns:

  • (Boolean)


143
144
145
# File 'lib/fog/proxmox/helpers/disk_helper.rb', line 143

def self.disk?(id)
  DISKS_REGEXP.match(id) || false
end

.extract(id) ⇒ Object



68
69
70
# File 'lib/fog/proxmox/helpers/disk_helper.rb', line 68

def self.extract(id)
  id.scan(/(\w+)(\d+)/).first
end

.extract_controller(id) ⇒ Object



60
61
62
# File 'lib/fog/proxmox/helpers/disk_helper.rb', line 60

def self.extract_controller(id)
  extract(id)[0]
end

.extract_device(id) ⇒ Object



64
65
66
# 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) ⇒ Object

Convert API Proxmox parameter string into attribute hash value



73
74
75
76
77
# 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) ⇒ Object



137
138
139
140
141
# 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) ⇒ Object

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



80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
# 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) ⇒ Object

Convert disk attributes hash into API Proxmox parameters string



35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
# 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) ⇒ Object



116
117
118
# File 'lib/fog/proxmox/helpers/disk_helper.rb', line 116

def self.modulo_bytes(size)
  size / 1024
end

.mount_point?(id) ⇒ Boolean

Returns:

  • (Boolean)


159
160
161
# File 'lib/fog/proxmox/helpers/disk_helper.rb', line 159

def self.mount_point?(id)
  MOUNT_POINT_REGEXP.match(id) || false
end

.of_type?(disk_h, vm_type) ⇒ Boolean

Returns:

  • (Boolean)


175
176
177
178
179
180
181
182
# 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) ⇒ Boolean

Returns:

  • (Boolean)


155
156
157
# File 'lib/fog/proxmox/helpers/disk_helper.rb', line 155

def self.rootfs?(id)
  ROOTFS_REGEXP.match(id) || false
end

.server_disk?(id) ⇒ Boolean

Returns:

  • (Boolean)


151
152
153
# File 'lib/fog/proxmox/helpers/disk_helper.rb', line 151

def self.server_disk?(id)
  SERVER_DISK_REGEXP.match(id) || false
end

.template?(volid) ⇒ Boolean

Returns:

  • (Boolean)


167
168
169
# File 'lib/fog/proxmox/helpers/disk_helper.rb', line 167

def self.template?(volid)
  TEMPLATE_REGEXP.match(volid) || false
end

.to_bytes(size) ⇒ Object



103
104
105
106
107
108
109
110
111
112
113
114
# 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) ⇒ Object



120
121
122
123
124
125
126
127
128
129
130
# 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) ⇒ Object



132
133
134
135
# 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