foreman_fog_proxmox 0.12.4 → 0.13.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 (78) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +3 -2
  3. data/app/assets/javascripts/foreman_fog_proxmox/proxmox_compute_resource.js +24 -2
  4. data/app/assets/javascripts/foreman_fog_proxmox/proxmox_vm.js +124 -52
  5. data/app/assets/javascripts/foreman_fog_proxmox/proxmox_vm_server.js +0 -48
  6. data/app/assets/javascripts/foreman_fog_proxmox/proxmox_volume.js +39 -0
  7. data/app/assets/javascripts/foreman_fog_proxmox/proxmox_volume_cdrom.js +63 -0
  8. data/app/assets/javascripts/foreman_fog_proxmox/proxmox_volume_cloudinit.js +25 -0
  9. data/app/controllers/concerns/foreman_fog_proxmox/controller/parameters/compute_resource.rb +1 -1
  10. data/app/helpers/proxmox_compute_controllers_helper.rb +39 -0
  11. data/app/helpers/proxmox_compute_resources_helper.rb +49 -0
  12. data/app/helpers/proxmox_compute_selectors_helper.rb +6 -44
  13. data/app/helpers/proxmox_form_helper.rb +12 -4
  14. data/app/{models/concerns/fog_extensions/proxmox/volume.rb → helpers/proxmox_storages_helper.rb} +5 -8
  15. data/app/{models/foreman_fog_proxmox/proxmox_token_expiration.rb → helpers/proxmox_vm_cdrom_helper.rb} +15 -10
  16. data/app/helpers/proxmox_vm_cloudinit_helper.rb +43 -0
  17. data/app/helpers/proxmox_vm_config_helper.rb +159 -0
  18. data/app/helpers/proxmox_vm_helper.rb +24 -62
  19. data/app/helpers/proxmox_vm_interfaces_helper.rb +85 -0
  20. data/app/helpers/proxmox_vm_os_template_helper.rb +47 -0
  21. data/app/helpers/proxmox_vm_volumes_helper.rb +105 -0
  22. data/app/models/concerns/fog_extensions/proxmox/disk.rb +17 -2
  23. data/app/models/concerns/fog_extensions/proxmox/interface.rb +19 -4
  24. data/app/models/concerns/fog_extensions/proxmox/server.rb +8 -3
  25. data/app/models/concerns/fog_extensions/proxmox/server_config.rb +8 -30
  26. data/app/models/concerns/host_ext/proxmox/interfaces.rb +7 -2
  27. data/app/models/concerns/orchestration/proxmox/compute.rb +1 -0
  28. data/app/models/foreman_fog_proxmox/proxmox.rb +58 -15
  29. data/app/models/foreman_fog_proxmox/proxmox_compute_attributes.rb +13 -18
  30. data/app/models/foreman_fog_proxmox/proxmox_connection.rb +14 -9
  31. data/app/models/foreman_fog_proxmox/proxmox_images.rb +2 -1
  32. data/app/models/foreman_fog_proxmox/proxmox_interfaces.rb +53 -28
  33. data/app/models/foreman_fog_proxmox/proxmox_operating_systems.rb +1 -1
  34. data/app/models/foreman_fog_proxmox/proxmox_version.rb +7 -2
  35. data/app/models/foreman_fog_proxmox/proxmox_vm_commands.rb +18 -30
  36. data/app/models/foreman_fog_proxmox/proxmox_vm_new.rb +108 -94
  37. data/app/models/foreman_fog_proxmox/proxmox_vm_queries.rb +2 -1
  38. data/app/models/foreman_fog_proxmox/proxmox_volumes.rb +79 -22
  39. data/app/views/compute_resources/form/_proxmox.html.erb +23 -10
  40. data/app/views/compute_resources/show/_proxmox.html.erb +6 -6
  41. data/app/views/compute_resources_vms/form/proxmox/_add_vm_type_to_nic_provider_specific_form.html.erb +3 -1
  42. data/app/views/compute_resources_vms/form/proxmox/_add_vm_type_to_volumes_edit.html.erb +46 -29
  43. data/app/views/compute_resources_vms/form/proxmox/_base.html.erb +3 -3
  44. data/app/views/compute_resources_vms/form/proxmox/_removable_layout.html.erb +2 -1
  45. data/app/views/compute_resources_vms/form/proxmox/container/_network.html.erb +8 -7
  46. data/app/views/compute_resources_vms/form/proxmox/server/_advanced.html.erb +0 -2
  47. data/app/views/compute_resources_vms/form/proxmox/server/_config.html.erb +15 -14
  48. data/app/views/compute_resources_vms/form/proxmox/server/_network.html.erb +2 -2
  49. data/app/views/compute_resources_vms/form/proxmox/server/_volume_cdrom.html.erb +34 -0
  50. data/app/views/compute_resources_vms/form/proxmox/server/_volume_cloud_init.html.erb +29 -0
  51. data/app/views/compute_resources_vms/form/proxmox/server/{_volume.html.erb → _volume_hard_disk.html.erb} +7 -3
  52. data/app/views/compute_resources_vms/show/_proxmox.html.erb +2 -0
  53. data/lib/foreman_fog_proxmox/engine.rb +7 -8
  54. data/lib/foreman_fog_proxmox/hash_collection.rb +69 -0
  55. data/lib/foreman_fog_proxmox/version.rb +1 -1
  56. data/lib/tasks/foreman_fog_proxmox_tasks.rake +0 -3
  57. data/test/factories/foreman_fog_proxmox/proxmox_container_mock_factory.rb +20 -8
  58. data/test/factories/foreman_fog_proxmox/proxmox_node_mock_factory.rb +5 -5
  59. data/test/factories/foreman_fog_proxmox/proxmox_server_mock_factory.rb +17 -7
  60. data/test/factories/proxmox_factory.rb +4 -4
  61. data/test/functional/compute_resources_controller_test.rb +4 -4
  62. data/test/unit/foreman_fog_proxmox/helpers/proxmox_container_helper_test.rb +49 -29
  63. data/test/unit/foreman_fog_proxmox/helpers/proxmox_server_helper_test.rb +53 -30
  64. data/test/unit/foreman_fog_proxmox/helpers/proxmox_vm_helper_test.rb +22 -20
  65. data/test/unit/foreman_fog_proxmox/helpers/proxmox_vm_volumes_helper_test.rb +50 -0
  66. data/test/unit/foreman_fog_proxmox/proxmox_compute_attributes_test.rb +10 -11
  67. data/test/unit/foreman_fog_proxmox/proxmox_interfaces_test.rb +38 -10
  68. data/test/unit/foreman_fog_proxmox/proxmox_version_test.rb +10 -10
  69. data/test/unit/foreman_fog_proxmox/proxmox_vm_commands_container_test.rb +34 -24
  70. data/test/unit/foreman_fog_proxmox/proxmox_vm_commands_server_create_test.rb +8 -8
  71. data/test/unit/foreman_fog_proxmox/proxmox_vm_commands_server_update_cdrom_test.rb +181 -0
  72. data/test/unit/foreman_fog_proxmox/proxmox_vm_commands_server_update_cloudinit_test.rb +131 -0
  73. data/test/unit/foreman_fog_proxmox/{proxmox_vm_commands_server_update_volumes_test.rb → proxmox_vm_commands_server_update_hard_disk_test.rb} +45 -19
  74. data/test/unit/foreman_fog_proxmox/proxmox_vm_commands_server_update_test.rb +21 -21
  75. data/test/unit/foreman_fog_proxmox/proxmox_vm_new_test.rb +3 -3
  76. metadata +40 -23
  77. data/app/helpers/proxmox_container_helper.rb +0 -163
  78. data/app/helpers/proxmox_server_helper.rb +0 -155
@@ -21,17 +21,17 @@ along with ForemanFogProxmox. If not, see <http://www.gnu.org/licenses/>. %>
21
21
  </tr>
22
22
  <tr>
23
23
  <td><%= _("Version") %></td>
24
- <td><%= @compute_resource.version%></td>
24
+ <td><%= @compute_resource.version %></td>
25
25
  </tr>
26
26
  <tr>
27
- <td><%= _("Token has expired?") %></td>
28
- <td><%= @compute_resource.token_expired?%></td>
27
+ <td><%= _("Authentication method") %></td>
28
+ <td><%= @compute_resource.auth_method %></td>
29
29
  </tr>
30
30
  <tr>
31
- <td><%= _("Token expires on") %></td>
32
- <td><%= @compute_resource.token_deadline%></td>
31
+ <td><%= _("User token expires") %></td>
32
+ <td><%= user_token_expiration_date(@compute_resource) %></td>
33
33
  </tr>
34
34
  <tr>
35
35
  <td><%= _("Cluster nodes") %></td>
36
- <td><%= @compute_resource.nodes.collect { |node| node.node }%></td>
36
+ <td><%= cluster_nodes(@compute_resource) %></td>
37
37
  </tr>
@@ -16,10 +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 @host.compute_resource.class == ForemanFogProxmox::Proxmox %>
18
18
  <% compute_attributes = f.object.compute_attributes %>
19
- <% vm_type = f.object.respond_to?('type') ? f.object.type : nil %>
19
+ <% logger.debug("_add_vm_type_to_nic_provider_specific_form.html compute_attributes=#{compute_attributes}") %>
20
20
  <% node_id = f.object.respond_to?('node_id') ? f.object.node_id : nil %>
21
21
 
22
22
  <%= f.fields_for 'compute_attributes', OpenStruct.new(f.object.compute_attributes) do |f| %>
23
+ <% vm_type = compute_attributes.respond_to?('type') ? compute_attributes.type : 'qemu' %>
24
+ <% logger.debug("_add_vm_type_to_nic_provider_specific_form.html vm_type=#{vm_type}") %>
23
25
  <%= 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 %>
24
26
  <% end %>
25
27
  <% else %>
@@ -14,45 +14,63 @@ GNU General Public License for more details.
14
14
 
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
- <% if compute_resource.class == ForemanFogProxmox::Proxmox %>
18
- <% type = f.object.type %>
19
- <% node_id = f.object.node_id %>
20
- <% server = type == 'qemu' %>
21
- <% container = type == 'lxc' %>
22
-
23
- <%= new_child_fields_template_typed(f, :volumes, {
24
- :type => 'server',
25
- :object => compute_resource.new_volume_server,
26
- :partial => provider_partial(compute_resource, 'server/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') },
28
- :layout => "compute_resources_vms/form/#{item_layout}_layout" }) %>
29
- <%= new_child_fields_template_typed(f, :volumes, {
30
- :type => 'container',
31
- :object => compute_resource.new_volume_container(id: 'mp0'),
32
- :partial => provider_partial(compute_resource, 'container/volume_mp'),
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') },
34
- :layout => "compute_resources_vms/form/#{item_layout}_layout" }) %>
35
17
 
18
+ <% if compute_resource.class == ForemanFogProxmox::Proxmox %>
19
+ <%= javascript_include_tag 'foreman_fog_proxmox/proxmox_volume', "data-turbolinks-track" => true %>
20
+ <% type = f.object.type %>
21
+ <% node_id = f.object.node_id %>
22
+ <% server = type == 'qemu' %>
23
+ <% container = type == 'lxc' %>
24
+ <% cdrom = f.object.cdrom? %>
25
+ <% logger.debug("_add_vm_type_to_volumes_edit.html cdrom=#{cdrom}") %>
26
+ <% cloud_init = f.object.cloud_init? %>
27
+ <% logger.debug("_add_vm_type_to_volumes_edit.html cloud_init=#{cloud_init}") %>
28
+ <% container = type == 'lxc' %>
36
29
 
30
+ <%= add_child_link_typed '+ ' + _("Add Hard Disk"), :volumes, 'hard_disk', { :class => "info #{'hide' unless server }", :title => _('add new hard disk') } %>
31
+ <%= add_child_link_typed '+ ' + _("Add CD-ROM"), :volumes, 'cdrom', { :class => "info #{'hide' if cdrom }", :title => _('add new cd-rom') } %>
32
+ <%= add_child_link_typed '+ ' + _("Add Cloud-init"), :volumes, 'cloud_init', { :class => "info #{'hide' if cloud_init }", :title => _('add new cloud-init') } %>
33
+ <%= add_child_link_typed '+ ' + _("Add Mount Point"), :volumes, 'mp', { :class => "info #{'hide' unless container}", :title => _('add new mount point') } %>
34
+
35
+ <%= new_child_fields_template_typed(f, :volumes, {
36
+ :type => 'hard_disk',
37
+ :object => compute_resource.new_typed_volume({},'qemu','hard_disk'),
38
+ :partial => provider_partial(compute_resource, 'server/volume_hard_disk'),
39
+ :form_builder_attrs => { :type => type, :node_id => node_id, :compute_resource => compute_resource, :new_host => new_vm, :new_vm => new_vm, :remove_title => _('remove Hard disk') },
40
+ :layout => "compute_resources_vms/form/#{item_layout}_layout" }) %>
41
+ <%= new_child_fields_template_typed(f, :volumes, {
42
+ :type => 'cdrom',
43
+ :object => compute_resource.new_typed_volume({},'qemu','cdrom'),
44
+ :partial => provider_partial(compute_resource, 'server/volume_cdrom'),
45
+ :form_builder_attrs => { :type => type, :node_id => node_id, :compute_resource => compute_resource, :new_host => new_vm, :new_vm => new_vm, :remove_title => _('remove CDROM') },
46
+ :layout => "compute_resources_vms/form/#{item_layout}_layout" }) %>
47
+ <%= new_child_fields_template_typed(f, :volumes, {
48
+ :type => 'cloud_init',
49
+ :object => compute_resource.new_typed_volume({},'qemu','cloud_init'),
50
+ :partial => provider_partial(compute_resource, 'server/volume_cloud_init'),
51
+ :form_builder_attrs => { :type => type, :node_id => node_id, :compute_resource => compute_resource, :new_host => new_vm, :new_vm => new_vm, :remove_title => _('remove Cloud-init') },
52
+ :layout => "compute_resources_vms/form/#{item_layout}_layout" }) %>
53
+ <%= new_child_fields_template_typed(f, :volumes, {
54
+ :type => 'mp',
55
+ :object => compute_resource.new_typed_volume({ id: 'mp0' }, 'lxc','mp'),
56
+ :partial => provider_partial(compute_resource, 'container/volume_mp'),
57
+ :form_builder_attrs => { :type => type, :node_id => node_id, :compute_resource => compute_resource, :new_host => new_vm, :new_vm => new_vm, :remove_title => _('remove mount point') },
58
+ :layout => "compute_resources_vms/form/#{item_layout}_layout" }) %>
37
59
 
38
60
  <%= f.fields_for :volumes do |i| %>
39
61
  <% if i.object.rootfs? %>
40
- <div id="container_volumes_rootfs" style="<%= 'display: ' + (container ? 'block' : 'none') + ';' %>">
41
62
  <%= 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" %>
42
- </div>
43
63
  <% elsif i.object.mount_point? %>
44
- <div id="container_volumes_mp" style="<%= 'display: ' + (container ? 'block' : 'none') + ';' %>">
45
64
  <%= 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" %>
46
- </div>
47
- <% elsif i.object.controller? %>
48
- <div id="server_volumes" style="<%= 'display: ' + (server ? 'block' : 'none') + ';' %>">
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" %>
50
- </div>
65
+ <% elsif i.object.hard_disk? %>
66
+ <%= render :partial => provider_partial(compute_resource, 'server/volume_hard_disk'), :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" %>
67
+ <% elsif i.object.cdrom? %>
68
+ <%= render :partial => provider_partial(compute_resource, 'server/volume_cdrom'), :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" %>
69
+ <% elsif i.object.cloud_init? %>
70
+ <%= render :partial => provider_partial(compute_resource, 'server/volume_cloud_init'), :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" %>
51
71
  <% end %>
52
72
  <% end %>
53
73
 
54
- <%= add_child_link_typed '+ ' + _("Add Volume"), :volumes, 'server', { :class => "info #{'hide' unless server}", :title => _('add new storage volume') } %>
55
- <%= add_child_link_typed '+ ' + _("Add Volume"), :volumes, 'container', { :class => "info #{'hide' unless container}", :title => _('add new storage volume') } %>
56
74
  <% else %>
57
75
  <%= new_child_fields_template(f, :volumes, {
58
76
  :object => volume,
@@ -68,4 +86,3 @@ along with ForemanFogProxmox. If not, see <http://www.gnu.org/licenses/>. %>
68
86
  <%= add_child_link '+ ' + _("Add Volume"), :volumes, { :class => "info", :title => _('add new storage volume') } %>
69
87
  <% end %>
70
88
  <% end %>
71
-
@@ -31,9 +31,9 @@ along with ForemanFogProxmox. If not, see <http://www.gnu.org/licenses/>. %>
31
31
  <%= render :partial => "compute_resources_vms/form/proxmox/container/advanced", :locals => { :f => f, :compute_resource => compute_resource, :new_vm => new_vm } %>
32
32
 
33
33
  <!-- Config Options Settings-->
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, :node_id => f.object.node_id } %>
34
+ <%= f.fields_for :config, compute_resource.new_typed_vm(object_to_config_hash(f.object, 'qemu'), 'qemu').config, include_id: false do |server_config|%>
35
+ <%= render :partial => "compute_resources_vms/form/proxmox/server/config", :locals => { :f => server_config, :cloudinit => f.object.cloud_init?, :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
- <%= f.fields_for :config, compute_resource.new_container_vm(object_to_config_hash(f.object)).config, include_id: false do |container_config|%>
37
+ <%= f.fields_for :config, compute_resource.new_typed_vm(object_to_config_hash(f.object, 'lxc'), 'lxc').config, include_id: false do |container_config|%>
38
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 %>
@@ -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
  <% volume_rootfs = f.object.respond_to?(:rootfs?) && f.object.rootfs? %>
19
+ <% type = f.object.respond_to?(:storage_type) && f.object.storage_type %>
19
20
 
20
21
  <% unless volume_rootfs %>
21
- <%= remove_child_link('X', f, { :method => :'_delete', :title => local_assigns[:remove_title], :class => 'label label-danger' }) %>
22
+ <%= remove_child_link_typed('X', f, type, { :method => :'_delete', :title => local_assigns[:remove_title], :class => 'label label-danger' }) %>
22
23
  <% end %>
23
24
  <% else %>
24
25
  <% if new_vm %>
@@ -20,14 +20,15 @@ along with ForemanFogProxmox. If not, see <http://www.gnu.org/licenses/>. %>
20
20
 
21
21
  <%= field_set_tag _("Nic"), :id => "container_network_#{index}", :style => ('display: none;' unless container), :disabled => !container do %>
22
22
  <%= f.hidden_field :id if !new_vm %>
23
- <%= text_f f, :name, :label => _('Name'), :label_size => "col-md-2" %>
24
- <%= checkbox_f f, :dhcpv4, :label => _('DHCP IPv4') %>
25
- <%= text_f f, :cidrv4_prefix, :label => _('CIDR IPv4 prefix'), :label_size => "col-md-2" %>
26
- <%= text_f f, :gwv4, :label => _('Gateway IPv4'), :label_size => "col-md-2" %>
27
- <%= checkbox_f f, :dhcpv6, :label => _('DHCP IPv6') %>
28
- <%= text_f f, :cidrv6_prefix, :label => _('CIDR IPv6 prefix'), :label_size => "col-md-2" %>
29
- <%= text_f f, :gwv6, :label => _('Gateway IPv6'), :label_size => "col-md-2" %>
23
+ <%= text_f f, :name, :label => _('Name'), :label_size => "col-md-2", :required => true, :label_help => _("eth[n] with n integer >= 0, e.g. eth0") %>
24
+ <%= checkbox_f f, :dhcp, :label => _('DHCP IPv4') %>
25
+ <%= text_f f, :cidr, :label => _('CIDR IPv4'), :label_size => "col-md-2", :label_help => _("integer within [0..32]") %>
26
+ <%= text_f f, :gw, :label => _('Gateway IPv4'), :label_size => "col-md-2" %>
27
+ <%= checkbox_f f, :dhcp6, :label => _('DHCP IPv6') %>
28
+ <%= text_f f, :cidr6, :label => _('CIDR IPv6'), :label_size => "col-md-2", :label_help => _("integer within [0..128]")%>
29
+ <%= text_f f, :gw6, :label => _('Gateway IPv6'), :label_size => "col-md-2" %>
30
30
  <%= counter_f f, :tag, :class => "input-mini", :label => _('VLAN tag'), :label_size => "col-md-2" %>
31
31
  <%= counter_f f, :rate, :class => "input-mini", :label => _('Rate limit'), :label_size => "col-md-2" %>
32
+ <%= checkbox_f f, :firewall, :label => _('Firewall') %>
32
33
  <%= select_f f, :bridge, compute_resource.bridges(node_id), :iface, :iface, { }, :label => _('Bridge'), :label_size => "col-md-2" %>
33
34
  <% end %>
@@ -24,8 +24,6 @@ along with ForemanFogProxmox. If not, see <http://www.gnu.org/licenses/>. %>
24
24
  <%= check_box_tag 'show_server_config_cpu', '1', false, :onclick => "$('#server_config_cpu').toggle()" %>
25
25
  <%= label_tag 'show_server_config_memory', _("Memory") %>
26
26
  <%= check_box_tag 'show_server_config_memory', '1', false, :onclick => "$('#server_config_memory').toggle()" %>
27
- <%= label_tag 'show_server_config_cdrom', _("CDROM") %>
28
- <%= check_box_tag 'show_server_config_cdrom', '1', false, :onclick => "$('#server_config_cdrom').toggle()" %>
29
27
  <%= label_tag 'show_server_config_os', _("OS") %>
30
28
  <%= check_box_tag 'show_server_config_os', '1', false, :onclick => "$('#server_config_os').toggle()" %>
31
29
  <% end %>
@@ -18,19 +18,19 @@ along with ForemanFogProxmox. If not, see <http://www.gnu.org/licenses/>. %>
18
18
  <%= javascript_include_tag 'foreman_fog_proxmox/proxmox_vm_server', "data-turbolinks-track" => true %>
19
19
 
20
20
  <% server = type == 'qemu' %>
21
+ <% logger.debug("_config.html.erb server_config=#{f.object.inspect}") %>
21
22
 
22
23
  <%= field_set_tag n_("Main option", "Main options", 2), :id => "server_config_options", :class => 'hide', :disabled => !server do %>
23
24
  <%= textarea_f f, :description, :label => _('Description'), :label_size => "col-md-2" %>
24
- <%= text_f f, :boot, :label => _('Boot device order'), :label_size => "col-md-2", :label_help => _('Floppy disk (a), hard disk (c), cdrom (d), network (n). Default cdn') %>
25
+ <%= text_f f, :boot, :label => _('Boot device order'), :label_size => "col-md-2", :label_help => _('Order your devices, e.g. order=net0;ide2;scsi0. Default empty (any)') %>
25
26
  <%= checkbox_f f, :onboot, :label => _('Start at boot') %>
26
27
  <%= checkbox_f f, :agent, :label => _('Qemu Agent') %>
27
28
  <%= checkbox_f f, :kvm, :label => _('KVM'), :label_help => _('Enable/disable KVM hardware virtualization') %>
28
- <%= select_f f, :keyboard, proxmox_keyboards_map, :id, :name, { }, :label => _('Keyboard'), :label_size => "col-md-2" %>
29
29
  <%= select_f f, :vga, proxmox_vgas_map, :id, :name, { :include_blank => true }, :label => _('VGA'), :label_size => "col-md-2" %>
30
30
  <%= select_f f, :scsihw, proxmox_scsi_controllers_map, :id, :name, { }, :label => _('SCSI Controller'), :label_size => "col-md-2" %>
31
31
  <%= select_f f, :bios, proxmox_bios_map, :id, :name, { }, :label => _('BIOS'), :label_size => "col-md-2" %>
32
32
  <% end %>
33
- <%= field_set_tag _("CPU"), :id => "server_config_cpu", :class => 'hide', :disabled => !server do %>
33
+ <%= field_set_tag _("CPUs"), :id => "server_config_cpu", :class => 'hide', :disabled => !server do %>
34
34
  <%= select_f f, :cpu_type, proxmox_cpus_map, :id, :name, { }, :label => _('Type'), :label_size => "col-md-2" %>
35
35
  <%= counter_f f, :sockets, :class => "input-mini", :label => _('Sockets'), :label_size => "col-md-2" %>
36
36
  <%= counter_f f, :cores, :class => "input-mini", :label => _('Cores'), :label_size => "col-md-2" %>
@@ -38,23 +38,24 @@ along with ForemanFogProxmox. If not, see <http://www.gnu.org/licenses/>. %>
38
38
  <%= counter_f f, :cpulimit, :class => "input-mini", :label => _('CPU limit'), :label_size => "col-md-2" %>
39
39
  <%= counter_f f, :cpuunits, :class => "input-mini", :label => _('CPU units'), :label_size => "col-md-2" %>
40
40
  <%= checkbox_f f, :numa, :label => _('Enable NUMA') %>
41
- <%= checkbox_f f, :pcid, :label => _('PCID') %>
42
- <%= checkbox_f f, :spectre, :label => _('Spectre-CTRL') %>
41
+ <%= field_set_tag _("CPU Flags"), :id => "server_config_cpu_flags" do %>
42
+ <% Fog::Proxmox::CpuHelper.flags.each do |flag_key, flag_value| %>
43
+ <%= select_f f, flag_key, proxmox_cpu_flags_map, :id, :name, { }, :label => _(flag_value) %>
44
+ <% end %>
45
+ <% end %>
43
46
  <% end %>
44
47
  <%= field_set_tag _("Memory"), :id => "server_config_memory", :class => 'hide', :disabled => !server do %>
45
48
  <%= byte_size_f f, :memory, :class => "input-mini", :label => _('Memory'), :label_size => "col-md-2" %>
46
49
  <%= byte_size_f f, :balloon, :class => "input-mini", :label => _('Minimum memory'), :label_size => "col-md-2" %>
47
50
  <%= counter_f f, :shares, :class => "input-mini", :label => _('Shares'), :label_size => "col-md-2" %>
48
51
  <% end %>
49
- <%= field_set_tag _("CD-ROM"), :id => "server_config_cdrom", :class => 'hide', :disabled => !server do %>
50
- <%= radio_button_f f, :cdrom, :value => 'none', :text => _('None'), :onclick => 'cdromSelected(this)' %>
51
- <%= radio_button_f f, :cdrom, :value => 'cdrom' , :text => _('Physical'), :onclick => 'cdromSelected(this)' %>
52
- <%= radio_button_f f, :cdrom, :value => 'image' , :text => _('Image'), :onclick => 'cdromSelected(this)' %>
53
- <div id='cdrom_image_form' class='<%= 'hide' if %[none cdrom].include? f.object.cdrom %>'>
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
- <%= 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
- </div>
57
- <% end %>
58
52
  <%= field_set_tag _("Operating System"), :id => "server_config_os", :class => 'hide', :disabled => !server do %>
59
53
  <%= select_f f, :ostype, proxmox_operating_systems_map, :id, :name, { :include_blank => true }, :label => _('OS type'), :label_size => "col-md-2" %>
54
+ <% end %>
55
+ <%= field_set_tag _("Cloud-init"), :id => "server_config_cloud_init", :class => ('hide' unless cloudinit), :disabled => (!cloudinit) do %>
56
+ <%= text_f f, :ciuser, :label => _('User'), :label_size => "col-md-2" %>
57
+ <%= text_f f, :cipassword, :label => _('Password'), :label_size => "col-md-2" %>
58
+ <%= text_f f, :searchdomain, :label => _('DNS domain'), :label_size => "col-md-2" %>
59
+ <%= text_f f, :nameserver, :label => _('DNS servers'), :label_size => "col-md-2" %>
60
+ <%= textarea_f f, :sshkeys, :label => _("SSH public key"), :size => "col-md-4" %>
60
61
  <% end %>
@@ -25,6 +25,6 @@ along with ForemanFogProxmox. If not, see <http://www.gnu.org/licenses/>. %>
25
25
  <%= counter_f f, :tag, :class => "input-mini", :label => _('VLAN tag'), :label_size => "col-md-2" %>
26
26
  <%= counter_f f, :rate, :class => "input-mini", :label => _('Rate limit'), :label_size => "col-md-2" %>
27
27
  <%= counter_f f, :queues, :class => "input-mini", :label => _('Multiqueue'), :label_size => "col-md-2" %>
28
- <%= checkbox_f f, :firewall, :label => _('Firewall') %>
29
- <%= checkbox_f f, :link_down, :label => _('Disconnect') %>
28
+ <%= checkbox_f f, :firewall, { :label => _('Firewall') }, '1', '0' %>
29
+ <%= checkbox_f f, :link_down, { :label => _('Disconnect') }, '1', '0' %>
30
30
  <% end %>
@@ -0,0 +1,34 @@
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
+ <%= javascript_include_tag 'foreman_fog_proxmox/proxmox_volume_cdrom', "data-turbolinks-track" => true %>
19
+
20
+ <% cdrom = f.object.cdrom? %>
21
+ <% new_volume = f.object.volid.nil? %>
22
+
23
+ <%= field_set_tag _("CD-ROM"), :id => "server_volume_cdrom_#{f.index}", :class => ('hide' unless cdrom), :disabled => !cdrom do %>
24
+ <%= field_set_tag _("Media"), :id => "cdrom_media_form_#{f.index}" do %>
25
+ <%= f.hidden_field :storage_type %>
26
+ <%= radio_button_f f, :cdrom, :value => 'none', :text => _('None'), :onclick => 'cdromSelected(this)' %>
27
+ <%= radio_button_f f, :cdrom, :value => 'cdrom' , :text => _('Physical'), :onclick => 'cdromSelected(this)' %>
28
+ <%= radio_button_f f, :cdrom, :value => 'image' , :text => _('Image'), :onclick => 'cdromSelected(this)' %>
29
+ <% end %>
30
+ <%= field_set_tag _("Image"), :id => "cdrom_image_form_#{f.index}", :class => ('hide' unless %[image].include? f.object.cdrom), :disabled => (%[cdrom none].include? f.object.cdrom) do %>
31
+ <%= select_f f, :storage, compute_resource.storages(node_id,'iso'), :storage, :storage, { :include_blank => true }, :label => _('Storage'), :label_size => "col-md-2", :onchange => 'storageIsoSelected(this)' %>
32
+ <%= select_f f, :volid, compute_resource.images_by_storage(node_id, f.object.storage, 'iso'), :volid, :volid, { :include_blank => true }, :label => _('Image ISO'), :label_size => "col-md-2" %>
33
+ <% end %>
34
+ <% end %>
@@ -0,0 +1,29 @@
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
+ <%= javascript_include_tag 'foreman_fog_proxmox/proxmox_volume_cloudinit', "data-turbolinks-track" => true %>
19
+
20
+ <% cloud_init = f.object.cloud_init? %>
21
+ <% new_volume = f.object.volid.nil? %>
22
+
23
+ <%= field_set_tag _("Cloud-init"), :id => "server_volume_cloud_init_#{f.index}", :class => ('hide' unless cloud_init), :disabled => !cloud_init do %>
24
+ <%= f.hidden_field :volid if !new_volume %>
25
+ <%= f.hidden_field :storage_type %>
26
+ <%= select_f f, :storage, compute_resource.storages(node_id), :storage, :storage, { :include_blank => true }, :label => _('Storage'), :label_size => "col-md-2", :disabled => !new_volume %>
27
+ <%= select_f f, :controller, proxmox_controllers_cloudinit_map, :id, :name, { :include_blank => true }, :label => _('Controller'), :label_size => "col-md-2", :onchange => 'cloudinitControllerSelected(this)', :disabled => !new_volume %>
28
+ <%= text_f f, :device, :label => _('Device'), :label_size => "col-md-2", :'data-min' => 0, :'data-soft-max' => proxmox_max_device(f.object.controller), :disabled => !new_volume %>
29
+ <% end %>
@@ -15,11 +15,15 @@ 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
+ <% hard_disk = f.object.hard_disk? %>
19
+ <% logger.debug("_volume_hard_disk.html f.object=#{f.object.inspect}") %>
20
+ <% logger.debug("_volume_hard_disk.html f.object.hard_disk?=#{f.object.hard_disk?}") %>
21
+ <% logger.debug("_volume_hard_disk.html f.object.storage_type=#{f.object.storage_type}") %>
19
22
  <% new_volume = f.object.volid.nil? %>
20
23
 
21
- <%= field_set_tag _("Disk"), :id => "server_volume_#{f.index}", :class => ('hide' unless server), :disabled => !server do %>
22
- <%= f.hidden_field :volid if !new_vm %>
24
+ <%= field_set_tag _('Hard disk'), :id => "server_volume_hard_disk_#{f.index}", :class => ('hide' unless hard_disk), :disabled => !hard_disk do %>
25
+ <%= f.hidden_field :volid if !new_volume %>
26
+ <%= f.hidden_field :storage_type %>
23
27
  <%= select_f f, :storage, compute_resource.storages(node_id), :storage, :storage, { }, :label => _('Storage'), :label_size => "col-md-2" %>
24
28
  <%= select_f f, :controller, proxmox_controllers_map, :id, :name, { }, :label => _('Controller'), :label_size => "col-md-2", :disabled => !new_volume, :onchange => 'controllerSelected(this)' %>
25
29
  <%= text_f f, :device, :label => _('Device'), :label_size => "col-md-2", :disabled => !new_volume, :'data-min' => 0, :'data-soft-max' => proxmox_max_device(f.object.controller), :onchange => 'deviceSelected(this)' %>
@@ -30,6 +30,8 @@ along with ForemanFogProxmox. If not, see <http://www.gnu.org/licenses/>. %>
30
30
  <%= prop :memory %>
31
31
  <% unless @vm.container? %>
32
32
  <%= prop :vga %>
33
+ <%= prop :cloud_init? %>
34
+ <%= prop :cdrom? %>
33
35
  <% end %>
34
36
  <%= prop :cpus %>
35
37
  <%= prop :uptime %>
@@ -84,18 +84,17 @@ module ForemanFogProxmox
84
84
  end
85
85
 
86
86
  config.to_prepare do
87
- require 'fog/compute/proxmox/models/server'
88
- require 'fog/compute/proxmox/models/server_config'
89
- require 'fog/compute/proxmox/models/disk'
90
- require 'fog/compute/proxmox/models/interface'
91
- require 'fog/compute/proxmox/models/volume'
92
- require 'fog/compute/proxmox/models/node'
87
+ require 'fog/proxmox/compute/models/server'
88
+ require 'fog/proxmox/compute/models/server_config'
89
+ require 'fog/proxmox/compute/models/disk'
90
+ require 'fog/proxmox/compute/models/interface'
91
+ require 'fog/proxmox/compute/models/volume'
92
+ require 'fog/proxmox/compute/models/node'
93
93
 
94
94
  Fog::Proxmox::Compute::Server.include FogExtensions::Proxmox::Server
95
95
  Fog::Proxmox::Compute::ServerConfig.include FogExtensions::Proxmox::ServerConfig
96
- Fog::Proxmox::Compute::Disk.include FogExtensions::Proxmox::Disk
97
96
  Fog::Proxmox::Compute::Interface.include FogExtensions::Proxmox::Interface
98
- Fog::Proxmox::Compute::Volume.include FogExtensions::Proxmox::Volume
97
+ Fog::Proxmox::Compute::Disk.include FogExtensions::Proxmox::Disk
99
98
  ::ComputeResourcesController.include ForemanFogProxmox::Controller::Parameters::ComputeResource
100
99
  Fog::Proxmox::Compute::Node.include FogExtensions::Proxmox::Node
101
100
  ::Host::Managed.include Orchestration::Proxmox::Compute
@@ -0,0 +1,69 @@
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
+ require 'foreman_fog_proxmox/value'
21
+
22
+ module ForemanFogProxmox
23
+ module HashCollection
24
+ def self.add_and_format_element(dest, dest_key, origin, origin_key, format = :to_s)
25
+ dest[dest_key] = origin[origin_key].send(format) if origin && origin[origin_key]
26
+ end
27
+
28
+ def self.remove_empty_values(h)
29
+ h.delete_if { |_key, value| ForemanFogProxmox::Value.empty?(value) }
30
+ end
31
+
32
+ def self.remove_keys(h, excluded_keys)
33
+ h.delete_if { |key, _value| excluded_keys.include?(key) }
34
+ end
35
+
36
+ def self.new_hash_reject_keys(h, excluded_keys)
37
+ h.reject { |key, _value| excluded_keys.include?(key) }
38
+ end
39
+
40
+ def self.new_hash_reject_empty_values(h)
41
+ h.reject { |_key, value| ForemanFogProxmox::Value.empty?(value) }
42
+ end
43
+
44
+ def self.new_hash_transform_values(h, transformation)
45
+ h.transform_values { |value| value.send(transformation) }
46
+ end
47
+
48
+ def self.equals?(h1, h2)
49
+ new_h1 = new_hash_transform_values(h1, :to_s)
50
+ new_sorted_h1 = new_h1.sort_by { |key, _value| key }.to_h
51
+ new_h2 = new_hash_transform_values(h2, :to_s)
52
+ new_sorted_h2 = new_h2.sort_by { |key, _value| key }.to_h
53
+ new_sorted_h1.keys == new_sorted_h2.keys && new_sorted_h1.values == new_sorted_h2.values
54
+ end
55
+
56
+ def self.stringify_keys(old_h)
57
+ h = old_h.map do |k, v|
58
+ v_str = if v.instance_of? Hash
59
+ v.stringify_keys
60
+ else
61
+ v
62
+ end
63
+
64
+ [k.to_s, v_str]
65
+ end
66
+ Hash[h]
67
+ end
68
+ end
69
+ end