foreman_fog_proxmox 0.14.2 → 0.15.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/app/assets/javascripts/foreman_fog_proxmox/proxmox_vm.js +32 -6
- data/app/helpers/proxmox_compute_resources_vms_helper.rb +6 -1
- data/app/helpers/proxmox_vm_cloudinit_helper.rb +100 -0
- data/app/helpers/proxmox_vm_config_helper.rb +9 -4
- data/app/helpers/proxmox_vm_interfaces_helper.rb +3 -3
- data/app/models/concerns/fog_extensions/proxmox/server.rb +1 -1
- data/app/models/foreman_fog_proxmox/proxmox.rb +9 -3
- data/app/models/foreman_fog_proxmox/proxmox_compute_attributes.rb +1 -1
- data/app/models/foreman_fog_proxmox/proxmox_console.rb +3 -1
- data/app/models/foreman_fog_proxmox/proxmox_images.rb +5 -8
- data/app/models/foreman_fog_proxmox/proxmox_interfaces.rb +0 -2
- data/app/models/foreman_fog_proxmox/proxmox_vm_commands.rb +19 -8
- data/app/models/foreman_fog_proxmox/proxmox_vm_new.rb +1 -1
- data/app/models/foreman_fog_proxmox/proxmox_volumes.rb +7 -5
- data/app/views/compute_resources/form/_proxmox.html.erb +1 -1
- data/app/views/compute_resources_vms/form/proxmox/_general.html.erb +4 -1
- data/app/views/compute_resources_vms/form/proxmox/container/_advanced.html.erb +1 -11
- data/app/views/compute_resources_vms/form/proxmox/container/_config.html.erb +19 -12
- data/app/views/compute_resources_vms/form/proxmox/server/_advanced.html.erb +1 -9
- data/app/views/compute_resources_vms/form/proxmox/server/_config.html.erb +23 -16
- data/app/views/compute_resources_vms/index/_proxmox.html.erb +1 -0
- data/lib/foreman_fog_proxmox/engine.rb +3 -1
- data/lib/foreman_fog_proxmox/version.rb +1 -1
- data/locale/en/foreman_fog_proxmox.po +13 -4
- data/locale/foreman_fog_proxmox.pot +22 -9
- data/locale/fr/foreman_fog_proxmox.po +16 -7
- data/test/unit/foreman_fog_proxmox/helpers/proxmox_vm_helper_test.rb +2 -2
- data/test/unit/foreman_fog_proxmox/proxmox_images_test.rb +2 -5
- data/test/unit/foreman_fog_proxmox/proxmox_vm_commands_container_test.rb +8 -2
- data/test/unit/foreman_fog_proxmox/proxmox_vm_commands_server_create_test.rb +8 -2
- data/test/unit/foreman_fog_proxmox/proxmox_vm_commands_server_update_cdrom_test.rb +3 -0
- data/test/unit/foreman_fog_proxmox/proxmox_vm_commands_server_update_hard_disk_test.rb +9 -3
- metadata +21 -21
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b41c2a927bcce7383e1fd55c588247e935e0c6e11ba967fe6628db72a80730df
|
4
|
+
data.tar.gz: ce7634ce750c8317bc28906e4394888d50b66931b9c77586f3af90c339ca07c2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 65a3b9ac47bb382cc0c2b30430151a9db92bf64dcc9c64ed6c9fffb1fbb5dc525316d3475a7c5d88c21d30e3ffb8ad8eaf6ef5d6676cff53cfbd43dd5a086378
|
7
|
+
data.tar.gz: e210dad89239964322d0dc1b5f3a326a11f449ada2ad61d23f87f2047d421454020aa4b14ffed1efc173f31fd7cb0c68d92a76a9df0757133c810993a49a5a85
|
@@ -15,6 +15,8 @@
|
|
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
|
+
//= require jquery-ui/widgets/accordion
|
19
|
+
|
18
20
|
$(document).ready(vmTypeSelected);
|
19
21
|
|
20
22
|
function vmTypeSelected() {
|
@@ -27,13 +29,8 @@ function vmTypeSelected() {
|
|
27
29
|
fieldsets.push({id: 'config_ext', toggle: true, new_vm: new_vm, selected: selected});
|
28
30
|
fieldsets.push({id: 'volume', toggle: true, new_vm: new_vm, selected: selected});
|
29
31
|
fieldsets.push({id: 'network', toggle: true, new_vm: true, selected: selected});
|
30
|
-
fieldsets.push({id: 'config_options', toggle: false, new_vm: new_vm, selected: selected});
|
31
|
-
fieldsets.push({id: 'config_cpu', toggle: false, new_vm: new_vm, selected: selected});
|
32
|
-
fieldsets.push({id: 'config_memory', toggle: false, new_vm: new_vm, selected: selected});
|
33
|
-
fieldsets.push({id: 'config_cdrom', toggle: false, new_vm: new_vm, selected: selected});
|
34
|
-
fieldsets.push({id: 'config_os', toggle: false, new_vm: new_vm, selected: selected});
|
35
|
-
fieldsets.push({id: 'config_dns', toggle: false, new_vm: new_vm, selected: selected});
|
36
32
|
fieldsets.forEach(toggleFieldsets);
|
33
|
+
toggleAccordion(selected);
|
37
34
|
toggleVolumes(selected);
|
38
35
|
return false;
|
39
36
|
}
|
@@ -142,6 +139,35 @@ function disableFieldset(fieldsetId, fieldset) {
|
|
142
139
|
input_hidden_id(fieldsetId).attr('disabled','disabled');
|
143
140
|
}
|
144
141
|
|
142
|
+
function enableConfigOptions(fieldsetId) {
|
143
|
+
var field = $("#" + fieldsetId + "_advanced_options");
|
144
|
+
field.accordion({collapsible : true, heightStyle: "content"});
|
145
|
+
field.removeClass('disabled').find("*").prop("disabled", false);
|
146
|
+
field.removeClass('hide');
|
147
|
+
}
|
148
|
+
|
149
|
+
function disableConfigOptions(fieldsetId) {
|
150
|
+
var field = $("#" + fieldsetId + "_advanced_options");
|
151
|
+
field.addClass('disabled').find("*").prop("disabled", true);
|
152
|
+
field.addClass('hide');
|
153
|
+
}
|
154
|
+
|
155
|
+
function toggleConfigOptions(fieldsetId, type1, type2) {
|
156
|
+
if (type1 === type2) {
|
157
|
+
enableConfigOptions(fieldsetId);
|
158
|
+
} else {
|
159
|
+
disableConfigOptions(fieldsetId);
|
160
|
+
}
|
161
|
+
}
|
162
|
+
|
163
|
+
function toggleAccordion(selected){
|
164
|
+
['qemu', 'lxc'].forEach(function(type){
|
165
|
+
fieldsets(type).forEach(function(fieldsetId){
|
166
|
+
toggleConfigOptions(fieldsetId, selected, type);
|
167
|
+
});
|
168
|
+
});
|
169
|
+
}
|
170
|
+
|
145
171
|
function toggleFieldset(fieldsetId, fieldset, type1, type2) {
|
146
172
|
type1 === type2 ? enableFieldset(fieldsetId, fieldset) : disableFieldset(fieldsetId, fieldset);
|
147
173
|
}
|
@@ -41,6 +41,11 @@ module ProxmoxComputeResourcesVmsHelper
|
|
41
41
|
end
|
42
42
|
|
43
43
|
def vm_associate_action(vm)
|
44
|
+
vm_associate_link(vm, link_class: "btn btn-default")
|
45
|
+
end
|
46
|
+
|
47
|
+
def vm_associate_link(vm, link_class: "")
|
48
|
+
return unless @compute_resource.supports_host_association?
|
44
49
|
display_link_if_authorized(
|
45
50
|
_('Associate VM'),
|
46
51
|
hash_for_associate_compute_resource_vm_path(
|
@@ -52,7 +57,7 @@ module ProxmoxComputeResourcesVmsHelper
|
|
52
57
|
),
|
53
58
|
:title => _('Associate VM to a Foreman host'),
|
54
59
|
:method => :put,
|
55
|
-
:class =>
|
60
|
+
:class => link_class
|
56
61
|
)
|
57
62
|
end
|
58
63
|
|
@@ -37,7 +37,107 @@ module ProxmoxVmCloudinitHelper
|
|
37
37
|
id = "#{controller}#{device}" if controller && device
|
38
38
|
cloudinit_h.store(:id, id.to_sym) if id
|
39
39
|
cloudinit_h.store(:volid, cloudinit_volid) if cloudinit_volid
|
40
|
+
cloudinit_h.store(:media, 'cdrom')
|
40
41
|
end
|
41
42
|
cloudinit_h
|
42
43
|
end
|
44
|
+
|
45
|
+
def create_cloudinit_iso(vm_name, configs, ssh)
|
46
|
+
iso = File.join(default_iso_path, "#{vm_name.tr('.', '_')}_cloudinit.iso")
|
47
|
+
files = []
|
48
|
+
wd = create_temp_directory(ssh)
|
49
|
+
|
50
|
+
configs.each do |config|
|
51
|
+
config_file = ssh.run(%(echo "#{config[1]}" >> "#{wd}/#{config[0]}"))
|
52
|
+
unless config_file.first.status.zero?
|
53
|
+
delete_temp_dir(ssh, wd)
|
54
|
+
raise ::Foreman::Exception, "Failed to create file #{config[0]}: #{config_file.first.stdout}"
|
55
|
+
end
|
56
|
+
files.append(File.join(wd, config[0]))
|
57
|
+
end
|
58
|
+
generated_iso = ssh.run(generate_iso_command(iso, files))
|
59
|
+
unless generated_iso.first.status.zero?
|
60
|
+
delete_temp_dir(ssh, wd)
|
61
|
+
raise Foreman::Exception, N_("ISO build failed: #{generated_iso.first.stdout}")
|
62
|
+
end
|
63
|
+
delete_temp_dir(ssh, wd)
|
64
|
+
iso
|
65
|
+
end
|
66
|
+
|
67
|
+
def generate_iso_command(iso_file, config_files)
|
68
|
+
arguments = ["genisoimage", "-output #{iso_file}", '-volid', 'cidata', '-joliet', '-rock']
|
69
|
+
iso_command = arguments.concat(config_files).join(' ')
|
70
|
+
logger.debug("iso image generation args: #{iso_command}")
|
71
|
+
iso_command
|
72
|
+
end
|
73
|
+
|
74
|
+
def create_temp_directory(ssh)
|
75
|
+
res = ssh.run("mktemp -d")
|
76
|
+
raise ::Foreman::Exception, "Could not create working directory to store cloudinit config data: #{res.first.stdout}." unless res.first.status.zero?
|
77
|
+
res.first.stdout.chomp
|
78
|
+
end
|
79
|
+
|
80
|
+
def delete_temp_dir(ssh, working_dir)
|
81
|
+
ssh.run("rm -rf #{working_dir}")
|
82
|
+
rescue Foreman::Exception => e
|
83
|
+
logger.warn("Could not delete directory for config files: #{e}. Please delete it manually at #{working_dir}")
|
84
|
+
end
|
85
|
+
|
86
|
+
def parse_cloudinit_config(args)
|
87
|
+
filenames = ["meta-data"]
|
88
|
+
config_data = ["instance-id: #{args[:name]}"]
|
89
|
+
user_data = args.delete(:user_data)
|
90
|
+
return args if user_data == ''
|
91
|
+
check_template_format(user_data)
|
92
|
+
ssh = vm_ssh
|
93
|
+
|
94
|
+
if user_data.include?('#network-config') && user_data.include?('#cloud-config')
|
95
|
+
config_data.concat(user_data.split('#network-config'))
|
96
|
+
filenames.concat(['user-data', 'network-config'])
|
97
|
+
elsif user_data.include?('#network-config') && !user_data.include?('#cloud-config')
|
98
|
+
config_data.append(user_data.split('#network-config')[1])
|
99
|
+
filenames.append("network-config")
|
100
|
+
elsif !user_data.include?('#network-config') && user_data.include?('#cloud-config')
|
101
|
+
config_data.append(user_data)
|
102
|
+
filenames.append("user-data")
|
103
|
+
end
|
104
|
+
|
105
|
+
return args if config_data.length == 1
|
106
|
+
configs = filenames.zip(config_data).to_h
|
107
|
+
|
108
|
+
iso = create_cloudinit_iso(args[:name], configs, ssh)
|
109
|
+
args[:config_attributes]&.merge!(update_boot_order(args[:image_id]))
|
110
|
+
args.merge!(attach_cloudinit_iso(args[:node_id], iso))
|
111
|
+
end
|
112
|
+
|
113
|
+
def attach_cloudinit_iso(node, iso)
|
114
|
+
storage = storages(node, 'iso')[0]
|
115
|
+
volume = storage.volumes.detect { |v| v.volid.include? File.basename(iso) }
|
116
|
+
{ ide2: "#{volume.volid},media=cdrom" }
|
117
|
+
end
|
118
|
+
|
119
|
+
def default_iso_path
|
120
|
+
"/var/lib/vz/template/iso"
|
121
|
+
end
|
122
|
+
|
123
|
+
def update_boot_order(image_id)
|
124
|
+
vm = find_vm_by_uuid(image_id)
|
125
|
+
return if vm.disks.nil?
|
126
|
+
disks = vm.disks.map { |disk| disk.split(":")[0] }.join(";")
|
127
|
+
{ boot: "order=" + disks }
|
128
|
+
end
|
129
|
+
|
130
|
+
def vm_ssh
|
131
|
+
ssh = Fog::SSH.new(URI.parse(fog_credentials[:proxmox_url]).host, fog_credentials[:proxmox_username].split('@')[0], { password: fog_credentials[:proxmox_password] })
|
132
|
+
ssh.run('ls') # test if ssh is successful
|
133
|
+
ssh
|
134
|
+
rescue StandardError => e
|
135
|
+
raise ::Foreman::Exception, "Unable to ssh into proxmox server: #{e}"
|
136
|
+
end
|
137
|
+
|
138
|
+
def check_template_format(user_data)
|
139
|
+
YAML.safe_load(user_data)
|
140
|
+
rescue StandardError => e
|
141
|
+
raise ::Foreman::Exception, "'User data kind' template provided could not be loaded, please check the format: #{e}"
|
142
|
+
end
|
43
143
|
end
|
@@ -27,11 +27,11 @@ require 'foreman_fog_proxmox/hash_collection'
|
|
27
27
|
module ProxmoxVmConfigHelper
|
28
28
|
def object_to_config_hash(vm, type)
|
29
29
|
vm_h = ActiveSupport::HashWithIndifferentAccess.new
|
30
|
-
main_a = ['vmid']
|
31
|
-
main = vm.attributes.select { |key, _value| main_a.include? key }
|
30
|
+
main_a = ['vmid', 'type']
|
31
|
+
main = vm.attributes.select { |key, _value| main_a.include? key.to_s }
|
32
32
|
main_a += ['templated']
|
33
33
|
config = vm.config.attributes.reject do |key, _value|
|
34
|
-
main_a.include?(key) || Fog::Proxmox::DiskHelper.disk?(key) || Fog::Proxmox::NicHelper.nic?(key)
|
34
|
+
main_a.include?(key.to_s) || Fog::Proxmox::DiskHelper.disk?(key) || Fog::Proxmox::NicHelper.nic?(key)
|
35
35
|
end
|
36
36
|
vm_h = vm_h.merge(main)
|
37
37
|
vm_h = vm_h.merge('config_attributes': config)
|
@@ -40,7 +40,7 @@ module ProxmoxVmConfigHelper
|
|
40
40
|
end
|
41
41
|
|
42
42
|
def general_a(type)
|
43
|
-
general_a = ['node_id', 'type', 'config_attributes', 'volumes_attributes', 'interfaces_attributes']
|
43
|
+
general_a = ['node_id', 'type', 'config_attributes', 'volumes_attributes', 'interfaces_attributes', 'image_id']
|
44
44
|
general_a += ['firmware_type', 'provision_method', 'container_volumes', 'server_volumes', 'start_after_create']
|
45
45
|
general_a += ['name'] if type == 'lxc'
|
46
46
|
general_a
|
@@ -126,6 +126,11 @@ module ProxmoxVmConfigHelper
|
|
126
126
|
def parse_typed_memory(args, type)
|
127
127
|
ForemanFogProxmox::HashCollection.remove_empty_values(args)
|
128
128
|
logger.debug("parse_typed_memory(#{type}): args=#{args}")
|
129
|
+
# Convert balloon value from bytes to expected MiB if its not already
|
130
|
+
if args.key?('balloon')
|
131
|
+
mb = (args['balloon'].to_i / 1024**2).to_s
|
132
|
+
args['balloon'] = (mb == '0') ? args['balloon'] : mb
|
133
|
+
end
|
129
134
|
args
|
130
135
|
end
|
131
136
|
|
@@ -56,7 +56,7 @@ module ProxmoxVmInterfacesHelper
|
|
56
56
|
end
|
57
57
|
|
58
58
|
def interface_common_typed_keys(type)
|
59
|
-
[
|
59
|
+
['id', type == 'qemu' ? 'macaddr' : 'hwaddr']
|
60
60
|
end
|
61
61
|
|
62
62
|
def compute_dhcps(interface_attributes_h)
|
@@ -80,8 +80,8 @@ module ProxmoxVmInterfacesHelper
|
|
80
80
|
interfaces_to_delete.push(id.to_s)
|
81
81
|
else
|
82
82
|
interface_common_typed_keys(type).each do |key|
|
83
|
-
ForemanFogProxmox::HashCollection.add_and_format_element(nic, key
|
84
|
-
key
|
83
|
+
ForemanFogProxmox::HashCollection.add_and_format_element(nic, key.to_sym, interface_attributes,
|
84
|
+
key)
|
85
85
|
end
|
86
86
|
interface_attributes_h = interface_attributes['compute_attributes']
|
87
87
|
if ForemanFogProxmox::Value.empty?(interface_attributes['compute_attributes'])
|
@@ -154,7 +154,7 @@ module ForemanFogProxmox
|
|
154
154
|
raise ::Foreman::Exception, 'User token expired' if token_expired?(e)
|
155
155
|
rescue StandardError => e
|
156
156
|
logger.warn("failed to create compute client: #{e}")
|
157
|
-
raise e
|
157
|
+
raise ::Foreman::Exception, error_message(e)
|
158
158
|
end
|
159
159
|
|
160
160
|
def identity_client
|
@@ -163,7 +163,7 @@ module ForemanFogProxmox
|
|
163
163
|
raise ::Foreman::Exception, 'User token expired' if token_expired?(e)
|
164
164
|
rescue StandardError => e
|
165
165
|
logger.warn("failed to create identity client: #{e}")
|
166
|
-
raise e
|
166
|
+
raise ::Foreman::Exception, error_message(e)
|
167
167
|
end
|
168
168
|
|
169
169
|
def network_client
|
@@ -172,7 +172,13 @@ module ForemanFogProxmox
|
|
172
172
|
raise ::Foreman::Exception, 'User token expired' if token_expired?(e)
|
173
173
|
rescue StandardError => e
|
174
174
|
logger.warn("failed to create network client: #{e}")
|
175
|
-
raise e
|
175
|
+
raise ::Foreman::Exception, error_message(e)
|
176
|
+
end
|
177
|
+
|
178
|
+
def error_message(e)
|
179
|
+
"Failed to create Proxmox compute resource: #{e.message}.
|
180
|
+
Either provided credentials or FQDN is wrong or
|
181
|
+
your server cannot connect to Proxmox due to network issues."
|
176
182
|
end
|
177
183
|
|
178
184
|
def host
|
@@ -41,7 +41,7 @@ ostype: ostype)
|
|
41
41
|
end
|
42
42
|
|
43
43
|
def interface_compute_attributes(interface_attributes)
|
44
|
-
vm_attrs = ForemanFogProxmox::HashCollection.new_hash_reject_keys(interface_attributes, [:identifier, :
|
44
|
+
vm_attrs = ForemanFogProxmox::HashCollection.new_hash_reject_keys(interface_attributes, [:identifier, :macaddr, :hwaddr])
|
45
45
|
vm_attrs[:dhcp] = interface_attributes[:ip] == 'dhcp' ? '1' : '0'
|
46
46
|
vm_attrs[:dhcp6] = interface_attributes[:ip6] == 'dhcp' ? '1' : '0'
|
47
47
|
vm_attrs
|
@@ -31,7 +31,9 @@ module ForemanFogProxmox
|
|
31
31
|
options.store(:websocket, 1) if type_console == 'vnc'
|
32
32
|
begin
|
33
33
|
vnc_console = vm.start_console(options)
|
34
|
-
|
34
|
+
vmid = extract_vmid(uuid).to_i
|
35
|
+
vnc_host_port = vnc_console['port'].to_i + vmid
|
36
|
+
WsProxy.start(:host => host, :host_port => vnc_host_port, :password => vnc_console['ticket']).merge(
|
35
37
|
:name => vm.name, :type => type_console
|
36
38
|
)
|
37
39
|
rescue StandardError => e
|
@@ -47,8 +47,9 @@ module ForemanFogProxmox
|
|
47
47
|
def templates
|
48
48
|
volumes = []
|
49
49
|
nodes.each do |node|
|
50
|
-
|
51
|
-
|
50
|
+
storages(node.node).each do |storage|
|
51
|
+
volumes += storage.volumes.list_by_content_type('images')
|
52
|
+
end
|
52
53
|
end
|
53
54
|
volumes.select(&:template?)
|
54
55
|
end
|
@@ -57,15 +58,11 @@ module ForemanFogProxmox
|
|
57
58
|
find_vm_by_uuid(uuid)
|
58
59
|
end
|
59
60
|
|
60
|
-
def clone_from_image(image_id,
|
61
|
+
def clone_from_image(image_id, vmid)
|
61
62
|
logger.debug("create_vm(): clone #{image_id} in #{vmid}")
|
62
63
|
image = find_vm_by_uuid(image_id)
|
63
64
|
image.clone(vmid)
|
64
|
-
|
65
|
-
options = {}
|
66
|
-
options.store(:name, args[:name]) unless clone.container?
|
67
|
-
options.store(:hostname, args[:name]) if clone.container?
|
68
|
-
clone.update(options)
|
65
|
+
find_vm_by_uuid(id.to_s + '_' + vmid.to_s)
|
69
66
|
end
|
70
67
|
end
|
71
68
|
end
|
@@ -39,26 +39,37 @@ module ForemanFogProxmox
|
|
39
39
|
raise ::Foreman::Exception, format(N_('invalid vmid=%<vmid>s'), vmid: vmid) unless node.servers.id_valid?(vmid)
|
40
40
|
|
41
41
|
image_id = args[:image_id]
|
42
|
+
remove_volume_keys(args)
|
42
43
|
if image_id
|
43
|
-
clone_from_image(image_id,
|
44
|
+
vm = clone_from_image(image_id, vmid)
|
45
|
+
vm.update(compute_clone_attributes(args, vm.container?, type))
|
46
|
+
update_pool(vm, args[:pool]) if args[:pool]
|
44
47
|
else
|
45
|
-
remove_volume_keys(args)
|
46
48
|
logger.warn("create vm: args=#{args}")
|
47
49
|
vm = node.send(vm_collection(type)).create(parse_typed_vm(args, type))
|
48
|
-
start_on_boot(vm, args)
|
49
50
|
end
|
51
|
+
start_on_boot(vm, args)
|
50
52
|
rescue StandardError => e
|
51
53
|
logger.warn("failed to create vm: #{e}")
|
52
|
-
destroy_vm
|
54
|
+
destroy_vm id.to_s + '_' + vm.vmid.to_s if vm
|
53
55
|
raise e
|
54
56
|
end
|
55
57
|
|
58
|
+
def compute_clone_attributes(args, container, type)
|
59
|
+
args = parse_cloudinit_config(args) if args[:user_data]
|
60
|
+
parsed_args = parse_typed_vm(args, type)
|
61
|
+
if container
|
62
|
+
options = { :hostname => args[:name] }
|
63
|
+
parsed_args.merge(options)
|
64
|
+
end
|
65
|
+
parsed_args.reject { |k| k == 'pool' }
|
66
|
+
end
|
67
|
+
|
56
68
|
def destroy_vm(uuid)
|
57
69
|
vm = find_vm_by_uuid(uuid)
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
end
|
70
|
+
return true if vm.nil?
|
71
|
+
vm.stop if vm.ready?
|
72
|
+
vm.destroy
|
62
73
|
rescue ActiveRecord::RecordNotFound
|
63
74
|
# if the VM does not exists, we don't really care.
|
64
75
|
true
|
@@ -104,12 +104,14 @@ module ForemanFogProxmox
|
|
104
104
|
|
105
105
|
def volume_exists?(vm, volume_attributes)
|
106
106
|
disk = vm.config.disks.get(volume_attributes['id'])
|
107
|
-
|
108
|
-
return exists unless disk
|
107
|
+
return false unless disk
|
109
108
|
|
110
|
-
|
111
|
-
|
112
|
-
|
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?
|
111
|
+
volume_attributes['volid'].present?
|
112
|
+
elsif disk.cdrom?
|
113
|
+
volume_attributes['cdrom'].present?
|
114
|
+
end
|
113
115
|
end
|
114
116
|
|
115
117
|
def volume_to_delete?(volume_attributes)
|
@@ -38,5 +38,5 @@ along with ForemanFogProxmox. If not, see <http://www.gnu.org/licenses/>. %>
|
|
38
38
|
:placeholder => _("Optionally provide a CA, or a correctly ordered CA chain. If left blank, disable ssl_verify_peer.") %>
|
39
39
|
<% end %>
|
40
40
|
<div class="col-md-offset-2">
|
41
|
-
<%= test_connection_button_f(f, (f.object.nodes rescue
|
41
|
+
<%= test_connection_button_f(f, (f.object.nodes rescue true)) %>
|
42
42
|
</div>
|
@@ -21,7 +21,10 @@ along with ForemanFogProxmox. If not, see <http://www.gnu.org/licenses/>. %>
|
|
21
21
|
<%= checkbox_f f, :templated, :label => _('Create image?'), :disabled => untemplatable, :class => ('hide' if untemplatable), :no_label => untemplatable %>
|
22
22
|
<%= counter_f f, :vmid, :label => _('VM ID'), :label_size => "col-md-2", :required => true, :disabled => (!new_vm || from_profile) %>
|
23
23
|
<%= select_f f, :node_id, compute_resource.nodes, :node, :node, { }, :label => _('Node'), :label_size => "col-md-2", :required => true, :onchange => 'nodeSelected(this)' %>
|
24
|
-
|
24
|
+
<% unless !new_vm || from_profile %>
|
25
|
+
<% checked = params[:host] && params[:host][:compute_attributes] && params[:host][:compute_attributes][:start_after_create] || '1' %>
|
26
|
+
<%= checkbox_f f, :start_after_create, {:checked => (checked == '1'), :label => _('Start after creation?')} %>
|
27
|
+
<% end %>
|
25
28
|
<% unless local_assigns[:hide_image] && !new_vm %>
|
26
29
|
<%
|
27
30
|
arch ||= nil ; os ||= nil
|
@@ -18,14 +18,4 @@ along with ForemanFogProxmox. If not, see <http://www.gnu.org/licenses/>. %>
|
|
18
18
|
<% container = f.object.type == 'lxc' %>
|
19
19
|
|
20
20
|
<%= field_set_tag _("Advanced"), :id => "container_config_advanced_options", :class => ('hide' unless container) do %>
|
21
|
-
|
22
|
-
<%= check_box_tag 'show_container_config_options', '1', false, :onclick => "$('#container_config_options').toggle()" %>
|
23
|
-
<%= label_tag 'show_container_config_cpu', _("CPU") %>
|
24
|
-
<%= check_box_tag 'show_container_config_cpu', '1', false, :onclick => "$('#container_config_cpu').toggle()" %>
|
25
|
-
<%= label_tag 'show_container_config_memory', _("Memory") %>
|
26
|
-
<%= check_box_tag 'show_container_config_memory', '1', false, :onclick => "$('#container_config_memory').toggle()" %>
|
27
|
-
<%= label_tag 'show_container_config_dns', _("DNS") %>
|
28
|
-
<%= check_box_tag 'show_container_config_dns', '1', false, :onclick => "$('#container_config_dns').toggle()" %>
|
29
|
-
<%= label_tag 'show_container_config_os', _("OS") %>
|
30
|
-
<%= check_box_tag 'show_container_config_os', '1', false, :onclick => "$('#container_config_os').toggle()" %>
|
31
|
-
<% end %>
|
21
|
+
<% end %>
|
@@ -17,25 +17,32 @@ along with ForemanFogProxmox. If not, see <http://www.gnu.org/licenses/>. %>
|
|
17
17
|
|
18
18
|
<%= javascript_include_tag 'foreman_fog_proxmox/proxmox_vm_container', "data-turbolinks-track" => true %>
|
19
19
|
<% container = type == 'lxc' %>
|
20
|
-
<%=
|
21
|
-
<%=
|
22
|
-
|
23
|
-
|
24
|
-
<%=
|
20
|
+
<%= content_tag :div, :id => "container_advanced_options" do %>
|
21
|
+
<%= content_tag :h3, "Main Options"%>
|
22
|
+
<div>
|
23
|
+
<%= textarea_f f, :description, :label => _('Description'), :label_size => "col-md-2" %>
|
24
|
+
<%= checkbox_f f, :onboot, :label => _('Start at boot') %>
|
25
|
+
</div>
|
26
|
+
<%= content_tag :h3, "CPUs"%>
|
27
|
+
<div>
|
25
28
|
<%= select_f f, :arch, proxmox_archs_map, :id, :name, { }, :label => _('Architecture'), :label_size => "col-md-2" %>
|
26
29
|
<%= counter_f f, :cores, :class => "input-mini", :label => _('Cores'), :label_size => "col-md-2" %>
|
27
30
|
<%= counter_f f, :cpulimit, :class => "input-mini", :label => _('CPU limit'), :label_size => "col-md-2" %>
|
28
31
|
<%= counter_f f, :cpuunits, :class => "input-mini", :label => _('CPU units'), :label_size => "col-md-2" %>
|
29
|
-
|
30
|
-
<%=
|
32
|
+
</div>
|
33
|
+
<%= content_tag :h3, "Memory"%>
|
34
|
+
<div>
|
31
35
|
<%= text_f f, :memory, :class => "input-mini", :label => _('Memory (MB)'), :label_size => "col-md-2" %>
|
32
36
|
<%= text_f f, :swap, :class => "input-mini", :label => _('Swap (MB)'), :label_size => "col-md-2" %>
|
33
|
-
|
34
|
-
<%=
|
37
|
+
</div>
|
38
|
+
<%= content_tag :h3, "DNS"%>
|
39
|
+
<div>
|
35
40
|
<%= text_f f, :hostname, :label => _('Hostname'), :label_size => "col-md-2", :disabled => true %>
|
36
41
|
<%= text_f f, :nameserver, :label => _('DNS server'), :label_size => "col-md-2" %>
|
37
42
|
<%= text_f f, :searchdomain, :label => _('Search domain'), :label_size => "col-md-2" %>
|
38
|
-
|
39
|
-
<%=
|
43
|
+
</div>
|
44
|
+
<%= content_tag :h3, "Operating System"%>
|
45
|
+
<div>
|
40
46
|
<%= select_f f, :ostype, proxmox_ostypes_map, :id, :name, { }, :label => _('OS type'), :label_size => "col-md-2" %>
|
41
|
-
|
47
|
+
</div>
|
48
|
+
<% end %>
|
@@ -18,12 +18,4 @@ along with ForemanFogProxmox. If not, see <http://www.gnu.org/licenses/>. %>
|
|
18
18
|
<% server = f.object.type == 'qemu' %>
|
19
19
|
|
20
20
|
<%= field_set_tag _("Advanced"), :id => "server_config_advanced_options", :class => ('hide' unless server) do %>
|
21
|
-
|
22
|
-
<%= check_box_tag 'show_server_config_options', '1', false, :onclick => "$('#server_config_options').toggle()" %>
|
23
|
-
<%= label_tag 'show_server_config_cpu', _("CPU") %>
|
24
|
-
<%= check_box_tag 'show_server_config_cpu', '1', false, :onclick => "$('#server_config_cpu').toggle()" %>
|
25
|
-
<%= label_tag 'show_server_config_memory', _("Memory") %>
|
26
|
-
<%= check_box_tag 'show_server_config_memory', '1', false, :onclick => "$('#server_config_memory').toggle()" %>
|
27
|
-
<%= label_tag 'show_server_config_os', _("OS") %>
|
28
|
-
<%= check_box_tag 'show_server_config_os', '1', false, :onclick => "$('#server_config_os').toggle()" %>
|
29
|
-
<% end %>
|
21
|
+
<% end %>
|
@@ -20,17 +20,21 @@ along with ForemanFogProxmox. If not, see <http://www.gnu.org/licenses/>. %>
|
|
20
20
|
<% server = type == 'qemu' %>
|
21
21
|
<% logger.debug("_config.html.erb server_config=#{f.object.inspect}") %>
|
22
22
|
|
23
|
-
<%=
|
24
|
-
<%=
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
<%=
|
23
|
+
<%= content_tag :div, :id => "server_advanced_options" do %>
|
24
|
+
<%= content_tag :h3, "Main Options" %>
|
25
|
+
<div>
|
26
|
+
<%= textarea_f f, :description, :label => _('Description'), :label_size => "col-md-2" %>
|
27
|
+
<%= 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)') %>
|
28
|
+
<%= checkbox_f f, :onboot, :label => _('Start at boot') %>
|
29
|
+
<%= checkbox_f f, :agent, :label => _('Qemu Agent') %>
|
30
|
+
<%= checkbox_f f, :kvm, :label => _('KVM'), :label_help => _('Enable/disable KVM hardware virtualization') %>
|
31
|
+
<%= select_f f, :vga, proxmox_vgas_map, :id, :name, { :include_blank => true }, :label => _('VGA'), :label_size => "col-md-2" %>
|
32
|
+
<%= select_f f, :scsihw, proxmox_scsi_controllers_map, :id, :name, { }, :label => _('SCSI Controller'), :label_size => "col-md-2" %>
|
33
|
+
<%= select_f f, :bios, proxmox_bios_map, :id, :name, { }, :label => _('BIOS'), :label_size => "col-md-2" %>
|
34
|
+
</div>
|
35
|
+
|
36
|
+
<%= content_tag :h3, "CPUs" %>
|
37
|
+
<div>
|
34
38
|
<%= select_f f, :cpu_type, proxmox_cpus_map, :id, :name, { }, :label => _('Type'), :label_size => "col-md-2" %>
|
35
39
|
<%= counter_f f, :sockets, :class => "input-mini", :label => _('Sockets'), :label_size => "col-md-2" %>
|
36
40
|
<%= counter_f f, :cores, :class => "input-mini", :label => _('Cores'), :label_size => "col-md-2" %>
|
@@ -43,14 +47,17 @@ along with ForemanFogProxmox. If not, see <http://www.gnu.org/licenses/>. %>
|
|
43
47
|
<%= select_f f, flag_key, proxmox_cpu_flags_map, :id, :name, { }, :label => _(flag_value) %>
|
44
48
|
<% end %>
|
45
49
|
<% end %>
|
46
|
-
|
47
|
-
<%=
|
50
|
+
</div>
|
51
|
+
<%= content_tag :h3, "Memory" %>
|
52
|
+
<div>
|
48
53
|
<%= text_f f, :memory, :class => "input-mini", :label => _('Memory (MB)'), :label_size => "col-md-2" %>
|
49
54
|
<%= text_f f, :balloon, :class => "input-mini", :label => _('Minimum memory (MB)'), :label_size => "col-md-2" %>
|
50
55
|
<%= text_f f, :shares, :class => "input-mini", :label => _('Shares (MB)'), :label_size => "col-md-2" %>
|
51
|
-
|
52
|
-
<%=
|
56
|
+
</div>
|
57
|
+
<%= content_tag :h3, "Operating System" %>
|
58
|
+
<div>
|
53
59
|
<%= select_f f, :ostype, proxmox_operating_systems_map, :id, :name, { :include_blank => true }, :label => _('OS type'), :label_size => "col-md-2" %>
|
60
|
+
</div>
|
54
61
|
<% end %>
|
55
62
|
<%= field_set_tag _("Cloud-init"), :id => "server_config_cloud_init", :class => ('hide' unless cloudinit), :disabled => (!cloudinit) do %>
|
56
63
|
<%= text_f f, :ciuser, :label => _('User'), :label_size => "col-md-2" %>
|
@@ -58,4 +65,4 @@ along with ForemanFogProxmox. If not, see <http://www.gnu.org/licenses/>. %>
|
|
58
65
|
<%= text_f f, :searchdomain, :label => _('DNS domain'), :label_size => "col-md-2" %>
|
59
66
|
<%= text_f f, :nameserver, :label => _('DNS servers'), :label_size => "col-md-2" %>
|
60
67
|
<%= textarea_f f, :sshkeys, :label => _("SSH public key"), :size => "col-md-4" %>
|
61
|
-
<% end %>
|
68
|
+
<% end %>
|
@@ -41,6 +41,7 @@ along with ForemanFogProxmox. If not, see <http://www.gnu.org/licenses/>. %>
|
|
41
41
|
<td>
|
42
42
|
<%= action_buttons(
|
43
43
|
vm_power_action(vm, authorizer),
|
44
|
+
vm_associate_link(vm),
|
44
45
|
display_delete_if_authorized(hash_for_compute_resource_vm_path(:compute_resource_id => @compute_resource, :id => vm.unique_cluster_identity(@compute_resource)).merge(:auth_object => @compute_resource, :authorizer => authorizer))) %>
|
45
46
|
</td>
|
46
47
|
</tr>
|
@@ -40,13 +40,15 @@ module ForemanFogProxmox
|
|
40
40
|
initializer 'foreman_fog_proxmox.register_plugin', :before => :finisher_hook do |_app|
|
41
41
|
Foreman::Plugin.register :foreman_fog_proxmox do
|
42
42
|
requires_foreman '>= 1.22.0'
|
43
|
+
# Add Global files for extending foreman-core components and routes
|
44
|
+
register_global_js_file 'global'
|
43
45
|
# Register Proxmox VE compute resource in foreman
|
44
46
|
compute_resource ForemanFogProxmox::Proxmox
|
45
47
|
parameter_filter(ComputeResource, :uuid)
|
46
48
|
# add dashboard widget
|
47
49
|
widget 'foreman_fog_proxmox_widget', name: N_('Foreman Fog Proxmox widget'), sizex: 8, sizey: 1
|
48
50
|
security_block :foreman_fog_proxmox do
|
49
|
-
permission :
|
51
|
+
permission :view_compute_resources, { :'foreman_fog_proxmox/compute_resources' =>
|
50
52
|
[:ostemplates_by_id_and_node_and_storage,
|
51
53
|
:isos_by_id_and_node_and_storage,
|
52
54
|
:ostemplates_by_id_and_node,
|
@@ -244,7 +244,10 @@ msgstr ""
|
|
244
244
|
msgid "Memory"
|
245
245
|
msgstr ""
|
246
246
|
|
247
|
-
msgid "
|
247
|
+
msgid "Memory (MB)"
|
248
|
+
msgstr ""
|
249
|
+
|
250
|
+
msgid "Minimum memory (MB)"
|
248
251
|
msgstr ""
|
249
252
|
|
250
253
|
msgid "Mount point"
|
@@ -340,10 +343,10 @@ msgstr ""
|
|
340
343
|
msgid "Search domain"
|
341
344
|
msgstr ""
|
342
345
|
|
343
|
-
msgid "Shares"
|
346
|
+
msgid "Shares (MB)"
|
344
347
|
msgstr ""
|
345
348
|
|
346
|
-
msgid "Size"
|
349
|
+
msgid "Size (GB)"
|
347
350
|
msgstr ""
|
348
351
|
|
349
352
|
msgid "Sockets"
|
@@ -358,7 +361,7 @@ msgstr ""
|
|
358
361
|
msgid "Storage"
|
359
362
|
msgstr ""
|
360
363
|
|
361
|
-
msgid "Swap"
|
364
|
+
msgid "Swap (MB)"
|
362
365
|
msgstr ""
|
363
366
|
|
364
367
|
msgid "Template storage"
|
@@ -472,6 +475,12 @@ msgstr ""
|
|
472
475
|
msgid "net[n] with n integer >= 0, e.g. net0"
|
473
476
|
msgstr ""
|
474
477
|
|
478
|
+
msgid "new_typed_vm(%<type>s) with vm_typed_instance_defaults: vm_h=%<vm_h>s"
|
479
|
+
msgstr ""
|
480
|
+
|
481
|
+
msgid "parse_hard_disk_volume(): args=%<args>s"
|
482
|
+
msgstr ""
|
483
|
+
|
475
484
|
msgid "remove CDROM"
|
476
485
|
msgstr ""
|
477
486
|
|
@@ -8,8 +8,8 @@ msgid ""
|
|
8
8
|
msgstr ""
|
9
9
|
"Project-Id-Version: foreman_fog_proxmox 1.0.0\n"
|
10
10
|
"Report-Msgid-Bugs-To: \n"
|
11
|
-
"POT-Creation-Date: 2022-12-
|
12
|
-
"PO-Revision-Date: 2022-12-
|
11
|
+
"POT-Creation-Date: 2022-12-16 17:29+0100\n"
|
12
|
+
"PO-Revision-Date: 2022-12-16 17:29+0100\n"
|
13
13
|
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
14
14
|
"Language-Team: LANGUAGE <LL@li.org>\n"
|
15
15
|
"Language: \n"
|
@@ -89,6 +89,10 @@ msgstr ""
|
|
89
89
|
msgid "Change the password"
|
90
90
|
msgstr ""
|
91
91
|
|
92
|
+
#: ../app/helpers/proxmox_vm_volumes_helper.rb:52
|
93
|
+
msgid "parse_hard_disk_volume(): args=%<args>s"
|
94
|
+
msgstr ""
|
95
|
+
|
92
96
|
#: ../app/models/concerns/fog_extensions/proxmox/server.rb:62
|
93
97
|
msgid "Type %<type>s, node %<node>s, %<cpus>s CPUs and %<memory>s MB memory"
|
94
98
|
msgstr ""
|
@@ -129,10 +133,15 @@ msgstr ""
|
|
129
133
|
msgid "invalid vmid=%<vmid>s"
|
130
134
|
msgstr ""
|
131
135
|
|
132
|
-
#: ../app/models/foreman_fog_proxmox/
|
136
|
+
#: ../app/models/foreman_fog_proxmox/proxmox_vm_new.rb:199
|
137
|
+
msgid "new_typed_vm(%<type>s) with vm_typed_instance_defaults: vm_h=%<vm_h>s"
|
138
|
+
msgstr ""
|
139
|
+
|
140
|
+
#: ../app/models/foreman_fog_proxmox/proxmox_vm_queries.rb:78
|
133
141
|
msgid "Failed retrieving proxmox server vm by vmid=%<vmid>s"
|
134
142
|
msgstr ""
|
135
143
|
|
144
|
+
#: ../app/models/foreman_fog_proxmox/proxmox_volumes.rb:88
|
136
145
|
#: ../app/models/foreman_fog_proxmox/proxmox_volumes.rb:91
|
137
146
|
msgid "Unable to shrink %<id>s size. Proxmox allows only increasing size."
|
138
147
|
msgstr ""
|
@@ -365,10 +374,8 @@ msgstr ""
|
|
365
374
|
#:
|
366
375
|
#: ../app/views/compute_resources_vms/form/proxmox/container/_advanced.html.erb:10
|
367
376
|
#: ../app/views/compute_resources_vms/form/proxmox/container/_config.html.erb:15
|
368
|
-
#: ../app/views/compute_resources_vms/form/proxmox/container/_config.html.erb:16
|
369
377
|
#: ../app/views/compute_resources_vms/form/proxmox/server/_advanced.html.erb:10
|
370
378
|
#: ../app/views/compute_resources_vms/form/proxmox/server/_config.html.erb:32
|
371
|
-
#: ../app/views/compute_resources_vms/form/proxmox/server/_config.html.erb:33
|
372
379
|
#: ../app/views/compute_resources_vms/index/_proxmox.html.erb:10
|
373
380
|
msgid "Memory"
|
374
381
|
msgstr ""
|
@@ -418,9 +425,15 @@ msgstr ""
|
|
418
425
|
msgid "CPU units"
|
419
426
|
msgstr ""
|
420
427
|
|
428
|
+
#:
|
429
|
+
#: ../app/views/compute_resources_vms/form/proxmox/container/_config.html.erb:16
|
430
|
+
#: ../app/views/compute_resources_vms/form/proxmox/server/_config.html.erb:33
|
431
|
+
msgid "Memory (MB)"
|
432
|
+
msgstr ""
|
433
|
+
|
421
434
|
#:
|
422
435
|
#: ../app/views/compute_resources_vms/form/proxmox/container/_config.html.erb:17
|
423
|
-
msgid "Swap"
|
436
|
+
msgid "Swap (MB)"
|
424
437
|
msgstr ""
|
425
438
|
|
426
439
|
#:
|
@@ -598,7 +611,7 @@ msgstr ""
|
|
598
611
|
#: ../app/views/compute_resources_vms/form/proxmox/container/_volume_mp.html.erb:11
|
599
612
|
#: ../app/views/compute_resources_vms/form/proxmox/container/_volume_rootfs.html.erb:8
|
600
613
|
#: ../app/views/compute_resources_vms/form/proxmox/server/_volume_hard_disk.html.erb:16
|
601
|
-
msgid "Size"
|
614
|
+
msgid "Size (GB)"
|
602
615
|
msgstr ""
|
603
616
|
|
604
617
|
#:
|
@@ -660,11 +673,11 @@ msgid "CPU Flags"
|
|
660
673
|
msgstr ""
|
661
674
|
|
662
675
|
#: ../app/views/compute_resources_vms/form/proxmox/server/_config.html.erb:34
|
663
|
-
msgid "Minimum memory"
|
676
|
+
msgid "Minimum memory (MB)"
|
664
677
|
msgstr ""
|
665
678
|
|
666
679
|
#: ../app/views/compute_resources_vms/form/proxmox/server/_config.html.erb:35
|
667
|
-
msgid "Shares"
|
680
|
+
msgid "Shares (MB)"
|
668
681
|
msgstr ""
|
669
682
|
|
670
683
|
#: ../app/views/compute_resources_vms/form/proxmox/server/_config.html.erb:40
|
@@ -244,8 +244,11 @@ msgstr ""
|
|
244
244
|
msgid "Memory"
|
245
245
|
msgstr "Mémoire"
|
246
246
|
|
247
|
-
msgid "
|
248
|
-
msgstr "
|
247
|
+
msgid "Memory (MB)"
|
248
|
+
msgstr ""
|
249
|
+
|
250
|
+
msgid "Minimum memory (MB)"
|
251
|
+
msgstr ""
|
249
252
|
|
250
253
|
msgid "Mount point"
|
251
254
|
msgstr "Point de montage"
|
@@ -340,11 +343,11 @@ msgstr ""
|
|
340
343
|
msgid "Search domain"
|
341
344
|
msgstr "Domaine de recherche"
|
342
345
|
|
343
|
-
msgid "Shares"
|
344
|
-
msgstr "
|
346
|
+
msgid "Shares (MB)"
|
347
|
+
msgstr ""
|
345
348
|
|
346
|
-
msgid "Size"
|
347
|
-
msgstr "
|
349
|
+
msgid "Size (GB)"
|
350
|
+
msgstr ""
|
348
351
|
|
349
352
|
msgid "Sockets"
|
350
353
|
msgstr ""
|
@@ -358,7 +361,7 @@ msgstr "Démarrer au boot"
|
|
358
361
|
msgid "Storage"
|
359
362
|
msgstr "Stockage"
|
360
363
|
|
361
|
-
msgid "Swap"
|
364
|
+
msgid "Swap (MB)"
|
362
365
|
msgstr ""
|
363
366
|
|
364
367
|
msgid "Template storage"
|
@@ -472,6 +475,12 @@ msgstr "vmid=%<vmid>s incorrect"
|
|
472
475
|
msgid "net[n] with n integer >= 0, e.g. net0"
|
473
476
|
msgstr ""
|
474
477
|
|
478
|
+
msgid "new_typed_vm(%<type>s) with vm_typed_instance_defaults: vm_h=%<vm_h>s"
|
479
|
+
msgstr ""
|
480
|
+
|
481
|
+
msgid "parse_hard_disk_volume(): args=%<args>s"
|
482
|
+
msgstr ""
|
483
|
+
|
475
484
|
msgid "remove CDROM"
|
476
485
|
msgstr ""
|
477
486
|
|
@@ -140,8 +140,8 @@ module ForemanFogProxmox
|
|
140
140
|
describe 'object_to_config_hash' do
|
141
141
|
setup { Fog.mock! }
|
142
142
|
teardown { Fog.unmock! }
|
143
|
-
excluded_qemu_keys = ['templated', 'ide2', 'scsi0', 'net0', 'net1']
|
144
|
-
excluded_lxc_keys = ['templated', 'rootfs', 'mp0', 'net0', 'net1']
|
143
|
+
excluded_qemu_keys = ['vmid', 'type', 'templated', 'ide2', 'scsi0', 'net0', 'net1']
|
144
|
+
excluded_lxc_keys = ['vmid', 'type', 'templated', 'rootfs', 'mp0', 'net0', 'net1']
|
145
145
|
|
146
146
|
it '#server qemu' do
|
147
147
|
config_hash = object_to_config_hash(server, 'qemu')
|
@@ -27,7 +27,6 @@ module ForemanFogProxmox
|
|
27
27
|
describe 'clone_from_image' do
|
28
28
|
before do
|
29
29
|
@cr = FactoryBot.build_stubbed(:proxmox_cr)
|
30
|
-
@args = { :name => 'name' }
|
31
30
|
@image_id = @cr.id.to_s + '_' + 100.to_s
|
32
31
|
@vmid = 101
|
33
32
|
@image = mock('vm')
|
@@ -36,16 +35,14 @@ module ForemanFogProxmox
|
|
36
35
|
@clone = mock('vm')
|
37
36
|
end
|
38
37
|
it 'clones server from image' do
|
39
|
-
@clone.expects(:update).with(:name => 'name')
|
40
38
|
@clone.stubs(:container?).returns(false)
|
41
39
|
@cr.stubs(:find_vm_by_uuid).with(@cr.id.to_s + '_' + @vmid.to_s).returns(@clone)
|
42
|
-
@cr.clone_from_image(@image_id, @
|
40
|
+
@cr.clone_from_image(@image_id, @vmid)
|
43
41
|
end
|
44
42
|
it 'clones container from image' do
|
45
43
|
@clone.stubs(:container?).returns(true)
|
46
|
-
@clone.expects(:update).with(:hostname => 'name')
|
47
44
|
@cr.stubs(:find_vm_by_uuid).with(@cr.id.to_s + '_' + @vmid.to_s).returns(@clone)
|
48
|
-
@cr.clone_from_image(@image_id, @
|
45
|
+
@cr.clone_from_image(@image_id, @vmid)
|
49
46
|
end
|
50
47
|
end
|
51
48
|
end
|
@@ -291,8 +291,14 @@ module ForemanFogProxmox
|
|
291
291
|
args = { vmid: '100', type: 'lxc', image_id: '999', name: 'name' }
|
292
292
|
servers = mock('servers')
|
293
293
|
servers.stubs(:id_valid?).returns(true)
|
294
|
-
|
295
|
-
cr
|
294
|
+
containers = mock('containers')
|
295
|
+
cr = mock_node_servers_containers(ForemanFogProxmox::Proxmox.new, servers, containers)
|
296
|
+
vm = mock('vm')
|
297
|
+
cr.expects(:clone_from_image).with('999', 100).returns(vm)
|
298
|
+
vm.expects(:container?).returns(true)
|
299
|
+
expected_args = { :vmid => "100", :type => "lxc" }
|
300
|
+
cr.stubs(:parse_typed_vm).with(args, 'lxc').returns(expected_args)
|
301
|
+
vm.expects(:update).with(expected_args)
|
296
302
|
cr.create_vm(args)
|
297
303
|
end
|
298
304
|
end
|
@@ -96,9 +96,15 @@ module ForemanFogProxmox
|
|
96
96
|
it 'clones server' do
|
97
97
|
args = { vmid: '100', type: 'qemu', image_id: '999', name: 'name' }
|
98
98
|
servers = mock('servers')
|
99
|
+
containers = mock('containers')
|
99
100
|
servers.stubs(:id_valid?).returns(true)
|
100
|
-
cr =
|
101
|
-
|
101
|
+
cr = mock_node_servers_containers(ForemanFogProxmox::Proxmox.new, servers, containers)
|
102
|
+
vm = mock('vm')
|
103
|
+
cr.expects(:clone_from_image).with('999', 100).returns(vm)
|
104
|
+
vm.expects(:container?).returns(false)
|
105
|
+
expected_args = { :vmid => "100", :type => "qemu", :name => "name" }
|
106
|
+
cr.stubs(:parse_typed_vm).with(args, 'qemu').returns(expected_args)
|
107
|
+
vm.expects(:update).with(expected_args)
|
102
108
|
cr.create_vm(args)
|
103
109
|
end
|
104
110
|
end
|
@@ -44,6 +44,7 @@ module ForemanFogProxmox
|
|
44
44
|
disk.stubs(:id).returns('ide2')
|
45
45
|
disk.stubs(:hard_disk?).returns(false)
|
46
46
|
disk.stubs(:cdrom?).returns(true)
|
47
|
+
disk.stubs(:rootfs?).returns(false)
|
47
48
|
disks.stubs(:get).returns
|
48
49
|
config.stubs(:disks).returns(disks)
|
49
50
|
config.stubs(:attributes).returns(:cores => '')
|
@@ -93,6 +94,7 @@ module ForemanFogProxmox
|
|
93
94
|
disk.stubs(:size).returns('1')
|
94
95
|
disk.stubs(:hard_disk?).returns(false)
|
95
96
|
disk.stubs(:cdrom?).returns(true)
|
97
|
+
disk.stubs(:rootfs?).returns(false)
|
96
98
|
disk.stubs(:cloud_init?).returns(false)
|
97
99
|
disk.stubs(:storage).returns('local-lvm')
|
98
100
|
disk.stubs(:volid).returns('local-lvm:iso/ubuntu-20_4.iso')
|
@@ -145,6 +147,7 @@ module ForemanFogProxmox
|
|
145
147
|
disk.stubs(:size).returns('1')
|
146
148
|
disk.stubs(:hard_disk?).returns(false)
|
147
149
|
disk.stubs(:cdrom?).returns(true)
|
150
|
+
disk.stubs(:rootfs?).returns(false)
|
148
151
|
disk.stubs(:cloud_init?).returns(false)
|
149
152
|
disk.stubs(:storage).returns('local-lvm')
|
150
153
|
disk.stubs(:volid).returns('local-lvm:iso/ubuntu-20_4.iso')
|
@@ -24,12 +24,13 @@ require 'factories/foreman_fog_proxmox/proxmox_server_mock_factory'
|
|
24
24
|
require 'active_support/core_ext/hash/indifferent_access'
|
25
25
|
|
26
26
|
module ForemanFogProxmox
|
27
|
-
class ProxmoxVmCommandsServerUpdateHardDiskTest < ActiveSupport::TestCase
|
27
|
+
class ProxmoxVmCommandsServerUpdateHardDiskTest < ActiveSupport::TestCase # rubocop:disable Metrics/ClassLength
|
28
28
|
include ComputeResourceTestHelpers
|
29
29
|
include ProxmoxNodeMockFactory
|
30
30
|
include ProxmoxServerMockFactory
|
31
31
|
include ProxmoxVmHelper
|
32
32
|
|
33
|
+
# rubocop:disable Metrics/BlockLength
|
33
34
|
describe 'save_vm' do
|
34
35
|
before do
|
35
36
|
@cr = FactoryBot.build_stubbed(:proxmox_cr)
|
@@ -43,6 +44,7 @@ module ForemanFogProxmox
|
|
43
44
|
disk.stubs(:size).returns('1')
|
44
45
|
disk.stubs(:hard_disk?).returns(true)
|
45
46
|
disk.stubs(:cdrom?).returns(false)
|
47
|
+
disk.stubs(:rootfs?).returns(false)
|
46
48
|
disk.stubs(:storage).returns('local-lvm')
|
47
49
|
disk.stubs(:id).returns('scsi0')
|
48
50
|
disk.stubs(:attributes).returns(id: 'scsi0', storage: 'local-lvm', size: '1')
|
@@ -94,6 +96,7 @@ module ForemanFogProxmox
|
|
94
96
|
disk.stubs(:size).returns('1')
|
95
97
|
disk.stubs(:hard_disk?).returns(true)
|
96
98
|
disk.stubs(:cdrom?).returns(false)
|
99
|
+
disk.stubs(:rootfs?).returns(false)
|
97
100
|
disk.stubs(:storage).returns('local-lvm')
|
98
101
|
disk.stubs(:id).returns('virtio0')
|
99
102
|
disks.stubs(:get).returns(disk)
|
@@ -147,6 +150,7 @@ module ForemanFogProxmox
|
|
147
150
|
disk.stubs(:size).returns('1')
|
148
151
|
disk.stubs(:hard_disk?).returns(true)
|
149
152
|
disk.stubs(:cdrom?).returns(false)
|
153
|
+
disk.stubs(:rootfs?).returns(false)
|
150
154
|
disk.stubs(:storage).returns('scsi0')
|
151
155
|
disk.stubs(:volid).returns('local-lvm:vm-100-disk-0')
|
152
156
|
disk.stubs(:id).returns('local-lvm')
|
@@ -202,6 +206,7 @@ module ForemanFogProxmox
|
|
202
206
|
disk.stubs(:size).returns('2')
|
203
207
|
disk.stubs(:hard_disk?).returns(true)
|
204
208
|
disk.stubs(:cdrom?).returns(false)
|
209
|
+
disk.stubs(:rootfs?).returns(false)
|
205
210
|
disk.stubs(:storage).returns('local-lvm')
|
206
211
|
disk.stubs(:volid).returns('local-lvm:vm-100-disk-0')
|
207
212
|
disk.stubs(:attributes).returns(id: 'scsi0', storage: 'local-lvm', size: '2')
|
@@ -254,8 +259,7 @@ module ForemanFogProxmox
|
|
254
259
|
disk.stubs(:size).returns('1')
|
255
260
|
disk.stubs(:hard_disk?).returns(true)
|
256
261
|
disk.stubs(:cdrom?).returns(false)
|
257
|
-
disk.stubs(:
|
258
|
-
disk.stubs(:cdrom?).returns(false)
|
262
|
+
disk.stubs(:rootfs?).returns(false)
|
259
263
|
disk.stubs(:storage).returns('local-lvm')
|
260
264
|
disk.stubs(:attributes).returns(id: 'scsi0', storage: 'local-lvm', size: '1', volid: 'local-lvm:vm-100-disk-0')
|
261
265
|
disks.stubs(:get).returns(disk)
|
@@ -307,6 +311,7 @@ module ForemanFogProxmox
|
|
307
311
|
disk.stubs(:size).returns('1')
|
308
312
|
disk.stubs(:hard_disk?).returns(true)
|
309
313
|
disk.stubs(:cdrom?).returns(false)
|
314
|
+
disk.stubs(:rootfs?).returns(false)
|
310
315
|
disk.stubs(:storage).returns('local-lvm')
|
311
316
|
disk.stubs(:volid).returns('local-lvm:vm-100-disk-0')
|
312
317
|
disk.stubs(:id).returns('scsi0')
|
@@ -352,5 +357,6 @@ module ForemanFogProxmox
|
|
352
357
|
@cr.save_vm(uuid, new_attributes)
|
353
358
|
end
|
354
359
|
end
|
360
|
+
# rubocop:enable Metrics/BlockLength
|
355
361
|
end
|
356
362
|
end
|
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.
|
4
|
+
version: 0.15.0
|
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:
|
12
|
+
date: 2023-11-15 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: deface
|
@@ -262,29 +262,29 @@ signing_key:
|
|
262
262
|
specification_version: 4
|
263
263
|
summary: Foreman plugin that adds Proxmox VE compute resource using fog-proxmox
|
264
264
|
test_files:
|
265
|
-
- test/test_plugin_helper.rb
|
266
|
-
- test/factories/foreman_fog_proxmox/proxmox_node_mock_factory.rb
|
267
|
-
- test/factories/foreman_fog_proxmox/proxmox_server_mock_factory.rb
|
268
|
-
- test/factories/foreman_fog_proxmox/proxmox_container_mock_factory.rb
|
269
265
|
- test/factories/proxmox_factory.rb
|
266
|
+
- test/factories/foreman_fog_proxmox/proxmox_container_mock_factory.rb
|
267
|
+
- test/factories/foreman_fog_proxmox/proxmox_server_mock_factory.rb
|
268
|
+
- test/factories/foreman_fog_proxmox/proxmox_node_mock_factory.rb
|
269
|
+
- test/test_plugin_helper.rb
|
270
|
+
- test/functional/compute_resources_controller_test.rb
|
270
271
|
- test/unit/foreman_fog_proxmox/proxmox_vm_commands_server_create_test.rb
|
271
|
-
- test/unit/foreman_fog_proxmox/
|
272
|
-
- test/unit/foreman_fog_proxmox/helpers/proxmox_server_helper_test.rb
|
273
|
-
- test/unit/foreman_fog_proxmox/helpers/proxmox_vm_helper_test.rb
|
274
|
-
- test/unit/foreman_fog_proxmox/helpers/proxmox_vm_uuid_helper_test.rb
|
275
|
-
- test/unit/foreman_fog_proxmox/helpers/proxmox_container_helper_test.rb
|
276
|
-
- test/unit/foreman_fog_proxmox/proxmox_version_test.rb
|
277
|
-
- test/unit/foreman_fog_proxmox/proxmox_vm_commands_server_update_cdrom_test.rb
|
272
|
+
- test/unit/foreman_fog_proxmox/proxmox_test.rb
|
278
273
|
- test/unit/foreman_fog_proxmox/proxmox_vm_commands_container_test.rb
|
279
|
-
- test/unit/foreman_fog_proxmox/proxmox_vm_commands_test.rb
|
280
|
-
- test/unit/foreman_fog_proxmox/semver_test.rb
|
281
|
-
- test/unit/foreman_fog_proxmox/proxmox_vm_commands_server_update_hard_disk_test.rb
|
282
274
|
- test/unit/foreman_fog_proxmox/proxmox_vm_queries_test.rb
|
275
|
+
- test/unit/foreman_fog_proxmox/semver_test.rb
|
283
276
|
- test/unit/foreman_fog_proxmox/proxmox_vm_commands_server_update_test.rb
|
284
|
-
- test/unit/foreman_fog_proxmox/proxmox_interfaces_test.rb
|
285
|
-
- test/unit/foreman_fog_proxmox/proxmox_compute_attributes_test.rb
|
286
|
-
- test/unit/foreman_fog_proxmox/proxmox_images_test.rb
|
287
277
|
- test/unit/foreman_fog_proxmox/proxmox_vm_commands_server_update_cloudinit_test.rb
|
288
|
-
- test/unit/foreman_fog_proxmox/
|
278
|
+
- test/unit/foreman_fog_proxmox/proxmox_vm_commands_test.rb
|
289
279
|
- test/unit/foreman_fog_proxmox/proxmox_vm_new_test.rb
|
290
|
-
- test/
|
280
|
+
- test/unit/foreman_fog_proxmox/proxmox_images_test.rb
|
281
|
+
- test/unit/foreman_fog_proxmox/proxmox_compute_attributes_test.rb
|
282
|
+
- test/unit/foreman_fog_proxmox/helpers/proxmox_server_helper_test.rb
|
283
|
+
- test/unit/foreman_fog_proxmox/helpers/proxmox_vm_helper_test.rb
|
284
|
+
- test/unit/foreman_fog_proxmox/helpers/proxmox_container_helper_test.rb
|
285
|
+
- test/unit/foreman_fog_proxmox/helpers/proxmox_vm_uuid_helper_test.rb
|
286
|
+
- test/unit/foreman_fog_proxmox/helpers/proxmox_vm_volumes_helper_test.rb
|
287
|
+
- test/unit/foreman_fog_proxmox/proxmox_version_test.rb
|
288
|
+
- test/unit/foreman_fog_proxmox/proxmox_interfaces_test.rb
|
289
|
+
- test/unit/foreman_fog_proxmox/proxmox_vm_commands_server_update_hard_disk_test.rb
|
290
|
+
- test/unit/foreman_fog_proxmox/proxmox_vm_commands_server_update_cdrom_test.rb
|