foreman_fog_proxmox 0.9.4 → 0.10.0

Sign up to get free protection for your applications and to get access to all the features.

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>