foreman_fog_proxmox 0.7.0 → 0.8.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.
- checksums.yaml +4 -4
- data/README.md +5 -4
- data/app/assets/javascripts/foreman_fog_proxmox/proxmox_compute_resource.js +12 -5
- data/app/assets/javascripts/foreman_fog_proxmox/proxmox_vm_server.js +33 -14
- data/app/helpers/proxmox_container_helper.rb +32 -38
- data/app/helpers/proxmox_server_helper.rb +34 -39
- data/app/helpers/proxmox_vm_helper.rb +1 -20
- data/app/models/concerns/fog_extensions/proxmox/interface.rb +29 -0
- data/app/models/concerns/fog_extensions/proxmox/node.rb +13 -0
- data/app/models/concerns/fog_extensions/proxmox/server.rb +4 -1
- data/app/models/concerns/host_ext/proxmox/interfaces.rb +37 -0
- data/app/models/concerns/orchestration/proxmox/compute.rb +38 -0
- data/app/models/foreman_fog_proxmox/proxmox.rb +71 -36
- data/app/overrides/compute_resources_vms/form/remove_new_vm_from_removable_layout.rb +24 -0
- data/app/views/compute_resources/form/_proxmox.html.erb +1 -1
- data/app/views/compute_resources_vms/form/proxmox/_add_vm_type_to_networks_form.html.erb +0 -1
- data/app/views/compute_resources_vms/form/proxmox/_add_vm_type_to_networks_new_childs_form.html.erb +0 -1
- data/app/views/compute_resources_vms/form/proxmox/_add_vm_type_to_nic_provider_specific_form.html.erb +0 -1
- data/app/views/compute_resources_vms/form/proxmox/_add_vm_type_to_volumes_edit.html.erb +3 -6
- data/app/views/compute_resources_vms/form/proxmox/_removable_layout.html.erb +22 -0
- data/app/views/compute_resources_vms/form/proxmox/container/_network.html.erb +2 -1
- data/app/views/compute_resources_vms/form/proxmox/container/_volume_mp.html.erb +6 -5
- data/app/views/compute_resources_vms/form/proxmox/container/_volume_rootfs.html.erb +3 -3
- data/app/views/compute_resources_vms/form/proxmox/server/_network.html.erb +2 -1
- data/app/views/compute_resources_vms/form/proxmox/server/_volume.html.erb +5 -4
- data/app/views/compute_resources_vms/show/_proxmox.html.erb +1 -1
- data/lib/foreman_fog_proxmox/engine.rb +4 -0
- data/lib/foreman_fog_proxmox/version.rb +1 -1
- data/test/unit/foreman_fog_proxmox/helpers/proxmox_container_helper_test.rb +28 -29
- data/test/unit/foreman_fog_proxmox/helpers/proxmox_server_helper_test.rb +28 -27
- data/test/unit/foreman_fog_proxmox/helpers/proxmox_vm_helper_test.rb +0 -25
- data/test/unit/foreman_fog_proxmox/proxmox_test.rb +215 -5
- data/test/unit/foreman_fog_proxmox/proxmox_test_helpers.rb +10 -2
- metadata +9 -4
@@ -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 HostExt::Proxmox::Interfaces
|
21
|
+
extend ActiveSupport::Concern
|
22
|
+
def update(attributes = {})
|
23
|
+
add_interfaces_to_compute_attributes(attributes)
|
24
|
+
super(attributes)
|
25
|
+
end
|
26
|
+
def add_interfaces_to_compute_attributes(attributes)
|
27
|
+
attributes['compute_attributes']['interfaces_attributes'] = {}
|
28
|
+
attributes['interfaces_attributes'].each { |index,interface_attributes| add_interface_to_compute_attributes(index,interface_attributes,attributes['compute_attributes']['interfaces_attributes']) }
|
29
|
+
end
|
30
|
+
def add_interface_to_compute_attributes(index,interface_attributes,compute_attributes)
|
31
|
+
compute_attributes[index] = {}
|
32
|
+
compute_attributes[index].store('id',interface_attributes['identifier'])
|
33
|
+
compute_attributes[index].store('_delete',interface_attributes['_destroy'])
|
34
|
+
compute_attributes[index].store('macaddr',interface_attributes['mac'])
|
35
|
+
compute_attributes[index].merge!(interface_attributes['compute_attributes'].reject { |k,_v| k == 'id' })
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,38 @@
|
|
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 Orchestration::Proxmox::Compute
|
21
|
+
extend ActiveSupport::Concern
|
22
|
+
|
23
|
+
def setComputeUpdate
|
24
|
+
logger.info "Update Proxmox Compute instance for #{name}"
|
25
|
+
final_compute_attributes = compute_attributes.merge(compute_resource.host_compute_attrs(self))
|
26
|
+
compute_resource.save_vm uuid, final_compute_attributes
|
27
|
+
rescue => e
|
28
|
+
failure _("Failed to update a compute %{compute_resource} instance %{name}: %{e}") % { :compute_resource => compute_resource, :name => name, :e => e }, e
|
29
|
+
end
|
30
|
+
|
31
|
+
def delComputeUpdate
|
32
|
+
logger.info "Undo Update Proxmox Compute instance for #{name}"
|
33
|
+
final_compute_attributes = old.compute_attributes.merge(compute_resource.host_compute_attrs(old))
|
34
|
+
compute_resource.save_vm uuid, final_compute_attributes
|
35
|
+
rescue => e
|
36
|
+
failure _("Failed to undo update compute %{compute_resource} instance %{name}: %{e}") % { :compute_resource => compute_resource, :name => name, :e => e }, e
|
37
|
+
end
|
38
|
+
end
|
@@ -18,7 +18,10 @@
|
|
18
18
|
# along with ForemanFogProxmox. If not, see <http://www.gnu.org/licenses/>.
|
19
19
|
|
20
20
|
require 'fog/proxmox'
|
21
|
+
require 'fog/proxmox/helpers/nic_helper'
|
22
|
+
require 'fog/proxmox/helpers/disk_helper'
|
21
23
|
require 'foreman_fog_proxmox/semver'
|
24
|
+
require 'foreman_fog_proxmox/value'
|
22
25
|
|
23
26
|
module ForemanFogProxmox
|
24
27
|
class Proxmox < ComputeResource
|
@@ -42,7 +45,7 @@ module ForemanFogProxmox
|
|
42
45
|
end
|
43
46
|
|
44
47
|
def capabilities
|
45
|
-
[:build, :new_volume, :image]
|
48
|
+
[:build, :new_volume, :new_interface, :image]
|
46
49
|
end
|
47
50
|
|
48
51
|
def self.model_name
|
@@ -65,7 +68,11 @@ module ForemanFogProxmox
|
|
65
68
|
version_suitable?
|
66
69
|
rescue => e
|
67
70
|
errors[:base] << e.message
|
68
|
-
|
71
|
+
if e.message.include?('SSL')
|
72
|
+
errors[:ssl_certs] << e.message
|
73
|
+
else
|
74
|
+
errors[:url] << e.message
|
75
|
+
end
|
69
76
|
end
|
70
77
|
|
71
78
|
def nodes
|
@@ -129,12 +136,17 @@ module ForemanFogProxmox
|
|
129
136
|
host.interfaces.select(&:physical?).each.with_index.reduce({}) do |hash, (nic, index)|
|
130
137
|
# Set default interface identifier to net[n]
|
131
138
|
nic.identifier = "net%{index}" % {index: index} if nic.identifier.empty?
|
132
|
-
raise ::Foreman::Exception.new _("Invalid identifier interface[%{index}]. Must be net[n] with n integer >= 0" % { index: index }) unless Fog::Proxmox::NicHelper.
|
139
|
+
raise ::Foreman::Exception.new _("Invalid identifier interface[%{index}]. Must be net[n] with n integer >= 0" % { index: index }) unless Fog::Proxmox::NicHelper.nic?(nic.identifier)
|
133
140
|
# Set default container interface name to eth[n]
|
134
141
|
container = host.compute_attributes['type'] == 'lxc'
|
135
142
|
nic.compute_attributes['name'] = "eth%{index}" % {index: index} if container && nic.compute_attributes['name'].empty?
|
136
143
|
raise ::Foreman::Exception.new _("Invalid name interface[%{index}]. Must be eth[n] with n integer >= 0" % { index: index }) if container && !/^(eth)(\d+)$/.match?(nic.compute_attributes['name'])
|
137
144
|
nic_compute_attributes = nic.compute_attributes.merge(id: nic.identifier)
|
145
|
+
mac = nic.mac
|
146
|
+
mac = nic.attributes['mac'] unless mac
|
147
|
+
nic_compute_attributes.store(:macaddr, mac) if (mac && !mac.empty?)
|
148
|
+
interface_compute_attributes = host.compute_attributes['interfaces_attributes'].select { |_k,v| v['id'] == nic.identifier }
|
149
|
+
nic_compute_attributes.store(:_delete, interface_compute_attributes[interface_compute_attributes.keys[0]]['_delete']) unless interface_compute_attributes.empty?
|
138
150
|
nic_compute_attributes.store(:ip, nic.ip) if (nic.ip && !nic.ip.empty?)
|
139
151
|
nic_compute_attributes.store(:ip6, nic.ip6) if (nic.ip6 && !nic.ip6.empty?)
|
140
152
|
hash.merge(index.to_s => nic_compute_attributes)
|
@@ -187,35 +199,17 @@ module ForemanFogProxmox
|
|
187
199
|
Fog::Proxmox::Compute::Interface.new(opts)
|
188
200
|
end
|
189
201
|
|
190
|
-
# used by host.clone
|
191
202
|
def vm_compute_attributes(vm)
|
192
|
-
vm_attrs =
|
193
|
-
vm_attrs = set_vm_config_attributes(vm, vm_attrs)
|
194
|
-
vm_attrs = set_vm_volumes_attributes(vm, vm_attrs)
|
195
|
-
vm_attrs = set_vm_interfaces_attributes(vm, vm_attrs)
|
196
|
-
vm_attrs
|
197
|
-
end
|
198
|
-
|
199
|
-
def set_vm_config_attributes(vm, vm_attrs)
|
203
|
+
vm_attrs = {}
|
200
204
|
if vm.respond_to?(:config)
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
volumes = vm.config.disks || []
|
210
|
-
vm_attrs[:volumes_attributes] = Hash[volumes.each_with_index.map { |volume, idx| [idx.to_s, volume.attributes] }]
|
211
|
-
end
|
212
|
-
vm_attrs
|
213
|
-
end
|
214
|
-
|
215
|
-
def set_vm_interfaces_attributes(vm, vm_attrs)
|
216
|
-
if vm.config.respond_to?(:interfaces)
|
217
|
-
interfaces = vm.config.interfaces || []
|
218
|
-
vm_attrs[:interfaces_attributes] = Hash[interfaces.each_with_index.map { |interface, idx| [idx.to_s, interface.attributes] }]
|
205
|
+
vm_attrs = vm_attrs.merge(vmid: vm.identity, node_id: vm.node_id, type: vm.type)
|
206
|
+
if vm.config.respond_to?(:disks)
|
207
|
+
vm_attrs[:volumes_attributes] = Hash[vm.config.disks.each_with_index.map { |disk, idx| [idx.to_s, disk.attributes] }]
|
208
|
+
end
|
209
|
+
if vm.config.respond_to?(:interfaces)
|
210
|
+
vm_attrs[:interfaces_attributes] = Hash[vm.config.interfaces.each_with_index.map { |interface, idx| [idx.to_s, interface.attributes] }]
|
211
|
+
end
|
212
|
+
vm_attrs[:config_attributes] = vm.config.attributes.reject { |key,value| [:disks, :interfaces, :vmid, :node_id, :node, :type].include?(key) || !vm.config.respond_to?(key) || ForemanFogProxmox::Value.empty?(value.to_s) || Fog::Proxmox::DiskHelper.disk?(key.to_s) || Fog::Proxmox::NicHelper.nic?(key.to_s) }
|
219
213
|
end
|
220
214
|
vm_attrs
|
221
215
|
end
|
@@ -239,15 +233,19 @@ module ForemanFogProxmox
|
|
239
233
|
end
|
240
234
|
|
241
235
|
def new_container_vm(new_attr = {})
|
242
|
-
new_attr
|
243
|
-
|
236
|
+
options = new_attr
|
237
|
+
options = options.merge(node_id: node_id).merge(type: 'lxc').merge(vmid: next_vmid)
|
238
|
+
options= vm_container_instance_defaults.merge(options) if new_attr.empty?
|
239
|
+
vm = node.containers.new(parse_container_vm(options).deep_symbolize_keys)
|
244
240
|
logger.debug(_("new_container_vm() vm.config=%{config}") % { config: vm.config.inspect })
|
245
241
|
vm
|
246
242
|
end
|
247
243
|
|
248
244
|
def new_server_vm(new_attr = {})
|
249
|
-
new_attr
|
250
|
-
|
245
|
+
options = new_attr
|
246
|
+
options = options.merge(node_id: node_id).merge(type: 'qemu').merge(vmid: next_vmid)
|
247
|
+
options = vm_server_instance_defaults.merge(options) if new_attr.empty?
|
248
|
+
vm = node.servers.new(parse_server_vm(options).deep_symbolize_keys)
|
251
249
|
logger.debug(_("new_server_vm() vm.config=%{config}") % { config: vm.config.inspect })
|
252
250
|
vm
|
253
251
|
end
|
@@ -331,14 +329,51 @@ module ForemanFogProxmox
|
|
331
329
|
!find_vm_by_uuid(image).nil?
|
332
330
|
end
|
333
331
|
|
332
|
+
def save_volumes(vm, volumes_attributes)
|
333
|
+
if volumes_attributes
|
334
|
+
volumes_attributes.each_value do |volume_attributes|
|
335
|
+
id = volume_attributes['id']
|
336
|
+
disk = vm.config.disks.get(id)
|
337
|
+
delete = volume_attributes['_delete']
|
338
|
+
if disk
|
339
|
+
if delete == '1'
|
340
|
+
vm.detach(id)
|
341
|
+
device = Fog::Proxmox::DiskHelper.extract_device(id)
|
342
|
+
vm.detach('unused' + device.to_s)
|
343
|
+
else
|
344
|
+
diff_size = volume_attributes['size'].to_i - disk.size
|
345
|
+
raise ::Foreman::Exception.new(_("Unable to shrink %{id} size. Proxmox allows only increasing size.") % { id: id }) unless diff_size >= 0
|
346
|
+
if diff_size > 0
|
347
|
+
extension = '+' + (diff_size / GIGA).to_s + 'G'
|
348
|
+
vm.extend(id,extension)
|
349
|
+
elsif disk.storage != volume_attributes['storage']
|
350
|
+
vm.move(id,volume_attributes['storage'])
|
351
|
+
end
|
352
|
+
end
|
353
|
+
else
|
354
|
+
options = {}
|
355
|
+
options.store(:mp, volume_attributes['mp']) if vm.container?
|
356
|
+
disk_attributes = { id: id, storage: volume_attributes['storage'], size: (volume_attributes['size'].to_i / GIGA).to_s }
|
357
|
+
vm.attach(disk_attributes, options) unless delete == '1'
|
358
|
+
end
|
359
|
+
end
|
360
|
+
end
|
361
|
+
end
|
362
|
+
|
334
363
|
def save_vm(uuid, new_attributes)
|
335
364
|
vm = find_vm_by_uuid(uuid)
|
336
|
-
templated = new_attributes[
|
365
|
+
templated = new_attributes['templated']
|
337
366
|
if (templated == '1' && !vm.templated?)
|
338
367
|
vm.create_template
|
339
368
|
else
|
369
|
+
volumes_attributes = new_attributes['volumes_attributes']
|
370
|
+
save_volumes(vm, volumes_attributes)
|
340
371
|
parsed_attr = vm.container? ? parse_container_vm(new_attributes.merge(type: vm.type)) : parse_server_vm(new_attributes.merge(type: vm.type))
|
341
|
-
|
372
|
+
config_attributes = parsed_attr.reject { |key,_value| [:templated,:ostemplate,:ostemplate_file,:ostemplate_storage,:volumes_attributes].include? key.to_sym }
|
373
|
+
config_attributes = config_attributes.reject { |_key,value| ForemanFogProxmox::Value.empty?(value) }
|
374
|
+
cdrom_attributes = parsed_attr.select { |_key,value| Fog::Proxmox::DiskHelper.cdrom?(value.to_s) }
|
375
|
+
config_attributes = config_attributes.reject { |key,_value| Fog::Proxmox::DiskHelper.disk?(key) }
|
376
|
+
vm.update(config_attributes.merge(cdrom_attributes))
|
342
377
|
end
|
343
378
|
vm = find_vm_by_uuid(uuid)
|
344
379
|
end
|
@@ -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
|
+
|
18
|
+
Deface::Override.new(
|
19
|
+
:virtual_path => "compute_resources_vms/form/_removable_layout",
|
20
|
+
:name => "remove_new_vm_from_removable_layout",
|
21
|
+
:replace_contents => "div.remove-button",
|
22
|
+
:partial => "compute_resources_vms/form/proxmox/removable_layout",
|
23
|
+
:original => "8b7383e57fbe158fc12bf8bc1003431f2f2cb6f5"
|
24
|
+
)
|
@@ -22,7 +22,7 @@ along with ForemanFogProxmox. If not, see <http://www.gnu.org/licenses/>. %>
|
|
22
22
|
<%= text_f f, :url, :help_block => _("e.g. https://127.0.0.1:8006/api2/json"), :help_inline_permanent => load_button_f(f, !!nodes, _("Test failed")) %>
|
23
23
|
<%= text_f f, :user , :help_block => _("e.g. root@pam") %>
|
24
24
|
<%= password_f f, :password, :keep_value => true, :unset => unset_password? %>
|
25
|
-
<%= checkbox_f f, :ssl_verify_peer, :label => _("SSL verify peer"), :
|
25
|
+
<%= checkbox_f f, :ssl_verify_peer, :label => _("SSL verify peer"), :checked_value => '1', :onchange => "sslVerifyPeerSelected()" %>
|
26
26
|
<%= textarea_f f, :ssl_certs, :label => _("X509 Certification Authorities"), :size => "col-md-4",
|
27
27
|
:placeholder => _("Optionally provide a CA, or a correctly ordered CA chain. If left blank, disable ssl_verify_peer.") %>
|
28
28
|
<%= select_f f, :node_id, nodes, :node, :node, { :include_blank => true }, :label => _('Node'), :label_size => "col-md-2", :required => true, :disabled => (node_id != '') %>
|
@@ -16,7 +16,6 @@ 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
|
<% vm_type = f.object.respond_to?('type') ? f.object.type : nil %>
|
19
|
-
<% logger.debug("vm_type=#{vm_type}") %>
|
20
19
|
|
21
20
|
<%= render :partial => provider_partial(compute_resource, 'network'),
|
22
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 },
|
data/app/views/compute_resources_vms/form/proxmox/_add_vm_type_to_networks_new_childs_form.html.erb
CHANGED
@@ -16,7 +16,6 @@ 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
|
<% vm_type = f.object.respond_to?('type') ? f.object.type : nil %>
|
19
|
-
<% logger.debug("vm_type=#{vm_type}") %>
|
20
19
|
|
21
20
|
<%= new_child_fields_template(f, compute_resource.interfaces_attrs_name, {
|
22
21
|
:object => compute_resource.new_interface,
|
@@ -16,7 +16,6 @@ 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
|
<% compute_attributes = f.options[:parent_builder].object.compute_attributes %>
|
18
18
|
<% vm_type = compute_attributes ? compute_attributes['type'] : f.object.type %>
|
19
|
-
<% logger.debug("vm_type=#{vm_type}") %>
|
20
19
|
|
21
20
|
<%= f.fields_for 'compute_attributes', OpenStruct.new(f.object.compute_attributes) do |f| %>
|
22
21
|
<%= 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 %>
|
@@ -35,25 +35,22 @@ along with ForemanFogProxmox. If not, see <http://www.gnu.org/licenses/>. %>
|
|
35
35
|
|
36
36
|
|
37
37
|
<%= f.fields_for :volumes do |i| %>
|
38
|
-
<% if i.object.
|
38
|
+
<% if i.object.rootfs? %>
|
39
39
|
<div id="container_volumes_rootfs" style="<%= 'display: ' + (container ? 'block' : 'none') + ';' %>">
|
40
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
41
|
</div>
|
42
|
-
<% elsif
|
42
|
+
<% elsif i.object.mount_point? %>
|
43
43
|
<div id="container_volumes_mp" style="<%= 'display: ' + (container ? 'block' : 'none') + ';' %>">
|
44
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
45
|
</div>
|
46
|
-
<% elsif
|
46
|
+
<% elsif i.object.controller? %>
|
47
47
|
<div id="server_volumes" style="<%= 'display: ' + (server ? 'block' : 'none') + ';' %>">
|
48
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
49
|
</div>
|
50
50
|
<% end %>
|
51
51
|
<% end %>
|
52
52
|
|
53
|
-
<% if new_vm %>
|
54
53
|
<%= add_child_link_typed '+ ' + _("Add Volume"), :volumes, 'server', { :class => "info #{'hide' unless server}", :title => _('add new storage volume') } %>
|
55
54
|
<%= add_child_link_typed '+ ' + _("Add Volume"), :volumes, 'container', { :class => "info #{'hide' unless container}", :title => _('add new storage volume') } %>
|
56
|
-
<% end %>
|
57
|
-
|
58
55
|
|
59
56
|
|
@@ -0,0 +1,22 @@
|
|
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
|
+
<% volume_rootfs = f.object.respond_to?(:rootfs?) && f.object.rootfs? %>
|
19
|
+
|
20
|
+
<% unless volume_rootfs %>
|
21
|
+
<%= remove_child_link('X', f, { :method => :'_delete', :title => local_assigns[:remove_title], :class => 'label label-danger' }) %>
|
22
|
+
<% end %>
|
@@ -17,7 +17,8 @@ along with ForemanFogProxmox. If not, see <http://www.gnu.org/licenses/>. %>
|
|
17
17
|
|
18
18
|
<% container = type == 'lxc' %>
|
19
19
|
|
20
|
-
<%= field_set_tag _("Nic"), :id => "
|
20
|
+
<%= field_set_tag _("Nic"), :id => "container_network_#{f.index}", :style => ('display: none;' unless container), :disabled => !container do %>
|
21
|
+
<%= f.hidden_field :id if !new_vm %>
|
21
22
|
<%= text_f f, :name, :label => _('Name'), :label_size => "col-md-2" %>
|
22
23
|
<%= counter_f f, :tag, :class => "input-mini", :label => _('VLAN tag'), :label_size => "col-md-2" %>
|
23
24
|
<%= counter_f f, :rate, :class => "input-mini", :label => _('Rate limit'), :label_size => "col-md-2" %>
|
@@ -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 = type == 'lxc' %>
|
19
|
+
<% new_volume = f.object.volid.nil? %>
|
19
20
|
|
20
|
-
<%= field_set_tag _("Mount point"), :id => "
|
21
|
+
<%= field_set_tag _("Mount point"), :id => "container_volume_mp_#{f.index}", :class => ('hide' unless container), :disabled => !container do %>
|
21
22
|
<%= f.hidden_field :volid if !new_vm %>
|
22
|
-
<%= select_f f, :storage, compute_resource.storages, :storage, :storage, { }, :label => _('Storage'), :label_size => "col-md-2"
|
23
|
-
<%= text_f f, :mp, :label => _('Path'), :label_size => "col-md-2", :
|
24
|
-
<%= counter_f f, :device, :label => _('Device'), :label_size => "col-md-2", :class => ('hide' if f.object.rootfs?), :disabled => (!
|
25
|
-
<%= byte_size_f f, :size, :class => "input-mini", :label => _("Size"), :label_size => "col-md-2"
|
23
|
+
<%= select_f f, :storage, compute_resource.storages, :storage, :storage, { }, :label => _('Storage'), :label_size => "col-md-2" %>
|
24
|
+
<%= text_f f, :mp, :label => _('Path'), :label_size => "col-md-2", :required => true, :help_inline => _("e.g. /path/to/") %>
|
25
|
+
<%= counter_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
|
+
<%= byte_size_f f, :size, :class => "input-mini", :label => _("Size"), :label_size => "col-md-2" %>
|
26
27
|
<% end %>
|
@@ -17,8 +17,8 @@ along with ForemanFogProxmox. If not, see <http://www.gnu.org/licenses/>. %>
|
|
17
17
|
|
18
18
|
<% container = type == 'lxc' %>
|
19
19
|
|
20
|
-
<%= field_set_tag _("Rootfs"), :id => "
|
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"
|
23
|
-
<%= byte_size_f f, :size, :class => "input-mini", :label => _("Size"), :label_size => "col-md-2"
|
22
|
+
<%= select_f f, :storage, compute_resource.storages, :storage, :storage, { }, :label => _('Storage'), :label_size => "col-md-2" %>
|
23
|
+
<%= byte_size_f f, :size, :class => "input-mini", :label => _("Size"), :label_size => "col-md-2" %>
|
24
24
|
<% end %>
|
@@ -17,7 +17,8 @@ along with ForemanFogProxmox. If not, see <http://www.gnu.org/licenses/>. %>
|
|
17
17
|
|
18
18
|
<% server = type == 'qemu' %>
|
19
19
|
|
20
|
-
<%= field_set_tag _("Nic"), :id => "
|
20
|
+
<%= field_set_tag _("Nic"), :id => "server_network_#{f.index}", :style => ('display: none;' unless server), :disabled => !server do %>
|
21
|
+
<%= f.hidden_field :id if !new_vm %>
|
21
22
|
<%= select_f f, :model, proxmox_networkcards_map, :id, :name, { }, :label => _('Card'), :label_size => "col-md-2" %>
|
22
23
|
<%= select_f f, :bridge, compute_resource.bridges, :iface, :iface, { }, :label => _('Bridge'), :label_size => "col-md-2" %>
|
23
24
|
<%= counter_f f, :tag, :class => "input-mini", :label => _('VLAN tag'), :label_size => "col-md-2" %>
|
@@ -16,12 +16,13 @@ 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
|
<% server = type == 'qemu' %>
|
19
|
+
<% new_volume = f.object.volid.nil? %>
|
19
20
|
|
20
21
|
<%= field_set_tag _("Disk"), :id => "server_volume_#{f.index}", :class => ('hide' unless server), :disabled => !server do %>
|
21
22
|
<%= f.hidden_field :volid if !new_vm %>
|
22
|
-
<%= select_f f, :storage, compute_resource.storages, :storage, :storage, { }, :label => _('Storage'), :label_size => "col-md-2"
|
23
|
-
<%= select_f f, :controller, proxmox_controllers_map, :id, :name, { }, :label => _('Controller'), :label_size => "col-md-2", :disabled => !
|
24
|
-
<%= counter_f f, :device, :label => _('Device'), :label_size => "col-md-2", :disabled => !
|
23
|
+
<%= select_f f, :storage, compute_resource.storages, :storage, :storage, { }, :label => _('Storage'), :label_size => "col-md-2" %>
|
24
|
+
<%= select_f f, :controller, proxmox_controllers_map, :id, :name, { }, :label => _('Controller'), :label_size => "col-md-2", :disabled => !new_volume, :onchange => 'controllerSelected(this)' %>
|
25
|
+
<%= counter_f f, :device, :label => _('Device'), :label_size => "col-md-2", :disabled => !new_volume, :'data-soft-max' => proxmox_max_device(f.object.controller), :onchange => 'deviceSelected(this)' %>
|
25
26
|
<%= select_f f, :cache, proxmox_caches_map, :id, :name, { }, :label => _('Cache'), :label_size => "col-md-2" %>
|
26
|
-
<%= byte_size_f f, :size, :class => "input-mini", :label => _("Size"), :label_size => "col-md-2"
|
27
|
+
<%= byte_size_f f, :size, :class => "input-mini", :label => _("Size"), :label_size => "col-md-2" %>
|
27
28
|
<% end %>
|
@@ -26,7 +26,6 @@ along with ForemanFogProxmox. If not, see <http://www.gnu.org/licenses/>. %>
|
|
26
26
|
<%= prop :type %>
|
27
27
|
<%= prop :node_id %>
|
28
28
|
<%= prop :templated? %>
|
29
|
-
<%= prop :mac %>
|
30
29
|
<%= prop :memory %>
|
31
30
|
<% unless @vm.container? %>
|
32
31
|
<%= prop :vga %>
|
@@ -36,5 +35,6 @@ along with ForemanFogProxmox. If not, see <http://www.gnu.org/licenses/>. %>
|
|
36
35
|
<%= prop :vmid %>
|
37
36
|
<%= prop :description %>
|
38
37
|
<%= prop :disks %>
|
38
|
+
<%= prop :nics %>
|
39
39
|
</table>
|
40
40
|
</div>
|