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.
Files changed (86) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +24 -5
  3. data/app/assets/javascripts/foreman_fog_proxmox/proxmox_compute_resource.js +36 -2
  4. data/app/assets/javascripts/foreman_fog_proxmox/proxmox_vm.js +134 -60
  5. data/app/assets/javascripts/foreman_fog_proxmox/proxmox_vm_server.js +2 -50
  6. data/app/assets/javascripts/foreman_fog_proxmox/proxmox_volume.js +39 -0
  7. data/app/assets/javascripts/foreman_fog_proxmox/proxmox_volume_cdrom.js +63 -0
  8. data/app/assets/javascripts/foreman_fog_proxmox/proxmox_volume_cloudinit.js +25 -0
  9. data/app/controllers/concerns/foreman_fog_proxmox/controller/parameters/compute_resource.rb +1 -1
  10. data/app/controllers/foreman_fog_proxmox/compute_resources_controller.rb +23 -25
  11. data/app/helpers/proxmox_compute_controllers_helper.rb +39 -0
  12. data/app/helpers/proxmox_compute_resources_helper.rb +49 -0
  13. data/app/helpers/proxmox_compute_selectors_helper.rb +6 -44
  14. data/app/helpers/proxmox_form_helper.rb +12 -4
  15. data/app/{models/concerns/fog_extensions/proxmox/volume.rb → helpers/proxmox_storages_helper.rb} +5 -8
  16. data/app/helpers/proxmox_vm_cdrom_helper.rb +35 -0
  17. data/app/helpers/proxmox_vm_cloudinit_helper.rb +43 -0
  18. data/app/helpers/proxmox_vm_config_helper.rb +160 -0
  19. data/app/helpers/proxmox_vm_helper.rb +24 -62
  20. data/app/helpers/proxmox_vm_interfaces_helper.rb +85 -0
  21. data/app/helpers/proxmox_vm_os_template_helper.rb +47 -0
  22. data/app/{models/foreman_fog_proxmox/proxmox_token_expiration.rb → helpers/proxmox_vm_uuid_helper.rb} +14 -10
  23. data/app/helpers/proxmox_vm_volumes_helper.rb +105 -0
  24. data/app/models/concerns/fog_extensions/proxmox/disk.rb +17 -2
  25. data/app/models/concerns/fog_extensions/proxmox/interface.rb +19 -4
  26. data/app/models/concerns/fog_extensions/proxmox/server.rb +12 -3
  27. data/app/models/concerns/fog_extensions/proxmox/server_config.rb +8 -30
  28. data/app/models/concerns/host_ext/proxmox/interfaces.rb +7 -2
  29. data/app/models/concerns/orchestration/proxmox/compute.rb +49 -0
  30. data/app/models/foreman_fog_proxmox/proxmox.rb +58 -15
  31. data/app/models/foreman_fog_proxmox/proxmox_compute_attributes.rb +14 -18
  32. data/app/models/foreman_fog_proxmox/proxmox_connection.rb +14 -9
  33. data/app/models/foreman_fog_proxmox/proxmox_images.rb +2 -1
  34. data/app/models/foreman_fog_proxmox/proxmox_interfaces.rb +53 -28
  35. data/app/models/foreman_fog_proxmox/proxmox_operating_systems.rb +1 -1
  36. data/app/models/foreman_fog_proxmox/proxmox_version.rb +7 -2
  37. data/app/models/foreman_fog_proxmox/proxmox_vm_commands.rb +19 -31
  38. data/app/models/foreman_fog_proxmox/proxmox_vm_new.rb +108 -94
  39. data/app/models/foreman_fog_proxmox/proxmox_vm_queries.rb +9 -6
  40. data/app/models/foreman_fog_proxmox/proxmox_volumes.rb +79 -22
  41. data/app/services/foreman_fog_proxmox/node_dashboard/data.rb +6 -2
  42. data/app/views/api/v2/compute_resources/proxmox.json.rabl +1 -1
  43. data/app/views/compute_resources/form/_proxmox.html.erb +23 -10
  44. data/app/views/compute_resources/show/_proxmox.html.erb +6 -6
  45. data/app/views/compute_resources_vms/form/proxmox/_add_vm_type_to_nic_provider_specific_form.html.erb +3 -1
  46. data/app/views/compute_resources_vms/form/proxmox/_add_vm_type_to_volumes_edit.html.erb +46 -29
  47. data/app/views/compute_resources_vms/form/proxmox/_base.html.erb +3 -3
  48. data/app/views/compute_resources_vms/form/proxmox/_removable_layout.html.erb +2 -1
  49. data/app/views/compute_resources_vms/form/proxmox/container/_network.html.erb +8 -7
  50. data/app/views/compute_resources_vms/form/proxmox/server/_advanced.html.erb +0 -2
  51. data/app/views/compute_resources_vms/form/proxmox/server/_config.html.erb +15 -14
  52. data/app/views/compute_resources_vms/form/proxmox/server/_network.html.erb +2 -2
  53. data/app/views/compute_resources_vms/form/proxmox/server/_volume_cdrom.html.erb +34 -0
  54. data/app/views/compute_resources_vms/form/proxmox/server/_volume_cloud_init.html.erb +29 -0
  55. data/app/views/compute_resources_vms/form/proxmox/server/{_volume.html.erb → _volume_hard_disk.html.erb} +7 -3
  56. data/app/views/compute_resources_vms/show/_proxmox.html.erb +2 -0
  57. data/config/routes.rb +7 -7
  58. data/db/migrate/20210312105013_update_proxmox_uuid_host.rb +29 -0
  59. data/lib/foreman_fog_proxmox/engine.rb +15 -10
  60. data/lib/foreman_fog_proxmox/hash_collection.rb +69 -0
  61. data/lib/foreman_fog_proxmox/version.rb +1 -1
  62. data/lib/tasks/foreman_fog_proxmox_tasks.rake +0 -3
  63. data/test/factories/foreman_fog_proxmox/proxmox_container_mock_factory.rb +20 -8
  64. data/test/factories/foreman_fog_proxmox/proxmox_node_mock_factory.rb +5 -5
  65. data/test/factories/foreman_fog_proxmox/proxmox_server_mock_factory.rb +17 -7
  66. data/test/factories/proxmox_factory.rb +4 -4
  67. data/test/functional/compute_resources_controller_test.rb +4 -4
  68. data/test/unit/foreman_fog_proxmox/helpers/proxmox_container_helper_test.rb +53 -32
  69. data/test/unit/foreman_fog_proxmox/helpers/proxmox_server_helper_test.rb +56 -31
  70. data/test/unit/foreman_fog_proxmox/helpers/proxmox_vm_helper_test.rb +22 -20
  71. data/test/unit/foreman_fog_proxmox/helpers/proxmox_vm_uuid_helper_test.rb +38 -0
  72. data/test/unit/foreman_fog_proxmox/helpers/proxmox_vm_volumes_helper_test.rb +50 -0
  73. data/test/unit/foreman_fog_proxmox/proxmox_compute_attributes_test.rb +10 -11
  74. data/test/unit/foreman_fog_proxmox/proxmox_interfaces_test.rb +38 -10
  75. data/test/unit/foreman_fog_proxmox/proxmox_version_test.rb +10 -10
  76. data/test/unit/foreman_fog_proxmox/proxmox_vm_commands_container_test.rb +34 -24
  77. data/test/unit/foreman_fog_proxmox/proxmox_vm_commands_server_create_test.rb +8 -8
  78. data/test/unit/foreman_fog_proxmox/proxmox_vm_commands_server_update_cdrom_test.rb +181 -0
  79. data/test/unit/foreman_fog_proxmox/proxmox_vm_commands_server_update_cloudinit_test.rb +131 -0
  80. 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
  81. data/test/unit/foreman_fog_proxmox/proxmox_vm_commands_server_update_test.rb +21 -21
  82. data/test/unit/foreman_fog_proxmox/proxmox_vm_new_test.rb +3 -3
  83. data/test/unit/foreman_fog_proxmox/proxmox_vm_queries_test.rb +3 -3
  84. metadata +44 -23
  85. data/app/helpers/proxmox_container_helper.rb +0 -163
  86. data/app/helpers/proxmox_server_helper.rb +0 -155
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # Copyright 2019 Tristan Robert
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. See the
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 ForemanFogProxmox
21
- module ProxmoxTokenExpiration
22
- def token_expired?
23
- Fog::Proxmox.credentials_has_expired?
24
- end
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
- def token_deadline
27
- Fog::Proxmox.credentials[:deadline]
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
- def templated?
25
- volid ? volid.match(/^([\w-]+)[:]base-(\d+)-disk-(\d+)/) : false
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 cidrv4_prefix
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 cidrv6_prefix
36
- Fog::Proxmox::IpHelper.prefix6(ip) if ip
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
- "Name=#{name}, vmid=#{vmid}"
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.reject(&:cdrom?)
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?(&:templated?)
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.extract_type(cpu)
27
+ Fog::Proxmox::CpuHelper.extract_cputype(cpu)
28
28
  end
29
29
 
30
- def spectre
31
- Fog::Proxmox::CpuHelper.has_spectre?(cpu)
32
- end
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
- Fog::Proxmox::IpHelper.to_cidr(interface_attributes['ip'], interface_attributes['compute_attributes']['cidr_suffix'])
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
- before_create :test_connection
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 renew
99
- attrs[:renew].blank? ? false : Foreman::Cast.to_bool(attrs[:renew])
97
+ def auth_method
98
+ attrs[:auth_method] || 'access_ticket'
100
99
  end
101
100
 
102
- def renew=(value)
103
- attrs[:renew] = value
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.error(e)
112
- raise ::Foreman::Exception, format(N_('Failed retrieving proxmox compute client caused by %<e>s'), e: e)
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.error(e)
119
- raise ::Foreman::Exception, format(N_('Failed retrieving proxmox identity client caused by %<e>s'), e: e)
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.error(e)
126
- raise ::Foreman::Exception, format(N_('Failed retrieving proxmox network client caused by %<e>s'), e: e)
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