foreman_fog_proxmox 0.14.3 → 0.15.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 48f67a6be462ff0c8dcbaf74676828eb72dcb028d09984e64652eabd224f5202
4
- data.tar.gz: b480687763ab5d18283b40eccd8625e117a7e057517a1de268e448de3c6de428
3
+ metadata.gz: 7fb26099667e555c1234f7a330cf9914f6efc3c874b22cd2dbff180f1e544ebc
4
+ data.tar.gz: 4c7dc234f8e677f91c898cd9bb1fa52bd5d074998481aeeee7fde0c64a6ef4d5
5
5
  SHA512:
6
- metadata.gz: '0608143b5b0742f00ea77306f785d6bfa0d4023f23ce1c8331c503ba7c1a87d0039bb83b5c350ca48787509e1c0aae08942d8539b2883da85539789ffdd10f9e'
7
- data.tar.gz: 4f58946907839513c8bea07021a9375a81c5bfb1a8fba62c8fc9605571626e0d62e79415a08095da8f4ac42210f99770c15a8c7f123518b20df4775f70df687a
6
+ metadata.gz: 4c1585871bc12fd7b7d6a806dc42c1ae975e4c79765d0a753a9823a2a7c0919e3e7a5b4997217b441f98b208d025166a0ce7f25411c9b058bc874dfd2786a4cb
7
+ data.tar.gz: 0b6d569fb3dfb400f65caf1fedf74e03d7044a3158c98ad9daee258860b9080362431e250ddd49fa79d2e75f7a852ab0dd972029a45e54bcfc20b59eb8dacd19
@@ -23,18 +23,21 @@ function vmTypeSelected() {
23
23
  var host_uuid = $("input[id='host_uuid']").val();
24
24
  var new_vm = host_uuid == undefined;
25
25
  var fieldsets = [];
26
+ var fieldconfig = [];
26
27
  fieldsets.push({id: 'config_advanced_options', toggle: true, new_vm: new_vm, selected: selected});
27
28
  fieldsets.push({id: 'config_ext', toggle: true, new_vm: new_vm, selected: selected});
28
29
  fieldsets.push({id: 'volume', toggle: true, new_vm: new_vm, selected: selected});
29
30
  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});
31
+ fieldconfig.push({id: 'config_options', new_vm: new_vm, selected: selected});
32
+ fieldconfig.push({id: 'config_cpu', new_vm: new_vm, selected: selected});
33
+ fieldconfig.push({id: 'config_memory', new_vm: new_vm, selected: selected});
34
+ fieldconfig.push({id: 'config_cdrom', new_vm: new_vm, selected: selected});
35
+ fieldconfig.push({id: 'config_os', new_vm: new_vm, selected: selected});
36
+ fieldconfig.push({id: 'config_dns', new_vm: new_vm, selected: selected});
36
37
  fieldsets.forEach(toggleFieldsets);
37
38
  toggleVolumes(selected);
39
+ fieldconfig.forEach(toggleConfigs);
40
+ toggleAccordions();
38
41
  return false;
39
42
  }
40
43
 
@@ -134,7 +137,7 @@ function enableFieldset(fieldsetId, fieldset) {
134
137
  input_hidden_id(fieldsetId).removeAttr('disabled');
135
138
  }
136
139
 
137
- function disableFieldset(fieldsetId, fieldset) {
140
+ function disableFieldset(fieldsetId, fieldset) {
138
141
  if (fieldset.toggle && fieldset.new_vm){
139
142
  fieldset_id(fieldsetId, fieldset).hide();
140
143
  }
@@ -142,7 +145,7 @@ function disableFieldset(fieldsetId, fieldset) {
142
145
  input_hidden_id(fieldsetId).attr('disabled','disabled');
143
146
  }
144
147
 
145
- function toggleFieldset(fieldsetId, fieldset, type1, type2) {
148
+ function toggleFieldset(fieldsetId, fieldset, type1, type2) {
146
149
  type1 === type2 ? enableFieldset(fieldsetId, fieldset) : disableFieldset(fieldsetId, fieldset);
147
150
  }
148
151
 
@@ -160,7 +163,7 @@ function fieldsets(type){
160
163
 
161
164
  function toggleFieldsets(fieldset){
162
165
  var removable_input_hidden = $("div.removable-item[style='display: none;']" + " + input:hidden");
163
- removable_input_hidden.attr('disabled','disabled');
166
+ removable_input_hidden.attr('disabled','disabled');
164
167
  ['qemu', 'lxc'].forEach(function(type){
165
168
  fieldsets(type).forEach(function(fieldsetId){
166
169
  toggleFieldset(fieldsetId, fieldset, fieldset.selected, type);
@@ -168,6 +171,50 @@ function toggleFieldsets(fieldset){
168
171
  });
169
172
  }
170
173
 
174
+ function toggleAccordions() {
175
+ $('.accordion-content').hide();
176
+ $('.accordion-section').off('click').on('click', function(event) {
177
+ var $content = $(this).find('.accordion-content');
178
+ $content.slideToggle();
179
+ $(this).toggleClass('active');
180
+ $('.accordion-content').not($content).slideUp();
181
+ $('.accordion-section').not($(this)).removeClass('active');
182
+ event.stopPropagation();
183
+ });
184
+ $('.accordion-content').on('click', function(event) {
185
+ event.stopPropagation();
186
+ });
187
+ }
188
+
189
+ function enableConfig(fieldsetId, fieldset) {
190
+ fieldset_id(fieldsetId, fieldset).removeClass('hide');
191
+ fieldset_id(fieldsetId, fieldset).removeAttr('disabled');
192
+ input_hidden_id(fieldsetId).removeAttr('disabled');
193
+
194
+ }
195
+
196
+ function disableConfig(fieldsetId, fieldset) {
197
+ fieldset_id(fieldsetId, fieldset).addClass('hide');
198
+ fieldset_id(fieldsetId, fieldset).attr('disabled','disabled');
199
+ input_hidden_id(fieldsetId).attr('disabled','disabled');
200
+ }
201
+
202
+ function toggleConfig(fieldsetId, fieldset, type1, type2) {
203
+ if (type1 === type2) {
204
+ enableConfig(fieldsetId, fieldset);
205
+ } else {
206
+ disableConfig(fieldsetId, fieldset);
207
+ }
208
+ }
209
+
210
+ function toggleConfigs(fieldset){
211
+ ['qemu', 'lxc'].forEach(function(type){
212
+ fieldsets(type).forEach(function(fieldsetId){
213
+ toggleConfig(fieldsetId, fieldset, fieldset.selected, type);
214
+ });
215
+ });
216
+ }
217
+
171
218
  function nodeSelected(item) {
172
219
  var node_id = $(item).val();
173
220
  var type = $("#host_compute_attributes_type").val();
@@ -32,7 +32,7 @@ function getIndex(item) {
32
32
  }
33
33
 
34
34
  function isProfile() {
35
- return $(volumesAttributesSelector(true,0,'id')) !== undefined;
35
+ return $(volumesAttributesSelector(true,0,'id')).val() !== undefined;
36
36
  }
37
37
 
38
38
  function controllerSelected(item) {
@@ -42,23 +42,43 @@ function controllerSelected(item) {
42
42
  var profile = isProfile();
43
43
  var device_selector = volumesAttributesSelector(profile,index,'device');
44
44
  var id_selector = volumesAttributesSelector(profile,index,'id');
45
- $(device_selector).attr('data-soft-max', max);
46
- var device = $(device_selector).limitedSpinner('value');
45
+ var device = $(device_selector).val();
47
46
  var id = controller + device;
47
+ validateDeviceLimit(device_selector, max);
48
48
  $(id_selector).val(id);
49
49
  }
50
50
 
51
51
  function deviceSelected(item) {
52
- var device = $(item).limitedSpinner('value');
52
+ var device = $(item).val();
53
53
  var index = getIndex(item);
54
54
  var profile = isProfile();
55
55
  var controller_selector = volumesAttributesSelector(profile,index,'controller');
56
56
  var id_selector = volumesAttributesSelector(profile,index,'id');
57
57
  var controller = $(controller_selector).val();
58
58
  var id = controller + device;
59
+ var max = computeControllerMaxDevice(controller);
60
+ validateDeviceLimit(item, max);
59
61
  $(id_selector).val(id);
60
62
  }
61
63
 
64
+ function validateDeviceLimit(item, maxLimit) {
65
+ var warningContainer = $(item).closest('form').find('.warning-container');
66
+ var deviceNumber = $(item).val();
67
+ var submitButton = $(item).closest('form').find('[data-disable-with]');
68
+ if (!isNaN(maxLimit) && !isNaN(deviceNumber) && deviceNumber > maxLimit) {
69
+ if (warningContainer.length === 0) {
70
+ warningContainer = $('<div class="warning-container" style="color: red;"><span style="color: red;">&#9888;</span> Warning: Value exceeds the maximum limit of ' + maxLimit + '.</div>');
71
+ $(item).closest('.col-md-4').append(warningContainer);
72
+ }
73
+ warningContainer.show();
74
+ submitButton.prop('disabled', true);
75
+ } else {
76
+ warningContainer.hide();
77
+ warningContainer.remove();
78
+ submitButton.prop('disabled', false);
79
+ }
80
+ }
81
+
62
82
  function computeControllerMaxDevice(controller) {
63
83
  switch (controller) {
64
84
  case 'ide':
@@ -72,4 +92,4 @@ function computeControllerMaxDevice(controller) {
72
92
  default:
73
93
  return 1;
74
94
  }
75
- }
95
+ }
@@ -0,0 +1,21 @@
1
+ .accordion-section {
2
+ cursor: pointer;
3
+ }
4
+
5
+ .accordion-section > legend::before {
6
+ content: "\f054";
7
+ font-family: "Font Awesome 5 Free";
8
+ position: relative;
9
+ left: -1em;
10
+ top: 50%;
11
+ transform: translateY(-50%);
12
+ }
13
+
14
+ .accordion-section.active > legend::before {
15
+ content: "\f078";
16
+ font-family: "Font Awesome 5 Free";
17
+ position: relative;
18
+ left: -1em;
19
+ top: 50%;
20
+ transform: translateY(-50%);
21
+ }
@@ -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
 
@@ -41,4 +41,103 @@ module ProxmoxVmCloudinitHelper
41
41
  end
42
42
  cloudinit_h
43
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
44
143
  end
@@ -181,7 +181,7 @@ module ForemanFogProxmox
181
181
  your server cannot connect to Proxmox due to network issues."
182
182
  end
183
183
 
184
- def host
184
+ def proxmox_host
185
185
  URI.parse(url).host
186
186
  end
187
187
  end
@@ -33,7 +33,7 @@ module ForemanFogProxmox
33
33
  vnc_console = vm.start_console(options)
34
34
  vmid = extract_vmid(uuid).to_i
35
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(
36
+ WsProxy.start(:host => proxmox_host, :host_port => vnc_host_port, :password => vnc_console['ticket']).merge(
37
37
  :name => vm.name, :type => type_console
38
38
  )
39
39
  rescue StandardError => e
@@ -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)
@@ -32,10 +32,9 @@ module ForemanFogProxmox
32
32
  end
33
33
 
34
34
  def create_vm(args = {})
35
- vmid = args[:vmid].to_i
36
35
  type = args[:type]
37
36
  node = client.nodes.get(args[:node_id])
38
- vmid = node.servers.next_id.to_i if vmid < 1
37
+ vmid = args[:vmid] = assign_vmid(args[:vmid].to_i, node)
39
38
  raise ::Foreman::Exception, format(N_('invalid vmid=%<vmid>s'), vmid: vmid) unless node.servers.id_valid?(vmid)
40
39
 
41
40
  image_id = args[:image_id]
@@ -55,7 +54,12 @@ module ForemanFogProxmox
55
54
  raise e
56
55
  end
57
56
 
57
+ def assign_vmid(vmid, node)
58
+ vmid < 1 ? node.servers.next_id : vmid
59
+ end
60
+
58
61
  def compute_clone_attributes(args, container, type)
62
+ args = parse_cloudinit_config(args) if args[:user_data]
59
63
  parsed_args = parse_typed_vm(args, type)
60
64
  if container
61
65
  options = { :hostname => args[:name] }
@@ -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 %>
@@ -16,26 +16,37 @@ 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
18
  <%= javascript_include_tag 'foreman_fog_proxmox/proxmox_vm_container', "data-turbolinks-track" => true %>
19
+ <%= stylesheet_link_tag 'foreman_fog_proxmox/accordion' %>
19
20
  <% container = type == 'lxc' %>
20
- <%= field_set_tag n_("Main option", "Main options", 2), :id => "container_config_options", :class => 'hide', :disabled => !container do %>
21
+ <%= field_set_tag n_("Main option", "Main options", 2), :id => "container_config_options", :class => 'accordion-section', :disabled => !container do %>
22
+ <div class="accordion-content">
21
23
  <%= textarea_f f, :description, :label => _('Description'), :label_size => "col-md-2" %>
22
24
  <%= checkbox_f f, :onboot, :label => _('Start at boot') %>
25
+ </div>
23
26
  <% end %>
24
- <%= field_set_tag _("CPU"), :id => "container_config_cpu", :class => 'hide', :disabled => !container do %>
27
+ <%= field_set_tag _("CPU"), :id => "container_config_cpu", :class => 'accordion-section', :disabled => !container do %>
28
+ <div class="accordion-content">
25
29
  <%= select_f f, :arch, proxmox_archs_map, :id, :name, { }, :label => _('Architecture'), :label_size => "col-md-2" %>
26
30
  <%= counter_f f, :cores, :class => "input-mini", :label => _('Cores'), :label_size => "col-md-2" %>
27
31
  <%= counter_f f, :cpulimit, :class => "input-mini", :label => _('CPU limit'), :label_size => "col-md-2" %>
28
32
  <%= counter_f f, :cpuunits, :class => "input-mini", :label => _('CPU units'), :label_size => "col-md-2" %>
33
+ </div>
29
34
  <% end %>
30
- <%= field_set_tag _("Memory"), :id => "container_config_memory", :class => 'hide', :disabled => !container do %>
35
+ <%= field_set_tag _("Memory"), :id => "container_config_memory", :class => 'accordion-section', :disabled => !container do %>
36
+ <div class="accordion-content">
31
37
  <%= text_f f, :memory, :class => "input-mini", :label => _('Memory (MB)'), :label_size => "col-md-2" %>
32
38
  <%= text_f f, :swap, :class => "input-mini", :label => _('Swap (MB)'), :label_size => "col-md-2" %>
39
+ </div>
33
40
  <% end %>
34
- <%= field_set_tag _("DNS"), :id => "container_config_dns", :class => 'hide', :disabled => !container do %>
41
+ <%= field_set_tag _("DNS"), :id => "container_config_dns", :class => 'accordion-section', :disabled => !container do %>
42
+ <div class="accordion-content">
35
43
  <%= text_f f, :hostname, :label => _('Hostname'), :label_size => "col-md-2", :disabled => true %>
36
44
  <%= text_f f, :nameserver, :label => _('DNS server'), :label_size => "col-md-2" %>
37
45
  <%= text_f f, :searchdomain, :label => _('Search domain'), :label_size => "col-md-2" %>
46
+ </div>
38
47
  <% end %>
39
- <%= field_set_tag _("Operating System"), :id => "container_config_os", :class => 'hide', :disabled => !container do %>
48
+ <%= field_set_tag _("Operating System"), :id => "container_config_os", :class => 'accordion-section', :disabled => !container do %>
49
+ <div class="accordion-content">
40
50
  <%= select_f f, :ostype, proxmox_ostypes_map, :id, :name, { }, :label => _('OS type'), :label_size => "col-md-2" %>
41
- <% end %>
51
+ </div>
52
+ <% 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 %>
@@ -16,11 +16,11 @@ 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
18
  <%= javascript_include_tag 'foreman_fog_proxmox/proxmox_vm_server', "data-turbolinks-track" => true %>
19
-
19
+ <%= stylesheet_link_tag 'foreman_fog_proxmox/accordion' %>
20
20
  <% server = type == 'qemu' %>
21
21
  <% logger.debug("_config.html.erb server_config=#{f.object.inspect}") %>
22
-
23
- <%= field_set_tag n_("Main option", "Main options", 2), :id => "server_config_options", :class => 'hide', :disabled => !server do %>
22
+ <%= field_set_tag n_("Main option", "Main options", 2), :id => "server_config_options", :class => 'accordion-section', :disabled => !server do %>
23
+ <div class="accordion-content">
24
24
  <%= textarea_f f, :description, :label => _('Description'), :label_size => "col-md-2" %>
25
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
26
  <%= checkbox_f f, :onboot, :label => _('Start at boot') %>
@@ -29,8 +29,10 @@ along with ForemanFogProxmox. If not, see <http://www.gnu.org/licenses/>. %>
29
29
  <%= select_f f, :vga, proxmox_vgas_map, :id, :name, { :include_blank => true }, :label => _('VGA'), :label_size => "col-md-2" %>
30
30
  <%= select_f f, :scsihw, proxmox_scsi_controllers_map, :id, :name, { }, :label => _('SCSI Controller'), :label_size => "col-md-2" %>
31
31
  <%= select_f f, :bios, proxmox_bios_map, :id, :name, { }, :label => _('BIOS'), :label_size => "col-md-2" %>
32
+ </div>
32
33
  <% end %>
33
- <%= field_set_tag _("CPUs"), :id => "server_config_cpu", :class => 'hide', :disabled => !server do %>
34
+ <%= field_set_tag _("CPUs"), :id => "server_config_cpu", :class => 'accordion-section', :disabled => !server do %>
35
+ <div class="accordion-content">
34
36
  <%= select_f f, :cpu_type, proxmox_cpus_map, :id, :name, { }, :label => _('Type'), :label_size => "col-md-2" %>
35
37
  <%= counter_f f, :sockets, :class => "input-mini", :label => _('Sockets'), :label_size => "col-md-2" %>
36
38
  <%= counter_f f, :cores, :class => "input-mini", :label => _('Cores'), :label_size => "col-md-2" %>
@@ -43,14 +45,19 @@ along with ForemanFogProxmox. If not, see <http://www.gnu.org/licenses/>. %>
43
45
  <%= select_f f, flag_key, proxmox_cpu_flags_map, :id, :name, { }, :label => _(flag_value) %>
44
46
  <% end %>
45
47
  <% end %>
48
+ </div>
46
49
  <% end %>
47
- <%= field_set_tag _("Memory"), :id => "server_config_memory", :class => 'hide', :disabled => !server do %>
50
+ <%= field_set_tag _("Memory"), :id => "server_config_memory", :class => 'accordion-section', :disabled => !server do %>
51
+ <div class="accordion-content">
48
52
  <%= text_f f, :memory, :class => "input-mini", :label => _('Memory (MB)'), :label_size => "col-md-2" %>
49
53
  <%= text_f f, :balloon, :class => "input-mini", :label => _('Minimum memory (MB)'), :label_size => "col-md-2" %>
50
54
  <%= text_f f, :shares, :class => "input-mini", :label => _('Shares (MB)'), :label_size => "col-md-2" %>
55
+ </div>
51
56
  <% end %>
52
- <%= field_set_tag _("Operating System"), :id => "server_config_os", :class => 'hide', :disabled => !server do %>
57
+ <%= field_set_tag _("Operating System"), :id => "server_config_os", :class => 'accordion-section', :disabled => !server do %>
58
+ <div class="accordion-content">
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 %>
@@ -26,7 +26,10 @@ along with ForemanFogProxmox. If not, see <http://www.gnu.org/licenses/>. %>
26
26
  <%= f.hidden_field :storage_type %>
27
27
  <%= select_f f, :storage, compute_resource.storages(node_id), :storage, :storage, { }, :label => _('Storage'), :label_size => "col-md-2" %>
28
28
  <%= select_f f, :controller, proxmox_controllers_map, :id, :name, { }, :label => _('Controller'), :label_size => "col-md-2", :disabled => !new_volume, :onchange => 'controllerSelected(this)' %>
29
- <%= text_f f, :device, :label => _('Device'), :label_size => "col-md-2", :disabled => !new_volume, :'data-min' => 0, :'data-soft-max' => proxmox_max_device(f.object.controller), :onchange => 'deviceSelected(this)' %>
29
+ <div>
30
+ <%= text_f f, :device, :label => _('Device'), :label_size => "col-md-2", :disabled => !new_volume, :onchange => 'deviceSelected(this)' %>
31
+ <span class="warning-container"></span>
32
+ </div>
30
33
  <%= select_f f, :cache, proxmox_caches_map, :id, :name, { include_blank: true }, :label => _('Cache'), :label_size => "col-md-2" %>
31
34
  <%= text_f f, :size, :class => "input-mini", :label => _("Size (GB)"), :label_size => "col-md-2", :disabled => !hard_disk %>
32
35
  <% 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>
@@ -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.3'
21
+ VERSION = '0.15.1'
22
22
  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.3
4
+ version: 0.15.1
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: 2023-08-25 00:00:00.000000000 Z
12
+ date: 2024-04-22 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: deface
@@ -114,6 +114,7 @@ files:
114
114
  - app/assets/javascripts/foreman_fog_proxmox/proxmox_volume.js
115
115
  - app/assets/javascripts/foreman_fog_proxmox/proxmox_volume_cdrom.js
116
116
  - app/assets/javascripts/foreman_fog_proxmox/proxmox_volume_cloudinit.js
117
+ - app/assets/stylesheets/foreman_fog_proxmox/accordion.css
117
118
  - app/controllers/concerns/foreman_fog_proxmox/compute_resources_vms_controller.rb
118
119
  - app/controllers/concerns/foreman_fog_proxmox/controller/parameters/compute_resource.rb
119
120
  - app/controllers/concerns/foreman_fog_proxmox/hosts_controller.rb
@@ -262,29 +263,29 @@ signing_key:
262
263
  specification_version: 4
263
264
  summary: Foreman plugin that adds Proxmox VE compute resource using fog-proxmox
264
265
  test_files:
265
- - test/factories/foreman_fog_proxmox/proxmox_server_mock_factory.rb
266
+ - test/test_plugin_helper.rb
266
267
  - test/factories/foreman_fog_proxmox/proxmox_node_mock_factory.rb
267
268
  - test/factories/foreman_fog_proxmox/proxmox_container_mock_factory.rb
269
+ - test/factories/foreman_fog_proxmox/proxmox_server_mock_factory.rb
268
270
  - test/factories/proxmox_factory.rb
269
- - test/unit/foreman_fog_proxmox/proxmox_test.rb
270
271
  - test/unit/foreman_fog_proxmox/proxmox_vm_commands_test.rb
271
- - test/unit/foreman_fog_proxmox/helpers/proxmox_container_helper_test.rb
272
- - test/unit/foreman_fog_proxmox/helpers/proxmox_vm_uuid_helper_test.rb
273
- - test/unit/foreman_fog_proxmox/helpers/proxmox_vm_helper_test.rb
274
- - test/unit/foreman_fog_proxmox/helpers/proxmox_vm_volumes_helper_test.rb
275
- - test/unit/foreman_fog_proxmox/helpers/proxmox_server_helper_test.rb
276
- - test/unit/foreman_fog_proxmox/proxmox_vm_commands_container_test.rb
277
- - test/unit/foreman_fog_proxmox/proxmox_interfaces_test.rb
278
- - test/unit/foreman_fog_proxmox/proxmox_vm_commands_server_update_hard_disk_test.rb
279
272
  - test/unit/foreman_fog_proxmox/proxmox_images_test.rb
280
- - test/unit/foreman_fog_proxmox/proxmox_vm_commands_server_update_cdrom_test.rb
273
+ - test/unit/foreman_fog_proxmox/proxmox_interfaces_test.rb
281
274
  - test/unit/foreman_fog_proxmox/proxmox_vm_commands_server_update_test.rb
282
- - test/unit/foreman_fog_proxmox/proxmox_version_test.rb
283
275
  - test/unit/foreman_fog_proxmox/proxmox_vm_queries_test.rb
284
276
  - test/unit/foreman_fog_proxmox/proxmox_vm_new_test.rb
285
- - test/unit/foreman_fog_proxmox/proxmox_vm_commands_server_update_cloudinit_test.rb
277
+ - test/unit/foreman_fog_proxmox/proxmox_test.rb
278
+ - test/unit/foreman_fog_proxmox/semver_test.rb
279
+ - test/unit/foreman_fog_proxmox/proxmox_vm_commands_server_update_cdrom_test.rb
280
+ - test/unit/foreman_fog_proxmox/proxmox_vm_commands_server_update_hard_disk_test.rb
286
281
  - test/unit/foreman_fog_proxmox/proxmox_vm_commands_server_create_test.rb
282
+ - test/unit/foreman_fog_proxmox/proxmox_version_test.rb
283
+ - test/unit/foreman_fog_proxmox/proxmox_vm_commands_server_update_cloudinit_test.rb
287
284
  - test/unit/foreman_fog_proxmox/proxmox_compute_attributes_test.rb
288
- - test/unit/foreman_fog_proxmox/semver_test.rb
285
+ - test/unit/foreman_fog_proxmox/proxmox_vm_commands_container_test.rb
286
+ - test/unit/foreman_fog_proxmox/helpers/proxmox_vm_volumes_helper_test.rb
287
+ - test/unit/foreman_fog_proxmox/helpers/proxmox_server_helper_test.rb
288
+ - test/unit/foreman_fog_proxmox/helpers/proxmox_container_helper_test.rb
289
+ - test/unit/foreman_fog_proxmox/helpers/proxmox_vm_helper_test.rb
290
+ - test/unit/foreman_fog_proxmox/helpers/proxmox_vm_uuid_helper_test.rb
289
291
  - test/functional/compute_resources_controller_test.rb
290
- - test/test_plugin_helper.rb