foreman_fog_proxmox 0.12.2 → 0.13.3
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/README.md +24 -5
- data/app/assets/javascripts/foreman_fog_proxmox/proxmox_compute_resource.js +36 -2
- data/app/assets/javascripts/foreman_fog_proxmox/proxmox_vm.js +134 -60
- data/app/assets/javascripts/foreman_fog_proxmox/proxmox_vm_server.js +2 -50
- data/app/assets/javascripts/foreman_fog_proxmox/proxmox_volume.js +39 -0
- data/app/assets/javascripts/foreman_fog_proxmox/proxmox_volume_cdrom.js +63 -0
- data/app/assets/javascripts/foreman_fog_proxmox/proxmox_volume_cloudinit.js +25 -0
- data/app/controllers/concerns/foreman_fog_proxmox/controller/parameters/compute_resource.rb +1 -1
- data/app/controllers/foreman_fog_proxmox/compute_resources_controller.rb +23 -25
- data/app/helpers/proxmox_compute_controllers_helper.rb +39 -0
- data/app/helpers/proxmox_compute_resources_helper.rb +49 -0
- data/app/helpers/proxmox_compute_selectors_helper.rb +6 -44
- data/app/helpers/proxmox_form_helper.rb +12 -4
- data/app/{models/concerns/fog_extensions/proxmox/volume.rb → helpers/proxmox_storages_helper.rb} +5 -8
- data/app/helpers/proxmox_vm_cdrom_helper.rb +35 -0
- data/app/helpers/proxmox_vm_cloudinit_helper.rb +43 -0
- data/app/helpers/proxmox_vm_config_helper.rb +160 -0
- data/app/helpers/proxmox_vm_helper.rb +24 -62
- data/app/helpers/proxmox_vm_interfaces_helper.rb +85 -0
- data/app/helpers/proxmox_vm_os_template_helper.rb +47 -0
- data/app/{models/foreman_fog_proxmox/proxmox_token_expiration.rb → helpers/proxmox_vm_uuid_helper.rb} +14 -10
- data/app/helpers/proxmox_vm_volumes_helper.rb +105 -0
- data/app/models/concerns/fog_extensions/proxmox/disk.rb +17 -2
- data/app/models/concerns/fog_extensions/proxmox/interface.rb +19 -4
- data/app/models/concerns/fog_extensions/proxmox/server.rb +12 -3
- data/app/models/concerns/fog_extensions/proxmox/server_config.rb +8 -30
- data/app/models/concerns/host_ext/proxmox/interfaces.rb +7 -2
- data/app/models/concerns/orchestration/proxmox/compute.rb +49 -0
- data/app/models/foreman_fog_proxmox/proxmox.rb +58 -15
- data/app/models/foreman_fog_proxmox/proxmox_compute_attributes.rb +14 -18
- data/app/models/foreman_fog_proxmox/proxmox_connection.rb +14 -9
- data/app/models/foreman_fog_proxmox/proxmox_images.rb +2 -1
- data/app/models/foreman_fog_proxmox/proxmox_interfaces.rb +53 -28
- data/app/models/foreman_fog_proxmox/proxmox_operating_systems.rb +1 -1
- data/app/models/foreman_fog_proxmox/proxmox_version.rb +7 -2
- data/app/models/foreman_fog_proxmox/proxmox_vm_commands.rb +19 -31
- data/app/models/foreman_fog_proxmox/proxmox_vm_new.rb +108 -94
- data/app/models/foreman_fog_proxmox/proxmox_vm_queries.rb +9 -6
- data/app/models/foreman_fog_proxmox/proxmox_volumes.rb +79 -22
- data/app/services/foreman_fog_proxmox/node_dashboard/data.rb +6 -2
- data/app/views/api/v2/compute_resources/proxmox.json.rabl +1 -1
- data/app/views/compute_resources/form/_proxmox.html.erb +23 -10
- data/app/views/compute_resources/show/_proxmox.html.erb +6 -6
- data/app/views/compute_resources_vms/form/proxmox/_add_vm_type_to_nic_provider_specific_form.html.erb +3 -1
- data/app/views/compute_resources_vms/form/proxmox/_add_vm_type_to_volumes_edit.html.erb +46 -29
- data/app/views/compute_resources_vms/form/proxmox/_base.html.erb +3 -3
- data/app/views/compute_resources_vms/form/proxmox/_removable_layout.html.erb +2 -1
- data/app/views/compute_resources_vms/form/proxmox/container/_network.html.erb +8 -7
- data/app/views/compute_resources_vms/form/proxmox/server/_advanced.html.erb +0 -2
- data/app/views/compute_resources_vms/form/proxmox/server/_config.html.erb +15 -14
- data/app/views/compute_resources_vms/form/proxmox/server/_network.html.erb +2 -2
- data/app/views/compute_resources_vms/form/proxmox/server/_volume_cdrom.html.erb +34 -0
- data/app/views/compute_resources_vms/form/proxmox/server/_volume_cloud_init.html.erb +29 -0
- data/app/views/compute_resources_vms/form/proxmox/server/{_volume.html.erb → _volume_hard_disk.html.erb} +7 -3
- data/app/views/compute_resources_vms/show/_proxmox.html.erb +2 -0
- data/config/routes.rb +7 -7
- data/db/migrate/20210312105013_update_proxmox_uuid_host.rb +29 -0
- data/lib/foreman_fog_proxmox/engine.rb +15 -10
- data/lib/foreman_fog_proxmox/hash_collection.rb +69 -0
- data/lib/foreman_fog_proxmox/version.rb +1 -1
- data/lib/tasks/foreman_fog_proxmox_tasks.rake +0 -3
- data/test/factories/foreman_fog_proxmox/proxmox_container_mock_factory.rb +20 -8
- data/test/factories/foreman_fog_proxmox/proxmox_node_mock_factory.rb +5 -5
- data/test/factories/foreman_fog_proxmox/proxmox_server_mock_factory.rb +17 -7
- data/test/factories/proxmox_factory.rb +4 -4
- data/test/functional/compute_resources_controller_test.rb +4 -4
- data/test/unit/foreman_fog_proxmox/helpers/proxmox_container_helper_test.rb +53 -32
- data/test/unit/foreman_fog_proxmox/helpers/proxmox_server_helper_test.rb +56 -31
- data/test/unit/foreman_fog_proxmox/helpers/proxmox_vm_helper_test.rb +22 -20
- data/test/unit/foreman_fog_proxmox/helpers/proxmox_vm_uuid_helper_test.rb +38 -0
- data/test/unit/foreman_fog_proxmox/helpers/proxmox_vm_volumes_helper_test.rb +50 -0
- data/test/unit/foreman_fog_proxmox/proxmox_compute_attributes_test.rb +10 -11
- data/test/unit/foreman_fog_proxmox/proxmox_interfaces_test.rb +38 -10
- data/test/unit/foreman_fog_proxmox/proxmox_version_test.rb +10 -10
- data/test/unit/foreman_fog_proxmox/proxmox_vm_commands_container_test.rb +34 -24
- data/test/unit/foreman_fog_proxmox/proxmox_vm_commands_server_create_test.rb +8 -8
- data/test/unit/foreman_fog_proxmox/proxmox_vm_commands_server_update_cdrom_test.rb +181 -0
- data/test/unit/foreman_fog_proxmox/proxmox_vm_commands_server_update_cloudinit_test.rb +131 -0
- data/test/unit/foreman_fog_proxmox/{proxmox_vm_commands_server_update_volumes_test.rb → proxmox_vm_commands_server_update_hard_disk_test.rb} +45 -19
- data/test/unit/foreman_fog_proxmox/proxmox_vm_commands_server_update_test.rb +21 -21
- data/test/unit/foreman_fog_proxmox/proxmox_vm_new_test.rb +3 -3
- data/test/unit/foreman_fog_proxmox/proxmox_vm_queries_test.rb +3 -3
- metadata +44 -23
- data/app/helpers/proxmox_container_helper.rb +0 -163
- data/app/helpers/proxmox_server_helper.rb +0 -155
@@ -1,6 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
# Copyright
|
3
|
+
# Copyright 2018 Tristan Robert
|
4
4
|
|
5
5
|
# This file is part of ForemanFogProxmox.
|
6
6
|
|
@@ -11,20 +11,24 @@
|
|
11
11
|
|
12
12
|
# ForemanFogProxmox is distributed in the hope that it will be useful,
|
13
13
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
14
|
-
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
14
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
15
15
|
# GNU General Public License for more details.
|
16
16
|
|
17
17
|
# You should have received a copy of the GNU General Public License
|
18
18
|
# along with ForemanFogProxmox. If not, see <http://www.gnu.org/licenses/>.
|
19
19
|
|
20
|
-
module
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
20
|
+
module ProxmoxVmUuidHelper
|
21
|
+
UUID_REGEXP = /(?<cluster_id>\d+)[_](?<vmid>\d+)/.freeze
|
22
|
+
def extract(uuid, name)
|
23
|
+
captures_h = uuid ? UUID_REGEXP.match(uuid.to_s) : { cluster_id: '', vmid: '' }
|
24
|
+
captures_h ? captures_h[name] : ''
|
25
|
+
end
|
26
|
+
|
27
|
+
def match_uuid?(uuid)
|
28
|
+
extract(uuid, :cluster_id) != ''
|
29
|
+
end
|
25
30
|
|
26
|
-
|
27
|
-
|
28
|
-
end
|
31
|
+
def extract_vmid(uuid)
|
32
|
+
extract(uuid, :vmid)
|
29
33
|
end
|
30
34
|
end
|
@@ -0,0 +1,105 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Copyright 2018 Tristan Robert
|
4
|
+
|
5
|
+
# This file is part of ForemanFogProxmox.
|
6
|
+
|
7
|
+
# ForemanFogProxmox is free software: you can redistribute it and/or modify
|
8
|
+
# it under the terms of the GNU General Public License as published by
|
9
|
+
# the Free Software Foundation, either version 3 of the License, or
|
10
|
+
# (at your option) any later version.
|
11
|
+
|
12
|
+
# ForemanFogProxmox is distributed in the hope that it will be useful,
|
13
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
14
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
15
|
+
# GNU General Public License for more details.
|
16
|
+
|
17
|
+
# You should have received a copy of the GNU General Public License
|
18
|
+
# along with ForemanFogProxmox. If not, see <http://www.gnu.org/licenses/>.
|
19
|
+
|
20
|
+
require 'fog/proxmox/helpers/disk_helper'
|
21
|
+
require 'fog/proxmox/helpers/nic_helper'
|
22
|
+
require 'foreman_fog_proxmox/value'
|
23
|
+
require 'foreman_fog_proxmox/hash_collection'
|
24
|
+
|
25
|
+
# Convert a foreman form server hash into a fog-proxmox server attributes hash
|
26
|
+
module ProxmoxVmVolumesHelper
|
27
|
+
include ProxmoxVmCdromHelper
|
28
|
+
include ProxmoxVmCloudinitHelper
|
29
|
+
KILO = 1024
|
30
|
+
MEGA = KILO * KILO
|
31
|
+
GIGA = KILO * MEGA
|
32
|
+
|
33
|
+
def add_disk_options(disk, args)
|
34
|
+
options = ForemanFogProxmox::HashCollection.new_hash_reject_keys(args, ['id', 'volid', 'controller', 'device', 'storage', 'size', '_delete', 'storage_type'])
|
35
|
+
ForemanFogProxmox::HashCollection.remove_empty_values(options)
|
36
|
+
disk[:options] = options
|
37
|
+
end
|
38
|
+
|
39
|
+
def parsed_typed_volumes(args, type, parsed_vm)
|
40
|
+
logger.debug(format(_('parsed_typed_volumes(%<type>s): args=%<args>s'), args: args, type: type))
|
41
|
+
volumes_attributes = args['volumes_attributes']
|
42
|
+
volumes_attributes ||= args['config_attributes']['volumes_attributes'] unless ForemanFogProxmox::Value.empty?(args['config_attributes'])
|
43
|
+
volumes_attributes ||= args['vm_attrs']['volumes_attributes'] unless ForemanFogProxmox::Value.empty?(args['vm_attrs'])
|
44
|
+
volumes = parse_typed_volumes(volumes_attributes, type)
|
45
|
+
volumes.each { |volume| parsed_vm = parsed_vm.merge(volume) }
|
46
|
+
parsed_vm
|
47
|
+
end
|
48
|
+
|
49
|
+
def parse_hard_disk_volume(args)
|
50
|
+
disk = {}
|
51
|
+
disk[:id] = args['id'] if args.key?('id')
|
52
|
+
disk[:volid] = args['volid'] if args.key?('volid')
|
53
|
+
disk[:storage] = args['storage'].to_s if args.key?('storage')
|
54
|
+
disk[:size] = args['size'].to_i if args.key?('size')
|
55
|
+
add_disk_options(disk, args)
|
56
|
+
disk.key?(:storage) ? disk : {}
|
57
|
+
end
|
58
|
+
|
59
|
+
def volume_type?(args, type)
|
60
|
+
if args.key?('storage_type')
|
61
|
+
args['storage_type'] == type
|
62
|
+
else
|
63
|
+
Fog::Proxmox::DiskHelper.cloud_init?(args['volid']) if type == 'cloud_init'
|
64
|
+
Fog::Proxmox::DiskHelper.cdrom?(args['volid']) if type == 'cdrom'
|
65
|
+
Fog::Proxmox::DiskHelper.disk?(args['id']) if ['hard_disk', 'rootfs', 'mp'].include?(type)
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
def parse_typed_volume(args, type)
|
70
|
+
logger.debug(format(_('parse_typed_volume(%<type>s): args=%<args>s'), args: args, type: type))
|
71
|
+
disk = parse_hard_disk_volume(args) if volume_type?(args, 'hard_disk') || volume_type?(args, 'mp') || volume_type?(args, 'rootfs')
|
72
|
+
disk = parse_server_cloudinit(args) if volume_type?(args, 'cloud_init')
|
73
|
+
disk = parse_server_cdrom(args) if volume_type?(args, 'cdrom')
|
74
|
+
logger.debug(format(_('parse_typed_volume(%<type>s): disk=%<disk>s'), disk: disk, type: type))
|
75
|
+
Fog::Proxmox::DiskHelper.flatten(disk) unless disk.empty?
|
76
|
+
end
|
77
|
+
|
78
|
+
def add_typed_volume(volumes, value, type)
|
79
|
+
volume = parse_typed_volume(value, type)
|
80
|
+
volumes.push(volume) unless ForemanFogProxmox::Value.empty?(volume)
|
81
|
+
end
|
82
|
+
|
83
|
+
def parse_typed_volumes(args, type)
|
84
|
+
logger.debug(format(_('parse_typed_volumes(%<type>s): args=%<args>s'), args: args, type: type))
|
85
|
+
volumes = []
|
86
|
+
args&.each_value { |value| add_typed_volume(volumes, value, type) }
|
87
|
+
volumes
|
88
|
+
end
|
89
|
+
|
90
|
+
def convert_volumes_size(args)
|
91
|
+
args['volumes_attributes'].each_value { |value| value['size'] = (value['size'].to_i / GIGA).to_s unless ForemanFogProxmox::Value.empty?(value['size']) }
|
92
|
+
end
|
93
|
+
|
94
|
+
def convert_sizes(args)
|
95
|
+
convert_memory_size(args['config_attributes'], 'memory')
|
96
|
+
convert_memory_size(args['config_attributes'], 'balloon')
|
97
|
+
convert_memory_size(args['config_attributes'], 'shares')
|
98
|
+
convert_memory_size(args['config_attributes'], 'swap')
|
99
|
+
args['volumes_attributes'].each_value { |value| value['size'] = (value['size'].to_i / GIGA).to_s unless ForemanFogProxmox::Value.empty?(value['size']) }
|
100
|
+
end
|
101
|
+
|
102
|
+
def remove_volume_keys(args)
|
103
|
+
args['volumes_attributes'].each_value { |volume_attributes| ForemanFogProxmox::HashCollection.remove_keys(volume_attributes, ['_delete']) } if args.key?('volumes_attributes')
|
104
|
+
end
|
105
|
+
end
|
@@ -21,8 +21,23 @@ module FogExtensions
|
|
21
21
|
module Proxmox
|
22
22
|
module Disk
|
23
23
|
extend ActiveSupport::Concern
|
24
|
-
|
25
|
-
|
24
|
+
|
25
|
+
attr_accessor :ciuser, :cipassword, :searchdomain, :nameserver, :sshkeys
|
26
|
+
|
27
|
+
def storage_type
|
28
|
+
return 'cdrom' if cdrom?
|
29
|
+
|
30
|
+
cloud_init? ? 'cloud_init' : 'hard_disk'
|
31
|
+
end
|
32
|
+
|
33
|
+
def cdrom
|
34
|
+
return 'none' unless cdrom? || volid.nil?
|
35
|
+
|
36
|
+
['none', 'cdrom'].include?(volid) ? volid : 'image'
|
37
|
+
end
|
38
|
+
|
39
|
+
def cloudinit
|
40
|
+
cloud_init? ? 'disk' : 'none'
|
26
41
|
end
|
27
42
|
end
|
28
43
|
end
|
@@ -23,17 +23,32 @@ module FogExtensions
|
|
23
23
|
module Proxmox
|
24
24
|
module Interface
|
25
25
|
extend ActiveSupport::Concern
|
26
|
-
attr_accessor :dhcpv4, :dhcpv6, :gwv4, :gwv6
|
27
26
|
def mac
|
28
27
|
macaddr
|
29
28
|
end
|
30
29
|
|
31
|
-
def
|
30
|
+
def dhcp
|
31
|
+
ip == 'dhcp'
|
32
|
+
end
|
33
|
+
|
34
|
+
def dhcp6
|
35
|
+
ip6 == 'dhcp'
|
36
|
+
end
|
37
|
+
|
38
|
+
def dhcp=(value)
|
39
|
+
@dhcp = value
|
40
|
+
end
|
41
|
+
|
42
|
+
def dhcp6=(value)
|
43
|
+
@dhcp6 = value
|
44
|
+
end
|
45
|
+
|
46
|
+
def cidr
|
32
47
|
Fog::Proxmox::IpHelper.prefix(ip) if ip
|
33
48
|
end
|
34
49
|
|
35
|
-
def
|
36
|
-
Fog::Proxmox::IpHelper.prefix6(
|
50
|
+
def cidr6
|
51
|
+
Fog::Proxmox::IpHelper.prefix6(ip6) if ip6
|
37
52
|
end
|
38
53
|
end
|
39
54
|
end
|
@@ -23,6 +23,10 @@ module FogExtensions
|
|
23
23
|
extend ActiveSupport::Concern
|
24
24
|
attr_accessor :image_id, :templated, :ostemplate_storage, :ostemplate_file, :password, :start_after_create
|
25
25
|
|
26
|
+
def unique_cluster_identity
|
27
|
+
compute_resource.name + '_' + identity
|
28
|
+
end
|
29
|
+
|
26
30
|
def start
|
27
31
|
action('start')
|
28
32
|
end
|
@@ -55,7 +59,7 @@ module FogExtensions
|
|
55
59
|
delegate :description, to: :config
|
56
60
|
|
57
61
|
def vm_description
|
58
|
-
|
62
|
+
format(_('Type %<type>s, node %<node>s, %<cpus>s CPUs and %<memory>s MB memory'), type: type, node: node_id, cpus: config.cores || '0', memory: config.memory / (1024 * 1024) || '0')
|
59
63
|
end
|
60
64
|
|
61
65
|
def select_nic(fog_nics, nic)
|
@@ -69,7 +73,7 @@ module FogExtensions
|
|
69
73
|
end
|
70
74
|
|
71
75
|
def volumes
|
72
|
-
config.disks
|
76
|
+
config.disks
|
73
77
|
end
|
74
78
|
|
75
79
|
def disks
|
@@ -78,6 +82,7 @@ module FogExtensions
|
|
78
82
|
|
79
83
|
delegate :vga, to: :config
|
80
84
|
delegate :pool, to: :config
|
85
|
+
delegate :cloud_init?, to: :config
|
81
86
|
|
82
87
|
def interfaces_attributes=(attrs); end
|
83
88
|
|
@@ -86,7 +91,11 @@ module FogExtensions
|
|
86
91
|
def config_attributes=(attrs); end
|
87
92
|
|
88
93
|
def templated?
|
89
|
-
volumes.any?(&:
|
94
|
+
volumes.any?(&:template?)
|
95
|
+
end
|
96
|
+
|
97
|
+
def cdrom?
|
98
|
+
volumes.any?(&:cdrom?)
|
90
99
|
end
|
91
100
|
end
|
92
101
|
end
|
@@ -24,38 +24,12 @@ module FogExtensions
|
|
24
24
|
module ServerConfig
|
25
25
|
extend ActiveSupport::Concern
|
26
26
|
def cpu_type
|
27
|
-
Fog::Proxmox::CpuHelper.
|
27
|
+
Fog::Proxmox::CpuHelper.extract_cputype(cpu)
|
28
28
|
end
|
29
29
|
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
def pcid
|
35
|
-
Fog::Proxmox::CpuHelper.has_pcid?(cpu)
|
36
|
-
end
|
37
|
-
|
38
|
-
def cdrom
|
39
|
-
if disks.cdrom
|
40
|
-
['none', 'cdrom'].include?(disks.cdrom.volid) ? disks.cdrom.volid : 'image'
|
41
|
-
else
|
42
|
-
'none'
|
43
|
-
end
|
44
|
-
end
|
45
|
-
|
46
|
-
def cdrom_storage
|
47
|
-
disks.cdrom ? disks.cdrom.storage : ''
|
48
|
-
end
|
49
|
-
|
50
|
-
def cdrom_iso
|
51
|
-
disks.cdrom ? disks.cdrom.volid : ''
|
52
|
-
end
|
53
|
-
|
54
|
-
def cdrom_image
|
55
|
-
if disks.cdrom
|
56
|
-
['none', 'cdrom'].include?(disks.cdrom.volid) ? disks.cdrom.volid : 'image'
|
57
|
-
else
|
58
|
-
'none'
|
30
|
+
Fog::Proxmox::CpuHelper.flags.each do |flag_key, flag_value|
|
31
|
+
define_method(flag_key) do
|
32
|
+
Fog::Proxmox::CpuHelper.flag_value(cpu, flag_value)
|
59
33
|
end
|
60
34
|
end
|
61
35
|
|
@@ -66,6 +40,10 @@ module FogExtensions
|
|
66
40
|
def rootfs_file
|
67
41
|
disks.rootfs&.volid
|
68
42
|
end
|
43
|
+
|
44
|
+
def cloud_init?
|
45
|
+
disks.any?(&:cloud_init?)
|
46
|
+
end
|
69
47
|
end
|
70
48
|
end
|
71
49
|
end
|
@@ -35,8 +35,12 @@ module HostExt
|
|
35
35
|
end
|
36
36
|
end
|
37
37
|
|
38
|
-
def cidr_ip(interface_attributes)
|
39
|
-
|
38
|
+
def cidr_ip(interface_attributes, v = 4)
|
39
|
+
key_ip = 'ip'
|
40
|
+
key_ip += '6' if v == 6
|
41
|
+
key_cidr = 'cidr'
|
42
|
+
key_cidr += '6' if v == 6
|
43
|
+
Fog::Proxmox::IpHelper.to_cidr(interface_attributes[key_ip], interface_attributes['compute_attributes'][key_cidr])
|
40
44
|
end
|
41
45
|
|
42
46
|
def add_interface_to_compute_attributes(index, interface_attributes, compute_attributes)
|
@@ -45,6 +49,7 @@ module HostExt
|
|
45
49
|
compute_attributes[index].store('_delete', interface_attributes['_destroy'])
|
46
50
|
compute_attributes[index].store('macaddr', interface_attributes['mac'])
|
47
51
|
compute_attributes[index].store('ip', cidr_ip(interface_attributes))
|
52
|
+
compute_attributes[index].store('ip6', cidr_ip(interface_attributes, 6))
|
48
53
|
compute_attributes[index].merge!(interface_attributes['compute_attributes'].reject { |k, _v| k == 'id' })
|
49
54
|
end
|
50
55
|
end
|
@@ -25,6 +25,7 @@ module Orchestration
|
|
25
25
|
def setComputeUpdate
|
26
26
|
logger.info "Update Proxmox Compute instance for #{name}"
|
27
27
|
final_compute_attributes = compute_attributes.merge(compute_resource.host_compute_attrs(self))
|
28
|
+
logger.debug("setComputeUpdate: final_compute_attributes=#{final_compute_attributes}")
|
28
29
|
compute_resource.save_vm uuid, final_compute_attributes
|
29
30
|
rescue StandardError => e
|
30
31
|
failure format(_('Failed to update a compute %<compute_resource>s instance %<name>s: %<e>s'), :compute_resource => compute_resource, :name => name, :e => e), e
|
@@ -37,6 +38,54 @@ module Orchestration
|
|
37
38
|
rescue StandardError => e
|
38
39
|
failure format(_('Failed to undo update compute %<compute_resource>s instance %<name>s: %<e>s'), :compute_resource => compute_resource, :name => name, :e => e), e
|
39
40
|
end
|
41
|
+
|
42
|
+
def empty_provided_ips?(ip, ip6)
|
43
|
+
ip.blank? && ip6.blank? && (compute_provides?(:ip) || compute_provides?(:ip6))
|
44
|
+
end
|
45
|
+
|
46
|
+
def ips_keys
|
47
|
+
[:ip, :ip6]
|
48
|
+
end
|
49
|
+
|
50
|
+
def computeIp(foreman_attr, fog_attr)
|
51
|
+
vm.send(fog_attr) || find_address(foreman_attr)
|
52
|
+
end
|
53
|
+
|
54
|
+
def computeValue(foreman_attr, fog_attr)
|
55
|
+
value = ''
|
56
|
+
value += compute_resource.id.to_s + '_' if foreman_attr == :uuid
|
57
|
+
value += vm.send(fog_attr)
|
58
|
+
value
|
59
|
+
end
|
60
|
+
|
61
|
+
def setVmDetails
|
62
|
+
attrs = compute_resource.provided_attributes
|
63
|
+
result = true
|
64
|
+
attrs.each do |foreman_attr, fog_attr|
|
65
|
+
if foreman_attr == :mac
|
66
|
+
result = false unless match_macs_to_nics(fog_attr)
|
67
|
+
elsif ips_keys.include?(foreman_attr)
|
68
|
+
value = computeIp(foreman_attr, fog_attr)
|
69
|
+
send("#{foreman_attr}=", value)
|
70
|
+
result = false if send(foreman_attr).present? && !validate_foreman_attr(value, ::Nic::Base, foreman_attr)
|
71
|
+
else
|
72
|
+
value = computeValue(foreman_attr, fog_attr)
|
73
|
+
send("#{foreman_attr}=", value)
|
74
|
+
result = false unless validate_required_foreman_attr(value, Host, foreman_attr)
|
75
|
+
end
|
76
|
+
end
|
77
|
+
return failure(format(_('Failed to acquire IP addresses from compute resource for %<name>s'), name: name)) if empty_provided_ips?(ip, ip6)
|
78
|
+
|
79
|
+
result
|
80
|
+
end
|
81
|
+
|
82
|
+
def setComputeDetails
|
83
|
+
if vm
|
84
|
+
setVmDetails
|
85
|
+
else
|
86
|
+
failure format(_('failed to save %<name>s'), name: name)
|
87
|
+
end
|
88
|
+
end
|
40
89
|
end
|
41
90
|
end
|
42
91
|
end
|
@@ -24,10 +24,7 @@ require 'foreman_fog_proxmox/value'
|
|
24
24
|
module ForemanFogProxmox
|
25
25
|
class Proxmox < ComputeResource
|
26
26
|
include ProxmoxVmHelper
|
27
|
-
include ProxmoxServerHelper
|
28
|
-
include ProxmoxContainerHelper
|
29
27
|
include ProxmoxConnection
|
30
|
-
include ProxmoxTokenExpiration
|
31
28
|
include ProxmoxVmNew
|
32
29
|
include ProxmoxVmCommands
|
33
30
|
include ProxmoxVmQueries
|
@@ -39,9 +36,11 @@ module ForemanFogProxmox
|
|
39
36
|
include ProxmoxVersion
|
40
37
|
include ProxmoxConsole
|
41
38
|
validates :url, :format => { :with => URI::DEFAULT_PARSER.make_regexp }, :presence => true
|
39
|
+
validates :auth_method, :presence => true, inclusion: { in: ['access_ticket', 'user_token'], message: ->(value) do format('%<value>s is not a valid authentication method', { value: value }) end }
|
42
40
|
validates :user, :format => { :with => /(\w+)[@]{1}(\w+)/ }, :presence => true
|
43
|
-
validates :password, :presence => true
|
44
|
-
|
41
|
+
validates :password, :presence => true, if: :access_ticket?
|
42
|
+
validates :token_id, :presence => true, if: :user_token?
|
43
|
+
validates :token, :presence => true, if: :user_token?
|
45
44
|
|
46
45
|
def provided_attributes
|
47
46
|
super.merge(
|
@@ -95,35 +94,79 @@ module ForemanFogProxmox
|
|
95
94
|
attrs[:ssl_verify_peer] = value
|
96
95
|
end
|
97
96
|
|
98
|
-
def
|
99
|
-
attrs[:
|
97
|
+
def auth_method
|
98
|
+
attrs[:auth_method] || 'access_ticket'
|
100
99
|
end
|
101
100
|
|
102
|
-
def
|
103
|
-
attrs[:
|
101
|
+
def auth_method=(value)
|
102
|
+
attrs[:auth_method] = value
|
103
|
+
end
|
104
|
+
|
105
|
+
def token_id
|
106
|
+
attrs[:token_id]
|
107
|
+
end
|
108
|
+
|
109
|
+
def token_id=(value)
|
110
|
+
attrs[:token_id] = value
|
111
|
+
end
|
112
|
+
|
113
|
+
def token
|
114
|
+
attrs[:token]
|
115
|
+
end
|
116
|
+
|
117
|
+
def token=(value)
|
118
|
+
attrs[:token] = value
|
104
119
|
end
|
105
120
|
|
106
121
|
private
|
107
122
|
|
123
|
+
def fog_credentials
|
124
|
+
hash = {
|
125
|
+
proxmox_url: url,
|
126
|
+
proxmox_auth_method: auth_method || 'access_ticket',
|
127
|
+
connection_options: connection_options
|
128
|
+
}
|
129
|
+
if access_ticket?
|
130
|
+
hash[:proxmox_username] = user
|
131
|
+
hash[:proxmox_password] = password
|
132
|
+
end
|
133
|
+
if user_token?
|
134
|
+
hash[:proxmox_userid] = user
|
135
|
+
hash[:proxmox_token] = token
|
136
|
+
hash[:proxmox_tokenid] = token_id
|
137
|
+
end
|
138
|
+
hash
|
139
|
+
end
|
140
|
+
|
141
|
+
def token_expired?(e)
|
142
|
+
e.response.reason_phrase == 'token expired'
|
143
|
+
end
|
144
|
+
|
108
145
|
def client
|
109
146
|
@client ||= ::Fog::Proxmox::Compute.new(fog_credentials)
|
147
|
+
rescue Excon::Errors::Unauthorized => e
|
148
|
+
raise ::Foreman::Exception, 'User token expired' if token_expired?(e)
|
110
149
|
rescue StandardError => e
|
111
|
-
logger.
|
112
|
-
raise
|
150
|
+
logger.warn(format(_('failed to create compute client: %<e>s'), e: e))
|
151
|
+
raise e
|
113
152
|
end
|
114
153
|
|
115
154
|
def identity_client
|
116
155
|
@identity_client ||= ::Fog::Proxmox::Identity.new(fog_credentials)
|
156
|
+
rescue Excon::Errors::Unauthorized => e
|
157
|
+
raise ::Foreman::Exception, 'User token expired' if token_expired?(e)
|
117
158
|
rescue StandardError => e
|
118
|
-
logger.
|
119
|
-
raise
|
159
|
+
logger.warn(format(_('failed to create identity client: %<e>s'), e: e))
|
160
|
+
raise e
|
120
161
|
end
|
121
162
|
|
122
163
|
def network_client
|
123
164
|
@network_client ||= ::Fog::Proxmox::Network.new(fog_credentials)
|
165
|
+
rescue Excon::Errors::Unauthorized => e
|
166
|
+
raise ::Foreman::Exception, 'User token expired' if token_expired?(e)
|
124
167
|
rescue StandardError => e
|
125
|
-
logger.
|
126
|
-
raise
|
168
|
+
logger.warn(format(_('failed to create network client: %<e>s'), e: e))
|
169
|
+
raise e
|
127
170
|
end
|
128
171
|
|
129
172
|
def host
|