foreman_fog_proxmox 0.16.1 → 0.16.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/helpers/proxmox_vm_attrs_helper.rb +2 -2
- data/app/models/foreman_fog_proxmox/proxmox_interfaces.rb +1 -1
- data/app/models/foreman_fog_proxmox/proxmox_volumes.rb +1 -1
- data/app/overrides/compute_resources_vms/form/add_from_profile_to_compute_attributes_form.rb +2 -1
- data/app/overrides/compute_resources_vms/form/update_react_component_to_host_form.rb +2 -1
- data/app/views/compute_resources_vms/form/proxmox/_add_react_component_to_host_form.html.erb +0 -1
- data/app/views/compute_resources_vms/form/proxmox/_update_react_component_to_host_form.html.erb +3 -0
- data/app/views/templates/provisioning/user_data/proxmox_user_data.erb +119 -0
- data/db/seeds.d/71_provisioning_templates.rb +7 -0
- data/lib/foreman_fog_proxmox/version.rb +1 -1
- data/test/unit/foreman_fog_proxmox/proxmox_interfaces_test.rb +2 -2
- data/test/unit/foreman_fog_proxmox/proxmox_vm_commands_server_update_cdrom_test.rb +3 -0
- data/webpack/components/GeneralTabContent.js +3 -3
- data/webpack/components/ProxmoxComputeSelectors.js +64 -20
- data/webpack/components/ProxmoxContainer/MountPoint.js +5 -8
- data/webpack/components/ProxmoxContainer/ProxmoxContainerOptions.js +3 -2
- data/webpack/components/ProxmoxContainer/ProxmoxContainerStorage.js +1 -1
- data/webpack/components/ProxmoxContainer/components/NetworkInterface.js +14 -13
- data/webpack/components/ProxmoxServer/ProxmoxServerHardware.js +22 -22
- data/webpack/components/ProxmoxServer/ProxmoxServerNetwork.js +1 -1
- data/webpack/components/ProxmoxServer/ProxmoxServerOptions.js +3 -3
- data/webpack/components/ProxmoxServer/components/HardDisk.js +13 -5
- data/webpack/components/ProxmoxServer/components/NetworkInterface.js +2 -2
- data/webpack/components/ProxmoxVmType.js +24 -21
- data/webpack/components/common/FormInputs.js +10 -2
- metadata +19 -17
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: af6ccc8c3f032a49324fd0c47999b1b70e768e9dd7b8c1b3893ab518cc1f2d60
|
4
|
+
data.tar.gz: d96cc32fd61acc5ccc76675382a25d5716e949e57c941c47998027476c655593
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b8cda57050030292ca7b28d4c78bd4e89399451fda2094739b8826b737eb6e9cdfaba714ecbd71582e52d757ee0e9ca24eedc7249d54e0caf36c123ee76d6422
|
7
|
+
data.tar.gz: 6f0c6182521d0870ca30a21ccb4eb409497d6f049579b6d705c86b6ada7144415527df0cb3b741560ddfe0a25507787d7a4e122cd37f9a2661efb8aa60c8e7a0
|
@@ -114,11 +114,11 @@ module ProxmoxVmAttrsHelper
|
|
114
114
|
start_after_create: vms.start_after_create,
|
115
115
|
templated: vms.templated,
|
116
116
|
}
|
117
|
-
vms_keys = [:
|
117
|
+
vms_keys = [:cpu_type, :nameserver, :searchdomain, :hostname]
|
118
118
|
extra_attrs = ActiveSupport::HashWithIndifferentAccess.new
|
119
119
|
attributes.each do |key, value|
|
120
120
|
camel_key = key.to_s.include?('_') ? snake_to_camel(key.to_s).to_sym : key
|
121
|
-
nested_key = vms_keys.include?(key) ?
|
121
|
+
nested_key = vms_keys.include?(key) ? "config_attributes[#{key}]" : key
|
122
122
|
value = start_checked if key == :start_after_create
|
123
123
|
extra_attrs[camel_key] = { name: "#{param_scope}[#{nested_key}]", value: value }
|
124
124
|
end
|
@@ -118,7 +118,7 @@ module ForemanFogProxmox
|
|
118
118
|
def set_mac(nic_compute_attributes, mac, type)
|
119
119
|
mac_attr_name = { 'qemu' => :macaddr, 'lxc' => :hwaddr }
|
120
120
|
mac_key = mac_attr_name[type] || 'mac'
|
121
|
-
nic_compute_attributes[mac_key] = Net::Validations.normalize_mac(mac)
|
121
|
+
nic_compute_attributes[mac_key] = Net::Validations.normalize_mac(mac).upcase
|
122
122
|
end
|
123
123
|
|
124
124
|
def host_interfaces_attrs(host)
|
@@ -107,7 +107,7 @@ module ForemanFogProxmox
|
|
107
107
|
return false unless disk
|
108
108
|
|
109
109
|
# Return boolean if disk of type hard_disk, cloud_init, cdrom or rootfs(LXC container) exists
|
110
|
-
if disk.hard_disk? || disk.cloud_init? || disk.rootfs?
|
110
|
+
if disk.hard_disk? || disk.cloud_init? || disk.rootfs? || disk.mount_point?
|
111
111
|
volume_attributes['volid'].present?
|
112
112
|
elsif disk.cdrom?
|
113
113
|
volume_attributes['cdrom'].present?
|
data/app/overrides/compute_resources_vms/form/add_from_profile_to_compute_attributes_form.rb
CHANGED
@@ -20,7 +20,8 @@
|
|
20
20
|
Deface::Override.new(
|
21
21
|
virtual_path: 'compute_attributes/_compute_form',
|
22
22
|
name: 'remove_networks_and_volumes_partial',
|
23
|
-
|
23
|
+
surround: "erb[loud]:contains('compute_resources_vms/form/networks'), erb[loud]:contains('compute_resources_vms/form/volumes')",
|
24
|
+
text: "<% unless compute_resource.class == ForemanFogProxmox::Proxmox %><%= render_original %><% end %>"
|
24
25
|
)
|
25
26
|
|
26
27
|
Deface::Override.new(
|
@@ -21,5 +21,6 @@ Deface::Override.new(
|
|
21
21
|
:virtual_path => 'hosts/_compute',
|
22
22
|
:name => 'update_react_component_to_virtual_machine_tab',
|
23
23
|
:replace => "erb[loud]:contains('hosts/compute_detail')",
|
24
|
-
:partial => 'compute_resources_vms/form/proxmox/update_react_component_to_host_form'
|
24
|
+
:partial => 'compute_resources_vms/form/proxmox/update_react_component_to_host_form',
|
25
|
+
:original => 'c71aceb245363af92515509d25cac0c066bd58ed'
|
25
26
|
)
|
data/app/views/compute_resources_vms/form/proxmox/_add_react_component_to_host_form.html.erb
CHANGED
@@ -1,5 +1,4 @@
|
|
1
1
|
<% content_for(:javascripts) do %>
|
2
2
|
<%= webpacked_plugins_js_for :foreman_fog_proxmox %>
|
3
|
-
<%= javascript_include_tag 'foreman_fog_proxmox/proxmox_vm', "data-turbolinks-track" => true %>
|
4
3
|
<% end %>
|
5
4
|
<%= react_component('ProxmoxVmType', { registerComp: true }) unless @host.managed %>
|
data/app/views/compute_resources_vms/form/proxmox/_update_react_component_to_host_form.html.erb
CHANGED
@@ -23,4 +23,7 @@ along with ForemanFogProxmox. If not, see <http://www.gnu.org/licenses/>. %>
|
|
23
23
|
<%= render :partial => provider_partial(compute_resource, 'base'),
|
24
24
|
locals: { f: compute, host: host, compute_resource: compute_resource, new_host: host.new_record?, new_vm: !compute.object.persisted?,
|
25
25
|
arch: host.architecture_id, os: host.operatingsystem_id } %>
|
26
|
+
|
27
|
+
<!--Storage-->
|
28
|
+
<%= render :partial => 'compute_resources_vms/form/volumes', :locals => { :f => compute, :compute_resource => compute_resource, :new_host => !compute.object.persisted?, :new_vm => !compute.object.persisted?, :item_layout => 'removable' } %>
|
26
29
|
<% end %>
|
@@ -0,0 +1,119 @@
|
|
1
|
+
<%#
|
2
|
+
kind: user_data
|
3
|
+
name: Proxmox UserData
|
4
|
+
model: ProvisioningTemplate
|
5
|
+
require:
|
6
|
+
- plugin: foreman_fog_proxmox
|
7
|
+
version: 0.16.1
|
8
|
+
oses:
|
9
|
+
- AlmaLinux
|
10
|
+
- Amazon
|
11
|
+
- CentOS
|
12
|
+
- CentOS_Stream
|
13
|
+
- Debian
|
14
|
+
- Rocky
|
15
|
+
- Ubuntu
|
16
|
+
description: |
|
17
|
+
This template is used during image based provisioning with Proxmox Compute Resource, when
|
18
|
+
the image is configured to use user-data and network config. The output is a list of
|
19
|
+
cloud-init directives that cloud-init parses to configures the VM booted from the image.
|
20
|
+
The image must have cloud-init installed in order for this to work.
|
21
|
+
|
22
|
+
This template accepts the following parameters:
|
23
|
+
- ssh_pwauth: boolean (default=true unless ssh_authorized_keys)
|
24
|
+
- ssh_authorized_keys: string w newline seperated keys (default="")
|
25
|
+
- package_upgrade: boolean (default=false)
|
26
|
+
- reboot: boolean (default=false)
|
27
|
+
- skip-puppet-setup: boolean (default=false)
|
28
|
+
-%>
|
29
|
+
<%
|
30
|
+
ssh_pwauth = host_param('ssh_pwauth') ? host_param_true?('ssh_pwauth') : !host_param('ssh_authorized_keys')
|
31
|
+
rhel_compatible = @host.operatingsystem.family == 'Redhat' && @host.operatingsystem.name != 'Fedora'
|
32
|
+
# safemode renderer does not support unary negation
|
33
|
+
puppet_enabled = !host_param_true?('skip-puppet-setup') && (host_puppet_server.present? || host_param_true?('force-puppet'))
|
34
|
+
salt_enabled = host_param('salt_master') ? true : false
|
35
|
+
chef_enabled = @host.respond_to?(:chef_proxy) && @host.chef_proxy
|
36
|
+
-%>
|
37
|
+
<%
|
38
|
+
username_to_create = host_param('username_to_create', 'root')
|
39
|
+
password_to_create = host_param('password_to_create') || @host.root_pass
|
40
|
+
-%>
|
41
|
+
#cloud-config
|
42
|
+
hostname: <%= @host.shortname %>
|
43
|
+
fqdn: <%= @host %>
|
44
|
+
manage_etc_hosts: true
|
45
|
+
<% if ssh_pwauth -%>
|
46
|
+
<%# Don't enable this in production. It is very insecure! Use ssh_authorized_keys instead...
|
47
|
+
http://cloudinit.readthedocs.io/en/latest/topics/examples.html#including-users-and-groups -%>
|
48
|
+
ssh_pwauth: true
|
49
|
+
users:
|
50
|
+
- name: <%= username_to_create %>
|
51
|
+
shell: /bin/bash
|
52
|
+
sudo: ALL=(ALL) ALL
|
53
|
+
lock_passwd: false
|
54
|
+
hashed_passwd: <%= password_to_create %>
|
55
|
+
<% end -%>
|
56
|
+
<% if host_param('ssh_authorized_keys') -%>
|
57
|
+
ssh_authorized_keys:
|
58
|
+
<% host_param('ssh_authorized_keys').split("\n").each do |ssh_key| -%>
|
59
|
+
- <%= ssh_key %>
|
60
|
+
<% end -%>
|
61
|
+
<% end -%>
|
62
|
+
|
63
|
+
<% if host_param_true?('package_upgrade') -%>
|
64
|
+
package_upgrade: true
|
65
|
+
<% end -%>
|
66
|
+
|
67
|
+
runcmd:
|
68
|
+
<% if rhel_compatible -%>
|
69
|
+
- |
|
70
|
+
<%= indent(2) { snippet('epel') } %>
|
71
|
+
<% end -%>
|
72
|
+
- |
|
73
|
+
<%= indent(2) { snippet('remote_execution_ssh_keys') } %>
|
74
|
+
<% if chef_enabled -%>
|
75
|
+
- |
|
76
|
+
<%= indent(2) { snippet('chef_client') } %>
|
77
|
+
<% end -%>
|
78
|
+
<% if puppet_enabled -%>
|
79
|
+
- |
|
80
|
+
<%= indent(2) { snippet('puppetlabs_repo') } %>
|
81
|
+
- |
|
82
|
+
<%= indent(2) { snippet('puppet_setup') } %>
|
83
|
+
<% end -%>
|
84
|
+
<% if salt_enabled -%>
|
85
|
+
- |
|
86
|
+
<%= indent(2) { snippet('saltstack_setup') } %>
|
87
|
+
<% end -%>
|
88
|
+
|
89
|
+
<%# Contact Foreman to confirm instance is built -%>
|
90
|
+
phone_home:
|
91
|
+
url: <%= foreman_url('built') %>
|
92
|
+
post: []
|
93
|
+
tries: 10
|
94
|
+
|
95
|
+
<% if host_param_true?('reboot') -%>
|
96
|
+
power_state:
|
97
|
+
mode: reboot
|
98
|
+
timeout: 30
|
99
|
+
condition: true
|
100
|
+
<% end -%>
|
101
|
+
|
102
|
+
#network-config
|
103
|
+
version: 2
|
104
|
+
ethernets:
|
105
|
+
eth0:
|
106
|
+
match:
|
107
|
+
name: e*
|
108
|
+
dhcp4: false
|
109
|
+
dhcp6: false
|
110
|
+
addresses:
|
111
|
+
- <%= @host.ip %>/<%= @host.subnet.cidr %>
|
112
|
+
routes:
|
113
|
+
- to: 0.0.0.0
|
114
|
+
via: <%= @host.subnet.gateway %>
|
115
|
+
nameservers:
|
116
|
+
addresses:
|
117
|
+
- <%= @host.subnet.dns_primary%>
|
118
|
+
search:
|
119
|
+
- <%= @host.domain.name %>
|
@@ -54,7 +54,7 @@ module ForemanFogProxmox
|
|
54
54
|
|
55
55
|
it 'sets interface identifier with server compute id, ip and ip6 and mac adress' do
|
56
56
|
ip = '192.168.56.100'
|
57
|
-
mac_address = '36:25:
|
57
|
+
mac_address = '36:25:8C:53:0C:50'
|
58
58
|
ip6 = Array.new(4) { format('%<x>s', x: rand(16**4)) }.join(':') + '::1'
|
59
59
|
compute_attributes = ActiveSupport::HashWithIndifferentAccess.new({ 'id' => 'net0' })
|
60
60
|
physical_nic = FactoryBot.build(:nic_base_empty, :identifier => 'net0', :ip => ip, :ip6 => ip6,
|
@@ -131,7 +131,7 @@ module ForemanFogProxmox
|
|
131
131
|
|
132
132
|
it 'sets container compute ip DHCP, mac adress and firewall' do
|
133
133
|
ip = '192.168.56.100'
|
134
|
-
mac_address = '36:25:
|
134
|
+
mac_address = '36:25:8C:53:0C:50'
|
135
135
|
ip6 = '2001:0:1234::c1c0:abcd:876'
|
136
136
|
firewall = '1'
|
137
137
|
compute_attributes = ActiveSupport::HashWithIndifferentAccess.new({ 'id' => 'net0', 'dhcp' => '1',
|
@@ -45,6 +45,7 @@ module ForemanFogProxmox
|
|
45
45
|
disk.stubs(:hard_disk?).returns(false)
|
46
46
|
disk.stubs(:cdrom?).returns(true)
|
47
47
|
disk.stubs(:rootfs?).returns(false)
|
48
|
+
disk.stubs(:mount_point?).returns(false)
|
48
49
|
disks.stubs(:get).returns
|
49
50
|
config.stubs(:disks).returns(disks)
|
50
51
|
config.stubs(:attributes).returns(:cores => '')
|
@@ -95,6 +96,7 @@ module ForemanFogProxmox
|
|
95
96
|
disk.stubs(:hard_disk?).returns(false)
|
96
97
|
disk.stubs(:cdrom?).returns(true)
|
97
98
|
disk.stubs(:rootfs?).returns(false)
|
99
|
+
disk.stubs(:mount_point?).returns(false)
|
98
100
|
disk.stubs(:cloud_init?).returns(false)
|
99
101
|
disk.stubs(:storage).returns('local-lvm')
|
100
102
|
disk.stubs(:volid).returns('local-lvm:iso/ubuntu-20_4.iso')
|
@@ -148,6 +150,7 @@ module ForemanFogProxmox
|
|
148
150
|
disk.stubs(:hard_disk?).returns(false)
|
149
151
|
disk.stubs(:cdrom?).returns(true)
|
150
152
|
disk.stubs(:rootfs?).returns(false)
|
153
|
+
disk.stubs(:mount_point?).returns(false)
|
151
154
|
disk.stubs(:cloud_init?).returns(false)
|
152
155
|
disk.stubs(:storage).returns('local-lvm')
|
153
156
|
disk.stubs(:volid).returns('local-lvm:iso/ubuntu-20_4.iso')
|
@@ -22,7 +22,7 @@ const GeneralTabContent = ({
|
|
22
22
|
required
|
23
23
|
type="number"
|
24
24
|
value={general?.vmid?.value}
|
25
|
-
disabled={fromProfile}
|
25
|
+
disabled={!newVm || fromProfile}
|
26
26
|
onChange={handleChange}
|
27
27
|
/>
|
28
28
|
<InputField
|
@@ -48,7 +48,7 @@ const GeneralTabContent = ({
|
|
48
48
|
label={__('Start after creation?')}
|
49
49
|
type="checkbox"
|
50
50
|
value={general?.startAfterCreate?.value}
|
51
|
-
checked={general?.startAfterCreate?.value === '1'}
|
51
|
+
checked={String(general?.startAfterCreate?.value) === '1'}
|
52
52
|
onChange={handleChange}
|
53
53
|
/>
|
54
54
|
)}
|
@@ -58,7 +58,7 @@ const GeneralTabContent = ({
|
|
58
58
|
label={__('Create image?')}
|
59
59
|
type="checkbox"
|
60
60
|
value={general?.templated?.value}
|
61
|
-
checked={general?.templated?.value === '1'}
|
61
|
+
checked={String(general?.templated?.value) === '1'}
|
62
62
|
disabled={untemplatable}
|
63
63
|
onChange={handleChange}
|
64
64
|
/>
|
@@ -52,6 +52,7 @@ const ProxmoxComputeSelectors = {
|
|
52
52
|
],
|
53
53
|
|
54
54
|
proxmoxVgasMap: [
|
55
|
+
{ value: '', labal: '' },
|
55
56
|
{ value: 'std', label: 'Standard VGA' },
|
56
57
|
{ value: 'vmware', label: 'Vmware compatible' },
|
57
58
|
{ value: 'qxl', label: 'SPICE' },
|
@@ -74,34 +75,77 @@ const ProxmoxComputeSelectors = {
|
|
74
75
|
],
|
75
76
|
|
76
77
|
proxmoxCpusMap: [
|
77
|
-
{ value: '486', label: '486' },
|
78
78
|
{ value: 'athlon', label: 'athlon' },
|
79
|
+
{ value: 'EPYC', label: 'EPYC' },
|
80
|
+
{ value: 'EPYC-IBPB', label: 'EPYC-IBPB' },
|
81
|
+
{ value: 'EPYC-Milan', label: 'EPYC-Milan' },
|
82
|
+
{ value: 'EPYC-Rome', label: 'EPYC-Rome' },
|
83
|
+
{ value: 'EPYC-Rome-v2', label: 'EPYC-Rome-v2' },
|
84
|
+
{ value: 'EPYC-v3', label: 'EPYC-v3' },
|
85
|
+
{ value: 'Opteron_G1', label: 'Opteron_G1' },
|
86
|
+
{ value: 'Opteron_G2', label: 'Opteron_G2' },
|
87
|
+
{ value: 'Opteron_G3', label: 'Opteron_G3' },
|
88
|
+
{ value: 'Opteron_G4', label: 'Opteron_G4' },
|
89
|
+
{ value: 'Opteron_G5', label: 'Opteron_G5' },
|
90
|
+
{ value: 'phenom', label: 'phenom' },
|
91
|
+
{ value: '486', label: '486' },
|
92
|
+
{ value: 'Broadwell', label: 'Broadwell' },
|
93
|
+
{ value: 'Broadwell-IBRS', label: 'Broadwell-IBRS' },
|
94
|
+
{ value: 'Broadwell-noTSX', label: 'Broadwell-noTSX' },
|
95
|
+
{ value: 'Broadwell-noTSX-IBRS', label: 'Broadwell-noTSX-IBRS' },
|
96
|
+
{ value: 'Cascadelake-Server', label: 'Cascadelake-Server' },
|
97
|
+
{ value: 'Cascadelake-Server-noTSX', label: 'Cascadelake-Server-noTSX' },
|
98
|
+
{ value: 'Cascadelake-Server-v2', label: 'Cascadelake-Server-v2' },
|
99
|
+
{ value: 'Cascadelake-Server-v4', label: 'Cascadelake-Server-v4' },
|
100
|
+
{ value: 'Cascadelake-Server-v5', label: 'Cascadelake-Server-v5' },
|
101
|
+
{ value: 'Conroe', label: 'Conroe' },
|
102
|
+
{ value: 'Cooperlake', label: 'Cooperlake' },
|
103
|
+
{ value: 'Cooperlake-v2', label: 'Cooperlake-v2' },
|
79
104
|
{ value: 'core2duo', label: 'core2duo' },
|
80
105
|
{ value: 'coreduo', label: 'coreduo' },
|
81
|
-
{ value: '
|
82
|
-
{ value: '
|
106
|
+
{ value: 'Haswell', label: 'Haswell' },
|
107
|
+
{ value: 'Haswell-IBRS', label: 'Haswell-IBRS' },
|
108
|
+
{ value: 'Haswell-noTSX', label: 'Haswell-noTSX' },
|
109
|
+
{ value: 'Haswell-noTSX-IBRS', label: 'Haswell-noTSX-IBRS' },
|
110
|
+
{ value: 'Icelake-Client', label: 'Icelake-Client' },
|
111
|
+
{ value: 'Icelake-Client-noTSX', label: 'Icelake-Client-noTSX' },
|
112
|
+
{ value: 'Icelake-Server', label: 'Icelake-Server' },
|
113
|
+
{ value: 'Icelake-Server-noTSX', label: 'Icelake-Server-noTSX' },
|
114
|
+
{ value: 'Icelake-Server-v3', label: 'Icelake-Server-v3' },
|
115
|
+
{ value: 'Icelake-Server-v4', label: 'Icelake-Server-v4' },
|
116
|
+
{ value: 'Icelake-Server-v5', label: 'Icelake-Server-v5' },
|
117
|
+
{ value: 'Icelake-Server-v6', label: 'Icelake-Server-v6' },
|
118
|
+
{ value: 'IvyBridge', label: 'IvyBridge' },
|
119
|
+
{ value: 'IvyBridge-IBRS', label: 'IvyBridge-IBRS' },
|
120
|
+
{ value: 'KnightsMill', label: 'KnightsMill' },
|
121
|
+
{ value: 'Nehalem', label: 'Nehalem' },
|
122
|
+
{ value: 'Nehalem-IBRS', label: 'Nehalem-IBRS' },
|
123
|
+
{ value: 'Penryn', label: 'Penryn' },
|
83
124
|
{ value: 'pentium', label: 'pentium' },
|
84
125
|
{ value: 'pentium2', label: 'pentium2' },
|
85
126
|
{ value: 'pentium3', label: 'pentium3' },
|
86
|
-
{ value: 'phenom', label: 'phenom' },
|
87
|
-
{ value: 'qemu32', label: 'qemu32' },
|
88
|
-
{ value: 'qemu64', label: 'qemu64' },
|
89
|
-
{ value: 'Conroe', label: 'Conroe' },
|
90
|
-
{ value: 'Penryn', label: 'Penryn' },
|
91
|
-
{ value: 'Nehalem', label: 'Nehalem' },
|
92
|
-
{ value: 'Westmere', label: 'Westmere' },
|
93
127
|
{ value: 'SandyBridge', label: 'SandyBridge' },
|
94
|
-
{ value: '
|
95
|
-
{ value: 'Haswell', label: 'Haswell' },
|
96
|
-
{ value: 'Haswell-noTSX', label: 'Haswell-noTSX' },
|
97
|
-
{ value: 'Broadwell', label: 'Broadwell' },
|
98
|
-
{ value: 'Broadwell-noTSX', label: 'Broadwell-noTSX' },
|
128
|
+
{ value: 'SandyBridge-IBRS', label: 'SandyBridge-IBRS' },
|
99
129
|
{ value: 'Skylake-Client', label: 'Skylake-Client' },
|
100
|
-
{ value: '
|
101
|
-
{ value: '
|
102
|
-
{ value: '
|
103
|
-
{ value: '
|
104
|
-
{ value: '
|
130
|
+
{ value: 'Skylake-Client-IBRS', label: 'Skylake-Client-IBRS' },
|
131
|
+
{ value: 'Skylake-Client-noTSX-IBRS', label: 'Skylake-Client-noTSX-IBRS' },
|
132
|
+
{ value: 'Skylake-Client-v4', label: 'Skylake-Client-v4' },
|
133
|
+
{ value: 'Skylake-Server', label: 'Skylake-Server' },
|
134
|
+
{ value: 'Skylake-Server-IBRS', label: 'Skylake-Server-IBRS' },
|
135
|
+
{ value: 'Skylake-Server-noTSX-IBRS', label: 'Skylake-Server-noTSX-IBRS' },
|
136
|
+
{ value: 'Skylake-Server-v4', label: 'Skylake-Server-v4' },
|
137
|
+
{ value: 'Skylake-Server-v5', label: 'Skylake-Server-v5' },
|
138
|
+
{ value: 'Westmere', label: 'Westmere' },
|
139
|
+
{ value: 'Westmere-IBRS', label: 'Westmere-IBRS' },
|
140
|
+
{ value: 'kvm32', label: 'kvm32' },
|
141
|
+
{ value: 'kvm64', label: '(Default) kvm64' },
|
142
|
+
{ value: 'max', label: 'max' },
|
143
|
+
{ value: 'qemu32', label: 'qemu32' },
|
144
|
+
{ value: 'qemu64', label: 'qemu64' },
|
145
|
+
{ value: 'x86-64-v2', label: 'x86-64-v2' },
|
146
|
+
{ value: 'x86-64-v2-AES', label: 'x86-64-v2-AES' },
|
147
|
+
{ value: 'x86-64-v3', label: 'x86-64-v3' },
|
148
|
+
{ value: 'x86-64-v4', label: 'x86-64-v4' },
|
105
149
|
{ value: 'host', label: 'host' },
|
106
150
|
],
|
107
151
|
|
@@ -45,16 +45,18 @@ const MountPoint = ({ id, data, storagesMap }) => {
|
|
45
45
|
/>
|
46
46
|
<InputField
|
47
47
|
name={mp?.size?.name}
|
48
|
-
label={__('Size')}
|
48
|
+
label={__('Size (GB)')}
|
49
49
|
type="number"
|
50
50
|
value={mp?.size?.value}
|
51
51
|
onChange={handleChange}
|
52
52
|
/>
|
53
|
-
<
|
53
|
+
<InputField
|
54
|
+
label={__('Device')}
|
54
55
|
name={mp?.device?.name}
|
55
|
-
|
56
|
+
disabled
|
56
57
|
value={mp?.device?.value}
|
57
58
|
onChange={handleChange}
|
59
|
+
tooltip={__('Device value is set automatically.')}
|
58
60
|
/>
|
59
61
|
<input
|
60
62
|
name={mp?.id?.name}
|
@@ -68,11 +70,6 @@ const MountPoint = ({ id, data, storagesMap }) => {
|
|
68
70
|
value={mp?.volid?.value}
|
69
71
|
onChange={handleChange}
|
70
72
|
/>
|
71
|
-
<input
|
72
|
-
name={mp?.storageType?.name}
|
73
|
-
type="hidden"
|
74
|
-
value={mp?.storageType?.value}
|
75
|
-
/>
|
76
73
|
</div>
|
77
74
|
);
|
78
75
|
};
|
@@ -56,14 +56,14 @@ const ProxmoxContainerOptions = ({ options, storages, nodeId }) => {
|
|
56
56
|
label={__('Start at boot')}
|
57
57
|
type="checkbox"
|
58
58
|
value={opts?.onboot?.value}
|
59
|
-
checked={opts?.onboot?.value === '1'}
|
59
|
+
checked={String(opts?.onboot?.value) === '1'}
|
60
60
|
onChange={handleChange}
|
61
61
|
/>
|
62
62
|
<InputField
|
63
63
|
name={opts?.ostype?.name}
|
64
64
|
label={__('OS Type')}
|
65
65
|
type="select"
|
66
|
-
options={ProxmoxComputeSelectors.
|
66
|
+
options={ProxmoxComputeSelectors.proxmoxOstypesMap}
|
67
67
|
value={opts?.ostype?.value}
|
68
68
|
onChange={handleChange}
|
69
69
|
/>
|
@@ -71,6 +71,7 @@ const ProxmoxContainerOptions = ({ options, storages, nodeId }) => {
|
|
71
71
|
name={opts?.hostname?.name}
|
72
72
|
label={__('Hostname')}
|
73
73
|
value={opts?.hostname?.value}
|
74
|
+
disabled
|
74
75
|
onChange={handleChange}
|
75
76
|
/>
|
76
77
|
<InputField
|
@@ -124,7 +124,7 @@ const ProxmoxContainerStorage = ({ storage, storages, nodeId, paramScope }) => {
|
|
124
124
|
/>
|
125
125
|
<InputField
|
126
126
|
name={rootfs?.size?.name}
|
127
|
-
label={__('Size')}
|
127
|
+
label={__('Size (GB)')}
|
128
128
|
type="number"
|
129
129
|
value={rootfs?.size?.value}
|
130
130
|
onChange={handleChange}
|
@@ -13,7 +13,8 @@ const NetworkInterface = ({
|
|
13
13
|
existingInterfaces,
|
14
14
|
}) => {
|
15
15
|
const [network, setNetwork] = useState(data);
|
16
|
-
const [
|
16
|
+
const [idError, setIdError] = useState('');
|
17
|
+
const [nameError, setNameError] = useState('');
|
17
18
|
useEffect(() => {
|
18
19
|
const currentNetData = JSON.stringify(network);
|
19
20
|
const parentNetData = JSON.stringify(data);
|
@@ -48,23 +49,23 @@ const NetworkInterface = ({
|
|
48
49
|
net.data.id.value !== network.id.value
|
49
50
|
)
|
50
51
|
) {
|
51
|
-
|
52
|
+
setIdError(__('Error: Duplicate ID found.'));
|
52
53
|
return;
|
53
54
|
}
|
54
|
-
|
55
|
+
setIdError('');
|
55
56
|
}
|
56
57
|
if (updatedKey === 'name') {
|
57
|
-
const
|
58
|
+
const nameValue = value;
|
58
59
|
if (
|
59
60
|
Object.values(existingInterfaces).some(
|
60
61
|
net =>
|
61
|
-
net.data.
|
62
|
-
net.data.
|
62
|
+
net.data.name.value === nameValue &&
|
63
|
+
net.data.name.value !== network.name.value
|
63
64
|
)
|
64
65
|
) {
|
65
|
-
|
66
|
+
setNameError(__('Error: Duplicate Name found.'));
|
66
67
|
} else {
|
67
|
-
|
68
|
+
setNameError('');
|
68
69
|
}
|
69
70
|
}
|
70
71
|
};
|
@@ -83,7 +84,7 @@ const NetworkInterface = ({
|
|
83
84
|
type="text"
|
84
85
|
value={network?.id?.value}
|
85
86
|
onChange={handleChange}
|
86
|
-
error={
|
87
|
+
error={idError}
|
87
88
|
/>
|
88
89
|
<InputField
|
89
90
|
name={network?.name?.name}
|
@@ -92,7 +93,7 @@ const NetworkInterface = ({
|
|
92
93
|
type="text"
|
93
94
|
value={network?.name?.value}
|
94
95
|
onChange={handleChange}
|
95
|
-
error={
|
96
|
+
error={nameError}
|
96
97
|
/>
|
97
98
|
<InputField
|
98
99
|
name={network?.bridge?.name}
|
@@ -107,7 +108,7 @@ const NetworkInterface = ({
|
|
107
108
|
label={__('DHCP IPv4')}
|
108
109
|
type="checkbox"
|
109
110
|
value={network?.dhcp?.value}
|
110
|
-
checked={network?.dhcp?.value === '1'}
|
111
|
+
checked={String(network?.dhcp?.value) === '1'}
|
111
112
|
onChange={handleChange}
|
112
113
|
/>
|
113
114
|
<InputField
|
@@ -130,7 +131,7 @@ const NetworkInterface = ({
|
|
130
131
|
label={__('DHCP IPv6')}
|
131
132
|
type="checkbox"
|
132
133
|
value={network?.dhcp6?.value}
|
133
|
-
checked={network?.dhcp6?.value === '1'}
|
134
|
+
checked={String(network?.dhcp6?.value) === '1'}
|
134
135
|
onChange={handleChange}
|
135
136
|
/>
|
136
137
|
<InputField
|
@@ -167,7 +168,7 @@ const NetworkInterface = ({
|
|
167
168
|
label={__('Firewall')}
|
168
169
|
type="checkbox"
|
169
170
|
value={network?.firewall?.value}
|
170
|
-
checked={network?.firewall?.value === '1'}
|
171
|
+
checked={String(network?.firewall?.value) === '1'}
|
171
172
|
onChange={handleChange}
|
172
173
|
/>
|
173
174
|
</div>
|
@@ -6,19 +6,19 @@ import InputField from '../common/FormInputs';
|
|
6
6
|
import ProxmoxComputeSelectors from '../ProxmoxComputeSelectors';
|
7
7
|
import CPUFlagsModal from './components/CPUFlagsModal';
|
8
8
|
|
9
|
-
const
|
10
|
-
'md_clear',
|
11
|
-
'pcid',
|
12
|
-
'
|
13
|
-
'ssbd',
|
14
|
-
'ibpb',
|
15
|
-
'virt_ssbd',
|
16
|
-
'amd_ssbd',
|
17
|
-
'amd_no_ssb',
|
18
|
-
'pdpe1gb',
|
19
|
-
'hv_tlbflush',
|
20
|
-
'hv_evmcs',
|
21
|
-
'aes',
|
9
|
+
const cpuFlagsHash = [
|
10
|
+
{ key: 'md_clear', label: 'md-clear' },
|
11
|
+
{ key: 'pcid', label: 'pcid' },
|
12
|
+
{ key: 'spectre', label: 'spec-ctrl' },
|
13
|
+
{ key: 'ssbd', label: 'ssbd' },
|
14
|
+
{ key: 'ibpb', label: 'ibpb' },
|
15
|
+
{ key: 'virt_ssbd', label: 'virt-ssbd' },
|
16
|
+
{ key: 'amd_ssbd', label: 'amd-ssbd' },
|
17
|
+
{ key: 'amd_no_ssb', label: 'amd-no-ssb' },
|
18
|
+
{ key: 'pdpe1gb', label: 'pdpe1gb' },
|
19
|
+
{ key: 'hv_tlbflush', label: 'hv-tlbflush' },
|
20
|
+
{ key: 'hv_evmcs', label: 'hv-evmcs' },
|
21
|
+
{ key: 'aes', label: 'aes' },
|
22
22
|
];
|
23
23
|
|
24
24
|
const cpuFlagDescriptions = {
|
@@ -28,7 +28,7 @@ const cpuFlagDescriptions = {
|
|
28
28
|
pcid: __(
|
29
29
|
'Meltdown fix cost reduction on Westmere, Sandy-, and IvyBridge Intel CPUs'
|
30
30
|
),
|
31
|
-
|
31
|
+
spectre: __('Allows improved Spectre mitigation with Intel CPUs'),
|
32
32
|
ssbd: __('Protection for "Speculative Store Bypass" for Intel models'),
|
33
33
|
ibpb: __('Allows improved Spectre mitigation with AMD CPUs'),
|
34
34
|
virt_ssbd: __(
|
@@ -47,20 +47,20 @@ const cpuFlagDescriptions = {
|
|
47
47
|
hv_evmcs: __(
|
48
48
|
'Improve performance for nested virtualization. Only supported on Intel CPUs.'
|
49
49
|
),
|
50
|
-
aes: __('Activate AES instruction set for HW
|
50
|
+
aes: __('Activate AES instruction set for HW accelaration.'),
|
51
51
|
};
|
52
52
|
|
53
53
|
const filterAndAddDescriptions = hardware =>
|
54
|
-
|
55
|
-
|
56
|
-
.reduce((acc, key) => {
|
54
|
+
cpuFlagsHash.reduce((acc, { key, label }) => {
|
55
|
+
if (key in hardware) {
|
57
56
|
acc[key] = {
|
58
57
|
...hardware[key],
|
59
58
|
description: cpuFlagDescriptions[key] || '',
|
60
|
-
label
|
59
|
+
label,
|
61
60
|
};
|
62
|
-
|
63
|
-
|
61
|
+
}
|
62
|
+
return acc;
|
63
|
+
}, {});
|
64
64
|
|
65
65
|
const ProxmoxServerHardware = ({ hardware }) => {
|
66
66
|
const [hw, setHw] = useState(hardware);
|
@@ -141,7 +141,7 @@ const ProxmoxServerHardware = ({ hardware }) => {
|
|
141
141
|
label={__('Enable NUMA')}
|
142
142
|
type="checkbox"
|
143
143
|
value={hw?.numa?.value}
|
144
|
-
checked={hw?.numa?.value === '1'}
|
144
|
+
checked={String(hw?.numa?.value) === '1'}
|
145
145
|
onChange={handleChange}
|
146
146
|
/>
|
147
147
|
<div style={{ marginLeft: '5%', display: 'inline-block' }}>
|
@@ -63,7 +63,7 @@ const ProxmoxServerNetwork = ({ network, bridges, paramScope }) => {
|
|
63
63
|
name: `${paramScope}[interfaces_attributes][${nextId}][firewall]`,
|
64
64
|
value: '0',
|
65
65
|
},
|
66
|
-
|
66
|
+
linkDown: {
|
67
67
|
name: `${paramScope}[interfaces_attributes][${nextId}][link_down]`,
|
68
68
|
value: '0',
|
69
69
|
},
|
@@ -38,7 +38,7 @@ const ProxmoxServerOptions = ({ options }) => {
|
|
38
38
|
label={__('Start at boot')}
|
39
39
|
type="checkbox"
|
40
40
|
value={opts?.onboot?.value}
|
41
|
-
checked={opts?.onboot?.value === '1'}
|
41
|
+
checked={String(opts?.onboot?.value) === '1'}
|
42
42
|
onChange={handleChange}
|
43
43
|
/>
|
44
44
|
<InputField
|
@@ -46,7 +46,7 @@ const ProxmoxServerOptions = ({ options }) => {
|
|
46
46
|
label={__('Qemu Agent')}
|
47
47
|
type="checkbox"
|
48
48
|
value={opts?.agent?.value}
|
49
|
-
checked={opts?.agent?.value === '1'}
|
49
|
+
checked={String(opts?.agent?.value) === '1'}
|
50
50
|
onChange={handleChange}
|
51
51
|
/>
|
52
52
|
<InputField
|
@@ -55,7 +55,7 @@ const ProxmoxServerOptions = ({ options }) => {
|
|
55
55
|
info={__('Enable/disable KVM hardware virtualization')}
|
56
56
|
type="checkbox"
|
57
57
|
value={opts?.kvm?.value}
|
58
|
-
checked={opts?.kvm?.value === '1'}
|
58
|
+
checked={String(opts?.kvm?.value) === '1'}
|
59
59
|
onChange={handleChange}
|
60
60
|
/>
|
61
61
|
<InputField
|
@@ -74,15 +74,15 @@ const HardDisk = ({
|
|
74
74
|
onChange={handleChange}
|
75
75
|
/>
|
76
76
|
<input
|
77
|
-
name={hdd?.
|
77
|
+
name={hdd?.id?.name}
|
78
78
|
type="hidden"
|
79
|
-
value={hdd?.
|
79
|
+
value={hdd?.id?.value}
|
80
80
|
onChange={handleChange}
|
81
81
|
/>
|
82
82
|
<input
|
83
|
-
name={hdd?.
|
83
|
+
name={hdd?.volid?.name}
|
84
84
|
type="hidden"
|
85
|
-
value={hdd?.
|
85
|
+
value={hdd?.volid?.value}
|
86
86
|
onChange={handleChange}
|
87
87
|
/>
|
88
88
|
<InputField
|
@@ -102,6 +102,14 @@ const HardDisk = ({
|
|
102
102
|
onChange={handleChange}
|
103
103
|
error={error}
|
104
104
|
/>
|
105
|
+
<InputField
|
106
|
+
label={__('Device')}
|
107
|
+
name={hdd?.device?.name}
|
108
|
+
value={hdd?.device?.value}
|
109
|
+
onChange={handleChange}
|
110
|
+
disabled
|
111
|
+
tooltip={__('Device value is set automatically.')}
|
112
|
+
/>
|
105
113
|
<InputField
|
106
114
|
name={hdd?.cache?.name}
|
107
115
|
label={__('Cache')}
|
@@ -112,7 +120,7 @@ const HardDisk = ({
|
|
112
120
|
/>
|
113
121
|
<InputField
|
114
122
|
name={hdd?.size?.name}
|
115
|
-
label={__('Size')}
|
123
|
+
label={__('Size (GB)')}
|
116
124
|
type="number"
|
117
125
|
value={hdd?.size?.value}
|
118
126
|
onChange={handleChange}
|
@@ -115,7 +115,7 @@ const NetworkInterface = ({
|
|
115
115
|
label={__('Firewall')}
|
116
116
|
type="checkbox"
|
117
117
|
value={network?.firewall?.value}
|
118
|
-
checked={network?.firewall?.value === '1'}
|
118
|
+
checked={String(network?.firewall?.value) === '1'}
|
119
119
|
onChange={handleChange}
|
120
120
|
/>
|
121
121
|
<InputField
|
@@ -123,7 +123,7 @@ const NetworkInterface = ({
|
|
123
123
|
label={__('Disconnect')}
|
124
124
|
type="checkbox"
|
125
125
|
value={network?.linkDown?.value}
|
126
|
-
checked={network?.linkDown?.value === '1'}
|
126
|
+
checked={String(network?.linkDown?.value) === '1'}
|
127
127
|
onChange={handleChange}
|
128
128
|
/>
|
129
129
|
</div>
|
@@ -33,27 +33,30 @@ const ProxmoxVmType = ({
|
|
33
33
|
registerComp,
|
34
34
|
untemplatable,
|
35
35
|
}) => {
|
36
|
-
const nodesMap =
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
value:
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
label:
|
54
|
-
|
55
|
-
|
56
|
-
|
36
|
+
const nodesMap =
|
37
|
+
nodes.length > 0
|
38
|
+
? nodes.map(node => ({ value: node.node, label: node.node }))
|
39
|
+
: [];
|
40
|
+
const imagesMap =
|
41
|
+
images.length > 0
|
42
|
+
? [
|
43
|
+
{ value: '', label: '' },
|
44
|
+
...images.map(image => ({
|
45
|
+
value: image.uuid,
|
46
|
+
label: image.name,
|
47
|
+
})),
|
48
|
+
]
|
49
|
+
: [];
|
50
|
+
const poolsMap =
|
51
|
+
pools.length > 0
|
52
|
+
? [
|
53
|
+
{ value: '', label: '' },
|
54
|
+
...pools.map(pool => ({
|
55
|
+
value: pool.poolid,
|
56
|
+
label: pool.poolid,
|
57
|
+
})),
|
58
|
+
]
|
59
|
+
: [];
|
57
60
|
const [activeTabKey, setActiveTabKey] = useState(0);
|
58
61
|
const handleTabClick = (event, tabIndex) => {
|
59
62
|
setActiveTabKey(tabIndex);
|
@@ -1,5 +1,6 @@
|
|
1
1
|
import React, { Fragment } from 'react';
|
2
2
|
import { FieldLevelHelp } from 'patternfly-react';
|
3
|
+
import { Tooltip } from '@patternfly/react-core';
|
3
4
|
import PropTypes from 'prop-types';
|
4
5
|
import CommonForm from 'foremanReact/components/common/forms/CommonForm';
|
5
6
|
|
@@ -15,6 +16,7 @@ const InputField = ({
|
|
15
16
|
options,
|
16
17
|
checked,
|
17
18
|
error,
|
19
|
+
tooltip,
|
18
20
|
}) => {
|
19
21
|
const renderOptions = opts =>
|
20
22
|
opts.map(option => <option value={option.value}>{option.label}</option>);
|
@@ -39,7 +41,7 @@ const InputField = ({
|
|
39
41
|
<select
|
40
42
|
disabled={disabled}
|
41
43
|
name={name}
|
42
|
-
className="form-control"
|
44
|
+
className="without_select2 form-control"
|
43
45
|
value={value}
|
44
46
|
onChange={onChange}
|
45
47
|
>
|
@@ -88,7 +90,11 @@ const InputField = ({
|
|
88
90
|
)
|
89
91
|
}
|
90
92
|
>
|
91
|
-
{
|
93
|
+
{tooltip ? (
|
94
|
+
<Tooltip content={tooltip}>{renderComponent}</Tooltip>
|
95
|
+
) : (
|
96
|
+
renderComponent
|
97
|
+
)}
|
92
98
|
{error && (
|
93
99
|
<div style={{ color: 'red', marginTop: '0.5rem' }}>{error}</div>
|
94
100
|
)}
|
@@ -125,6 +131,7 @@ InputField.propTypes = {
|
|
125
131
|
})
|
126
132
|
),
|
127
133
|
error: PropTypes.string,
|
134
|
+
tooltip: PropTypes.string,
|
128
135
|
};
|
129
136
|
|
130
137
|
InputField.defaultProps = {
|
@@ -138,6 +145,7 @@ InputField.defaultProps = {
|
|
138
145
|
checked: false,
|
139
146
|
options: [],
|
140
147
|
error: '',
|
148
|
+
tooltip: '',
|
141
149
|
};
|
142
150
|
|
143
151
|
export default InputField;
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: foreman_fog_proxmox
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.16.
|
4
|
+
version: 0.16.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tristan Robert
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2024-07
|
12
|
+
date: 2024-11-07 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: deface
|
@@ -204,8 +204,10 @@ files:
|
|
204
204
|
- app/views/compute_resources_vms/show/_proxmox.html.erb
|
205
205
|
- app/views/dashboard/_foreman_fog_proxmox_widget.erb
|
206
206
|
- app/views/images/form/_proxmox.html.erb
|
207
|
+
- app/views/templates/provisioning/user_data/proxmox_user_data.erb
|
207
208
|
- config/routes.rb
|
208
209
|
- db/migrate/20210312105013_update_proxmox_uuid_host.rb
|
210
|
+
- db/seeds.d/71_provisioning_templates.rb
|
209
211
|
- lib/foreman_fog_proxmox.rb
|
210
212
|
- lib/foreman_fog_proxmox/engine.rb
|
211
213
|
- lib/foreman_fog_proxmox/hash_collection.rb
|
@@ -291,29 +293,29 @@ signing_key:
|
|
291
293
|
specification_version: 4
|
292
294
|
summary: Foreman plugin that adds Proxmox VE compute resource using fog-proxmox
|
293
295
|
test_files:
|
296
|
+
- test/test_plugin_helper.rb
|
297
|
+
- test/unit/foreman_fog_proxmox/proxmox_test.rb
|
298
|
+
- test/unit/foreman_fog_proxmox/proxmox_vm_queries_test.rb
|
299
|
+
- test/unit/foreman_fog_proxmox/proxmox_vm_commands_server_update_cloudinit_test.rb
|
294
300
|
- test/unit/foreman_fog_proxmox/proxmox_vm_new_test.rb
|
301
|
+
- test/unit/foreman_fog_proxmox/proxmox_vm_commands_test.rb
|
295
302
|
- test/unit/foreman_fog_proxmox/proxmox_compute_attributes_test.rb
|
296
303
|
- test/unit/foreman_fog_proxmox/proxmox_interfaces_test.rb
|
297
|
-
- test/unit/foreman_fog_proxmox/
|
304
|
+
- test/unit/foreman_fog_proxmox/proxmox_vm_commands_container_test.rb
|
305
|
+
- test/unit/foreman_fog_proxmox/semver_test.rb
|
306
|
+
- test/unit/foreman_fog_proxmox/proxmox_vm_commands_server_create_test.rb
|
307
|
+
- test/unit/foreman_fog_proxmox/proxmox_vm_commands_server_update_cdrom_test.rb
|
308
|
+
- test/unit/foreman_fog_proxmox/proxmox_version_test.rb
|
298
309
|
- test/unit/foreman_fog_proxmox/proxmox_vm_commands_server_update_hard_disk_test.rb
|
310
|
+
- test/unit/foreman_fog_proxmox/proxmox_images_test.rb
|
311
|
+
- test/unit/foreman_fog_proxmox/proxmox_vm_commands_server_update_test.rb
|
299
312
|
- test/unit/foreman_fog_proxmox/helpers/proxmox_server_helper_test.rb
|
300
313
|
- test/unit/foreman_fog_proxmox/helpers/proxmox_container_helper_test.rb
|
301
|
-
- test/unit/foreman_fog_proxmox/helpers/proxmox_vm_volumes_helper_test.rb
|
302
314
|
- test/unit/foreman_fog_proxmox/helpers/proxmox_vm_uuid_helper_test.rb
|
303
315
|
- test/unit/foreman_fog_proxmox/helpers/proxmox_vm_helper_test.rb
|
304
|
-
- test/unit/foreman_fog_proxmox/
|
305
|
-
- test/
|
306
|
-
- test/unit/foreman_fog_proxmox/proxmox_vm_commands_container_test.rb
|
307
|
-
- test/unit/foreman_fog_proxmox/proxmox_images_test.rb
|
308
|
-
- test/unit/foreman_fog_proxmox/proxmox_vm_commands_test.rb
|
309
|
-
- test/unit/foreman_fog_proxmox/proxmox_version_test.rb
|
310
|
-
- test/unit/foreman_fog_proxmox/proxmox_vm_queries_test.rb
|
311
|
-
- test/unit/foreman_fog_proxmox/semver_test.rb
|
312
|
-
- test/unit/foreman_fog_proxmox/proxmox_vm_commands_server_update_cloudinit_test.rb
|
313
|
-
- test/unit/foreman_fog_proxmox/proxmox_vm_commands_server_update_cdrom_test.rb
|
314
|
-
- test/test_plugin_helper.rb
|
316
|
+
- test/unit/foreman_fog_proxmox/helpers/proxmox_vm_volumes_helper_test.rb
|
317
|
+
- test/functional/compute_resources_controller_test.rb
|
315
318
|
- test/factories/foreman_fog_proxmox/proxmox_server_mock_factory.rb
|
316
|
-
- test/factories/foreman_fog_proxmox/proxmox_node_mock_factory.rb
|
317
319
|
- test/factories/foreman_fog_proxmox/proxmox_container_mock_factory.rb
|
320
|
+
- test/factories/foreman_fog_proxmox/proxmox_node_mock_factory.rb
|
318
321
|
- test/factories/proxmox_factory.rb
|
319
|
-
- test/functional/compute_resources_controller_test.rb
|