foreman_discovery 16.0.0 → 16.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/app/controllers/api/v2/discovered_hosts_controller.rb +24 -11
- data/app/controllers/api/v2/discovery_rules_controller.rb +1 -1
- data/app/controllers/discovered_hosts_controller.rb +5 -3
- data/app/controllers/discovery_rules_controller.rb +1 -1
- data/app/models/discovery_rule.rb +1 -1
- data/app/models/host/discovered.rb +52 -34
- data/app/models/host/managed_extensions.rb +2 -2
- data/app/models/setting/discovered.rb +3 -1
- data/app/services/foreman_discovery/host_converter.rb +15 -7
- data/app/services/foreman_discovery/host_fact_importer.rb +10 -0
- data/app/services/foreman_discovery/import_hooks/subnet_and_taxonomy.rb +2 -0
- data/app/services/foreman_discovery/node_api/node_resource.rb +1 -0
- data/app/views/api/v2/discovery_rules/create.json.rabl +3 -0
- data/app/views/discovered_hosts/_discovered_host_modal.html.erb +0 -2
- data/app/views/discovered_hosts/welcome.html.erb +15 -9
- data/app/views/discovery_rules/index.html.erb +1 -1
- data/app/views/foreman_discovery/debian_kexec.erb +3 -2
- data/app/views/foreman_discovery/redhat_kexec.erb +2 -1
- data/db/migrate/20150512150432_remove_old_discovery_reader_permissions.rb +1 -1
- data/db/migrate/20151023144501_regenerate_red_hat_kexec.rb +1 -1
- data/db/migrate/20180412124505_add_priority_score_to_discovery_rules.rb +1 -1
- data/extra/discover-host +14 -8
- data/lib/foreman_discovery/engine.rb +5 -4
- data/lib/foreman_discovery/version.rb +1 -1
- data/locale/ca/LC_MESSAGES/foreman_discovery.mo +0 -0
- data/locale/ca/foreman_discovery.edit.po +195 -252
- data/locale/ca/foreman_discovery.po +40 -17
- data/locale/de/LC_MESSAGES/foreman_discovery.mo +0 -0
- data/locale/de/foreman_discovery.edit.po +201 -257
- data/locale/de/foreman_discovery.po +46 -23
- data/locale/en/LC_MESSAGES/foreman_discovery.mo +0 -0
- data/locale/en/foreman_discovery.edit.po +141 -111
- data/locale/en/foreman_discovery.po +36 -13
- data/locale/en_GB/LC_MESSAGES/foreman_discovery.mo +0 -0
- data/locale/en_GB/foreman_discovery.edit.po +205 -254
- data/locale/en_GB/foreman_discovery.po +42 -19
- data/locale/es/LC_MESSAGES/foreman_discovery.mo +0 -0
- data/locale/es/foreman_discovery.edit.po +209 -258
- data/locale/es/foreman_discovery.po +46 -23
- data/locale/foreman_discovery.pot +150 -117
- data/locale/fr/LC_MESSAGES/foreman_discovery.mo +0 -0
- data/locale/fr/foreman_discovery.edit.po +203 -255
- data/locale/fr/foreman_discovery.po +44 -21
- data/locale/gl/LC_MESSAGES/foreman_discovery.mo +0 -0
- data/locale/gl/foreman_discovery.edit.po +190 -250
- data/locale/gl/foreman_discovery.po +38 -15
- data/locale/it/LC_MESSAGES/foreman_discovery.mo +0 -0
- data/locale/it/foreman_discovery.edit.po +193 -253
- data/locale/it/foreman_discovery.po +41 -18
- data/locale/ja/LC_MESSAGES/foreman_discovery.mo +0 -0
- data/locale/ja/foreman_discovery.edit.po +207 -256
- data/locale/ja/foreman_discovery.po +44 -21
- data/locale/ko/LC_MESSAGES/foreman_discovery.mo +0 -0
- data/locale/ko/foreman_discovery.edit.po +196 -255
- data/locale/ko/foreman_discovery.po +44 -21
- data/locale/pt_BR/LC_MESSAGES/foreman_discovery.mo +0 -0
- data/locale/pt_BR/foreman_discovery.edit.po +205 -256
- data/locale/pt_BR/foreman_discovery.po +44 -21
- data/locale/ru/LC_MESSAGES/foreman_discovery.mo +0 -0
- data/locale/ru/foreman_discovery.edit.po +199 -257
- data/locale/ru/foreman_discovery.po +44 -21
- data/locale/sv_SE/LC_MESSAGES/foreman_discovery.mo +0 -0
- data/locale/sv_SE/foreman_discovery.edit.po +190 -250
- data/locale/sv_SE/foreman_discovery.po +38 -15
- data/locale/zh_CN/LC_MESSAGES/foreman_discovery.mo +0 -0
- data/locale/zh_CN/foreman_discovery.edit.po +207 -256
- data/locale/zh_CN/foreman_discovery.po +44 -21
- data/locale/zh_TW/LC_MESSAGES/foreman_discovery.mo +0 -0
- data/locale/zh_TW/foreman_discovery.edit.po +196 -254
- data/locale/zh_TW/foreman_discovery.po +42 -19
- data/package.json +39 -0
- data/test/facts/only-ipv6.json +205 -0
- data/test/facts/skylake-ipv6.json +223 -0
- data/test/functional/api/v2/settings_controller_test.rb +2 -2
- data/test/functional/discovered_hosts_controller_test.rb +16 -7
- data/test/functional/discovery_rules_controller_test.rb +1 -1
- data/test/unit/discovered_extensions_test.rb +6 -1
- data/test/unit/host_discovered_test.rb +0 -16
- data/test/unit/managed_extensions_test.rb +1 -0
- data/webpack/index.js +18 -0
- data/webpack/src/ForemanDiscovery/DiscoveredHosts/Components/EmptyState/EmptyState.js +28 -0
- data/webpack/src/ForemanDiscovery/DiscoveredHosts/Components/EmptyState/index.js +1 -0
- data/webpack/src/ForemanDiscovery/DiscoveredHosts/index.js +6 -0
- data/webpack/src/reducers.js +7 -0
- metadata +42 -28
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 633d9a0f20147b982f23bbcc7fe02eb210bdbb060ac2f304b098620981502899
|
4
|
+
data.tar.gz: e80520e5eacd123161aa6da427e8185ff0d52dd44d8925319391563ba2634372
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 36a6ab1d08a10291ba5fa6665649fbaa2b23779305b83826b86a62c1644d9f4545e069c1eba6d13cac27789c50faa2093058de9396d60a06d36f212d995f17c4
|
7
|
+
data.tar.gz: 8c2e52c9eee44e6bd3f22098059395e10b4250d193b331b787bb87ffc7f222911510e650645e6d9ff26bd46245680060e7f033fde62bc8bdf0c13d8f39e7aea0
|
@@ -51,24 +51,30 @@ module Api
|
|
51
51
|
param :id, :identifier, :required => true
|
52
52
|
param :discovered_host, Hash, :action_aware => true do
|
53
53
|
param :name, String
|
54
|
-
param :environment_id, String
|
54
|
+
param :environment_id, String, :desc => N_("required if host is managed and value is not inherited from host group")
|
55
55
|
param :ip, String, :desc => N_("not required if using a subnet with DHCP proxy")
|
56
56
|
param :mac, String, :desc => N_("not required if it's a virtual machine")
|
57
|
-
param :architecture_id, :number
|
58
|
-
param :domain_id, :number
|
57
|
+
param :architecture_id, :number, :desc => N_("required if host is managed and value is not inherited from host group")
|
58
|
+
param :domain_id, :number, :desc => N_("required if host is managed and value is not inherited from host group")
|
59
59
|
param :puppet_proxy_id, :number
|
60
60
|
param :puppet_class_ids, Array
|
61
|
-
param :operatingsystem_id,
|
62
|
-
param :medium_id, :
|
63
|
-
param :ptable_id, :number
|
64
|
-
param :subnet_id, :number
|
61
|
+
param :operatingsystem_id, :number, :desc => N_("required if host is managed and value is not inherited from host group")
|
62
|
+
param :medium_id, String, :desc => N_("required if not imaged based provisioning and host is managed and value is not inherited from host group")
|
63
|
+
param :ptable_id, :number, :desc => N_("required if host is managed and custom partition has not been defined")
|
64
|
+
param :subnet_id, :number, :desc => N_("required if host is managed and value is not inherited from host group")
|
65
65
|
param :sp_subnet_id, :number
|
66
66
|
param :model_id, :number
|
67
67
|
param :hostgroup_id, :number
|
68
68
|
param :owner_id, :number
|
69
|
+
param :owner_type, Host::Base::OWNER_TYPES, :desc => N_("Host's owner type")
|
69
70
|
param :puppet_ca_proxy_id, :number
|
70
71
|
param :image_id, :number
|
71
|
-
param :host_parameters_attributes, Array
|
72
|
+
param :host_parameters_attributes, Array, :desc => N_("Host's parameters (array or indexed hash)") do
|
73
|
+
param :name, String, :desc => N_("Name of the parameter"), :required => true
|
74
|
+
param :value, String, :desc => N_("Parameter value"), :required => true
|
75
|
+
param :parameter_type, Parameter::KEY_TYPES, :desc => N_("Type of value")
|
76
|
+
param :hidden_value, :bool
|
77
|
+
end
|
72
78
|
param :build, :bool
|
73
79
|
param :enabled, :bool
|
74
80
|
param :provision_method, String
|
@@ -102,9 +108,16 @@ module Api
|
|
102
108
|
state = true
|
103
109
|
User.as_anonymous_admin do
|
104
110
|
@discovered_host = Host::Discovered.import_host(facts)
|
105
|
-
|
106
|
-
|
107
|
-
|
111
|
+
# Host::Based.set_taxonomies sets taxonomies during import from either
|
112
|
+
# facts or via Global Foreman setting "default_taxonomy", reset it back so
|
113
|
+
# the anonymous admin can see all records. We set taxonomy explicitly via
|
114
|
+
# discovery SubnetAndTaxonomy import hook and enforce taxnomy manually
|
115
|
+
# in find_discovery_rule method via validate_rule_by_taxonomy.
|
116
|
+
Taxonomy.no_taxonomy_scope do
|
117
|
+
Rails.logger.warn 'Discovered facts import unsuccessful, skipping auto provisioning' unless @discovered_host
|
118
|
+
if Setting['discovery_auto'] && @discovered_host && (rule = find_discovery_rule(@discovered_host))
|
119
|
+
state = perform_auto_provision(@discovered_host, rule)
|
120
|
+
end
|
108
121
|
end
|
109
122
|
end
|
110
123
|
process_response state
|
@@ -55,7 +55,7 @@ module Api
|
|
55
55
|
param_group :discovery_rule, :as => :update
|
56
56
|
|
57
57
|
def update
|
58
|
-
process_response @discovery_rule.
|
58
|
+
process_response @discovery_rule.update(discovery_rule_params)
|
59
59
|
end
|
60
60
|
|
61
61
|
api :DELETE, "/discovery_rules/:id/", N_("Delete a rule")
|
@@ -199,15 +199,17 @@ class DiscoveredHostsController < ::ApplicationController
|
|
199
199
|
|
200
200
|
def setup_host_class_variables
|
201
201
|
if @host.hostgroup
|
202
|
+
subnet = @host.hostgroup.subnet || @host.subnet
|
203
|
+
subnet6 = @host.hostgroup.subnet6 || @host.subnet6
|
202
204
|
@architecture = @host.hostgroup.architecture
|
203
205
|
@operatingsystem = @host.hostgroup.operatingsystem
|
204
206
|
@environment = @host.hostgroup.environment
|
205
207
|
@domain = @host.hostgroup.domain
|
206
|
-
@subnet =
|
208
|
+
@subnet = subnet
|
209
|
+
@subnet6 = subnet6
|
207
210
|
@compute_profile = @host.hostgroup.compute_profile
|
208
211
|
@realm = @host.hostgroup.realm
|
209
|
-
@host.interfaces.first.assign_attributes(subnet:
|
210
|
-
domain: @domain)
|
212
|
+
@host.interfaces.first.assign_attributes(subnet: subnet, subnet6: subnet6, domain: @domain)
|
211
213
|
@host.environment = @environment
|
212
214
|
end
|
213
215
|
end
|
@@ -22,7 +22,7 @@ class DiscoveryRule < ApplicationRecord
|
|
22
22
|
before_validation :enforce_taxonomy
|
23
23
|
|
24
24
|
belongs_to :hostgroup
|
25
|
-
|
25
|
+
has_many_hosts :dependent => :nullify
|
26
26
|
|
27
27
|
scoped_search :on => :name, :complete_value => :true
|
28
28
|
scoped_search :on => :priority, :only_explicit => true
|
@@ -44,9 +44,13 @@ class Host::Discovered < ::Host::Base
|
|
44
44
|
|
45
45
|
# Discovery import workflow:
|
46
46
|
# discovered#import_host ->
|
47
|
-
#
|
48
|
-
#
|
49
|
-
#
|
47
|
+
# ForemanDiscovery::HostFactImporter#import_facts ->
|
48
|
+
# ::HostFactImporter#import_facts ->
|
49
|
+
# ::HostFactImporter#parse_facts ->
|
50
|
+
# discovered#populate_fields_from_facts ->
|
51
|
+
# base#populate_fields_from_facts ->
|
52
|
+
# base#set_interfaces ->
|
53
|
+
# discovered#populate_discovery_fields_from_facts
|
50
54
|
def self.import_host facts
|
51
55
|
raise(::Foreman::Exception.new(N_("Invalid facts, must be a Hash"))) unless facts.is_a?(Hash) || facts.is_a?(ActionController::Parameters)
|
52
56
|
|
@@ -92,19 +96,11 @@ class Host::Discovered < ::Host::Base
|
|
92
96
|
|
93
97
|
# and save (interfaces are created via puppet parser extension)
|
94
98
|
host.save(:validate => false) if host.new_record?
|
95
|
-
|
99
|
+
importer = ForemanDiscovery::HostFactImporter.new(host)
|
100
|
+
raise ::Foreman::Exception.new(N_("Facts could not be imported")) unless importer.import_facts(facts)
|
96
101
|
host
|
97
102
|
end
|
98
103
|
|
99
|
-
def import_facts(facts)
|
100
|
-
# Discovered Hosts won't report in via puppet, so we can use that field to
|
101
|
-
# record the last time it sent facts...
|
102
|
-
self.last_report = Time.now
|
103
|
-
# Set the correct facts type for new foreman facts importing code.
|
104
|
-
facts[:_type] = :foreman_discovery
|
105
|
-
super(facts)
|
106
|
-
end
|
107
|
-
|
108
104
|
def setup_clone
|
109
105
|
# Nic::Managed needs this method but Discovered hosts shouldn't
|
110
106
|
# be doing orchestration anyway...
|
@@ -137,33 +133,55 @@ class Host::Discovered < ::Host::Base
|
|
137
133
|
subnet.present? && subnet.discovery.present?
|
138
134
|
end
|
139
135
|
|
140
|
-
def proxy_url
|
141
|
-
proxied? ? subnet.discovery.url + "/discovery/#{
|
136
|
+
def proxy_url(node_ip)
|
137
|
+
proxied? ? subnet.discovery.url + "/discovery/#{node_ip}" : "https://#{node_ip}:8443"
|
142
138
|
end
|
143
139
|
|
144
140
|
def refresh_facts
|
145
|
-
facts = ::ForemanDiscovery::NodeAPI::Inventory.new(:url => proxy_url).facter
|
141
|
+
facts = ::ForemanDiscovery::NodeAPI::Inventory.new(:url => proxy_url(self.ip)).facter
|
146
142
|
self.class.import_host facts
|
147
|
-
import_facts facts
|
143
|
+
::ForemanDiscovery::HostFactImporter.new(self).import_facts facts
|
148
144
|
rescue => e
|
149
145
|
::Foreman::Logging.exception("Unable to get facts from proxy", e)
|
150
|
-
raise ::Foreman::WrappedException.new(e, N_("Could not get facts from proxy %{url}: %{error}"), :url => proxy_url, :error => e)
|
151
|
-
end
|
152
|
-
|
153
|
-
def reboot
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
146
|
+
raise ::Foreman::WrappedException.new(e, N_("Could not get facts from proxy %{url}: %{error}"), :url => proxy_url(self.ip), :error => e)
|
147
|
+
end
|
148
|
+
|
149
|
+
def reboot(old_ip = nil, new_ip = nil)
|
150
|
+
# perform the action against the original lease as well as the new reservation
|
151
|
+
ips = [old_ip, new_ip, self.ip].compact.uniq
|
152
|
+
logger.debug "Performing reboot calls against #{ips.to_sentence}, facts left #{facts.count}"
|
153
|
+
ips.each do |next_ip|
|
154
|
+
begin
|
155
|
+
node_url = proxy_url(next_ip)
|
156
|
+
logger.debug "Performing reboot call against #{node_url}"
|
157
|
+
resource = ::ForemanDiscovery::NodeAPI::Power.service(:url => node_url)
|
158
|
+
return true if resource.reboot
|
159
|
+
rescue => e
|
160
|
+
msg = N_("Unable to perform reboot on %{name} (%{url}): %{msg}")
|
161
|
+
::Foreman::Logging.exception(msg % { :name => name, :url => node_url, :msg => e.to_s }, e)
|
162
|
+
end
|
163
|
+
end
|
164
|
+
msg = N_("Unable to perform %{action} on %{ips}")
|
165
|
+
raise ::Foreman::Exception.new(msg, action: "reboot", ips: ips.to_sentence)
|
166
|
+
end
|
167
|
+
|
168
|
+
def kexec(json, old_ip = nil, new_ip = nil)
|
169
|
+
# perform the action against the original lease as well as the new reservation
|
170
|
+
ips = [old_ip, new_ip, self.ip].compact.uniq
|
171
|
+
logger.debug "Performing kexec calls against #{ips.to_sentence}, #{facts.count} facts left"
|
172
|
+
ips.each do |next_ip|
|
173
|
+
begin
|
174
|
+
node_url = proxy_url(next_ip)
|
175
|
+
logger.debug "Performing kexec call against #{node_url}"
|
176
|
+
resource = ::ForemanDiscovery::NodeAPI::Power.service(:url => node_url)
|
177
|
+
return true if resource.kexec(json)
|
178
|
+
rescue => e
|
179
|
+
msg = N_("Unable to perform kexec on %{name} (%{url}): %{msg}")
|
180
|
+
::Foreman::Logging.exception(msg % { :name => name, :url => node_url, :msg => e.to_s }, e)
|
181
|
+
end
|
182
|
+
end
|
183
|
+
msg = N_("Unable to perform %{action} on %{ips}")
|
184
|
+
raise ::Foreman::Exception.new(msg, action: "kexec", ips: ips.to_sentence)
|
167
185
|
end
|
168
186
|
|
169
187
|
def self.model_name
|
@@ -27,7 +27,7 @@ module Host::ManagedExtensions
|
|
27
27
|
end
|
28
28
|
|
29
29
|
def setReboot
|
30
|
-
old.becomes(Host::Discovered).reboot
|
30
|
+
old.becomes(Host::Discovered).reboot(old.ip, ip)
|
31
31
|
# It is too late to report error in the post_queue, we catch them and
|
32
32
|
# continue. If flash is implemented for new hosts (http://projects.theforeman.org/issues/10559)
|
33
33
|
# we can report the error to the user perhaps.
|
@@ -55,7 +55,7 @@ module Host::ManagedExtensions
|
|
55
55
|
end
|
56
56
|
|
57
57
|
def setKexec
|
58
|
-
old.becomes(Host::Discovered).kexec(render_kexec_template.to_json)
|
58
|
+
old.becomes(Host::Discovered).kexec(render_kexec_template.to_json, old.ip, ip)
|
59
59
|
true
|
60
60
|
rescue ::Foreman::Exception => e
|
61
61
|
Foreman::Logging.exception("Unable to kexec", e)
|
@@ -8,7 +8,9 @@ class Setting::Discovered < ::Setting
|
|
8
8
|
BLANK_ATTRS << 'discovery_facts_hardware'
|
9
9
|
BLANK_ATTRS << 'discovery_facts_network'
|
10
10
|
BLANK_ATTRS << 'discovery_facts_ipmi'
|
11
|
-
|
11
|
+
|
12
|
+
STRING_PRESENCE_ATTRS = ['discovery_hostname', 'discovery_prefix']
|
13
|
+
validates :value, :presence => true, :if => proc { |s| STRING_PRESENCE_ATTRS.include?(s.name) }
|
12
14
|
|
13
15
|
def self.default_settings
|
14
16
|
[
|
@@ -1,6 +1,6 @@
|
|
1
1
|
class ForemanDiscovery::HostConverter
|
2
2
|
# Converts discovered host to managed host without uptading the database.
|
3
|
-
# Record must be saved explicitly (using save! or
|
3
|
+
# Record must be saved explicitly (using save! or update! or similar).
|
4
4
|
# Creates shallow copy.
|
5
5
|
def self.to_managed(original_host, set_managed = true, set_build = true, added_attributes = {})
|
6
6
|
host = original_host.becomes(::Host::Managed)
|
@@ -35,12 +35,21 @@ class ForemanDiscovery::HostConverter
|
|
35
35
|
end
|
36
36
|
|
37
37
|
def self.unused_ip_for_subnet(subnet, mac, existing_ip)
|
38
|
-
|
39
|
-
|
38
|
+
# prefer existing reservation to prevent conflicts
|
39
|
+
existing_rec = subnet&.dhcp_proxy&.record(subnet.network, mac)
|
40
40
|
|
41
|
-
|
42
|
-
|
43
|
-
|
41
|
+
if existing_rec && existing_rec.type == "reservation"
|
42
|
+
# reuse the reservation
|
43
|
+
existing_rec.ip
|
44
|
+
else
|
45
|
+
# no reservation - find new unused IP
|
46
|
+
ipam = subnet.unused_ip(mac)
|
47
|
+
raise(::Foreman::Exception.new(N_("IPAM must be configured for subnet '%s'"), subnet)) unless ipam.present?
|
48
|
+
|
49
|
+
# None IPAM returns nil - in that case keep the current address
|
50
|
+
suggested_ip = ipam.suggest_ip
|
51
|
+
suggested_ip.nil? ? existing_ip : suggested_ip
|
52
|
+
end
|
44
53
|
end
|
45
54
|
|
46
55
|
def self.unused_ip_for_host(host, new_subnet = nil, new_subnet6 = nil)
|
@@ -51,7 +60,6 @@ class ForemanDiscovery::HostConverter
|
|
51
60
|
interface.subnet6 = new_subnet6 if new_subnet6
|
52
61
|
interface.ip = unused_ip_for_subnet(interface.subnet, interface.mac, interface.ip) if interface.subnet
|
53
62
|
interface.ip6 = unused_ip_for_subnet(interface.subnet6, interface.mac, interface.ip6) if interface.subnet6
|
54
|
-
interface.save!
|
55
63
|
end
|
56
64
|
end
|
57
65
|
|
@@ -0,0 +1,10 @@
|
|
1
|
+
class ForemanDiscovery::HostFactImporter < ::HostFactImporter
|
2
|
+
def import_facts(facts)
|
3
|
+
# Discovered Hosts won't report in via puppet, so we can use that field to
|
4
|
+
# record the last time it sent facts...
|
5
|
+
host.last_report = Time.now
|
6
|
+
# Set the correct facts type for new foreman facts importing code.
|
7
|
+
facts[:_type] = :foreman_discovery
|
8
|
+
super(facts)
|
9
|
+
end
|
10
|
+
end
|
@@ -35,6 +35,7 @@ module ForemanDiscovery
|
|
35
35
|
Location.find_by_title(facts["discovery_location"]) ||
|
36
36
|
Location.find_by_title(Setting[:discovery_location]) ||
|
37
37
|
host.subnet.try(:locations).try(:first) ||
|
38
|
+
host.subnet6.try(:locations).try(:first) ||
|
38
39
|
Location.first
|
39
40
|
end
|
40
41
|
|
@@ -48,6 +49,7 @@ module ForemanDiscovery
|
|
48
49
|
Organization.find_by_title(facts["discovery_organization"]) ||
|
49
50
|
Organization.find_by_title(Setting[:discovery_organization]) ||
|
50
51
|
host.subnet.try(:organizations).try(:first) ||
|
52
|
+
host.subnet6.try(:organizations).try(:first) ||
|
51
53
|
Organization.first
|
52
54
|
end
|
53
55
|
end
|
@@ -17,8 +17,6 @@
|
|
17
17
|
<% if show_location_tab? %>
|
18
18
|
<%= select_f f, :location_id, Location.my_locations, :id, :to_label, {}, {:size => 'col-md-10'} %>
|
19
19
|
<% end %>
|
20
|
-
|
21
|
-
<div>Changing the Host's Subnet is not possible via Customize Host form, use Create Host or Auto provisioning and set the desired Subnet in the Hostgroup.</div>
|
22
20
|
</div>
|
23
21
|
<div class="modal-footer">
|
24
22
|
<button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
|
@@ -1,10 +1,16 @@
|
|
1
|
+
<% content_for(:javascripts) do %>
|
2
|
+
<%= webpacked_plugins_js_for :'foreman_discovery' %>
|
3
|
+
<% end %>
|
4
|
+
<% content_for(:stylesheets) do %>
|
5
|
+
<%= webpacked_plugins_css_for :'foreman_discovery' %>
|
6
|
+
<% end %>
|
7
|
+
|
1
8
|
<% content_for(:title, _("Discovered Hosts")) %>
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
<
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
</div>
|
9
|
+
|
10
|
+
<% content_for(:content) do %>
|
11
|
+
<%= notifications %>
|
12
|
+
<div id="organization-id" data-id="<%= Organization.current.id if Organization.current %>" ></div>
|
13
|
+
<div id="user-id" data-id="<%= User.current.id if User.current %>" ></div>
|
14
|
+
<%= react_component('DiscoveredHosts',
|
15
|
+
docUrl: "https://theforeman.org/plugins/foreman_discovery/#{ForemanDiscovery::VERSION.scan(/\d+\.\d+/).first}/index.html" ) %>
|
16
|
+
<% end %>
|
@@ -18,7 +18,7 @@
|
|
18
18
|
<td><%= trunc_with_tooltip(rule.search) %></td>
|
19
19
|
<td><%= label_with_link(rule.hostgroup, 26, authorizer) %></td>
|
20
20
|
<td><%= rule.hosts.count %> / <%= rule.max_count %></td>
|
21
|
-
<td><%= rule.enabled %></td>
|
21
|
+
<td><%= checked_icon rule.enabled %></td>
|
22
22
|
<td><%= action_buttons(*permitted_discovery_actions(rule)) %></td>
|
23
23
|
</tr>
|
24
24
|
<% end %>
|
@@ -12,9 +12,10 @@ environments. The template must generate JSON format with the following items
|
|
12
12
|
"kernel", "initram", "append" and "extra". The kexec command is composed in
|
13
13
|
the following way:
|
14
14
|
|
15
|
-
kexec --force --
|
15
|
+
kexec --force --debug --append=$append --initrd=$initram $extra $kernel
|
16
16
|
|
17
17
|
Please read kexec(8) man page for more information about semantics.
|
18
|
+
Extra options like --reset-vga can be set via "extra" array.
|
18
19
|
-%>
|
19
20
|
<%
|
20
21
|
mac = @host.facts['discovery_bootif']
|
@@ -28,7 +29,7 @@ Please read kexec(8) man page for more information about semantics.
|
|
28
29
|
options << @host.facts['append']
|
29
30
|
options << "domain=#{@host.domain}"
|
30
31
|
options << 'console-setup/ask_detect=false console-setup/layout=USA console-setup/variant=USA keyboard-configuration/layoutcode=us localechooser/translation/warn-light=true localechooser/translation/warn-severe=true'
|
31
|
-
options << "locale=#{
|
32
|
+
options << "locale=#{host_param('lang') || 'en_US'}"
|
32
33
|
options << "inst.stage2=#{@host.operatingsystem.medium_uri(@host)}" if @host.operatingsystem.name.match(/Atomic/i)
|
33
34
|
-%>
|
34
35
|
{
|
@@ -22,9 +22,10 @@ environments. The template must generate JSON format with the following items
|
|
22
22
|
"kernel", "initram", "append" and "extra". The kexec command is composed in
|
23
23
|
the following way:
|
24
24
|
|
25
|
-
kexec --force --
|
25
|
+
kexec --force --debug --append=$append --initrd=$initram $extra $kernel
|
26
26
|
|
27
27
|
Please read kexec(8) man page for more information about semantics.
|
28
|
+
Extra options like --reset-vga can be set via "extra" array.
|
28
29
|
-%>
|
29
30
|
<%
|
30
31
|
mac = @host.facts['discovery_bootif']
|
@@ -1,7 +1,7 @@
|
|
1
1
|
class RemoveOldDiscoveryReaderPermissions < ActiveRecord::Migration[4.2]
|
2
2
|
def up
|
3
3
|
Permission.where("name like '%_discovery_rules' and resource_type is null").each do |permission|
|
4
|
-
permission.
|
4
|
+
permission.update(:resource_type => 'DiscoveryRule')
|
5
5
|
end
|
6
6
|
end
|
7
7
|
|
@@ -1,7 +1,7 @@
|
|
1
1
|
class RegenerateRedHatKexec < ActiveRecord::Migration[4.2]
|
2
2
|
def up
|
3
3
|
t = ProvisioningTemplate.find_by_name("Discovery Red Hat kexec")
|
4
|
-
t.
|
4
|
+
t.update(:template => t.template.sub(/rescue ''$/, 'if mac')) if t
|
5
5
|
end
|
6
6
|
|
7
7
|
def down
|