foreman_fog_proxmox 0.13.0 → 0.13.4
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 +42 -9
- data/app/assets/javascripts/foreman_fog_proxmox/proxmox_compute_resource.js +25 -13
- data/app/assets/javascripts/foreman_fog_proxmox/proxmox_vm.js +62 -60
- data/app/assets/javascripts/foreman_fog_proxmox/proxmox_vm_server.js +2 -2
- data/app/assets/javascripts/foreman_fog_proxmox/proxmox_volume.js +10 -10
- data/app/controllers/concerns/foreman_fog_proxmox/compute_resources_vms_controller.rb +80 -0
- data/app/controllers/foreman_fog_proxmox/compute_resources_controller.rb +23 -25
- data/app/helpers/proxmox_compute_resources_vms_helper.rb +99 -0
- data/app/helpers/proxmox_vm_config_helper.rb +5 -4
- data/app/helpers/proxmox_vm_uuid_helper.rb +34 -0
- data/app/models/concerns/fog_extensions/proxmox/server.rb +4 -0
- data/app/models/concerns/host_ext/proxmox/associator.rb +46 -0
- data/app/models/concerns/host_ext/proxmox/for_vm.rb +33 -0
- data/app/models/concerns/orchestration/proxmox/compute.rb +65 -7
- data/app/models/foreman_fog_proxmox/proxmox.rb +4 -0
- data/app/models/foreman_fog_proxmox/proxmox_compute_attributes.rb +3 -6
- data/app/models/foreman_fog_proxmox/proxmox_images.rb +13 -4
- data/app/models/foreman_fog_proxmox/proxmox_interfaces.rb +2 -1
- data/app/models/foreman_fog_proxmox/proxmox_vm_commands.rb +5 -3
- data/app/models/foreman_fog_proxmox/proxmox_vm_new.rb +2 -4
- data/app/models/foreman_fog_proxmox/proxmox_vm_queries.rb +14 -7
- data/app/models/foreman_fog_proxmox/vms.rb +1 -1
- data/app/services/concerns/foreman_fog_proxmox/compute_resource_host_associator.rb +34 -0
- 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_vms/form/proxmox/server/_volume_cdrom.html.erb +1 -1
- data/app/views/compute_resources_vms/index/_proxmox.html.erb +2 -2
- data/config/routes.rb +7 -7
- data/db/migrate/20210312105013_update_proxmox_uuid_host.rb +29 -0
- data/lib/foreman_fog_proxmox/engine.rb +13 -2
- data/lib/foreman_fog_proxmox/version.rb +1 -1
- data/test/functional/compute_resources_controller_test.rb +4 -4
- data/test/unit/foreman_fog_proxmox/helpers/proxmox_container_helper_test.rb +4 -3
- data/test/unit/foreman_fog_proxmox/helpers/proxmox_server_helper_test.rb +3 -1
- data/test/unit/foreman_fog_proxmox/helpers/proxmox_vm_uuid_helper_test.rb +38 -0
- data/test/unit/foreman_fog_proxmox/proxmox_images_test.rb +3 -3
- data/test/unit/foreman_fog_proxmox/proxmox_interfaces_test.rb +2 -2
- data/test/unit/foreman_fog_proxmox/proxmox_vm_queries_test.rb +3 -3
- metadata +12 -3
@@ -19,59 +19,57 @@
|
|
19
19
|
|
20
20
|
module ForemanFogProxmox
|
21
21
|
class ComputeResourcesController < ::ApplicationController
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
def isos_by_node_and_storage
|
26
|
-
volumes = @compute_resource.images_by_storage(params[:node_id], params[:storage], 'iso')
|
22
|
+
# GET foreman_fog_proxmox/isos/:compute_resource_id/:node_id/:storage
|
23
|
+
def isos_by_id_and_node_and_storage
|
24
|
+
volumes = load_compute_resource(params[:compute_resource_id]).images_by_storage(params[:node_id], params[:storage], 'iso')
|
27
25
|
respond_to do |format|
|
28
26
|
format.json { render :json => volumes }
|
29
27
|
end
|
30
28
|
end
|
31
29
|
|
32
|
-
# GET foreman_fog_proxmox/ostemplates/:node_id/:storage
|
33
|
-
def
|
34
|
-
volumes =
|
30
|
+
# GET foreman_fog_proxmox/ostemplates/:compute_resource_id/:node_id/:storage
|
31
|
+
def ostemplates_by_id_and_node_and_storage
|
32
|
+
volumes = load_compute_resource(params[:compute_resource_id]).images_by_storage(params[:node_id], params[:storage], 'vztmpl')
|
35
33
|
respond_to do |format|
|
36
34
|
format.json { render :json => volumes }
|
37
35
|
end
|
38
36
|
end
|
39
37
|
|
40
|
-
# GET foreman_fog_proxmox/isos/:node_id
|
41
|
-
def
|
42
|
-
volumes =
|
38
|
+
# GET foreman_fog_proxmox/isos/:compute_resource_id/:node_id
|
39
|
+
def isos_by_id_and_node
|
40
|
+
volumes = load_compute_resource(params[:compute_resource_id]).images_by_storage(params[:node_id], params[:storage], 'iso')
|
43
41
|
respond_to do |format|
|
44
42
|
format.json { render :json => volumes }
|
45
43
|
end
|
46
44
|
end
|
47
45
|
|
48
|
-
# GET foreman_fog_proxmox/ostemplates/:node_id
|
49
|
-
def
|
50
|
-
storages =
|
46
|
+
# GET foreman_fog_proxmox/ostemplates/:compute_resource_id/:node_id
|
47
|
+
def ostemplates_by_id_and_node
|
48
|
+
storages = load_compute_resource(params[:compute_resource_id]).storages(params[:node_id], 'vztmpl')
|
51
49
|
respond_to do |format|
|
52
50
|
format.json { render :json => storages }
|
53
51
|
end
|
54
52
|
end
|
55
53
|
|
56
|
-
# GET foreman_fog_proxmox/storages/:node_id
|
57
|
-
def
|
58
|
-
storages =
|
54
|
+
# GET foreman_fog_proxmox/storages/:compute_resource_id/:node_id
|
55
|
+
def storages_by_id_and_node
|
56
|
+
storages = load_compute_resource(params[:compute_resource_id]).storages(params[:node_id])
|
59
57
|
respond_to do |format|
|
60
58
|
format.json { render :json => storages }
|
61
59
|
end
|
62
60
|
end
|
63
61
|
|
64
|
-
# GET foreman_fog_proxmox/isostorages/:node_id
|
65
|
-
def
|
66
|
-
storages =
|
62
|
+
# GET foreman_fog_proxmox/isostorages/:compute_resource_id/:node_id
|
63
|
+
def iso_storages_by_id_and_node
|
64
|
+
storages = load_compute_resource(params[:compute_resource_id]).storages(params[:node_id], 'iso')
|
67
65
|
respond_to do |format|
|
68
66
|
format.json { render :json => storages }
|
69
67
|
end
|
70
68
|
end
|
71
69
|
|
72
|
-
# GET foreman_fog_proxmox/bridges/:node_id
|
73
|
-
def
|
74
|
-
bridges =
|
70
|
+
# GET foreman_fog_proxmox/bridges/:compute_resource_id/:node_id
|
71
|
+
def bridges_by_id_and_node
|
72
|
+
bridges = load_compute_resource(params[:compute_resource_id]).bridges(params[:node_id])
|
75
73
|
respond_to do |format|
|
76
74
|
format.json { render :json => bridges }
|
77
75
|
end
|
@@ -79,8 +77,8 @@ module ForemanFogProxmox
|
|
79
77
|
|
80
78
|
private
|
81
79
|
|
82
|
-
def load_compute_resource
|
83
|
-
|
80
|
+
def load_compute_resource(compute_resource_id)
|
81
|
+
ComputeResource.find(compute_resource_id)
|
84
82
|
end
|
85
83
|
end
|
86
84
|
end
|
@@ -0,0 +1,99 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Copyright 2021 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
|
+
module ProxmoxComputeResourcesVmsHelper
|
21
|
+
def proxmox_vm_id(compute_resource, vm)
|
22
|
+
id = vm.identity
|
23
|
+
id = vm.unique_cluster_identity(compute_resource) if compute_resource.class == ForemanFogProxmox::Proxmox
|
24
|
+
id
|
25
|
+
end
|
26
|
+
|
27
|
+
def vm_host_action(vm)
|
28
|
+
host = Host.for_vm_uuid(@compute_resource, vm).first
|
29
|
+
return unless host
|
30
|
+
|
31
|
+
display_link_if_authorized(_("Host"), hash_for_host_path(:id => host), :class => 'btn btn-default')
|
32
|
+
end
|
33
|
+
|
34
|
+
def vm_power_action(vm, authorizer = nil)
|
35
|
+
opts = hash_for_power_compute_resource_vm_path(:compute_resource_id => @compute_resource, :id => proxmox_vm_id(@compute_resource, vm)).merge(:auth_object => @compute_resource, :permission => 'power_compute_resources_vms', :authorizer => authorizer)
|
36
|
+
html = power_action_html(vm)
|
37
|
+
|
38
|
+
display_link_if_authorized "Power #{action_string(vm)}", opts, html.merge(:method => :put)
|
39
|
+
end
|
40
|
+
|
41
|
+
def vm_associate_action(vm)
|
42
|
+
display_link_if_authorized(
|
43
|
+
_('Associate VM'),
|
44
|
+
hash_for_associate_compute_resource_vm_path(
|
45
|
+
:compute_resource_id => @compute_resource,
|
46
|
+
:id => proxmox_vm_id(@compute_resource, vm)
|
47
|
+
).merge(
|
48
|
+
:auth_object => @compute_resource,
|
49
|
+
:permission => 'edit_compute_resources'),
|
50
|
+
:title => _('Associate VM to a Foreman host'),
|
51
|
+
:method => :put,
|
52
|
+
:class => 'btn btn-default'
|
53
|
+
)
|
54
|
+
end
|
55
|
+
|
56
|
+
def vm_import_action(vm, html_options = {})
|
57
|
+
@_linked_hosts_cache ||= Host.where(:compute_resource_id => @compute_resource.id).pluck(:uuid)
|
58
|
+
return if @_linked_hosts_cache.include?(proxmox_vm_id(@compute_resource, vm).to_s)
|
59
|
+
|
60
|
+
import_managed_link = display_link_if_authorized(
|
61
|
+
_('Import as managed Host'),
|
62
|
+
hash_for_import_compute_resource_vm_path(
|
63
|
+
:compute_resource_id => @compute_resource,
|
64
|
+
:id => proxmox_vm_id(@compute_resource, vm),
|
65
|
+
:type => 'managed'),
|
66
|
+
html_options
|
67
|
+
)
|
68
|
+
import_unmanaged_link = display_link_if_authorized(
|
69
|
+
_('Import as unmanaged Host'),
|
70
|
+
hash_for_import_compute_resource_vm_path(
|
71
|
+
:compute_resource_id => @compute_resource,
|
72
|
+
:id => proxmox_vm_id(@compute_resource, vm),
|
73
|
+
:type => 'unmanaged'),
|
74
|
+
html_options
|
75
|
+
)
|
76
|
+
|
77
|
+
import_managed_link + import_unmanaged_link
|
78
|
+
end
|
79
|
+
|
80
|
+
def vm_console_action(vm)
|
81
|
+
return unless vm.ready?
|
82
|
+
|
83
|
+
link_to_if_authorized(
|
84
|
+
_('Console'),
|
85
|
+
hash_for_console_compute_resource_vm_path.merge(
|
86
|
+
:auth_object => @compute_resource,
|
87
|
+
:id => proxmox_vm_id(@compute_resource, vm)
|
88
|
+
),
|
89
|
+
{
|
90
|
+
:id => 'console-button',
|
91
|
+
:class => 'btn btn-info'
|
92
|
+
}
|
93
|
+
)
|
94
|
+
end
|
95
|
+
|
96
|
+
def vm_delete_action(vm, authorizer = nil)
|
97
|
+
display_delete_if_authorized(hash_for_compute_resource_vm_path(:compute_resource_id => @compute_resource, :id => proxmox_vm_id(@compute_resource, vm)).merge(:auth_object => @compute_resource, :authorizer => authorizer), :class => 'btn btn-danger')
|
98
|
+
end
|
99
|
+
end
|
@@ -31,7 +31,7 @@ module ProxmoxVmConfigHelper
|
|
31
31
|
|
32
32
|
def object_to_config_hash(vm, type)
|
33
33
|
vm_h = ActiveSupport::HashWithIndifferentAccess.new
|
34
|
-
main_a = ['
|
34
|
+
main_a = ['vmid']
|
35
35
|
main = vm.attributes.select { |key, _value| main_a.include? key }
|
36
36
|
main_a += ['templated']
|
37
37
|
config = vm.config.attributes.reject { |key, _value| main_a.include?(key) || Fog::Proxmox::DiskHelper.disk?(key) || Fog::Proxmox::NicHelper.nic?(key) }
|
@@ -47,14 +47,15 @@ module ProxmoxVmConfigHelper
|
|
47
47
|
config_hash.store(key, memory)
|
48
48
|
end
|
49
49
|
|
50
|
-
def general_a
|
51
|
-
general_a = ['
|
50
|
+
def general_a(type)
|
51
|
+
general_a = ['node_id', 'type', 'config_attributes', 'volumes_attributes', 'interfaces_attributes']
|
52
52
|
general_a += ['firmware_type', 'provision_method', 'container_volumes', 'server_volumes', 'start_after_create']
|
53
|
+
general_a += ['name'] if type == 'lxc'
|
53
54
|
general_a
|
54
55
|
end
|
55
56
|
|
56
57
|
def config_typed_keys(type)
|
57
|
-
keys = { general: general_a }
|
58
|
+
keys = { general: general_a(type) }
|
58
59
|
main_a = ['name', 'type', 'node_id', 'vmid', 'interfaces', 'mount_points', 'disks']
|
59
60
|
case type
|
60
61
|
when 'lxc'
|
@@ -0,0 +1,34 @@
|
|
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
|
+
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
|
30
|
+
|
31
|
+
def extract_vmid(uuid)
|
32
|
+
extract(uuid, :vmid)
|
33
|
+
end
|
34
|
+
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(compute_resource)
|
27
|
+
compute_resource.id.to_s + '_' + identity
|
28
|
+
end
|
29
|
+
|
26
30
|
def start
|
27
31
|
action('start')
|
28
32
|
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Copyright 2021 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
|
+
module HostExt
|
21
|
+
module Proxmox
|
22
|
+
module Associator
|
23
|
+
extend ActiveSupport::Concern
|
24
|
+
included do
|
25
|
+
prepend Overrides
|
26
|
+
end
|
27
|
+
module Overrides
|
28
|
+
def associate!(cr, vm)
|
29
|
+
self.uuid = proxmox_vm_id(cr, vm)
|
30
|
+
self.compute_resource_id = cr.id
|
31
|
+
save!(:validate => false) # don't want to trigger callbacks
|
32
|
+
end
|
33
|
+
|
34
|
+
def proxmox_vm_id(compute_resource, vm)
|
35
|
+
id = vm.identity
|
36
|
+
id = vm.unique_cluster_identity(compute_resource) if compute_resource.class == ForemanFogProxmox::Proxmox
|
37
|
+
id
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def for_vm_uuid(cr, vm)
|
42
|
+
where(:compute_resource_id => cr.id, :uuid => Array.wrap(vm).compact.map(cr.id.to_s + '_' + vm&.identity).map(&:to_s))
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Copyright 2021 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
|
+
module HostExt
|
21
|
+
module Proxmox
|
22
|
+
module ForVm
|
23
|
+
extend ActiveSupport::Concern
|
24
|
+
module ClassMethods
|
25
|
+
def for_vm_uuid(cr, vm)
|
26
|
+
uuid = vm&.identity
|
27
|
+
uuid = cr.id.to_s + '_' + vm&.identity if cr.class == ForemanFogProxmox::Proxmox
|
28
|
+
where(:compute_resource_id => cr.id, :uuid => uuid)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -23,21 +23,79 @@ module Orchestration
|
|
23
23
|
extend ActiveSupport::Concern
|
24
24
|
|
25
25
|
def setComputeUpdate
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
26
|
+
if compute_resource.class != ForemanFogProxmox::Proxmox
|
27
|
+
super
|
28
|
+
else
|
29
|
+
logger.info "Update Proxmox Compute instance for #{name}"
|
30
|
+
final_compute_attributes = compute_attributes.merge(compute_resource.host_compute_attrs(self))
|
31
|
+
logger.debug("setComputeUpdate: final_compute_attributes=#{final_compute_attributes}")
|
32
|
+
compute_resource.save_vm uuid, final_compute_attributes
|
33
|
+
end
|
30
34
|
rescue StandardError => e
|
31
35
|
failure format(_('Failed to update a compute %<compute_resource>s instance %<name>s: %<e>s'), :compute_resource => compute_resource, :name => name, :e => e), e
|
32
36
|
end
|
33
37
|
|
34
38
|
def delComputeUpdate
|
35
|
-
|
36
|
-
|
37
|
-
|
39
|
+
if compute_resource.class != ForemanFogProxmox::Proxmox
|
40
|
+
super
|
41
|
+
else
|
42
|
+
logger.info "Undo Update Proxmox Compute instance for #{name}"
|
43
|
+
final_compute_attributes = old.compute_attributes.merge(compute_resource.host_compute_attrs(old))
|
44
|
+
compute_resource.save_vm uuid, final_compute_attributes
|
45
|
+
end
|
38
46
|
rescue StandardError => e
|
39
47
|
failure format(_('Failed to undo update compute %<compute_resource>s instance %<name>s: %<e>s'), :compute_resource => compute_resource, :name => name, :e => e), e
|
40
48
|
end
|
49
|
+
|
50
|
+
def empty_provided_ips?(ip, ip6)
|
51
|
+
ip.blank? && ip6.blank? && (compute_provides?(:ip) || compute_provides?(:ip6))
|
52
|
+
end
|
53
|
+
|
54
|
+
def ips_keys
|
55
|
+
[:ip, :ip6]
|
56
|
+
end
|
57
|
+
|
58
|
+
def computeIp(foreman_attr, fog_attr)
|
59
|
+
vm.send(fog_attr) || find_address(foreman_attr)
|
60
|
+
end
|
61
|
+
|
62
|
+
def computeValue(foreman_attr, fog_attr)
|
63
|
+
value = ''
|
64
|
+
value += compute_resource.id.to_s + '_' if foreman_attr == :uuid
|
65
|
+
value += vm.send(fog_attr)
|
66
|
+
value
|
67
|
+
end
|
68
|
+
|
69
|
+
def setVmDetails
|
70
|
+
attrs = compute_resource.provided_attributes
|
71
|
+
result = true
|
72
|
+
attrs.each do |foreman_attr, fog_attr|
|
73
|
+
if foreman_attr == :mac
|
74
|
+
result = false unless match_macs_to_nics(fog_attr)
|
75
|
+
elsif ips_keys.include?(foreman_attr)
|
76
|
+
value = computeIp(foreman_attr, fog_attr)
|
77
|
+
send("#{foreman_attr}=", value)
|
78
|
+
result = false if send(foreman_attr).present? && !validate_foreman_attr(value, ::Nic::Base, foreman_attr)
|
79
|
+
else
|
80
|
+
value = computeValue(foreman_attr, fog_attr)
|
81
|
+
send("#{foreman_attr}=", value)
|
82
|
+
result = false unless validate_required_foreman_attr(value, Host, foreman_attr)
|
83
|
+
end
|
84
|
+
end
|
85
|
+
return failure(format(_('Failed to acquire IP addresses from compute resource for %<name>s'), name: name)) if empty_provided_ips?(ip, ip6)
|
86
|
+
|
87
|
+
result
|
88
|
+
end
|
89
|
+
|
90
|
+
def setComputeDetails
|
91
|
+
if compute_resource.class != ForemanFogProxmox::Proxmox
|
92
|
+
super
|
93
|
+
elsif vm
|
94
|
+
setVmDetails
|
95
|
+
else
|
96
|
+
failure format(_('failed to save %<name>s'), name: name)
|
97
|
+
end
|
98
|
+
end
|
41
99
|
end
|
42
100
|
end
|
43
101
|
end
|
@@ -64,6 +64,10 @@ module ForemanFogProxmox
|
|
64
64
|
associate_by('mac', vm.mac)
|
65
65
|
end
|
66
66
|
|
67
|
+
def associate_by(name, attributes)
|
68
|
+
Host.authorized(:view_hosts, Host).joins(:primary_interface).where(:nics => { :primary => true }).where("nics.#{name}" => attributes).readonly(false).first
|
69
|
+
end
|
70
|
+
|
67
71
|
def ssl_certs
|
68
72
|
attrs[:ssl_certs]
|
69
73
|
end
|