foreman_fog_proxmox 0.9.4 → 0.10.0

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.

Files changed (56) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/javascripts/foreman_fog_proxmox/proxmox_vm.js +89 -0
  3. data/app/assets/javascripts/foreman_fog_proxmox/proxmox_vm_container.js +5 -41
  4. data/app/assets/javascripts/foreman_fog_proxmox/proxmox_vm_server.js +2 -21
  5. data/app/controllers/concerns/foreman_fog_proxmox/controller/parameters/compute_resource.rb +1 -1
  6. data/app/controllers/foreman_fog_proxmox/compute_resources_controller.rb +46 -6
  7. data/app/helpers/proxmox_container_helper.rb +3 -1
  8. data/app/helpers/proxmox_server_helper.rb +2 -1
  9. data/app/helpers/proxmox_vm_helper.rb +19 -0
  10. data/app/models/concerns/fog_extensions/proxmox/node.rb +0 -5
  11. data/app/models/concerns/fog_extensions/proxmox/server.rb +1 -1
  12. data/app/models/foreman_fog_proxmox/proxmox.rb +9 -13
  13. data/app/models/foreman_fog_proxmox/proxmox_images.rb +10 -5
  14. data/app/models/foreman_fog_proxmox/proxmox_vm_commands.rb +6 -2
  15. data/app/models/foreman_fog_proxmox/proxmox_vm_new.rb +22 -6
  16. data/app/models/foreman_fog_proxmox/proxmox_vm_queries.rb +9 -7
  17. data/app/models/foreman_fog_proxmox/vms.rb +37 -0
  18. data/app/overrides/compute_resources_vms/form/add_vm_type_node_to_new_form.rb +25 -0
  19. data/app/views/compute_resources/form/_proxmox.html.erb +0 -2
  20. data/app/views/compute_resources/show/_proxmox.html.erb +4 -0
  21. data/app/views/compute_resources_vms/form/proxmox/_add_vm_type_node_to_new_form.html.erb +24 -0
  22. data/app/views/compute_resources_vms/form/proxmox/_add_vm_type_to_networks_form.html.erb +2 -1
  23. data/app/views/compute_resources_vms/form/proxmox/_add_vm_type_to_networks_new_childs_form.html.erb +2 -1
  24. data/app/views/compute_resources_vms/form/proxmox/_add_vm_type_to_nic_provider_specific_form.html.erb +3 -2
  25. data/app/views/compute_resources_vms/form/proxmox/_add_vm_type_to_volumes_edit.html.erb +6 -5
  26. data/app/views/compute_resources_vms/form/proxmox/_base.html.erb +3 -3
  27. data/app/views/compute_resources_vms/form/proxmox/_general.html.erb +2 -1
  28. data/app/views/compute_resources_vms/form/proxmox/_network.html.erb +2 -2
  29. data/app/views/compute_resources_vms/form/proxmox/container/_extended.html.erb +3 -2
  30. data/app/views/compute_resources_vms/form/proxmox/container/_network.html.erb +4 -3
  31. data/app/views/compute_resources_vms/form/proxmox/container/_volume_mp.html.erb +1 -1
  32. data/app/views/compute_resources_vms/form/proxmox/container/_volume_rootfs.html.erb +1 -1
  33. data/app/views/compute_resources_vms/form/proxmox/server/_config.html.erb +1 -1
  34. data/app/views/compute_resources_vms/form/proxmox/server/_network.html.erb +4 -3
  35. data/app/views/compute_resources_vms/form/proxmox/server/_volume.html.erb +1 -1
  36. data/app/views/compute_resources_vms/index/_proxmox.html.erb +4 -2
  37. data/config/routes.rb +7 -2
  38. data/lib/foreman_fog_proxmox/engine.rb +4 -0
  39. data/lib/foreman_fog_proxmox/version.rb +1 -1
  40. data/locale/en/foreman_fog_proxmox.edit.po +508 -0
  41. data/locale/en/foreman_fog_proxmox.po +34 -7
  42. data/locale/en/foreman_fog_proxmox.po.time_stamp +0 -0
  43. data/locale/foreman_fog_proxmox.pot +112 -70
  44. data/locale/fr/foreman_fog_proxmox.edit.po +508 -0
  45. data/locale/fr/foreman_fog_proxmox.po +39 -12
  46. data/locale/fr/foreman_fog_proxmox.po.time_stamp +0 -0
  47. data/test/factories/foreman_fog_proxmox/proxmox_node_mock_factory.rb +28 -8
  48. data/test/factories/proxmox_factory.rb +0 -1
  49. data/test/functional/compute_resources_controller_test.rb +16 -4
  50. data/test/unit/foreman_fog_proxmox/helpers/proxmox_server_helper_test.rb +1 -0
  51. data/test/unit/foreman_fog_proxmox/proxmox_test.rb +0 -1
  52. data/test/unit/foreman_fog_proxmox/proxmox_vm_commands_container_test.rb +33 -8
  53. data/test/unit/foreman_fog_proxmox/proxmox_vm_commands_server_create_test.rb +2 -2
  54. data/test/unit/foreman_fog_proxmox/proxmox_vm_commands_server_update_test.rb +22 -2
  55. data/test/unit/foreman_fog_proxmox/proxmox_vm_commands_server_update_volumes_test.rb +18 -6
  56. metadata +9 -2
@@ -66,7 +66,7 @@ module ForemanFogProxmox
66
66
  end
67
67
 
68
68
  def interface_container_defaults(id = 'net0')
69
- { id: id, name: 'eth0', bridge: bridges.first.identity.to_s }
69
+ { id: id, name: 'eth0', bridge: bridges.first.identity.to_s, dhcpv4: 1, dhcpv6: 1 }
70
70
  end
71
71
 
72
72
  def new_interface(attr = {})
@@ -92,12 +92,24 @@ module ForemanFogProxmox
92
92
  Fog::Proxmox::Compute::Interface.new(opts)
93
93
  end
94
94
 
95
+ def default_node
96
+ nodes.first
97
+ end
98
+
99
+ def default_node_id
100
+ default_node.node
101
+ end
102
+
103
+ def next_vmid
104
+ default_node.servers.next_id
105
+ end
106
+
95
107
  def vm_server_instance_defaults
96
108
  ActiveSupport::HashWithIndifferentAccess.new(
97
109
  name: "foreman_#{Time.now.to_i}",
98
110
  vmid: next_vmid,
99
111
  type: 'qemu',
100
- node_id: node_id,
112
+ node_id: default_node_id,
101
113
  cores: 1,
102
114
  sockets: 1,
103
115
  kvm: 1,
@@ -117,14 +129,14 @@ module ForemanFogProxmox
117
129
  name: "foreman_#{Time.now.to_i}",
118
130
  vmid: next_vmid,
119
131
  type: 'lxc',
120
- node_id: node_id,
132
+ node_id: default_node_id,
121
133
  memory: 512 * MEGA,
122
134
  templated: 0
123
135
  ).merge(Fog::Proxmox::DiskHelper.flatten(volume_container_defaults)).merge(Fog::Proxmox::DiskHelper.flatten(volume_server_defaults)).merge(Fog::Proxmox::NicHelper.flatten(interface_defaults))
124
136
  end
125
137
 
126
138
  def vm_instance_defaults
127
- super.merge(vmid: next_vmid, node_id: node_id)
139
+ super.merge(vmid: next_vmid, node_id: default_node_id)
128
140
  end
129
141
 
130
142
  def new_vm(new_attr = {})
@@ -143,7 +155,9 @@ module ForemanFogProxmox
143
155
 
144
156
  def new_container_vm(new_attr = {})
145
157
  options = new_attr
146
- options = options.merge(node_id: node_id).merge(type: 'lxc').merge(vmid: next_vmid)
158
+ node_id = new_attr['node_id']
159
+ node = node_id ? client.nodes.get(node_id) : default_node
160
+ options = options.merge(type: 'lxc').merge(vmid: next_vmid)
147
161
  options = vm_container_instance_defaults.merge(options) if new_attr.empty?
148
162
  vm = node.containers.new(parse_container_vm(options).deep_symbolize_keys)
149
163
  logger.debug(format(_('new_container_vm() vm.config=%<config>s'), config: vm.config.inspect))
@@ -152,7 +166,9 @@ module ForemanFogProxmox
152
166
 
153
167
  def new_server_vm(new_attr = {})
154
168
  options = new_attr
155
- options = options.merge(node_id: node_id).merge(type: 'qemu').merge(vmid: next_vmid)
169
+ node_id = new_attr['node_id']
170
+ node = node_id ? client.nodes.get(node_id) : default_node
171
+ options = options.merge(type: 'qemu').merge(vmid: next_vmid)
156
172
  options = vm_server_instance_defaults.merge(options) if new_attr.empty?
157
173
  vm = node.servers.new(parse_server_vm(options).deep_symbolize_keys)
158
174
  logger.debug(format(_('new_server_vm() vm.config=%<config>s'), config: vm.config.inspect))
@@ -19,10 +19,6 @@
19
19
 
20
20
  module ForemanFogProxmox
21
21
  module ProxmoxVmQueries
22
- def next_vmid
23
- node.servers.next_id
24
- end
25
-
26
22
  def nodes
27
23
  nodes = client.nodes.all if client
28
24
  nodes&.sort_by(&:node)
@@ -33,19 +29,25 @@ module ForemanFogProxmox
33
29
  pools.sort_by(&:poolid)
34
30
  end
35
31
 
36
- def storages(type = 'images')
32
+ def storages(node_id = default_node_id, type = 'images')
33
+ node = client.nodes.get node_id
34
+ node ||= default_node
37
35
  storages = node.storages.list_by_content_type type
38
36
  storages.sort_by(&:storage)
39
37
  end
40
38
 
41
- def bridges
39
+ def bridges(node_id = default_node_id)
42
40
  node = network_client.nodes.get node_id
41
+ node ||= network_client.nodes.first
43
42
  bridges = node.networks.all(type: 'any_bridge')
44
43
  bridges.sort_by(&:iface)
45
44
  end
46
45
 
46
+ # TODO: Pagination with filters
47
47
  def vms(_opts = {})
48
- node
48
+ vms = []
49
+ nodes.each { |node| vms += node.servers.all + node.containers.all }
50
+ ForemanFogProxmox::Vms.new(vms)
49
51
  end
50
52
 
51
53
  def find_vm_by_uuid(uuid)
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Copyright 2018 Tristan Robert
4
+
5
+ # This file is part of ForemanFogProxmox.
6
+
7
+ # ForemanFogProxmox is free software: you can redistribute it and/or modify
8
+ # it under the terms of the GNU General Public License as published by
9
+ # the Free Software Foundation, either version 3 of the License, or
10
+ # (at your option) any later version.
11
+
12
+ # ForemanFogProxmox is distributed in the hope that it will be useful,
13
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
+ # GNU General Public License for more details.
16
+
17
+ # You should have received a copy of the GNU General Public License
18
+ # along with ForemanFogProxmox. If not, see <http://www.gnu.org/licenses/>.
19
+
20
+ module ForemanFogProxmox
21
+ class Vms
22
+ attr_reader :items
23
+
24
+ def each
25
+ @items.each
26
+ end
27
+
28
+ # TODO: Pagination with filters
29
+ def all(_filters = {})
30
+ items
31
+ end
32
+
33
+ def initialize(items = [])
34
+ @items = items
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,25 @@
1
+ # Copyright 2018 Tristan Robert
2
+
3
+ # This file is part of ForemanFogProxmox.
4
+
5
+ # ForemanFogProxmox is free software: you can redistribute it and/or modify
6
+ # it under the terms of the GNU General Public License as published by
7
+ # the Free Software Foundation, either version 3 of the License, or
8
+ # (at your option) any later version.
9
+
10
+ # ForemanFogProxmox is distributed in the hope that it will be useful,
11
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ # GNU General Public License for more details.
14
+
15
+ # You should have received a copy of the GNU General Public License
16
+ # along with ForemanFogProxmox. If not, see <http://www.gnu.org/licenses/>.
17
+
18
+ Deface::Override.new(
19
+ :virtual_path => 'compute_resources_vms/new',
20
+ :name => 'add_vm_type_to_networks_form',
21
+ :replace => "erb[loud]:contains('compute_resources_vms/form/networks')",
22
+ :partial => 'compute_resources_vms/form/proxmox/add_vm_type_node_to_new_form',
23
+ :original => '10d73563b7c13f01702aadfffd95956da8bff1ad',
24
+ :namespaced => true
25
+ )
@@ -18,7 +18,6 @@ along with ForemanFogProxmox. If not, see <http://www.gnu.org/licenses/>. %>
18
18
  <%= javascript_include_tag 'foreman_fog_proxmox/proxmox_compute_resource', "data-turbolinks-track" => true %>
19
19
 
20
20
  <% nodes = f.object.nodes rescue nil %>
21
- <% node_id = !!f.object.node_id ? f.object.node_id : '' %>
22
21
  <% token_expired = f.object.token_expired? %>
23
22
  <% token_deadline = f.object.token_deadline %>
24
23
  <%= checkbox_f f, :renew, :label => _("Renew expired token ?"), :checked_value => '1', :label_help => _("Token expires on #{token_deadline}") %>
@@ -28,4 +27,3 @@ along with ForemanFogProxmox. If not, see <http://www.gnu.org/licenses/>. %>
28
27
  <%= checkbox_f f, :ssl_verify_peer, :label => _("SSL verify peer"), :checked_value => '1', :onchange => "sslVerifyPeerSelected()" %>
29
28
  <%= textarea_f f, :ssl_certs, :label => _("X509 Certification Authorities"), :size => "col-md-4",
30
29
  :placeholder => _("Optionally provide a CA, or a correctly ordered CA chain. If left blank, disable ssl_verify_peer.") %>
31
- <%= select_f f, :node_id, nodes, :node, :node, { :include_blank => true }, :label => _('Node'), :label_size => "col-md-2", :required => true, :disabled => (node_id != '') %>
@@ -31,3 +31,7 @@ along with ForemanFogProxmox. If not, see <http://www.gnu.org/licenses/>. %>
31
31
  <td><%= _("Token expires on") %></td>
32
32
  <td><%= @compute_resource.token_deadline%></td>
33
33
  </tr>
34
+ <tr>
35
+ <td><%= _("Cluster nodes") %></td>
36
+ <td><%= @compute_resource.nodes.collect { |node| node.node }%></td>
37
+ </tr>
@@ -0,0 +1,24 @@
1
+ <%# Copyright 2018 Tristan Robert
2
+
3
+ This file is part of ForemanFogProxmox.
4
+
5
+ ForemanFogProxmox is free software: you can redistribute it and/or modify
6
+ it under the terms of the GNU General Public License as published by
7
+ the Free Software Foundation, either version 3 of the License, or
8
+ (at your option) any later version.
9
+
10
+ ForemanFogProxmox is distributed in the hope that it will be useful,
11
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ GNU General Public License for more details.
14
+
15
+ You should have received a copy of the GNU General Public License
16
+ along with ForemanFogProxmox. If not, see <http://www.gnu.org/licenses/>. %>
17
+ <% if compute_resource.class == ForemanFogProxmox::Proxmox %>
18
+ <% vm_type = f.object.respond_to?('type') ? f.object.type : nil %>
19
+ <% node_id = f.object.respond_to?('node_id') ? f.object.node_id : nil %>
20
+
21
+ <%= render :partial => 'compute_resources_vms/form/networks', :locals => { :f => f, :compute_resource => @compute_resource, :new_host => true, :new_vm => true, :item_layout => 'removable', :vm_type => vm_type, :node_id => node_id } %>
22
+ <% else %>
23
+ <%= render :partial => 'compute_resources_vms/form/networks', :locals => { :f => f, :compute_resource => @compute_resource, :new_host => true, :new_vm => true, :item_layout => 'removable' } %>
24
+ <% end %>
@@ -16,9 +16,10 @@ 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
  <% if compute_resource.class == ForemanFogProxmox::Proxmox %>
18
18
  <% vm_type = f.object.respond_to?('type') ? f.object.type : nil %>
19
+ <% node_id = f.object.respond_to?('node_id') ? f.object.node_id : nil %>
19
20
 
20
21
  <%= render :partial => provider_partial(compute_resource, 'network'),
21
- :locals => { :f => i, :vm_type => vm_type, :compute_resource => compute_resource, :new_host => new_host, :new_vm => new_vm, :remove_title => _('remove network interface'), :selected_cluster => selected_cluster },
22
+ :locals => { :f => i, :vm_type => vm_type, :node_id => node_id, :compute_resource => compute_resource, :new_host => new_host, :new_vm => new_vm, :remove_title => _('remove network interface'), :selected_cluster => selected_cluster },
22
23
  :layout => 'compute_resources_vms/form/deletable_layout' %>
23
24
  <% else %>
24
25
  <%= render :partial => provider_partial(compute_resource, 'network'),
@@ -16,11 +16,12 @@ 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
  <% if compute_resource.class == ForemanFogProxmox::Proxmox %>
18
18
  <% vm_type = f.object.respond_to?('type') ? f.object.type : nil %>
19
+ <% node_id = f.object.respond_to?('node_id') ? f.object.node_id : nil %>
19
20
 
20
21
  <%= new_child_fields_template(f, compute_resource.interfaces_attrs_name, {
21
22
  :object => compute_resource.new_interface,
22
23
  :partial => provider_partial(compute_resource, 'network'),
23
- :form_builder_attrs => { :vm_type => vm_type, :compute_resource => compute_resource, :new_host => new_host, :new_vm => new_vm, :remove_title => _('remove network interface') },
24
+ :form_builder_attrs => { :vm_type => vm_type, :node_id => node_id, :compute_resource => compute_resource, :new_host => new_host, :new_vm => new_vm, :remove_title => _('remove network interface') },
24
25
  :layout => 'compute_resources_vms/form/deletable_layout' }) %>
25
26
  <% else %>
26
27
  <%= new_child_fields_template(f, compute_resource.interfaces_attrs_name, {
@@ -16,10 +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
  <% if @host.compute_resource.class == ForemanFogProxmox::Proxmox %>
18
18
  <% compute_attributes = f.object.compute_attributes %>
19
- <% vm_type = compute_attributes ? compute_attributes['type'] : f.object.type %>
19
+ <% vm_type = vm_type(@host) %>
20
+ <% node_id = node_id(@host) %>
20
21
 
21
22
  <%= f.fields_for 'compute_attributes', OpenStruct.new(f.object.compute_attributes) do |f| %>
22
- <%= render provider_partial(@host.compute_resource, 'network'), :f => f, :vm_type => vm_type, :disabled => f.object.persisted?, :compute_resource => @host.compute_resource, :new_host => new_vm, :new_vm => new_vm %>
23
+ <%= render provider_partial(@host.compute_resource, 'network'), :f => f, :vm_type => vm_type, :node_id => node_id, :disabled => f.object.persisted?, :compute_resource => @host.compute_resource, :new_host => new_vm, :new_vm => new_vm %>
23
24
  <% end %>
24
25
  <% else %>
25
26
  <%= f.fields_for 'compute_attributes', OpenStruct.new(f.object.compute_attributes) do |f| %>
@@ -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
  <% if compute_resource.class == ForemanFogProxmox::Proxmox %>
18
18
  <% type = f.object.type %>
19
+ <% node_id = f.object.node_id %>
19
20
  <% server = type == 'qemu' %>
20
21
  <% container = type == 'lxc' %>
21
22
 
@@ -23,13 +24,13 @@ along with ForemanFogProxmox. If not, see <http://www.gnu.org/licenses/>. %>
23
24
  :type => 'server',
24
25
  :object => compute_resource.new_volume_server,
25
26
  :partial => provider_partial(compute_resource, 'server/volume'),
26
- :form_builder_attrs => { :type => type, :compute_resource => compute_resource, :new_host => new_vm, :new_vm => new_vm, :remove_title => _('remove storage volume') },
27
+ :form_builder_attrs => { :type => type, :node_id => node_id, :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
29
  <%= new_child_fields_template_typed(f, :volumes, {
29
30
  :type => 'container',
30
31
  :object => compute_resource.new_volume_container(id: 'mp0'),
31
32
  :partial => provider_partial(compute_resource, 'container/volume_mp'),
32
- :form_builder_attrs => { :type => type, :compute_resource => compute_resource, :new_host => new_vm, :new_vm => new_vm, :remove_title => _('remove storage volume') },
33
+ :form_builder_attrs => { :type => type, :node_id => node_id, :compute_resource => compute_resource, :new_host => new_vm, :new_vm => new_vm, :remove_title => _('remove storage volume') },
33
34
  :layout => "compute_resources_vms/form/#{item_layout}_layout" }) %>
34
35
 
35
36
 
@@ -37,15 +38,15 @@ along with ForemanFogProxmox. If not, see <http://www.gnu.org/licenses/>. %>
37
38
  <%= f.fields_for :volumes do |i| %>
38
39
  <% if i.object.rootfs? %>
39
40
  <div id="container_volumes_rootfs" style="<%= 'display: ' + (container ? 'block' : 'none') + ';' %>">
40
- <%= 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" %>
41
+ <%= render :partial => provider_partial(compute_resource, 'container/volume_rootfs'), :locals => { :f => i, :type => type, :node_id => node_id, :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" %>
41
42
  </div>
42
43
  <% elsif i.object.mount_point? %>
43
44
  <div id="container_volumes_mp" style="<%= 'display: ' + (container ? 'block' : 'none') + ';' %>">
44
- <%= 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" %>
45
+ <%= render :partial => provider_partial(compute_resource, 'container/volume_mp'), :locals => { :f => i, :type => type, :node_id => node_id, :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" %>
45
46
  </div>
46
47
  <% elsif i.object.controller? %>
47
48
  <div id="server_volumes" style="<%= 'display: ' + (server ? 'block' : 'none') + ';' %>">
48
- <%= 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" %>
49
+ <%= render :partial => provider_partial(compute_resource, 'server/volume'), :locals => { :f => i, :type => type, :node_id => node_id, :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" %>
49
50
  </div>
50
51
  <% end %>
51
52
  <% end %>
@@ -18,7 +18,7 @@ along with ForemanFogProxmox. If not, see <http://www.gnu.org/licenses/>. %>
18
18
  <%= javascript_include_tag 'foreman_fog_proxmox/proxmox_vm', "data-turbolinks-track" => true %>
19
19
  <%= javascript_tag("$(document).on('ContentLoad', tfm.numFields.initAll)"); %>
20
20
 
21
- <%= select_f f, :type, proxmox_types_map, :id, :name, { }, :label => _('Type'), :label_size => "col-md-2", :onchange => "vmTypeSelected()", :disabled => !new_vm %>
21
+ <%= select_f f, :type, proxmox_types_map, :id, :name, { }, :label => _('Type'), :label_size => "col-md-2", :required => true, :onchange => "vmTypeSelected()", :disabled => !new_vm %>
22
22
 
23
23
  <!-- VM General Settings -->
24
24
  <%= render :partial => "compute_resources_vms/form/proxmox/general", :locals => { :f => f, :compute_resource => compute_resource, :new_vm => new_vm, :from_profile => from_profile } %>
@@ -32,8 +32,8 @@ along with ForemanFogProxmox. If not, see <http://www.gnu.org/licenses/>. %>
32
32
 
33
33
  <!-- Config Options Settings-->
34
34
  <%= f.fields_for :config, compute_resource.new_server_vm(object_to_config_hash(f.object)).config, include_id: false do |server_config|%>
35
- <%= render :partial => "compute_resources_vms/form/proxmox/server/config", :locals => { :f => server_config, :compute_resource => compute_resource, :host => @host, :new_vm => new_vm, :item_layout => 'removable', :type => f.object.type } %>
35
+ <%= render :partial => "compute_resources_vms/form/proxmox/server/config", :locals => { :f => server_config, :compute_resource => compute_resource, :host => @host, :new_vm => new_vm, :item_layout => 'removable', :type => f.object.type, :node_id => f.object.node_id } %>
36
36
  <% end %>
37
37
  <%= f.fields_for :config, compute_resource.new_container_vm(object_to_config_hash(f.object)).config, include_id: false do |container_config|%>
38
- <%= render :partial => "compute_resources_vms/form/proxmox/container/config", :locals => { :f => container_config, :compute_resource => compute_resource, :host => @host, :new_vm => new_vm, :item_layout => 'removable', :type => f.object.type } %>
38
+ <%= render :partial => "compute_resources_vms/form/proxmox/container/config", :locals => { :f => container_config, :compute_resource => compute_resource, :host => @host, :new_vm => new_vm, :item_layout => 'removable', :type => f.object.type, :node_id => f.object.node_id } %>
39
39
  <% end %>
@@ -20,7 +20,8 @@ along with ForemanFogProxmox. If not, see <http://www.gnu.org/licenses/>. %>
20
20
  <%= field_set_tag _("General"), :id => "general" do %>
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
- <%= select_f f, :node_id, compute_resource.nodes, :node, :node, { }, :label => _('Node'), :label_size => "col-md-2", :required => true, :disabled => true %>
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
25
  <% unless local_assigns[:hide_image] && !new_vm %>
25
26
  <%
26
27
  arch ||= nil ; os ||= nil
@@ -15,5 +15,5 @@ GNU General Public License for more details.
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
- <%= render :partial => "compute_resources_vms/form/proxmox/server/network", :locals => { :f => f, :type => vm_type, :compute_resource => compute_resource, :new_vm => new_vm } %>
19
- <%= render :partial => "compute_resources_vms/form/proxmox/container/network", :locals => { :f => f, :type => vm_type, :compute_resource => compute_resource, :new_vm => new_vm } %>
18
+ <%= render :partial => "compute_resources_vms/form/proxmox/server/network", :locals => { :f => f, :vm_type => vm_type, :node_id => node_id, :compute_resource => compute_resource, :new_vm => new_vm } %>
19
+ <%= render :partial => "compute_resources_vms/form/proxmox/container/network", :locals => { :f => f, :vm_type => vm_type, :node_id => node_id, :compute_resource => compute_resource, :new_vm => new_vm } %>
@@ -16,11 +16,12 @@ 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
  <% container = f.object.type == 'lxc' %>
19
+ <% node_id = f.object.node_id %>
19
20
 
20
21
  <%= field_set_tag _("Extended"), :id => "container_config_ext", :class => ('hide' unless (new_vm && container)), :disabled => (!container || !new_vm) do %>
21
22
  <div id="ostemplate_form">
22
- <%= select_f f, :ostemplate_storage, compute_resource.storages('vztmpl'), :storage, :storage, { :include_blank => true }, :disabled => !new_vm, :class => ('hide' unless new_vm), :label => _('Template storage'), :label_size => "col-md-2", :onchange => 'storageOstemplateSelected(this)' %>
23
- <%= select_f f, :ostemplate_file, compute_resource.images_by_storage(f.object.ostemplate_storage, 'vztmpl'), :volid, :volid, { :include_blank => true }, :disabled => !new_vm, :class => ('hide' unless new_vm), :label => _('OS Template'), :label_size => "col-md-2", :required => true %>
23
+ <%= select_f f, :ostemplate_storage, compute_resource.storages(node_id,'vztmpl'), :storage, :storage, { :include_blank => true }, :disabled => !new_vm, :class => ('hide' unless new_vm), :label => _('Template storage'), :label_size => "col-md-2", :onchange => 'storageOstemplateSelected(this)' %>
24
+ <%= select_f f, :ostemplate_file, compute_resource.images_by_storage(node_id,f.object.ostemplate_storage, 'vztmpl'), :volid, :volid, { :include_blank => true }, :disabled => !new_vm, :class => ('hide' unless new_vm), :label => _('OS Template'), :label_size => "col-md-2", :required => true %>
24
25
  </div>
25
26
  <%= password_proxmox_f f, :password, :label => _("Root password"), :required => true %>
26
27
  <% end %>
@@ -15,9 +15,10 @@ GNU General Public License for more details.
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
- <% container = type == 'lxc' %>
18
+ <% container = vm_type == 'lxc' %>
19
+ <% index = f.index ? f.index.present? : 0 %>
19
20
 
20
- <%= field_set_tag _("Nic"), :id => "container_network_#{f.index}", :style => ('display: none;' unless container), :disabled => !container do %>
21
+ <%= field_set_tag _("Nic"), :id => "container_network_#{index}", :style => ('display: none;' unless container), :disabled => !container do %>
21
22
  <%= f.hidden_field :id if !new_vm %>
22
23
  <%= text_f f, :name, :label => _('Name'), :label_size => "col-md-2" %>
23
24
  <%= checkbox_f f, :dhcpv4, :label => _('DHCP IPv4') %>
@@ -28,5 +29,5 @@ along with ForemanFogProxmox. If not, see <http://www.gnu.org/licenses/>. %>
28
29
  <%= text_f f, :gwv6, :label => _('Gateway IPv6'), :label_size => "col-md-2" %>
29
30
  <%= counter_f f, :tag, :class => "input-mini", :label => _('VLAN tag'), :label_size => "col-md-2" %>
30
31
  <%= counter_f f, :rate, :class => "input-mini", :label => _('Rate limit'), :label_size => "col-md-2" %>
31
- <%= select_f f, :bridge, compute_resource.bridges, :iface, :iface, { }, :label => _('Bridge'), :label_size => "col-md-2" %>
32
+ <%= select_f f, :bridge, compute_resource.bridges(node_id), :iface, :iface, { }, :label => _('Bridge'), :label_size => "col-md-2" %>
32
33
  <% end %>
@@ -20,7 +20,7 @@ along with ForemanFogProxmox. If not, see <http://www.gnu.org/licenses/>. %>
20
20
 
21
21
  <%= field_set_tag _("Mount point"), :id => "container_volume_mp_#{f.index}", :class => ('hide' unless container), :disabled => !container do %>
22
22
  <%= f.hidden_field :volid if !new_vm %>
23
- <%= select_f f, :storage, compute_resource.storages, :storage, :storage, { }, :label => _('Storage'), :label_size => "col-md-2" %>
23
+ <%= select_f f, :storage, compute_resource.storages(node_id), :storage, :storage, { }, :label => _('Storage'), :label_size => "col-md-2" %>
24
24
  <%= text_f f, :mp, :label => _('Path'), :label_size => "col-md-2", :required => true, :help_inline => _("e.g. /path/to/") %>
25
25
  <%= text_f f, :device, :label => _('Device'), :label_size => "col-md-2", :class => ('hide' if f.object.rootfs?), :disabled => (!new_volume || f.object.rootfs?), :'data-soft-max' => 10 %>
26
26
  <%= byte_size_f f, :size, :class => "input-mini", :label => _("Size"), :label_size => "col-md-2" %>
@@ -19,6 +19,6 @@ along with ForemanFogProxmox. If not, see <http://www.gnu.org/licenses/>. %>
19
19
 
20
20
  <%= field_set_tag _("Rootfs"), :id => "container_volume_rootfs", :class => ('hide' unless container), :disabled => !container do %>
21
21
  <%= f.hidden_field :volid if !new_vm %>
22
- <%= select_f f, :storage, compute_resource.storages, :storage, :storage, { }, :label => _('Storage'), :label_size => "col-md-2" %>
22
+ <%= select_f f, :storage, compute_resource.storages(node_id), :storage, :storage, { }, :label => _('Storage'), :label_size => "col-md-2" %>
23
23
  <%= byte_size_f f, :size, :class => "input-mini", :label => _("Size"), :label_size => "col-md-2" %>
24
24
  <% end %>
@@ -51,7 +51,7 @@ along with ForemanFogProxmox. If not, see <http://www.gnu.org/licenses/>. %>
51
51
  <%= radio_button_f f, :cdrom, :value => 'cdrom' , :text => _('Physical'), :onclick => 'cdromSelected(this)' %>
52
52
  <%= radio_button_f f, :cdrom, :value => 'image' , :text => _('Image'), :onclick => 'cdromSelected(this)' %>
53
53
  <div id='cdrom_image_form' class='<%= 'hide' if %[none cdrom].include? f.object.cdrom %>'>
54
- <%= select_f f, :cdrom_storage, compute_resource.storages('iso'), :storage, :storage, { :include_blank => true }, :label => _('Storage'), :label_size => "col-md-2", :onchange => 'storageIsoSelected(this)' %>
54
+ <%= select_f f, :cdrom_storage, compute_resource.storages(node_id,'iso'), :storage, :storage, { :include_blank => true }, :label => _('Storage'), :label_size => "col-md-2", :onchange => 'storageIsoSelected(this)' %>
55
55
  <%= select_f f, :cdrom_iso, compute_resource.images_by_storage(f.object.cdrom_storage, 'iso'), :volid, :volid, { :include_blank => true }, :label => _('Image ISO'), :label_size => "col-md-2" %>
56
56
  </div>
57
57
  <% end %>
@@ -15,12 +15,13 @@ GNU General Public License for more details.
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
- <% server = type == 'qemu' %>
18
+ <% server = vm_type == 'qemu' %>
19
+ <% index = f.index ? f.index.present? : 0 %>
19
20
 
20
- <%= field_set_tag _("Nic"), :id => "server_network_#{f.index}", :style => ('display: none;' unless server), :disabled => !server do %>
21
+ <%= field_set_tag _("Nic"), :id => "server_network_#{index}", :style => ('display: none;' unless server), :disabled => !server do %>
21
22
  <%= f.hidden_field :id if !new_vm %>
22
23
  <%= select_f f, :model, proxmox_networkcards_map, :id, :name, { }, :label => _('Card'), :label_size => "col-md-2" %>
23
- <%= select_f f, :bridge, compute_resource.bridges, :iface, :iface, { }, :label => _('Bridge'), :label_size => "col-md-2" %>
24
+ <%= select_f f, :bridge, compute_resource.bridges(node_id), :iface, :iface, { }, :label => _('Bridge'), :label_size => "col-md-2" %>
24
25
  <%= counter_f f, :tag, :class => "input-mini", :label => _('VLAN tag'), :label_size => "col-md-2" %>
25
26
  <%= counter_f f, :rate, :class => "input-mini", :label => _('Rate limit'), :label_size => "col-md-2" %>
26
27
  <%= counter_f f, :queues, :class => "input-mini", :label => _('Multiqueue'), :label_size => "col-md-2" %>
@@ -20,7 +20,7 @@ along with ForemanFogProxmox. If not, see <http://www.gnu.org/licenses/>. %>
20
20
 
21
21
  <%= field_set_tag _("Disk"), :id => "server_volume_#{f.index}", :class => ('hide' unless server), :disabled => !server do %>
22
22
  <%= f.hidden_field :volid if !new_vm %>
23
- <%= select_f f, :storage, compute_resource.storages, :storage, :storage, { }, :label => _('Storage'), :label_size => "col-md-2" %>
23
+ <%= select_f f, :storage, compute_resource.storages(node_id), :storage, :storage, { }, :label => _('Storage'), :label_size => "col-md-2" %>
24
24
  <%= select_f f, :controller, proxmox_controllers_map, :id, :name, { }, :label => _('Controller'), :label_size => "col-md-2", :disabled => !new_volume, :onchange => 'controllerSelected(this)' %>
25
25
  <%= 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)' %>
26
26
  <%= select_f f, :cache, proxmox_caches_map, :id, :name, { include_blank: true }, :label => _('Cache'), :label_size => "col-md-2" %>
@@ -19,6 +19,7 @@ along with ForemanFogProxmox. If not, see <http://www.gnu.org/licenses/>. %>
19
19
  <thead>
20
20
  <tr>
21
21
  <th><%= _('Name') -%></th>
22
+ <th><%= _('Node') -%></th>
22
23
  <th><%= _('Type') -%></th>
23
24
  <th><%= _('CPUs') -%></th>
24
25
  <th><%= _('Memory') -%></th>
@@ -31,9 +32,10 @@ along with ForemanFogProxmox. If not, see <http://www.gnu.org/licenses/>. %>
31
32
  <% @vms.each do |vm| -%>
32
33
  <tr>
33
34
  <td><%= link_to_if_authorized vm.name, hash_for_compute_resource_vm_path(:compute_resource_id => @compute_resource, :id => vm.identity) %></td>
35
+ <td><%= vm.node_id %></td>
34
36
  <td><%= vm.type %></td>
35
- <td><%= vm.maxcpu %></td>
36
- <td><%= (vm.maxmem.to_i / (1024 * 1024)).to_s %> MB</td>
37
+ <td><%= vm.cpus %></td>
38
+ <td><%= Fog::Proxmox::DiskHelper.to_human_bytes(vm.maxmem) %></td>
37
39
  <td> <span <%= vm_power_class(vm.ready?) %>> <%= vm_state(vm) %></span> </td>
38
40
  <td><%= vm.uptime %></td>
39
41
  <td>