foreman_fog_proxmox 0.14.2 → 0.15.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (34) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/javascripts/foreman_fog_proxmox/proxmox_vm.js +32 -6
  3. data/app/helpers/proxmox_compute_resources_vms_helper.rb +6 -1
  4. data/app/helpers/proxmox_vm_cloudinit_helper.rb +100 -0
  5. data/app/helpers/proxmox_vm_config_helper.rb +9 -4
  6. data/app/helpers/proxmox_vm_interfaces_helper.rb +3 -3
  7. data/app/models/concerns/fog_extensions/proxmox/server.rb +1 -1
  8. data/app/models/foreman_fog_proxmox/proxmox.rb +9 -3
  9. data/app/models/foreman_fog_proxmox/proxmox_compute_attributes.rb +1 -1
  10. data/app/models/foreman_fog_proxmox/proxmox_console.rb +3 -1
  11. data/app/models/foreman_fog_proxmox/proxmox_images.rb +5 -8
  12. data/app/models/foreman_fog_proxmox/proxmox_interfaces.rb +0 -2
  13. data/app/models/foreman_fog_proxmox/proxmox_vm_commands.rb +19 -8
  14. data/app/models/foreman_fog_proxmox/proxmox_vm_new.rb +1 -1
  15. data/app/models/foreman_fog_proxmox/proxmox_volumes.rb +7 -5
  16. data/app/views/compute_resources/form/_proxmox.html.erb +1 -1
  17. data/app/views/compute_resources_vms/form/proxmox/_general.html.erb +4 -1
  18. data/app/views/compute_resources_vms/form/proxmox/container/_advanced.html.erb +1 -11
  19. data/app/views/compute_resources_vms/form/proxmox/container/_config.html.erb +19 -12
  20. data/app/views/compute_resources_vms/form/proxmox/server/_advanced.html.erb +1 -9
  21. data/app/views/compute_resources_vms/form/proxmox/server/_config.html.erb +23 -16
  22. data/app/views/compute_resources_vms/index/_proxmox.html.erb +1 -0
  23. data/lib/foreman_fog_proxmox/engine.rb +3 -1
  24. data/lib/foreman_fog_proxmox/version.rb +1 -1
  25. data/locale/en/foreman_fog_proxmox.po +13 -4
  26. data/locale/foreman_fog_proxmox.pot +22 -9
  27. data/locale/fr/foreman_fog_proxmox.po +16 -7
  28. data/test/unit/foreman_fog_proxmox/helpers/proxmox_vm_helper_test.rb +2 -2
  29. data/test/unit/foreman_fog_proxmox/proxmox_images_test.rb +2 -5
  30. data/test/unit/foreman_fog_proxmox/proxmox_vm_commands_container_test.rb +8 -2
  31. data/test/unit/foreman_fog_proxmox/proxmox_vm_commands_server_create_test.rb +8 -2
  32. data/test/unit/foreman_fog_proxmox/proxmox_vm_commands_server_update_cdrom_test.rb +3 -0
  33. data/test/unit/foreman_fog_proxmox/proxmox_vm_commands_server_update_hard_disk_test.rb +9 -3
  34. metadata +21 -21
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: dba360e94210ac6442155e678bc2fd6cc3f4fcccb29ff219abb7746981e7dcc6
4
- data.tar.gz: 614badb0bcdf2a98d154735788e0ea34f434f09588644a42d79f6db4054bd054
3
+ metadata.gz: b41c2a927bcce7383e1fd55c588247e935e0c6e11ba967fe6628db72a80730df
4
+ data.tar.gz: ce7634ce750c8317bc28906e4394888d50b66931b9c77586f3af90c339ca07c2
5
5
  SHA512:
6
- metadata.gz: 1dd4fa2f0d4ae18a4b2ae0bea8448e67304f7d94e65d837c15a25a6f19df60aadcb3da568ee757573537621ef2ca512deaba6a79d11087f020d66575b74aeed2
7
- data.tar.gz: 4ae5d901c8c714b108221860cf922882d791e1bfb85c2913487fbf48814ac767d447092c6304e775774c8c1e94f09af33d26bbab41ff7a330dcd60c8e5231c7d
6
+ metadata.gz: 65a3b9ac47bb382cc0c2b30430151a9db92bf64dcc9c64ed6c9fffb1fbb5dc525316d3475a7c5d88c21d30e3ffb8ad8eaf6ef5d6676cff53cfbd43dd5a086378
7
+ data.tar.gz: e210dad89239964322d0dc1b5f3a326a11f449ada2ad61d23f87f2047d421454020aa4b14ffed1efc173f31fd7cb0c68d92a76a9df0757133c810993a49a5a85
@@ -15,6 +15,8 @@
15
15
  // You should have received a copy of the GNU General Public License
16
16
  // along with ForemanFogProxmox. If not, see <http://www.gnu.org/licenses/>.
17
17
 
18
+ //= require jquery-ui/widgets/accordion
19
+
18
20
  $(document).ready(vmTypeSelected);
19
21
 
20
22
  function vmTypeSelected() {
@@ -27,13 +29,8 @@ function vmTypeSelected() {
27
29
  fieldsets.push({id: 'config_ext', toggle: true, new_vm: new_vm, selected: selected});
28
30
  fieldsets.push({id: 'volume', toggle: true, new_vm: new_vm, selected: selected});
29
31
  fieldsets.push({id: 'network', toggle: true, new_vm: true, selected: selected});
30
- fieldsets.push({id: 'config_options', toggle: false, new_vm: new_vm, selected: selected});
31
- fieldsets.push({id: 'config_cpu', toggle: false, new_vm: new_vm, selected: selected});
32
- fieldsets.push({id: 'config_memory', toggle: false, new_vm: new_vm, selected: selected});
33
- fieldsets.push({id: 'config_cdrom', toggle: false, new_vm: new_vm, selected: selected});
34
- fieldsets.push({id: 'config_os', toggle: false, new_vm: new_vm, selected: selected});
35
- fieldsets.push({id: 'config_dns', toggle: false, new_vm: new_vm, selected: selected});
36
32
  fieldsets.forEach(toggleFieldsets);
33
+ toggleAccordion(selected);
37
34
  toggleVolumes(selected);
38
35
  return false;
39
36
  }
@@ -142,6 +139,35 @@ function disableFieldset(fieldsetId, fieldset) {
142
139
  input_hidden_id(fieldsetId).attr('disabled','disabled');
143
140
  }
144
141
 
142
+ function enableConfigOptions(fieldsetId) {
143
+ var field = $("#" + fieldsetId + "_advanced_options");
144
+ field.accordion({collapsible : true, heightStyle: "content"});
145
+ field.removeClass('disabled').find("*").prop("disabled", false);
146
+ field.removeClass('hide');
147
+ }
148
+
149
+ function disableConfigOptions(fieldsetId) {
150
+ var field = $("#" + fieldsetId + "_advanced_options");
151
+ field.addClass('disabled').find("*").prop("disabled", true);
152
+ field.addClass('hide');
153
+ }
154
+
155
+ function toggleConfigOptions(fieldsetId, type1, type2) {
156
+ if (type1 === type2) {
157
+ enableConfigOptions(fieldsetId);
158
+ } else {
159
+ disableConfigOptions(fieldsetId);
160
+ }
161
+ }
162
+
163
+ function toggleAccordion(selected){
164
+ ['qemu', 'lxc'].forEach(function(type){
165
+ fieldsets(type).forEach(function(fieldsetId){
166
+ toggleConfigOptions(fieldsetId, selected, type);
167
+ });
168
+ });
169
+ }
170
+
145
171
  function toggleFieldset(fieldsetId, fieldset, type1, type2) {
146
172
  type1 === type2 ? enableFieldset(fieldsetId, fieldset) : disableFieldset(fieldsetId, fieldset);
147
173
  }
@@ -41,6 +41,11 @@ module ProxmoxComputeResourcesVmsHelper
41
41
  end
42
42
 
43
43
  def vm_associate_action(vm)
44
+ vm_associate_link(vm, link_class: "btn btn-default")
45
+ end
46
+
47
+ def vm_associate_link(vm, link_class: "")
48
+ return unless @compute_resource.supports_host_association?
44
49
  display_link_if_authorized(
45
50
  _('Associate VM'),
46
51
  hash_for_associate_compute_resource_vm_path(
@@ -52,7 +57,7 @@ module ProxmoxComputeResourcesVmsHelper
52
57
  ),
53
58
  :title => _('Associate VM to a Foreman host'),
54
59
  :method => :put,
55
- :class => 'btn btn-default'
60
+ :class => link_class
56
61
  )
57
62
  end
58
63
 
@@ -37,7 +37,107 @@ module ProxmoxVmCloudinitHelper
37
37
  id = "#{controller}#{device}" if controller && device
38
38
  cloudinit_h.store(:id, id.to_sym) if id
39
39
  cloudinit_h.store(:volid, cloudinit_volid) if cloudinit_volid
40
+ cloudinit_h.store(:media, 'cdrom')
40
41
  end
41
42
  cloudinit_h
42
43
  end
44
+
45
+ def create_cloudinit_iso(vm_name, configs, ssh)
46
+ iso = File.join(default_iso_path, "#{vm_name.tr('.', '_')}_cloudinit.iso")
47
+ files = []
48
+ wd = create_temp_directory(ssh)
49
+
50
+ configs.each do |config|
51
+ config_file = ssh.run(%(echo "#{config[1]}" >> "#{wd}/#{config[0]}"))
52
+ unless config_file.first.status.zero?
53
+ delete_temp_dir(ssh, wd)
54
+ raise ::Foreman::Exception, "Failed to create file #{config[0]}: #{config_file.first.stdout}"
55
+ end
56
+ files.append(File.join(wd, config[0]))
57
+ end
58
+ generated_iso = ssh.run(generate_iso_command(iso, files))
59
+ unless generated_iso.first.status.zero?
60
+ delete_temp_dir(ssh, wd)
61
+ raise Foreman::Exception, N_("ISO build failed: #{generated_iso.first.stdout}")
62
+ end
63
+ delete_temp_dir(ssh, wd)
64
+ iso
65
+ end
66
+
67
+ def generate_iso_command(iso_file, config_files)
68
+ arguments = ["genisoimage", "-output #{iso_file}", '-volid', 'cidata', '-joliet', '-rock']
69
+ iso_command = arguments.concat(config_files).join(' ')
70
+ logger.debug("iso image generation args: #{iso_command}")
71
+ iso_command
72
+ end
73
+
74
+ def create_temp_directory(ssh)
75
+ res = ssh.run("mktemp -d")
76
+ raise ::Foreman::Exception, "Could not create working directory to store cloudinit config data: #{res.first.stdout}." unless res.first.status.zero?
77
+ res.first.stdout.chomp
78
+ end
79
+
80
+ def delete_temp_dir(ssh, working_dir)
81
+ ssh.run("rm -rf #{working_dir}")
82
+ rescue Foreman::Exception => e
83
+ logger.warn("Could not delete directory for config files: #{e}. Please delete it manually at #{working_dir}")
84
+ end
85
+
86
+ def parse_cloudinit_config(args)
87
+ filenames = ["meta-data"]
88
+ config_data = ["instance-id: #{args[:name]}"]
89
+ user_data = args.delete(:user_data)
90
+ return args if user_data == ''
91
+ check_template_format(user_data)
92
+ ssh = vm_ssh
93
+
94
+ if user_data.include?('#network-config') && user_data.include?('#cloud-config')
95
+ config_data.concat(user_data.split('#network-config'))
96
+ filenames.concat(['user-data', 'network-config'])
97
+ elsif user_data.include?('#network-config') && !user_data.include?('#cloud-config')
98
+ config_data.append(user_data.split('#network-config')[1])
99
+ filenames.append("network-config")
100
+ elsif !user_data.include?('#network-config') && user_data.include?('#cloud-config')
101
+ config_data.append(user_data)
102
+ filenames.append("user-data")
103
+ end
104
+
105
+ return args if config_data.length == 1
106
+ configs = filenames.zip(config_data).to_h
107
+
108
+ iso = create_cloudinit_iso(args[:name], configs, ssh)
109
+ args[:config_attributes]&.merge!(update_boot_order(args[:image_id]))
110
+ args.merge!(attach_cloudinit_iso(args[:node_id], iso))
111
+ end
112
+
113
+ def attach_cloudinit_iso(node, iso)
114
+ storage = storages(node, 'iso')[0]
115
+ volume = storage.volumes.detect { |v| v.volid.include? File.basename(iso) }
116
+ { ide2: "#{volume.volid},media=cdrom" }
117
+ end
118
+
119
+ def default_iso_path
120
+ "/var/lib/vz/template/iso"
121
+ end
122
+
123
+ def update_boot_order(image_id)
124
+ vm = find_vm_by_uuid(image_id)
125
+ return if vm.disks.nil?
126
+ disks = vm.disks.map { |disk| disk.split(":")[0] }.join(";")
127
+ { boot: "order=" + disks }
128
+ end
129
+
130
+ def vm_ssh
131
+ ssh = Fog::SSH.new(URI.parse(fog_credentials[:proxmox_url]).host, fog_credentials[:proxmox_username].split('@')[0], { password: fog_credentials[:proxmox_password] })
132
+ ssh.run('ls') # test if ssh is successful
133
+ ssh
134
+ rescue StandardError => e
135
+ raise ::Foreman::Exception, "Unable to ssh into proxmox server: #{e}"
136
+ end
137
+
138
+ def check_template_format(user_data)
139
+ YAML.safe_load(user_data)
140
+ rescue StandardError => e
141
+ raise ::Foreman::Exception, "'User data kind' template provided could not be loaded, please check the format: #{e}"
142
+ end
43
143
  end
@@ -27,11 +27,11 @@ require 'foreman_fog_proxmox/hash_collection'
27
27
  module ProxmoxVmConfigHelper
28
28
  def object_to_config_hash(vm, type)
29
29
  vm_h = ActiveSupport::HashWithIndifferentAccess.new
30
- main_a = ['vmid']
31
- main = vm.attributes.select { |key, _value| main_a.include? key }
30
+ main_a = ['vmid', 'type']
31
+ main = vm.attributes.select { |key, _value| main_a.include? key.to_s }
32
32
  main_a += ['templated']
33
33
  config = vm.config.attributes.reject do |key, _value|
34
- main_a.include?(key) || Fog::Proxmox::DiskHelper.disk?(key) || Fog::Proxmox::NicHelper.nic?(key)
34
+ main_a.include?(key.to_s) || Fog::Proxmox::DiskHelper.disk?(key) || Fog::Proxmox::NicHelper.nic?(key)
35
35
  end
36
36
  vm_h = vm_h.merge(main)
37
37
  vm_h = vm_h.merge('config_attributes': config)
@@ -40,7 +40,7 @@ module ProxmoxVmConfigHelper
40
40
  end
41
41
 
42
42
  def general_a(type)
43
- general_a = ['node_id', 'type', 'config_attributes', 'volumes_attributes', 'interfaces_attributes']
43
+ general_a = ['node_id', 'type', 'config_attributes', 'volumes_attributes', 'interfaces_attributes', 'image_id']
44
44
  general_a += ['firmware_type', 'provision_method', 'container_volumes', 'server_volumes', 'start_after_create']
45
45
  general_a += ['name'] if type == 'lxc'
46
46
  general_a
@@ -126,6 +126,11 @@ module ProxmoxVmConfigHelper
126
126
  def parse_typed_memory(args, type)
127
127
  ForemanFogProxmox::HashCollection.remove_empty_values(args)
128
128
  logger.debug("parse_typed_memory(#{type}): args=#{args}")
129
+ # Convert balloon value from bytes to expected MiB if its not already
130
+ if args.key?('balloon')
131
+ mb = (args['balloon'].to_i / 1024**2).to_s
132
+ args['balloon'] = (mb == '0') ? args['balloon'] : mb
133
+ end
129
134
  args
130
135
  end
131
136
 
@@ -56,7 +56,7 @@ module ProxmoxVmInterfacesHelper
56
56
  end
57
57
 
58
58
  def interface_common_typed_keys(type)
59
- [{ origin: 'id', dest: 'id' }, { origin: 'mac', dest: type == 'qemu' ? 'macaddr' : 'hwaddr' }]
59
+ ['id', type == 'qemu' ? 'macaddr' : 'hwaddr']
60
60
  end
61
61
 
62
62
  def compute_dhcps(interface_attributes_h)
@@ -80,8 +80,8 @@ module ProxmoxVmInterfacesHelper
80
80
  interfaces_to_delete.push(id.to_s)
81
81
  else
82
82
  interface_common_typed_keys(type).each do |key|
83
- ForemanFogProxmox::HashCollection.add_and_format_element(nic, key[:dest].to_sym, interface_attributes,
84
- key[:origin])
83
+ ForemanFogProxmox::HashCollection.add_and_format_element(nic, key.to_sym, interface_attributes,
84
+ key)
85
85
  end
86
86
  interface_attributes_h = interface_attributes['compute_attributes']
87
87
  if ForemanFogProxmox::Value.empty?(interface_attributes['compute_attributes'])
@@ -53,7 +53,7 @@ module FogExtensions
53
53
  end
54
54
 
55
55
  def state
56
- qmpstatus
56
+ status
57
57
  end
58
58
 
59
59
  delegate :description, to: :config
@@ -154,7 +154,7 @@ module ForemanFogProxmox
154
154
  raise ::Foreman::Exception, 'User token expired' if token_expired?(e)
155
155
  rescue StandardError => e
156
156
  logger.warn("failed to create compute client: #{e}")
157
- raise e
157
+ raise ::Foreman::Exception, error_message(e)
158
158
  end
159
159
 
160
160
  def identity_client
@@ -163,7 +163,7 @@ module ForemanFogProxmox
163
163
  raise ::Foreman::Exception, 'User token expired' if token_expired?(e)
164
164
  rescue StandardError => e
165
165
  logger.warn("failed to create identity client: #{e}")
166
- raise e
166
+ raise ::Foreman::Exception, error_message(e)
167
167
  end
168
168
 
169
169
  def network_client
@@ -172,7 +172,13 @@ module ForemanFogProxmox
172
172
  raise ::Foreman::Exception, 'User token expired' if token_expired?(e)
173
173
  rescue StandardError => e
174
174
  logger.warn("failed to create network client: #{e}")
175
- raise e
175
+ raise ::Foreman::Exception, error_message(e)
176
+ end
177
+
178
+ def error_message(e)
179
+ "Failed to create Proxmox compute resource: #{e.message}.
180
+ Either provided credentials or FQDN is wrong or
181
+ your server cannot connect to Proxmox due to network issues."
176
182
  end
177
183
 
178
184
  def host
@@ -41,7 +41,7 @@ ostype: ostype)
41
41
  end
42
42
 
43
43
  def interface_compute_attributes(interface_attributes)
44
- vm_attrs = ForemanFogProxmox::HashCollection.new_hash_reject_keys(interface_attributes, [:identifier, :mac])
44
+ vm_attrs = ForemanFogProxmox::HashCollection.new_hash_reject_keys(interface_attributes, [:identifier, :macaddr, :hwaddr])
45
45
  vm_attrs[:dhcp] = interface_attributes[:ip] == 'dhcp' ? '1' : '0'
46
46
  vm_attrs[:dhcp6] = interface_attributes[:ip6] == 'dhcp' ? '1' : '0'
47
47
  vm_attrs
@@ -31,7 +31,9 @@ module ForemanFogProxmox
31
31
  options.store(:websocket, 1) if type_console == 'vnc'
32
32
  begin
33
33
  vnc_console = vm.start_console(options)
34
- WsProxy.start(:host => host, :host_port => vnc_console['port'], :password => vnc_console['ticket']).merge(
34
+ vmid = extract_vmid(uuid).to_i
35
+ vnc_host_port = vnc_console['port'].to_i + vmid
36
+ WsProxy.start(:host => host, :host_port => vnc_host_port, :password => vnc_console['ticket']).merge(
35
37
  :name => vm.name, :type => type_console
36
38
  )
37
39
  rescue StandardError => e
@@ -47,8 +47,9 @@ module ForemanFogProxmox
47
47
  def templates
48
48
  volumes = []
49
49
  nodes.each do |node|
50
- storage = storages(node.node).first
51
- volumes += storage.volumes.list_by_content_type('images')
50
+ storages(node.node).each do |storage|
51
+ volumes += storage.volumes.list_by_content_type('images')
52
+ end
52
53
  end
53
54
  volumes.select(&:template?)
54
55
  end
@@ -57,15 +58,11 @@ module ForemanFogProxmox
57
58
  find_vm_by_uuid(uuid)
58
59
  end
59
60
 
60
- def clone_from_image(image_id, args, vmid)
61
+ def clone_from_image(image_id, vmid)
61
62
  logger.debug("create_vm(): clone #{image_id} in #{vmid}")
62
63
  image = find_vm_by_uuid(image_id)
63
64
  image.clone(vmid)
64
- clone = find_vm_by_uuid(id.to_s + '_' + vmid.to_s)
65
- options = {}
66
- options.store(:name, args[:name]) unless clone.container?
67
- options.store(:hostname, args[:name]) if clone.container?
68
- clone.update(options)
65
+ find_vm_by_uuid(id.to_s + '_' + vmid.to_s)
69
66
  end
70
67
  end
71
68
  end
@@ -33,8 +33,6 @@ module ForemanFogProxmox
33
33
  _(format('Invalid proxmox NIC id on interface[%<index>s]. Must be net[n] with n integer >= 0',
34
34
  index: index))
35
35
  end
36
-
37
- nic.identifier = nic.compute_attributes['id'] if nic.identifier.empty?
38
36
  end
39
37
 
40
38
  def vm_type(host)
@@ -39,26 +39,37 @@ module ForemanFogProxmox
39
39
  raise ::Foreman::Exception, format(N_('invalid vmid=%<vmid>s'), vmid: vmid) unless node.servers.id_valid?(vmid)
40
40
 
41
41
  image_id = args[:image_id]
42
+ remove_volume_keys(args)
42
43
  if image_id
43
- clone_from_image(image_id, args, vmid)
44
+ vm = clone_from_image(image_id, vmid)
45
+ vm.update(compute_clone_attributes(args, vm.container?, type))
46
+ update_pool(vm, args[:pool]) if args[:pool]
44
47
  else
45
- remove_volume_keys(args)
46
48
  logger.warn("create vm: args=#{args}")
47
49
  vm = node.send(vm_collection(type)).create(parse_typed_vm(args, type))
48
- start_on_boot(vm, args)
49
50
  end
51
+ start_on_boot(vm, args)
50
52
  rescue StandardError => e
51
53
  logger.warn("failed to create vm: #{e}")
52
- destroy_vm client.identity + '_' + vm.id if vm
54
+ destroy_vm id.to_s + '_' + vm.vmid.to_s if vm
53
55
  raise e
54
56
  end
55
57
 
58
+ def compute_clone_attributes(args, container, type)
59
+ args = parse_cloudinit_config(args) if args[:user_data]
60
+ parsed_args = parse_typed_vm(args, type)
61
+ if container
62
+ options = { :hostname => args[:name] }
63
+ parsed_args.merge(options)
64
+ end
65
+ parsed_args.reject { |k| k == 'pool' }
66
+ end
67
+
56
68
  def destroy_vm(uuid)
57
69
  vm = find_vm_by_uuid(uuid)
58
- unless vm.nil?
59
- vm.stop if vm.ready?
60
- vm.destroy
61
- end
70
+ return true if vm.nil?
71
+ vm.stop if vm.ready?
72
+ vm.destroy
62
73
  rescue ActiveRecord::RecordNotFound
63
74
  # if the VM does not exists, we don't really care.
64
75
  true
@@ -142,7 +142,7 @@ module ForemanFogProxmox
142
142
  config_attributes = {
143
143
  cores: '1',
144
144
  sockets: '1',
145
- kvm: '0',
145
+ kvm: '1',
146
146
  vga: 'std',
147
147
  memory: '1024',
148
148
  ostype: 'l26',
@@ -104,12 +104,14 @@ module ForemanFogProxmox
104
104
 
105
105
  def volume_exists?(vm, volume_attributes)
106
106
  disk = vm.config.disks.get(volume_attributes['id'])
107
- exists = false
108
- return exists unless disk
107
+ return false unless disk
109
108
 
110
- exists = !volume_attributes['volid'].empty? if disk.hard_disk? || disk.cloud_init?
111
- exists = !volume_attributes['cdrom'].empty? if disk.cdrom?
112
- exists
109
+ # Return boolean if disk of type hard_disk, cloud_init, cdrom or rootfs(LXC container) exists
110
+ if disk.hard_disk? || disk.cloud_init? || disk.rootfs?
111
+ volume_attributes['volid'].present?
112
+ elsif disk.cdrom?
113
+ volume_attributes['cdrom'].present?
114
+ end
113
115
  end
114
116
 
115
117
  def volume_to_delete?(volume_attributes)
@@ -38,5 +38,5 @@ along with ForemanFogProxmox. If not, see <http://www.gnu.org/licenses/>. %>
38
38
  :placeholder => _("Optionally provide a CA, or a correctly ordered CA chain. If left blank, disable ssl_verify_peer.") %>
39
39
  <% end %>
40
40
  <div class="col-md-offset-2">
41
- <%= test_connection_button_f(f, (f.object.nodes rescue false)) %>
41
+ <%= test_connection_button_f(f, (f.object.nodes rescue true)) %>
42
42
  </div>
@@ -21,7 +21,10 @@ along with ForemanFogProxmox. If not, see <http://www.gnu.org/licenses/>. %>
21
21
  <%= checkbox_f f, :templated, :label => _('Create image?'), :disabled => untemplatable, :class => ('hide' if untemplatable), :no_label => untemplatable %>
22
22
  <%= counter_f f, :vmid, :label => _('VM ID'), :label_size => "col-md-2", :required => true, :disabled => (!new_vm || from_profile) %>
23
23
  <%= select_f f, :node_id, compute_resource.nodes, :node, :node, { }, :label => _('Node'), :label_size => "col-md-2", :required => true, :onchange => 'nodeSelected(this)' %>
24
- <%= checkbox_f f, :start_after_create, :label => _('Start after creation?'), :disabled => !new_vm, :class => ('hide' if !new_vm), :no_label => !new_vm %>
24
+ <% unless !new_vm || from_profile %>
25
+ <% checked = params[:host] && params[:host][:compute_attributes] && params[:host][:compute_attributes][:start_after_create] || '1' %>
26
+ <%= checkbox_f f, :start_after_create, {:checked => (checked == '1'), :label => _('Start after creation?')} %>
27
+ <% end %>
25
28
  <% unless local_assigns[:hide_image] && !new_vm %>
26
29
  <%
27
30
  arch ||= nil ; os ||= nil
@@ -18,14 +18,4 @@ along with ForemanFogProxmox. If not, see <http://www.gnu.org/licenses/>. %>
18
18
  <% container = f.object.type == 'lxc' %>
19
19
 
20
20
  <%= field_set_tag _("Advanced"), :id => "container_config_advanced_options", :class => ('hide' unless container) do %>
21
- <%= label_tag 'show_container_config_options', n_("Main option", "Main options", 2) %>
22
- <%= check_box_tag 'show_container_config_options', '1', false, :onclick => "$('#container_config_options').toggle()" %>
23
- <%= label_tag 'show_container_config_cpu', _("CPU") %>
24
- <%= check_box_tag 'show_container_config_cpu', '1', false, :onclick => "$('#container_config_cpu').toggle()" %>
25
- <%= label_tag 'show_container_config_memory', _("Memory") %>
26
- <%= check_box_tag 'show_container_config_memory', '1', false, :onclick => "$('#container_config_memory').toggle()" %>
27
- <%= label_tag 'show_container_config_dns', _("DNS") %>
28
- <%= check_box_tag 'show_container_config_dns', '1', false, :onclick => "$('#container_config_dns').toggle()" %>
29
- <%= label_tag 'show_container_config_os', _("OS") %>
30
- <%= check_box_tag 'show_container_config_os', '1', false, :onclick => "$('#container_config_os').toggle()" %>
31
- <% end %>
21
+ <% end %>
@@ -17,25 +17,32 @@ along with ForemanFogProxmox. If not, see <http://www.gnu.org/licenses/>. %>
17
17
 
18
18
  <%= javascript_include_tag 'foreman_fog_proxmox/proxmox_vm_container', "data-turbolinks-track" => true %>
19
19
  <% container = type == 'lxc' %>
20
- <%= field_set_tag n_("Main option", "Main options", 2), :id => "container_config_options", :class => 'hide', :disabled => !container do %>
21
- <%= textarea_f f, :description, :label => _('Description'), :label_size => "col-md-2" %>
22
- <%= checkbox_f f, :onboot, :label => _('Start at boot') %>
23
- <% end %>
24
- <%= field_set_tag _("CPU"), :id => "container_config_cpu", :class => 'hide', :disabled => !container do %>
20
+ <%= content_tag :div, :id => "container_advanced_options" do %>
21
+ <%= content_tag :h3, "Main Options"%>
22
+ <div>
23
+ <%= textarea_f f, :description, :label => _('Description'), :label_size => "col-md-2" %>
24
+ <%= checkbox_f f, :onboot, :label => _('Start at boot') %>
25
+ </div>
26
+ <%= content_tag :h3, "CPUs"%>
27
+ <div>
25
28
  <%= select_f f, :arch, proxmox_archs_map, :id, :name, { }, :label => _('Architecture'), :label_size => "col-md-2" %>
26
29
  <%= counter_f f, :cores, :class => "input-mini", :label => _('Cores'), :label_size => "col-md-2" %>
27
30
  <%= counter_f f, :cpulimit, :class => "input-mini", :label => _('CPU limit'), :label_size => "col-md-2" %>
28
31
  <%= counter_f f, :cpuunits, :class => "input-mini", :label => _('CPU units'), :label_size => "col-md-2" %>
29
- <% end %>
30
- <%= field_set_tag _("Memory"), :id => "container_config_memory", :class => 'hide', :disabled => !container do %>
32
+ </div>
33
+ <%= content_tag :h3, "Memory"%>
34
+ <div>
31
35
  <%= text_f f, :memory, :class => "input-mini", :label => _('Memory (MB)'), :label_size => "col-md-2" %>
32
36
  <%= text_f f, :swap, :class => "input-mini", :label => _('Swap (MB)'), :label_size => "col-md-2" %>
33
- <% end %>
34
- <%= field_set_tag _("DNS"), :id => "container_config_dns", :class => 'hide', :disabled => !container do %>
37
+ </div>
38
+ <%= content_tag :h3, "DNS"%>
39
+ <div>
35
40
  <%= text_f f, :hostname, :label => _('Hostname'), :label_size => "col-md-2", :disabled => true %>
36
41
  <%= text_f f, :nameserver, :label => _('DNS server'), :label_size => "col-md-2" %>
37
42
  <%= text_f f, :searchdomain, :label => _('Search domain'), :label_size => "col-md-2" %>
38
- <% end %>
39
- <%= field_set_tag _("Operating System"), :id => "container_config_os", :class => 'hide', :disabled => !container do %>
43
+ </div>
44
+ <%= content_tag :h3, "Operating System"%>
45
+ <div>
40
46
  <%= select_f f, :ostype, proxmox_ostypes_map, :id, :name, { }, :label => _('OS type'), :label_size => "col-md-2" %>
41
- <% end %>
47
+ </div>
48
+ <% end %>
@@ -18,12 +18,4 @@ along with ForemanFogProxmox. If not, see <http://www.gnu.org/licenses/>. %>
18
18
  <% server = f.object.type == 'qemu' %>
19
19
 
20
20
  <%= field_set_tag _("Advanced"), :id => "server_config_advanced_options", :class => ('hide' unless server) do %>
21
- <%= label_tag 'show_server_config_options', n_("Main option", "Main options", 2) %>
22
- <%= check_box_tag 'show_server_config_options', '1', false, :onclick => "$('#server_config_options').toggle()" %>
23
- <%= label_tag 'show_server_config_cpu', _("CPU") %>
24
- <%= check_box_tag 'show_server_config_cpu', '1', false, :onclick => "$('#server_config_cpu').toggle()" %>
25
- <%= label_tag 'show_server_config_memory', _("Memory") %>
26
- <%= check_box_tag 'show_server_config_memory', '1', false, :onclick => "$('#server_config_memory').toggle()" %>
27
- <%= label_tag 'show_server_config_os', _("OS") %>
28
- <%= check_box_tag 'show_server_config_os', '1', false, :onclick => "$('#server_config_os').toggle()" %>
29
- <% end %>
21
+ <% end %>
@@ -20,17 +20,21 @@ along with ForemanFogProxmox. If not, see <http://www.gnu.org/licenses/>. %>
20
20
  <% server = type == 'qemu' %>
21
21
  <% logger.debug("_config.html.erb server_config=#{f.object.inspect}") %>
22
22
 
23
- <%= field_set_tag n_("Main option", "Main options", 2), :id => "server_config_options", :class => 'hide', :disabled => !server do %>
24
- <%= textarea_f f, :description, :label => _('Description'), :label_size => "col-md-2" %>
25
- <%= text_f f, :boot, :label => _('Boot device order'), :label_size => "col-md-2", :label_help => _('Order your devices, e.g. order=net0;ide2;scsi0. Default empty (any)') %>
26
- <%= checkbox_f f, :onboot, :label => _('Start at boot') %>
27
- <%= checkbox_f f, :agent, :label => _('Qemu Agent') %>
28
- <%= checkbox_f f, :kvm, :label => _('KVM'), :label_help => _('Enable/disable KVM hardware virtualization') %>
29
- <%= select_f f, :vga, proxmox_vgas_map, :id, :name, { :include_blank => true }, :label => _('VGA'), :label_size => "col-md-2" %>
30
- <%= select_f f, :scsihw, proxmox_scsi_controllers_map, :id, :name, { }, :label => _('SCSI Controller'), :label_size => "col-md-2" %>
31
- <%= select_f f, :bios, proxmox_bios_map, :id, :name, { }, :label => _('BIOS'), :label_size => "col-md-2" %>
32
- <% end %>
33
- <%= field_set_tag _("CPUs"), :id => "server_config_cpu", :class => 'hide', :disabled => !server do %>
23
+ <%= content_tag :div, :id => "server_advanced_options" do %>
24
+ <%= content_tag :h3, "Main Options" %>
25
+ <div>
26
+ <%= textarea_f f, :description, :label => _('Description'), :label_size => "col-md-2" %>
27
+ <%= text_f f, :boot, :label => _('Boot device order'), :label_size => "col-md-2", :label_help => _('Order your devices, e.g. order=net0;ide2;scsi0. Default empty (any)') %>
28
+ <%= checkbox_f f, :onboot, :label => _('Start at boot') %>
29
+ <%= checkbox_f f, :agent, :label => _('Qemu Agent') %>
30
+ <%= checkbox_f f, :kvm, :label => _('KVM'), :label_help => _('Enable/disable KVM hardware virtualization') %>
31
+ <%= select_f f, :vga, proxmox_vgas_map, :id, :name, { :include_blank => true }, :label => _('VGA'), :label_size => "col-md-2" %>
32
+ <%= select_f f, :scsihw, proxmox_scsi_controllers_map, :id, :name, { }, :label => _('SCSI Controller'), :label_size => "col-md-2" %>
33
+ <%= select_f f, :bios, proxmox_bios_map, :id, :name, { }, :label => _('BIOS'), :label_size => "col-md-2" %>
34
+ </div>
35
+
36
+ <%= content_tag :h3, "CPUs" %>
37
+ <div>
34
38
  <%= select_f f, :cpu_type, proxmox_cpus_map, :id, :name, { }, :label => _('Type'), :label_size => "col-md-2" %>
35
39
  <%= counter_f f, :sockets, :class => "input-mini", :label => _('Sockets'), :label_size => "col-md-2" %>
36
40
  <%= counter_f f, :cores, :class => "input-mini", :label => _('Cores'), :label_size => "col-md-2" %>
@@ -43,14 +47,17 @@ along with ForemanFogProxmox. If not, see <http://www.gnu.org/licenses/>. %>
43
47
  <%= select_f f, flag_key, proxmox_cpu_flags_map, :id, :name, { }, :label => _(flag_value) %>
44
48
  <% end %>
45
49
  <% end %>
46
- <% end %>
47
- <%= field_set_tag _("Memory"), :id => "server_config_memory", :class => 'hide', :disabled => !server do %>
50
+ </div>
51
+ <%= content_tag :h3, "Memory" %>
52
+ <div>
48
53
  <%= text_f f, :memory, :class => "input-mini", :label => _('Memory (MB)'), :label_size => "col-md-2" %>
49
54
  <%= text_f f, :balloon, :class => "input-mini", :label => _('Minimum memory (MB)'), :label_size => "col-md-2" %>
50
55
  <%= text_f f, :shares, :class => "input-mini", :label => _('Shares (MB)'), :label_size => "col-md-2" %>
51
- <% end %>
52
- <%= field_set_tag _("Operating System"), :id => "server_config_os", :class => 'hide', :disabled => !server do %>
56
+ </div>
57
+ <%= content_tag :h3, "Operating System" %>
58
+ <div>
53
59
  <%= select_f f, :ostype, proxmox_operating_systems_map, :id, :name, { :include_blank => true }, :label => _('OS type'), :label_size => "col-md-2" %>
60
+ </div>
54
61
  <% end %>
55
62
  <%= field_set_tag _("Cloud-init"), :id => "server_config_cloud_init", :class => ('hide' unless cloudinit), :disabled => (!cloudinit) do %>
56
63
  <%= text_f f, :ciuser, :label => _('User'), :label_size => "col-md-2" %>
@@ -58,4 +65,4 @@ along with ForemanFogProxmox. If not, see <http://www.gnu.org/licenses/>. %>
58
65
  <%= text_f f, :searchdomain, :label => _('DNS domain'), :label_size => "col-md-2" %>
59
66
  <%= text_f f, :nameserver, :label => _('DNS servers'), :label_size => "col-md-2" %>
60
67
  <%= textarea_f f, :sshkeys, :label => _("SSH public key"), :size => "col-md-4" %>
61
- <% end %>
68
+ <% end %>
@@ -41,6 +41,7 @@ along with ForemanFogProxmox. If not, see <http://www.gnu.org/licenses/>. %>
41
41
  <td>
42
42
  <%= action_buttons(
43
43
  vm_power_action(vm, authorizer),
44
+ vm_associate_link(vm),
44
45
  display_delete_if_authorized(hash_for_compute_resource_vm_path(:compute_resource_id => @compute_resource, :id => vm.unique_cluster_identity(@compute_resource)).merge(:auth_object => @compute_resource, :authorizer => authorizer))) %>
45
46
  </td>
46
47
  </tr>
@@ -40,13 +40,15 @@ module ForemanFogProxmox
40
40
  initializer 'foreman_fog_proxmox.register_plugin', :before => :finisher_hook do |_app|
41
41
  Foreman::Plugin.register :foreman_fog_proxmox do
42
42
  requires_foreman '>= 1.22.0'
43
+ # Add Global files for extending foreman-core components and routes
44
+ register_global_js_file 'global'
43
45
  # Register Proxmox VE compute resource in foreman
44
46
  compute_resource ForemanFogProxmox::Proxmox
45
47
  parameter_filter(ComputeResource, :uuid)
46
48
  # add dashboard widget
47
49
  widget 'foreman_fog_proxmox_widget', name: N_('Foreman Fog Proxmox widget'), sizex: 8, sizey: 1
48
50
  security_block :foreman_fog_proxmox do
49
- permission :view_compute_resource, { :compute_resources =>
51
+ permission :view_compute_resources, { :'foreman_fog_proxmox/compute_resources' =>
50
52
  [:ostemplates_by_id_and_node_and_storage,
51
53
  :isos_by_id_and_node_and_storage,
52
54
  :ostemplates_by_id_and_node,
@@ -18,5 +18,5 @@
18
18
  # along with ForemanFogProxmox. If not, see <http://www.gnu.org/licenses/>.
19
19
 
20
20
  module ForemanFogProxmox
21
- VERSION = '0.14.2'
21
+ VERSION = '0.15.0'
22
22
  end
@@ -244,7 +244,10 @@ msgstr ""
244
244
  msgid "Memory"
245
245
  msgstr ""
246
246
 
247
- msgid "Minimum memory"
247
+ msgid "Memory (MB)"
248
+ msgstr ""
249
+
250
+ msgid "Minimum memory (MB)"
248
251
  msgstr ""
249
252
 
250
253
  msgid "Mount point"
@@ -340,10 +343,10 @@ msgstr ""
340
343
  msgid "Search domain"
341
344
  msgstr ""
342
345
 
343
- msgid "Shares"
346
+ msgid "Shares (MB)"
344
347
  msgstr ""
345
348
 
346
- msgid "Size"
349
+ msgid "Size (GB)"
347
350
  msgstr ""
348
351
 
349
352
  msgid "Sockets"
@@ -358,7 +361,7 @@ msgstr ""
358
361
  msgid "Storage"
359
362
  msgstr ""
360
363
 
361
- msgid "Swap"
364
+ msgid "Swap (MB)"
362
365
  msgstr ""
363
366
 
364
367
  msgid "Template storage"
@@ -472,6 +475,12 @@ msgstr ""
472
475
  msgid "net[n] with n integer >= 0, e.g. net0"
473
476
  msgstr ""
474
477
 
478
+ msgid "new_typed_vm(%<type>s) with vm_typed_instance_defaults: vm_h=%<vm_h>s"
479
+ msgstr ""
480
+
481
+ msgid "parse_hard_disk_volume(): args=%<args>s"
482
+ msgstr ""
483
+
475
484
  msgid "remove CDROM"
476
485
  msgstr ""
477
486
 
@@ -8,8 +8,8 @@ msgid ""
8
8
  msgstr ""
9
9
  "Project-Id-Version: foreman_fog_proxmox 1.0.0\n"
10
10
  "Report-Msgid-Bugs-To: \n"
11
- "POT-Creation-Date: 2022-12-07 18:29+0100\n"
12
- "PO-Revision-Date: 2022-12-07 18:29+0100\n"
11
+ "POT-Creation-Date: 2022-12-16 17:29+0100\n"
12
+ "PO-Revision-Date: 2022-12-16 17:29+0100\n"
13
13
  "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
14
14
  "Language-Team: LANGUAGE <LL@li.org>\n"
15
15
  "Language: \n"
@@ -89,6 +89,10 @@ msgstr ""
89
89
  msgid "Change the password"
90
90
  msgstr ""
91
91
 
92
+ #: ../app/helpers/proxmox_vm_volumes_helper.rb:52
93
+ msgid "parse_hard_disk_volume(): args=%<args>s"
94
+ msgstr ""
95
+
92
96
  #: ../app/models/concerns/fog_extensions/proxmox/server.rb:62
93
97
  msgid "Type %<type>s, node %<node>s, %<cpus>s CPUs and %<memory>s MB memory"
94
98
  msgstr ""
@@ -129,10 +133,15 @@ msgstr ""
129
133
  msgid "invalid vmid=%<vmid>s"
130
134
  msgstr ""
131
135
 
132
- #: ../app/models/foreman_fog_proxmox/proxmox_vm_queries.rb:79
136
+ #: ../app/models/foreman_fog_proxmox/proxmox_vm_new.rb:199
137
+ msgid "new_typed_vm(%<type>s) with vm_typed_instance_defaults: vm_h=%<vm_h>s"
138
+ msgstr ""
139
+
140
+ #: ../app/models/foreman_fog_proxmox/proxmox_vm_queries.rb:78
133
141
  msgid "Failed retrieving proxmox server vm by vmid=%<vmid>s"
134
142
  msgstr ""
135
143
 
144
+ #: ../app/models/foreman_fog_proxmox/proxmox_volumes.rb:88
136
145
  #: ../app/models/foreman_fog_proxmox/proxmox_volumes.rb:91
137
146
  msgid "Unable to shrink %<id>s size. Proxmox allows only increasing size."
138
147
  msgstr ""
@@ -365,10 +374,8 @@ msgstr ""
365
374
  #:
366
375
  #: ../app/views/compute_resources_vms/form/proxmox/container/_advanced.html.erb:10
367
376
  #: ../app/views/compute_resources_vms/form/proxmox/container/_config.html.erb:15
368
- #: ../app/views/compute_resources_vms/form/proxmox/container/_config.html.erb:16
369
377
  #: ../app/views/compute_resources_vms/form/proxmox/server/_advanced.html.erb:10
370
378
  #: ../app/views/compute_resources_vms/form/proxmox/server/_config.html.erb:32
371
- #: ../app/views/compute_resources_vms/form/proxmox/server/_config.html.erb:33
372
379
  #: ../app/views/compute_resources_vms/index/_proxmox.html.erb:10
373
380
  msgid "Memory"
374
381
  msgstr ""
@@ -418,9 +425,15 @@ msgstr ""
418
425
  msgid "CPU units"
419
426
  msgstr ""
420
427
 
428
+ #:
429
+ #: ../app/views/compute_resources_vms/form/proxmox/container/_config.html.erb:16
430
+ #: ../app/views/compute_resources_vms/form/proxmox/server/_config.html.erb:33
431
+ msgid "Memory (MB)"
432
+ msgstr ""
433
+
421
434
  #:
422
435
  #: ../app/views/compute_resources_vms/form/proxmox/container/_config.html.erb:17
423
- msgid "Swap"
436
+ msgid "Swap (MB)"
424
437
  msgstr ""
425
438
 
426
439
  #:
@@ -598,7 +611,7 @@ msgstr ""
598
611
  #: ../app/views/compute_resources_vms/form/proxmox/container/_volume_mp.html.erb:11
599
612
  #: ../app/views/compute_resources_vms/form/proxmox/container/_volume_rootfs.html.erb:8
600
613
  #: ../app/views/compute_resources_vms/form/proxmox/server/_volume_hard_disk.html.erb:16
601
- msgid "Size"
614
+ msgid "Size (GB)"
602
615
  msgstr ""
603
616
 
604
617
  #:
@@ -660,11 +673,11 @@ msgid "CPU Flags"
660
673
  msgstr ""
661
674
 
662
675
  #: ../app/views/compute_resources_vms/form/proxmox/server/_config.html.erb:34
663
- msgid "Minimum memory"
676
+ msgid "Minimum memory (MB)"
664
677
  msgstr ""
665
678
 
666
679
  #: ../app/views/compute_resources_vms/form/proxmox/server/_config.html.erb:35
667
- msgid "Shares"
680
+ msgid "Shares (MB)"
668
681
  msgstr ""
669
682
 
670
683
  #: ../app/views/compute_resources_vms/form/proxmox/server/_config.html.erb:40
@@ -244,8 +244,11 @@ msgstr ""
244
244
  msgid "Memory"
245
245
  msgstr "Mémoire"
246
246
 
247
- msgid "Minimum memory"
248
- msgstr "Mémoire minimale"
247
+ msgid "Memory (MB)"
248
+ msgstr ""
249
+
250
+ msgid "Minimum memory (MB)"
251
+ msgstr ""
249
252
 
250
253
  msgid "Mount point"
251
254
  msgstr "Point de montage"
@@ -340,11 +343,11 @@ msgstr ""
340
343
  msgid "Search domain"
341
344
  msgstr "Domaine de recherche"
342
345
 
343
- msgid "Shares"
344
- msgstr "Partages"
346
+ msgid "Shares (MB)"
347
+ msgstr ""
345
348
 
346
- msgid "Size"
347
- msgstr "Taille"
349
+ msgid "Size (GB)"
350
+ msgstr ""
348
351
 
349
352
  msgid "Sockets"
350
353
  msgstr ""
@@ -358,7 +361,7 @@ msgstr "Démarrer au boot"
358
361
  msgid "Storage"
359
362
  msgstr "Stockage"
360
363
 
361
- msgid "Swap"
364
+ msgid "Swap (MB)"
362
365
  msgstr ""
363
366
 
364
367
  msgid "Template storage"
@@ -472,6 +475,12 @@ msgstr "vmid=%<vmid>s incorrect"
472
475
  msgid "net[n] with n integer >= 0, e.g. net0"
473
476
  msgstr ""
474
477
 
478
+ msgid "new_typed_vm(%<type>s) with vm_typed_instance_defaults: vm_h=%<vm_h>s"
479
+ msgstr ""
480
+
481
+ msgid "parse_hard_disk_volume(): args=%<args>s"
482
+ msgstr ""
483
+
475
484
  msgid "remove CDROM"
476
485
  msgstr ""
477
486
 
@@ -140,8 +140,8 @@ module ForemanFogProxmox
140
140
  describe 'object_to_config_hash' do
141
141
  setup { Fog.mock! }
142
142
  teardown { Fog.unmock! }
143
- excluded_qemu_keys = ['templated', 'ide2', 'scsi0', 'net0', 'net1']
144
- excluded_lxc_keys = ['templated', 'rootfs', 'mp0', 'net0', 'net1']
143
+ excluded_qemu_keys = ['vmid', 'type', 'templated', 'ide2', 'scsi0', 'net0', 'net1']
144
+ excluded_lxc_keys = ['vmid', 'type', 'templated', 'rootfs', 'mp0', 'net0', 'net1']
145
145
 
146
146
  it '#server qemu' do
147
147
  config_hash = object_to_config_hash(server, 'qemu')
@@ -27,7 +27,6 @@ module ForemanFogProxmox
27
27
  describe 'clone_from_image' do
28
28
  before do
29
29
  @cr = FactoryBot.build_stubbed(:proxmox_cr)
30
- @args = { :name => 'name' }
31
30
  @image_id = @cr.id.to_s + '_' + 100.to_s
32
31
  @vmid = 101
33
32
  @image = mock('vm')
@@ -36,16 +35,14 @@ module ForemanFogProxmox
36
35
  @clone = mock('vm')
37
36
  end
38
37
  it 'clones server from image' do
39
- @clone.expects(:update).with(:name => 'name')
40
38
  @clone.stubs(:container?).returns(false)
41
39
  @cr.stubs(:find_vm_by_uuid).with(@cr.id.to_s + '_' + @vmid.to_s).returns(@clone)
42
- @cr.clone_from_image(@image_id, @args, @vmid)
40
+ @cr.clone_from_image(@image_id, @vmid)
43
41
  end
44
42
  it 'clones container from image' do
45
43
  @clone.stubs(:container?).returns(true)
46
- @clone.expects(:update).with(:hostname => 'name')
47
44
  @cr.stubs(:find_vm_by_uuid).with(@cr.id.to_s + '_' + @vmid.to_s).returns(@clone)
48
- @cr.clone_from_image(@image_id, @args, @vmid)
45
+ @cr.clone_from_image(@image_id, @vmid)
49
46
  end
50
47
  end
51
48
  end
@@ -291,8 +291,14 @@ module ForemanFogProxmox
291
291
  args = { vmid: '100', type: 'lxc', image_id: '999', name: 'name' }
292
292
  servers = mock('servers')
293
293
  servers.stubs(:id_valid?).returns(true)
294
- cr = mock_node_servers(ForemanFogProxmox::Proxmox.new, servers)
295
- cr.expects(:clone_from_image).with('999', args, 100)
294
+ containers = mock('containers')
295
+ cr = mock_node_servers_containers(ForemanFogProxmox::Proxmox.new, servers, containers)
296
+ vm = mock('vm')
297
+ cr.expects(:clone_from_image).with('999', 100).returns(vm)
298
+ vm.expects(:container?).returns(true)
299
+ expected_args = { :vmid => "100", :type => "lxc" }
300
+ cr.stubs(:parse_typed_vm).with(args, 'lxc').returns(expected_args)
301
+ vm.expects(:update).with(expected_args)
296
302
  cr.create_vm(args)
297
303
  end
298
304
  end
@@ -96,9 +96,15 @@ module ForemanFogProxmox
96
96
  it 'clones server' do
97
97
  args = { vmid: '100', type: 'qemu', image_id: '999', name: 'name' }
98
98
  servers = mock('servers')
99
+ containers = mock('containers')
99
100
  servers.stubs(:id_valid?).returns(true)
100
- cr = mock_node_servers(ForemanFogProxmox::Proxmox.new, servers)
101
- cr.expects(:clone_from_image).with('999', args, 100)
101
+ cr = mock_node_servers_containers(ForemanFogProxmox::Proxmox.new, servers, containers)
102
+ vm = mock('vm')
103
+ cr.expects(:clone_from_image).with('999', 100).returns(vm)
104
+ vm.expects(:container?).returns(false)
105
+ expected_args = { :vmid => "100", :type => "qemu", :name => "name" }
106
+ cr.stubs(:parse_typed_vm).with(args, 'qemu').returns(expected_args)
107
+ vm.expects(:update).with(expected_args)
102
108
  cr.create_vm(args)
103
109
  end
104
110
  end
@@ -44,6 +44,7 @@ module ForemanFogProxmox
44
44
  disk.stubs(:id).returns('ide2')
45
45
  disk.stubs(:hard_disk?).returns(false)
46
46
  disk.stubs(:cdrom?).returns(true)
47
+ disk.stubs(:rootfs?).returns(false)
47
48
  disks.stubs(:get).returns
48
49
  config.stubs(:disks).returns(disks)
49
50
  config.stubs(:attributes).returns(:cores => '')
@@ -93,6 +94,7 @@ module ForemanFogProxmox
93
94
  disk.stubs(:size).returns('1')
94
95
  disk.stubs(:hard_disk?).returns(false)
95
96
  disk.stubs(:cdrom?).returns(true)
97
+ disk.stubs(:rootfs?).returns(false)
96
98
  disk.stubs(:cloud_init?).returns(false)
97
99
  disk.stubs(:storage).returns('local-lvm')
98
100
  disk.stubs(:volid).returns('local-lvm:iso/ubuntu-20_4.iso')
@@ -145,6 +147,7 @@ module ForemanFogProxmox
145
147
  disk.stubs(:size).returns('1')
146
148
  disk.stubs(:hard_disk?).returns(false)
147
149
  disk.stubs(:cdrom?).returns(true)
150
+ disk.stubs(:rootfs?).returns(false)
148
151
  disk.stubs(:cloud_init?).returns(false)
149
152
  disk.stubs(:storage).returns('local-lvm')
150
153
  disk.stubs(:volid).returns('local-lvm:iso/ubuntu-20_4.iso')
@@ -24,12 +24,13 @@ require 'factories/foreman_fog_proxmox/proxmox_server_mock_factory'
24
24
  require 'active_support/core_ext/hash/indifferent_access'
25
25
 
26
26
  module ForemanFogProxmox
27
- class ProxmoxVmCommandsServerUpdateHardDiskTest < ActiveSupport::TestCase
27
+ class ProxmoxVmCommandsServerUpdateHardDiskTest < ActiveSupport::TestCase # rubocop:disable Metrics/ClassLength
28
28
  include ComputeResourceTestHelpers
29
29
  include ProxmoxNodeMockFactory
30
30
  include ProxmoxServerMockFactory
31
31
  include ProxmoxVmHelper
32
32
 
33
+ # rubocop:disable Metrics/BlockLength
33
34
  describe 'save_vm' do
34
35
  before do
35
36
  @cr = FactoryBot.build_stubbed(:proxmox_cr)
@@ -43,6 +44,7 @@ module ForemanFogProxmox
43
44
  disk.stubs(:size).returns('1')
44
45
  disk.stubs(:hard_disk?).returns(true)
45
46
  disk.stubs(:cdrom?).returns(false)
47
+ disk.stubs(:rootfs?).returns(false)
46
48
  disk.stubs(:storage).returns('local-lvm')
47
49
  disk.stubs(:id).returns('scsi0')
48
50
  disk.stubs(:attributes).returns(id: 'scsi0', storage: 'local-lvm', size: '1')
@@ -94,6 +96,7 @@ module ForemanFogProxmox
94
96
  disk.stubs(:size).returns('1')
95
97
  disk.stubs(:hard_disk?).returns(true)
96
98
  disk.stubs(:cdrom?).returns(false)
99
+ disk.stubs(:rootfs?).returns(false)
97
100
  disk.stubs(:storage).returns('local-lvm')
98
101
  disk.stubs(:id).returns('virtio0')
99
102
  disks.stubs(:get).returns(disk)
@@ -147,6 +150,7 @@ module ForemanFogProxmox
147
150
  disk.stubs(:size).returns('1')
148
151
  disk.stubs(:hard_disk?).returns(true)
149
152
  disk.stubs(:cdrom?).returns(false)
153
+ disk.stubs(:rootfs?).returns(false)
150
154
  disk.stubs(:storage).returns('scsi0')
151
155
  disk.stubs(:volid).returns('local-lvm:vm-100-disk-0')
152
156
  disk.stubs(:id).returns('local-lvm')
@@ -202,6 +206,7 @@ module ForemanFogProxmox
202
206
  disk.stubs(:size).returns('2')
203
207
  disk.stubs(:hard_disk?).returns(true)
204
208
  disk.stubs(:cdrom?).returns(false)
209
+ disk.stubs(:rootfs?).returns(false)
205
210
  disk.stubs(:storage).returns('local-lvm')
206
211
  disk.stubs(:volid).returns('local-lvm:vm-100-disk-0')
207
212
  disk.stubs(:attributes).returns(id: 'scsi0', storage: 'local-lvm', size: '2')
@@ -254,8 +259,7 @@ module ForemanFogProxmox
254
259
  disk.stubs(:size).returns('1')
255
260
  disk.stubs(:hard_disk?).returns(true)
256
261
  disk.stubs(:cdrom?).returns(false)
257
- disk.stubs(:hard_disk?).returns(true)
258
- disk.stubs(:cdrom?).returns(false)
262
+ disk.stubs(:rootfs?).returns(false)
259
263
  disk.stubs(:storage).returns('local-lvm')
260
264
  disk.stubs(:attributes).returns(id: 'scsi0', storage: 'local-lvm', size: '1', volid: 'local-lvm:vm-100-disk-0')
261
265
  disks.stubs(:get).returns(disk)
@@ -307,6 +311,7 @@ module ForemanFogProxmox
307
311
  disk.stubs(:size).returns('1')
308
312
  disk.stubs(:hard_disk?).returns(true)
309
313
  disk.stubs(:cdrom?).returns(false)
314
+ disk.stubs(:rootfs?).returns(false)
310
315
  disk.stubs(:storage).returns('local-lvm')
311
316
  disk.stubs(:volid).returns('local-lvm:vm-100-disk-0')
312
317
  disk.stubs(:id).returns('scsi0')
@@ -352,5 +357,6 @@ module ForemanFogProxmox
352
357
  @cr.save_vm(uuid, new_attributes)
353
358
  end
354
359
  end
360
+ # rubocop:enable Metrics/BlockLength
355
361
  end
356
362
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: foreman_fog_proxmox
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.14.2
4
+ version: 0.15.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tristan Robert
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2022-12-16 00:00:00.000000000 Z
12
+ date: 2023-11-15 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: deface
@@ -262,29 +262,29 @@ signing_key:
262
262
  specification_version: 4
263
263
  summary: Foreman plugin that adds Proxmox VE compute resource using fog-proxmox
264
264
  test_files:
265
- - test/test_plugin_helper.rb
266
- - test/factories/foreman_fog_proxmox/proxmox_node_mock_factory.rb
267
- - test/factories/foreman_fog_proxmox/proxmox_server_mock_factory.rb
268
- - test/factories/foreman_fog_proxmox/proxmox_container_mock_factory.rb
269
265
  - test/factories/proxmox_factory.rb
266
+ - test/factories/foreman_fog_proxmox/proxmox_container_mock_factory.rb
267
+ - test/factories/foreman_fog_proxmox/proxmox_server_mock_factory.rb
268
+ - test/factories/foreman_fog_proxmox/proxmox_node_mock_factory.rb
269
+ - test/test_plugin_helper.rb
270
+ - test/functional/compute_resources_controller_test.rb
270
271
  - test/unit/foreman_fog_proxmox/proxmox_vm_commands_server_create_test.rb
271
- - test/unit/foreman_fog_proxmox/helpers/proxmox_vm_volumes_helper_test.rb
272
- - test/unit/foreman_fog_proxmox/helpers/proxmox_server_helper_test.rb
273
- - test/unit/foreman_fog_proxmox/helpers/proxmox_vm_helper_test.rb
274
- - test/unit/foreman_fog_proxmox/helpers/proxmox_vm_uuid_helper_test.rb
275
- - test/unit/foreman_fog_proxmox/helpers/proxmox_container_helper_test.rb
276
- - test/unit/foreman_fog_proxmox/proxmox_version_test.rb
277
- - test/unit/foreman_fog_proxmox/proxmox_vm_commands_server_update_cdrom_test.rb
272
+ - test/unit/foreman_fog_proxmox/proxmox_test.rb
278
273
  - test/unit/foreman_fog_proxmox/proxmox_vm_commands_container_test.rb
279
- - test/unit/foreman_fog_proxmox/proxmox_vm_commands_test.rb
280
- - test/unit/foreman_fog_proxmox/semver_test.rb
281
- - test/unit/foreman_fog_proxmox/proxmox_vm_commands_server_update_hard_disk_test.rb
282
274
  - test/unit/foreman_fog_proxmox/proxmox_vm_queries_test.rb
275
+ - test/unit/foreman_fog_proxmox/semver_test.rb
283
276
  - test/unit/foreman_fog_proxmox/proxmox_vm_commands_server_update_test.rb
284
- - test/unit/foreman_fog_proxmox/proxmox_interfaces_test.rb
285
- - test/unit/foreman_fog_proxmox/proxmox_compute_attributes_test.rb
286
- - test/unit/foreman_fog_proxmox/proxmox_images_test.rb
287
277
  - test/unit/foreman_fog_proxmox/proxmox_vm_commands_server_update_cloudinit_test.rb
288
- - test/unit/foreman_fog_proxmox/proxmox_test.rb
278
+ - test/unit/foreman_fog_proxmox/proxmox_vm_commands_test.rb
289
279
  - test/unit/foreman_fog_proxmox/proxmox_vm_new_test.rb
290
- - test/functional/compute_resources_controller_test.rb
280
+ - test/unit/foreman_fog_proxmox/proxmox_images_test.rb
281
+ - test/unit/foreman_fog_proxmox/proxmox_compute_attributes_test.rb
282
+ - test/unit/foreman_fog_proxmox/helpers/proxmox_server_helper_test.rb
283
+ - test/unit/foreman_fog_proxmox/helpers/proxmox_vm_helper_test.rb
284
+ - test/unit/foreman_fog_proxmox/helpers/proxmox_container_helper_test.rb
285
+ - test/unit/foreman_fog_proxmox/helpers/proxmox_vm_uuid_helper_test.rb
286
+ - test/unit/foreman_fog_proxmox/helpers/proxmox_vm_volumes_helper_test.rb
287
+ - test/unit/foreman_fog_proxmox/proxmox_version_test.rb
288
+ - test/unit/foreman_fog_proxmox/proxmox_interfaces_test.rb
289
+ - test/unit/foreman_fog_proxmox/proxmox_vm_commands_server_update_hard_disk_test.rb
290
+ - test/unit/foreman_fog_proxmox/proxmox_vm_commands_server_update_cdrom_test.rb