foreman_fog_proxmox 0.5.4 → 0.5.5

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.

Potentially problematic release.


This version of foreman_fog_proxmox might be problematic. Click here for more details.

checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2b3332c6939c4896c597786242fb2d0a96ff206e9b4503ae540d25bc26aa46dd
4
- data.tar.gz: c8c9d2808b64625cfd21dee603267df85168cfec2c199b12f60b841c40cef1c6
3
+ metadata.gz: ca619ec359deaafb7ae8d9226bd0db7213a8f8276b27c24e39d3f4549744d759
4
+ data.tar.gz: 674603da5a60bf493462eaff2f9ac55637b908ee557cb2d026cdba006f17d1df
5
5
  SHA512:
6
- metadata.gz: f3be1549ae1d6dc713bdd8f55f14e4d72fdb8bb2f282714a4fdc2eea02a1a1439f2fb0ef1bf9b84e551c09065f2ddee5333f994ace60cb2ae4a2ee5cb096bea7
7
- data.tar.gz: d70a4df6f3f87a0ab9b552c2d481ced3c971a01cfa6c28d826cb786e5dd6a7794e2af0ee6ae7bfeef7403be2d6c66f38afd51f44db0185f40168be40f1de4041
6
+ metadata.gz: a5bc188c202ac4c0a067c001949ae64666c914000a2d2eff3bd49554f0be033bc5b5bcafddcfa9aeaebc9f282c7d0908237c3dfed801bbd8109fa7a5f79a757f
7
+ data.tar.gz: 044cc2a7d66fb8cddb3332d0fe98160e77a6bb0a71aec979334692197e4e406d2866bb84c8e1dde032797541c96f267a3126024e9520d28f87ceb0eb4f09a4a3
data/README.md CHANGED
@@ -17,7 +17,7 @@ If you like it and need more features you can [support](SUPPORT.md) it.
17
17
  Tested with:
18
18
 
19
19
  * Foreman >= 1.17 and < 1.20
20
- * Fog-proxmox >= 0.5.2
20
+ * Fog-proxmox >= 0.5.3
21
21
  * Proxmox >= 5.1
22
22
  * Ruby >= 2.3
23
23
 
@@ -101,9 +101,9 @@ Please see the Foreman manual for complete instructions:
101
101
 
102
102
  ### Prerequisites
103
103
 
104
- You need a Proxmox VE >= 5.1 server running.
105
-
106
- You also need nodejs in your dev machine to run webpack-dev-server.
104
+ * You need a Proxmox VE >= 5.1 server running.
105
+ * You need ruby >= 2.3. You can install it with [rbenv](https://github.com/rbenv/rbenv).
106
+ * You also need nodejs in your dev machine to run webpack-dev-server. You can install it with [nvm](https://github.com/creationix/nvm).
107
107
 
108
108
  ### Platform
109
109
 
@@ -121,18 +121,22 @@ git checkout tags/1.17.3
121
121
 
122
122
  ```ruby
123
123
  gem 'foreman_fog_proxmox', :path => '/your_path_to/foreman_fog_proxmox'
124
+ gem 'fog-proxmox', :path => '/your_path_to/fog-proxmox' # optional if you need to modify fog-proxmox code too
125
+ gem 'ruby-debug-ide' # dev
126
+ gem 'debase' # dev
127
+ gem 'simplecov' # test
124
128
  ```
125
129
 
126
130
  * In foreman directory, install dependencies:
127
131
 
128
132
  ```shell
129
- bundle install
133
+ bundle install --without libvirt postgresql mysql2
130
134
  ```
131
135
 
132
136
  * Configure foreman settings:
133
137
 
134
138
  ```shell
135
- cp config/settings.yaml.example config/settings.yaml
139
+ cp config/settings.yaml.test config/settings.yaml
136
140
  ```
137
141
 
138
142
  * Install foreman database (sqlite is default in rails development):
@@ -50,21 +50,26 @@ function toggleVolumes(selected){
50
50
  div_server.show();
51
51
  a_container.hide();
52
52
  a_server.show();
53
- break;
53
+ break;
54
54
  case 'lxc':
55
55
  div_container.show();
56
56
  div_server.hide();
57
57
  a_container.show();
58
58
  a_server.hide();
59
- break;
59
+ break;
60
+ default:
61
+ console.log("unkown type="+selected);
62
+ break;
60
63
  }
61
64
  }
62
65
 
63
66
  function toggleFieldset(fieldset, index, fieldsets){
64
- var server_input_hidden = $("div[id^='server_volumes']" + " > input:hidden");
65
- var container_input_hidden = $("div[id^='container_volumes']" + " > input:hidden");
67
+ var server_input_hidden = $("div[id^='server_volumes']" + " + input:hidden");
68
+ var container_input_hidden = $("div[id^='container_volumes']" + " + input:hidden");
69
+ var removable_input_hidden = $("div.removable-item[style='display: none;']" + " + input:hidden");
66
70
  var server_fieldset = $("fieldset[id^='server_"+fieldset.id+"']");
67
71
  var container_fieldset = $("fieldset[id^='container_"+fieldset.id+"']");
72
+ removable_input_hidden.attr('disabled','disabled');
68
73
  switch (fieldset.selected) {
69
74
  case 'qemu':
70
75
  if (fieldset.toggle && fieldset.new_vm){
@@ -87,6 +92,7 @@ function toggleFieldset(fieldset, index, fieldsets){
87
92
  server_input_hidden.attr('disabled','disabled');
88
93
  break;
89
94
  default:
95
+ console.log("unkown type="+fieldset.selected);
90
96
  break;
91
97
  }
92
98
  }
@@ -41,75 +41,90 @@ function cdromSelected(item) {
41
41
  return false;
42
42
  }
43
43
 
44
- function initCdromStorage(){
44
+ function initCdromStorage() {
45
45
  var select = '#host_compute_attributes_config_attributes_cdrom_storage';
46
- $(select + ' option:selected').prop('selected',false);
46
+ $(select + ' option:selected').prop('selected', false);
47
47
  $(select).val('');
48
48
  }
49
49
 
50
- function initCdromOptions(name){
51
- var select = '#host_compute_attributes_config_attributes_cdrom_'+name;
50
+ function initCdromOptions(name) {
51
+ var select = '#host_compute_attributes_config_attributes_cdrom_' + name;
52
52
  $(select).empty();
53
53
  $(select).append($("<option></option>").val('').text(''));
54
54
  $(select).val('');
55
55
  }
56
56
 
57
- function storageIsoSelected(item) {
58
- var storage = $(item).val();
59
- if (storage != '') {
60
- tfm.tools.showSpinner();
61
- $.getJSON({
62
- type: 'get',
63
- url: '/foreman_fog_proxmox/isos/'+storage,
64
- complete: function(){
65
- tfm.tools.hideSpinner();
66
- },
67
- error: function(j,status,error){
68
- console.log("Error=" + error +", status=" + status + " loading isos for storage=" + storage);
69
- },
70
- success: function(isos) {
71
- initCdromOptions('iso');
72
- $.each(isos, function(i,iso){
73
- $('#host_compute_attributes_config_attributes_cdrom_iso').append($("<option></option>").val(iso.volid).text(iso.volid));
74
- });
75
- }
76
- });
77
- } else {
78
- initCdromOptions('iso');
79
- }
57
+ function storageIsoSelected(item) {
58
+ var storage = $(item).val();
59
+ if (storage != '') {
60
+ tfm.tools.showSpinner();
61
+ $.getJSON({
62
+ type: 'get',
63
+ url: '/foreman_fog_proxmox/isos/' + storage,
64
+ complete: function () {
65
+ tfm.tools.hideSpinner();
66
+ },
67
+ error: function (j, status, error) {
68
+ console.log("Error=" + error + ", status=" + status + " loading isos for storage=" + storage);
69
+ },
70
+ success: function (isos) {
71
+ initCdromOptions('iso');
72
+ $.each(isos, function (i, iso) {
73
+ $('#host_compute_attributes_config_attributes_cdrom_iso').append($("<option></option>").val(iso.volid).text(iso.volid));
74
+ });
75
+ }
76
+ });
77
+ } else {
78
+ initCdromOptions('iso');
80
79
  }
80
+ }
81
81
 
82
- function controllerSelected(item){
82
+ function controllerSelected(item) {
83
83
  var controller = $(item).val();
84
- var id = $(item).attr('id');
85
- var pattern = /(\w+)(\d+)(\w+)/i;
86
- var index = pattern.exec(id)[2];
84
+ var index = getIndex(item);
87
85
  var max = computeControllerMaxDevice(controller);
88
- $('#host_compute_attributes_volumes_attributes_' + index + '_device').attr('data-soft-max',max);
86
+ var device_selector = '#host_compute_attributes_volumes_attributes_' + index + '_device';
87
+ $(device_selector).attr('data-soft-max', max);
88
+ var device = $(device_selector).limitedSpinner('value');
89
+ $('#host_compute_attributes_volumes_attributes_' + index + '_id').val(controller + device);
89
90
  tfm.numFields.initAll();
90
91
  }
91
92
 
92
- function computeControllerMaxDevice(controller){
93
+ function deviceSelected(item) {
94
+ var device = $(item).limitedSpinner('value');
95
+ console.log("device=" + device);
96
+ var index = getIndex(item);
97
+ var controller_selector = '#host_compute_attributes_volumes_attributes_' + index + '_controller';
98
+ var controller = $(controller_selector).val();
99
+ $('#host_compute_attributes_volumes_attributes_' + index + '_id').val(controller + device);
100
+ tfm.numFields.initAll();
101
+ }
102
+
103
+ function getIndex(item) {
104
+ var id = $(item).attr('id');
105
+ var pattern = /(host_compute_attributes_volumes_attributes_)(\d+)[_](.*)/i;
106
+ pattern_a = pattern.exec(id);
107
+ var index = pattern_a[2];
108
+ console.log("index=" + index);
109
+ return index;
110
+ }
111
+
112
+ function computeControllerMaxDevice(controller) {
93
113
  switch (controller) {
94
114
  case 'ide':
95
115
  return 3;
96
- break;
97
116
  case 'sata':
98
117
  return 5;
99
- break;
100
118
  case 'scsi':
101
119
  return 13;
102
- break;
103
120
  case 'virtio':
104
121
  return 15;
105
- break;
106
122
  default:
107
123
  return 1;
108
- break;
109
124
  }
110
125
  }
111
126
 
112
- function balloonSelected(item){
127
+ function balloonSelected(item) {
113
128
  var ballooned = $(item).is(':checked');
114
129
  var memory_f = $("input[name$='[config_attributes][memory]']:hidden");
115
130
  var min_memory_f = $("input[id$='config_attributes_min_memory']");
@@ -120,13 +135,13 @@ function balloonSelected(item){
120
135
  min_memory_f.removeAttr('disabled');
121
136
  shares_f.removeAttr('disabled');
122
137
  var max = memory_f.val();
123
- console.log("max="+max);
124
- min_memory_f.attr('data-soft-max',max);
138
+ console.log("max=" + max);
139
+ min_memory_f.attr('data-soft-max', max);
125
140
  } else {
126
- min_memory_f.attr('disabled','disabled');
127
- min_memory_hidden_f.attr('value','');
128
- shares_f.attr('disabled','disabled');
129
- shares_hidden_f.attr('value','');
141
+ min_memory_f.attr('disabled', 'disabled');
142
+ min_memory_hidden_f.attr('value', '');
143
+ shares_f.attr('disabled', 'disabled');
144
+ shares_hidden_f.attr('value', '');
130
145
  }
131
146
  tfm.numFields.initAll();
132
147
  }
@@ -96,9 +96,10 @@ module ProxmoxContainerHelper
96
96
  def parse_container_volume(args)
97
97
  disk = {}
98
98
  id = args['id']
99
- id = "mp#{args['device']}" unless id
99
+ id = "mp#{args['device']}" if args.has_key?('device') && !id
100
100
  delete = args['_delete'].to_i == 1
101
101
  logger.debug("parse_container_volume() args=#{args}")
102
+ return args if ForemanFogProxmox::Value.empty?(id) || server_disk?(id)
102
103
  args.delete_if { |_key,value| ForemanFogProxmox::Value.empty?(value) }
103
104
  if delete
104
105
  logger.debug("parse_container_volume(): delete id=#{id}")
@@ -46,22 +46,27 @@ end
46
46
  pass = obj.attributes.has_key?(attr)
47
47
  pass ? "********" : ''
48
48
  end
49
+
50
+ def new_child_fields_template_typed(form_builder, association, options = { })
51
+ unless options[:object].present?
52
+ association_object = form_builder.object.class.reflect_on_association(association)
53
+ options[:object] = association_object.klass.new(association_object.foreign_key => form_builder.object.id)
54
+ end
55
+ options[:partial] ||= association.to_s.singularize
56
+ options[:form_builder_local] ||= :f
57
+ options[:form_builder_attrs] ||= {}
49
58
 
50
- def second_child_fields_template(form_builder, association, options = { })
51
- unless options[:object].present?
52
- association_object = form_builder.object.class.reflect_on_association(association)
53
- options[:object] = association_object.klass.new(association_object.foreign_key => form_builder.object.id)
54
- end
55
- options[:partial] ||= association.to_s.singularize
56
- options[:form_builder_local] ||= :f
57
- options[:form_builder_attrs] ||= {}
58
-
59
- content_tag(:div, :id => "#{options[:type]}_#{association}", :style => 'display: none') do
60
- form_builder.fields_for(association, options[:object], :child_index => "0") do |f|
61
- render(:partial => options[:partial], :layout => options[:layout],
62
- :locals => { options[:form_builder_local] => f }.merge(options[:form_builder_attrs]))
63
- end
59
+ content_tag(:div, :class => "#{options[:type]}_#{association}_fields_template form_template #{}", :style => "display: none;") do
60
+ form_builder.fields_for(association, options[:object], :child_index => "new_#{options[:type]}_#{association}") do |f|
61
+ render(:partial => options[:partial], :layout => options[:layout],
62
+ :locals => { options[:form_builder_local] => f }.merge(options[:form_builder_attrs]))
64
63
  end
65
64
  end
65
+ end
66
66
 
67
+ def add_child_link_typed(name, association, type, opts = {})
68
+ opts[:class] = [opts[:class], "add_nested_fields btn btn-primary"].compact.join(" ")
69
+ opts[:"data-association"] = (type + '_' + association.to_s).to_sym
70
+ link_to_function(name.to_s, "add_child_node(this);tfm.numFields.initAll();", opts)
71
+ end
67
72
  end
@@ -103,8 +103,8 @@ module ProxmoxServerHelper
103
103
  def parse_server_volume(args)
104
104
  disk = {}
105
105
  id = args['id']
106
- id = "#{args['controller']}#{args['device']}" unless id
107
- return args if ForemanFogProxmox::Value.empty?(id)
106
+ id = "#{args['controller']}#{args['device']}" if args.has_key?('controller') && args.has_key?('device') && !id
107
+ return args if ForemanFogProxmox::Value.empty?(id) || id == 'rootfs'
108
108
  delete = args['_delete'].to_i == 1
109
109
  args.delete_if { |_key,value| ForemanFogProxmox::Value.empty?(value) }
110
110
  if delete
@@ -113,9 +113,9 @@ module ProxmoxServerHelper
113
113
  disk
114
114
  else
115
115
  disk.store(:id, id)
116
- disk.store(:volid, args['volid'])
117
- disk.store(:storage, args['storage'].to_s)
118
- disk.store(:size, args['size'].to_i)
116
+ disk.store(:volid, args['volid']) if args.has_key?('volid')
117
+ disk.store(:storage, args['storage'].to_s) if args.has_key?('storage')
118
+ disk.store(:size, args['size'].to_i) if args.has_key?('size')
119
119
  options = args.reject { |key,_value| %w[id volid controller device storage size _delete].include? key}
120
120
  disk.store(:options, options)
121
121
  logger.debug("parse_server_volume(): add disk=#{disk}")
@@ -70,6 +70,10 @@ module ProxmoxVmHelper
70
70
  args['volumes_attributes'].each_value { |value| value['size'] = (value['size'].to_i / GIGA).to_s unless ForemanFogProxmox::Value.empty?(value['size']) }
71
71
  end
72
72
 
73
+ def remove_deletes(args)
74
+ args['volumes_attributes'].delete_if { |_key,value| value.has_key? '_delete' }
75
+ end
76
+
73
77
  def convert_memory_size(config_hash, key)
74
78
  config_hash.store(key, (config_hash[key].to_i / MEGA).to_s) unless ForemanFogProxmox::Value.empty?(config_hash[key])
75
79
  end
@@ -83,4 +87,12 @@ module ProxmoxVmHelper
83
87
  return type, vmid
84
88
  end
85
89
 
90
+ def mount_point_disk?(id)
91
+ /^(mp)(\d+)$/.match?(id)
92
+ end
93
+
94
+ def server_disk?(id)
95
+ /^(scsi|sata|virtio|ide)(\d+)$/.match?(id)
96
+ end
97
+
86
98
  end
@@ -120,8 +120,13 @@ module ForemanFogProxmox
120
120
 
121
121
  def host_interfaces_attrs(host)
122
122
  host.interfaces.select(&:physical?).each.with_index.reduce({}) do |hash, (nic, index)|
123
- raise ::Foreman::Exception.new _("Identifier interface[%{index}] required." % { index: index }) if nic.identifier.empty?
123
+ # Set default interface identifier to net[n]
124
+ nic.identifier = "net%{index}" % {index: index} if nic.identifier.empty?
124
125
  raise ::Foreman::Exception.new _("Invalid identifier interface[%{index}]. Must be net[n] with n integer >= 0" % { index: index }) unless Fog::Proxmox::NicHelper.valid?(nic.identifier)
126
+ # Set default container interface name to eth[n]
127
+ container = host.compute_attributes['type'] == 'lxc'
128
+ nic.compute_attributes['name'] = "eth%{index}" % {index: index} if container && nic.compute_attributes['name'].empty?
129
+ raise ::Foreman::Exception.new _("Invalid name interface[%{index}]. Must be eth[n] with n integer >= 0" % { index: index }) if container && !/^(eth)(\d+)$/.match?(nic.compute_attributes['name'])
125
130
  nic_compute_attributes = nic.compute_attributes.merge(id: nic.identifier)
126
131
  nic_compute_attributes.store(:ip, nic.ip) if (nic.ip && !nic.ip.empty?)
127
132
  nic_compute_attributes.store(:ip6, nic.ip6) if (nic.ip6 && !nic.ip6.empty?)
@@ -232,6 +237,7 @@ module ForemanFogProxmox
232
237
  else
233
238
  logger.debug(_("create_vm(): %{args}") % { args: args })
234
239
  convert_sizes(args)
240
+ remove_deletes(args)
235
241
  case type
236
242
  when 'qemu'
237
243
  node.servers.create(parse_server_vm(args))
@@ -422,7 +428,7 @@ module ForemanFogProxmox
422
428
  cpu: 'kvm64',
423
429
  scsihw: 'virtio-scsi-pci',
424
430
  ide2: "none,media=cdrom",
425
- templated: 0).merge(Fog::Proxmox::DiskHelper.flatten(volume_server_defaults)).merge(Fog::Proxmox::NicHelper.flatten(interface_server_defaults))
431
+ templated: 0).merge(Fog::Proxmox::DiskHelper.flatten(volume_server_defaults)).merge(Fog::Proxmox::DiskHelper.flatten(volume_container_defaults)).merge(Fog::Proxmox::NicHelper.flatten(interface_server_defaults))
426
432
  end
427
433
 
428
434
  def vm_container_instance_defaults
@@ -432,7 +438,7 @@ module ForemanFogProxmox
432
438
  type: 'lxc',
433
439
  node: node.to_s,
434
440
  memory: 512 * MEGA,
435
- templated: 0).merge(Fog::Proxmox::DiskHelper.flatten(volume_container_defaults)).merge(Fog::Proxmox::NicHelper.container_flatten(interface_container_defaults))
441
+ templated: 0).merge(Fog::Proxmox::DiskHelper.flatten(volume_server_defaults)).merge(Fog::Proxmox::DiskHelper.flatten(volume_container_defaults)).merge(Fog::Proxmox::NicHelper.container_flatten(interface_container_defaults))
436
442
  end
437
443
 
438
444
  def vm_instance_defaults
@@ -20,53 +20,40 @@ along with ForemanFogProxmox. If not, see <http://www.gnu.org/licenses/>. %>
20
20
  <% server = type == 'qemu' %>
21
21
  <% container = type == 'lxc' %>
22
22
 
23
- <%= new_child_fields_template(f, :server_volumes, {
23
+ <%= new_child_fields_template_typed(f, :volumes, {
24
+ :type => 'server',
24
25
  :object => compute_resource.new_volume_server,
25
26
  :partial => provider_partial(compute_resource, 'server/volume'),
26
27
  :form_builder_attrs => { :type => type, :compute_resource => compute_resource, :new_host => new_vm, :new_vm => new_vm, :remove_title => _('remove storage volume') },
27
28
  :layout => "compute_resources_vms/form/#{item_layout}_layout" }) %>
28
- <%= new_child_fields_template(f, :container_volumes, {
29
+ <%= new_child_fields_template_typed(f, :volumes, {
30
+ :type => 'container',
29
31
  :object => compute_resource.new_volume_container(id: 'mp0'),
30
32
  :partial => provider_partial(compute_resource, 'container/volume_mp'),
31
33
  :form_builder_attrs => { :type => type, :compute_resource => compute_resource, :new_host => new_vm, :new_vm => new_vm, :remove_title => _('remove storage volume') },
32
34
  :layout => "compute_resources_vms/form/#{item_layout}_layout" }) %>
33
35
 
34
36
 
35
- <% if server %>
36
- <div id="server_volumes">
37
- <%= f.fields_for :volumes do |i| %>
38
- <%= render :partial => provider_partial(compute_resource, 'server/volume'), :locals => { :f => i, :type => type, :compute_resource => compute_resource, :new_host => new_vm, :new_vm => new_vm, :remove_title => _('remove storage volume') }, :layout => "compute_resources_vms/form/#{item_layout}_layout" %>
39
- <% end %>
40
- </div>
41
- <%= second_child_fields_template(f, :volumes, {
42
- :object => compute_resource.new_volume_container(id: 'rootfs'),
43
- :partial => provider_partial(compute_resource, 'container/volume_rootfs'),
44
- :type => 'container',
45
- :form_builder_attrs => { :type => type, :compute_resource => compute_resource, :new_host => new_vm, :new_vm => new_vm, :remove_title => _('remove storage volume') },
46
- :layout => "compute_resources_vms/form/#{item_layout}_layout" }) %>
47
- <% end %>
48
- <% if container %>
49
- <div id="container_volumes">
37
+
50
38
  <%= f.fields_for :volumes do |i| %>
51
- <% if i.object.id == 'rootfs' %>
52
- <%= render :partial => provider_partial(compute_resource, 'container/volume_rootfs'), :locals => { :f => i, :type => type, :compute_resource => compute_resource, :new_host => new_vm, :new_vm => new_vm, :remove_title => _('remove storage volume') }, :layout => "compute_resources_vms/form/#{item_layout}_layout" %>
53
- <% else %>
54
- <%= render :partial => provider_partial(compute_resource, 'container/volume_mp'), :locals => { :f => i, :type => type, :compute_resource => compute_resource, :new_host => new_vm, :new_vm => new_vm, :remove_title => _('remove storage volume') }, :layout => "compute_resources_vms/form/#{item_layout}_layout" %>
55
- <% end %>
56
- <% end %>
57
- </div>
58
- <%= second_child_fields_template(f, :volumes, {
59
- :object => compute_resource.new_volume_server,
60
- :partial => provider_partial(compute_resource, 'server/volume'),
61
- :type => 'server',
62
- :form_builder_attrs => { :type => type, :compute_resource => compute_resource, :new_host => new_vm, :new_vm => new_vm, :remove_title => _('remove storage volume') },
63
- :layout => "compute_resources_vms/form/#{item_layout}_layout" }) %>
64
- <% end %>
65
- <% if new_vm %>
66
- <%= add_child_link '+ ' + _("Add Volume"), :server_volumes, { :class => "info", :style => ("display: none;" unless server), :title => _('add new storage volume') } %>
67
- <% end %>
39
+ <% if i.object.id == 'rootfs' %>
40
+ <div id="container_volumes_rootfs" style="<%= 'display: ' + (container ? 'block' : 'none') + ';' %>">
41
+ <%= render :partial => provider_partial(compute_resource, 'container/volume_rootfs'), :locals => { :f => i, :type => type, :compute_resource => compute_resource, :new_host => new_vm, :new_vm => new_vm, :remove_title => _('remove storage volume'), :disabled => !container }, :layout => "compute_resources_vms/form/#{item_layout}_layout" %>
42
+ </div>
43
+ <% elsif mount_point_disk?(i.object.id) %>
44
+ <div id="container_volumes_mp" style="<%= 'display: ' + (container ? 'block' : 'none') + ';' %>">
45
+ <%= render :partial => provider_partial(compute_resource, 'container/volume_mp'), :locals => { :f => i, :type => type, :compute_resource => compute_resource, :new_host => new_vm, :new_vm => new_vm, :remove_title => _('remove storage volume'), :disabled => !container }, :layout => "compute_resources_vms/form/#{item_layout}_layout" %>
46
+ </div>
47
+ <% elsif server_disk?(i.object.id) %>
48
+ <div id="server_volumes" style="<%= 'display: ' + (server ? 'block' : 'none') + ';' %>">
49
+ <%= render :partial => provider_partial(compute_resource, 'server/volume'), :locals => { :f => i, :type => type, :compute_resource => compute_resource, :new_host => new_vm, :new_vm => new_vm, :remove_title => _('remove storage volume'), :disabled => !server }, :layout => "compute_resources_vms/form/#{item_layout}_layout" %>
50
+ </div>
51
+ <% end %>
52
+ <% end %>
53
+
68
54
  <% if new_vm %>
69
- <%= add_child_link '+ ' + _("Add Volume"), :container_volumes, { :class => "info", :style => ("display: none;" unless container), :title => _('add new storage volume') } %>
55
+ <%= add_child_link_typed '+ ' + _("Add Volume"), :volumes, 'server', { :class => "info #{'hide' unless server}", :title => _('add new storage volume') } %>
56
+ <%= add_child_link_typed '+ ' + _("Add Volume"), :volumes, 'container', { :class => "info #{'hide' unless container}", :title => _('add new storage volume') } %>
70
57
  <% end %>
71
58
 
72
59
 
@@ -20,6 +20,7 @@ along with ForemanFogProxmox. If not, see <http://www.gnu.org/licenses/>. %>
20
20
  <%= field_set_tag _("Mount point"), :id => "container_volume_#{f.index}", :class => ('hide' unless container), :disabled => !container do %>
21
21
  <%= f.hidden_field :volid if !new_vm %>
22
22
  <%= select_f f, :storage, compute_resource.storages, :storage, :storage, { }, :label => _('Storage'), :label_size => "col-md-2", :disabled => !new_vm %>
23
+ <%= text_f f, :mp, :label => _('Mount point'), :label_size => "col-md-2", :disabled => !new_vm, :required => true %>
23
24
  <%= counter_f f, :device, :label => _('Device'), :label_size => "col-md-2", :class => ('hide' if f.object.rootfs?), :disabled => (!new_vm || f.object.rootfs?), :'data-soft-max' => 10 %>
24
25
  <%= byte_size_f f, :size, :class => "input-mini", :label => _("Size"), :label_size => "col-md-2", :disabled => !new_vm %>
25
26
  <% end %>
@@ -16,6 +16,7 @@ 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
20
  <% server = type == 'qemu' %>
20
21
 
21
22
  <%= field_set_tag n_("Main option", "Main options", 2), :id => "server_config_options", :class => 'hide', :disabled => !server do %>
@@ -21,7 +21,7 @@ along with ForemanFogProxmox. If not, see <http://www.gnu.org/licenses/>. %>
21
21
  <%= f.hidden_field :volid if !new_vm %>
22
22
  <%= select_f f, :storage, compute_resource.storages, :storage, :storage, { }, :label => _('Storage'), :label_size => "col-md-2", :disabled => !new_vm %>
23
23
  <%= select_f f, :controller, proxmox_controllers_map, :id, :name, { }, :label => _('Controller'), :label_size => "col-md-2", :disabled => !new_vm, :onchange => 'controllerSelected(this)' %>
24
- <%= counter_f f, :device, :label => _('Device'), :label_size => "col-md-2", :disabled => !new_vm, :'data-soft-max' => proxmox_max_device(f.object.controller) %>
24
+ <%= counter_f f, :device, :label => _('Device'), :label_size => "col-md-2", :disabled => !new_vm, :'data-soft-max' => proxmox_max_device(f.object.controller), :onchange => 'deviceSelected(this)' %>
25
25
  <%= select_f f, :cache, proxmox_caches_map, :id, :name, { }, :label => _('Cache'), :label_size => "col-md-2" %>
26
26
  <%= byte_size_f f, :size, :class => "input-mini", :label => _("Size"), :label_size => "col-md-2", :disabled => !new_vm %>
27
27
  <% end %>
@@ -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.5.4'.freeze
21
+ VERSION = '0.5.5'.freeze
22
22
  end
@@ -45,7 +45,8 @@ class ProxmoxServerHelperTest < ActiveSupport::TestCase
45
45
  'sockets' => '1'
46
46
  },
47
47
  'volumes_attributes' => {
48
- '0'=> { 'controller' => 'scsi', 'device' => '0', 'storage' => 'local-lvm', 'size' => '1073741824', 'cache' => 'none' }
48
+ '0'=> { 'controller' => 'scsi', 'device' => '0', 'storage' => 'local-lvm', 'size' => '1073741824', 'cache' => 'none' },
49
+ '1'=> { 'controller' => 'virtio', 'device' => '0', 'storage' => 'local-lvm', 'size' => '1073741824', 'cache' => 'none' }
49
50
  },
50
51
  'interfaces_attributes' => {
51
52
  '0' => { 'id' => 'net0', 'model' => 'virtio', 'bridge' => 'vmbr0', 'firewall' => '0', 'link_down' => '0', 'rate' => nil },
@@ -92,10 +93,20 @@ class ProxmoxServerHelperTest < ActiveSupport::TestCase
92
93
  test '#volume with scsi 1Gb' do
93
94
  volumes = parse_server_volumes(host['volumes_attributes'])
94
95
  assert !volumes.empty?
96
+ assert volumes.size, 2
95
97
  assert volume = volumes.first
96
98
  assert volume.has_key?(:scsi0)
97
99
  assert_equal 'local-lvm:1073741824,cache=none', volume[:scsi0]
98
100
  end
101
+
102
+ test '#volume with virtio 1Gb' do
103
+ volumes = parse_server_volumes(host['volumes_attributes'])
104
+ assert !volumes.empty?
105
+ assert volumes.size, 2
106
+ assert volume = volumes[1]
107
+ assert volume.has_key?(:virtio0)
108
+ assert_equal 'local-lvm:1073741824,cache=none', volume[:virtio0]
109
+ end
99
110
 
100
111
  test '#volume delete scsi0' do
101
112
  volumes = parse_server_volumes(host_delete['volumes_attributes'])
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: foreman_fog_proxmox
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.4
4
+ version: 0.5.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tristan Robert
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-11-09 00:00:00.000000000 Z
11
+ date: 2018-11-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: fog-proxmox
@@ -189,11 +189,11 @@ signing_key:
189
189
  specification_version: 4
190
190
  summary: Foreman plugin that adds Proxmox VE compute resource using fog-proxmox
191
191
  test_files:
192
- - test/functional/compute_resources_controller_test.rb
193
- - test/factories/proxmox_factory.rb
194
192
  - test/unit/foreman_fog_proxmox/proxmox_test_helpers.rb
195
- - test/unit/foreman_fog_proxmox/proxmox_test.rb
193
+ - test/unit/foreman_fog_proxmox/helpers/proxmox_vm_helper_test.rb
196
194
  - test/unit/foreman_fog_proxmox/helpers/proxmox_container_helper_test.rb
197
195
  - test/unit/foreman_fog_proxmox/helpers/proxmox_server_helper_test.rb
198
- - test/unit/foreman_fog_proxmox/helpers/proxmox_vm_helper_test.rb
196
+ - test/unit/foreman_fog_proxmox/proxmox_test.rb
197
+ - test/factories/proxmox_factory.rb
198
+ - test/functional/compute_resources_controller_test.rb
199
199
  - test/test_plugin_helper.rb