foreman_fog_proxmox 0.12.1 → 0.13.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +25 -6
- 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 +47 -26
- 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
|