foreman_discovery 13.0.1 → 14.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/controllers/concerns/foreman/controller/discovered_extensions.rb +3 -1
- data/app/models/host/discovered.rb +8 -78
- data/app/models/host/managed_extensions.rb +3 -3
- data/app/models/nic/managed_extensions.rb +1 -1
- data/app/services/foreman_discovery/import_hook.rb +12 -0
- data/app/services/foreman_discovery/import_hook_service.rb +24 -0
- data/app/services/foreman_discovery/import_hooks/discovery_attribute.rb +33 -0
- data/app/services/foreman_discovery/import_hooks/lldp_neighbor.rb +11 -0
- data/app/services/foreman_discovery/import_hooks/lock_templates.rb +27 -0
- data/app/services/foreman_discovery/import_hooks/subnet_and_taxonomy.rb +63 -0
- data/app/views/discovered_hosts/_discovered_hosts_list.html.erb +1 -1
- data/app/views/foreman_discovery/debian_kexec.erb +4 -3
- data/app/views/foreman_discovery/redhat_kexec.erb +4 -2
- data/db/migrate/20141223142759_fill_discovery_attribute_sets_for_existing_hosts.rb +1 -2
- data/db/seeds.d/50_discovery_templates.rb +9 -2
- data/extra/discover-host +1 -1
- data/lib/foreman_discovery/engine.rb +1 -1
- 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 +100 -61
- data/locale/ca/foreman_discovery.po +31 -4
- data/locale/de/LC_MESSAGES/foreman_discovery.mo +0 -0
- data/locale/de/foreman_discovery.edit.po +111 -71
- data/locale/de/foreman_discovery.po +41 -13
- data/locale/en/foreman_discovery.edit.po +21 -17
- data/locale/en/foreman_discovery.po +3 -0
- data/locale/en_GB/LC_MESSAGES/foreman_discovery.mo +0 -0
- data/locale/en_GB/foreman_discovery.edit.po +101 -62
- data/locale/en_GB/foreman_discovery.po +31 -4
- data/locale/es/LC_MESSAGES/foreman_discovery.mo +0 -0
- data/locale/es/foreman_discovery.edit.po +102 -63
- data/locale/es/foreman_discovery.po +32 -5
- data/locale/foreman_discovery.pot +24 -19
- data/locale/fr/LC_MESSAGES/foreman_discovery.mo +0 -0
- data/locale/fr/foreman_discovery.edit.po +102 -63
- data/locale/fr/foreman_discovery.po +32 -5
- data/locale/gl/LC_MESSAGES/foreman_discovery.mo +0 -0
- data/locale/gl/foreman_discovery.edit.po +100 -61
- data/locale/gl/foreman_discovery.po +31 -4
- data/locale/it/LC_MESSAGES/foreman_discovery.mo +0 -0
- data/locale/it/foreman_discovery.edit.po +102 -63
- data/locale/it/foreman_discovery.po +32 -5
- data/locale/ja/LC_MESSAGES/foreman_discovery.mo +0 -0
- data/locale/ja/foreman_discovery.edit.po +102 -63
- data/locale/ja/foreman_discovery.po +32 -5
- data/locale/ko/LC_MESSAGES/foreman_discovery.mo +0 -0
- data/locale/ko/foreman_discovery.edit.po +101 -62
- data/locale/ko/foreman_discovery.po +31 -4
- data/locale/pt_BR/LC_MESSAGES/foreman_discovery.mo +0 -0
- data/locale/pt_BR/foreman_discovery.edit.po +102 -63
- data/locale/pt_BR/foreman_discovery.po +32 -5
- data/locale/ru/LC_MESSAGES/foreman_discovery.mo +0 -0
- data/locale/ru/foreman_discovery.edit.po +102 -63
- data/locale/ru/foreman_discovery.po +32 -5
- data/locale/sv_SE/LC_MESSAGES/foreman_discovery.mo +0 -0
- data/locale/sv_SE/foreman_discovery.edit.po +101 -62
- data/locale/sv_SE/foreman_discovery.po +32 -5
- data/locale/zh_CN/LC_MESSAGES/foreman_discovery.mo +0 -0
- data/locale/zh_CN/foreman_discovery.edit.po +101 -62
- data/locale/zh_CN/foreman_discovery.po +31 -4
- data/locale/zh_TW/LC_MESSAGES/foreman_discovery.mo +0 -0
- data/locale/zh_TW/foreman_discovery.edit.po +102 -63
- data/locale/zh_TW/foreman_discovery.po +32 -5
- data/test/factories/discovery_host_related.rb +1 -1
- data/test/factories/discovery_rule_related.rb +4 -4
- data/{extra/discovery → test/facts}/default.json +0 -0
- data/{extra/discovery/many_ems.json → test/facts/dell_npars.json} +5 -7
- data/test/facts/dell_vlan.json +328 -0
- data/test/{unit → facts}/facts_with_lldp.json +0 -0
- data/test/{unit → facts}/facts_with_lldp_bond_candidate.json +0 -0
- data/test/facts/puppet3-virtual.json +109 -0
- data/{extra/discovery → test/facts}/pxeless-vlan.json +0 -0
- data/test/{unit/facts.json → facts/regular_host.json} +0 -0
- data/{extra/discovery → test/facts}/rhel-dl380-1kdisks.json +0 -0
- data/{extra/discovery → test/facts}/rhel-r730.json +0 -0
- data/{extra/discovery → test/facts}/rhel7-vlan.json +0 -0
- data/{extra/discovery → test/facts}/simple-bond.json +0 -0
- data/{extra/discovery → test/facts}/suse-vmware.json +0 -0
- data/test/facts/vmware_local.json +226 -0
- data/test/functional/api/v2/discovered_hosts_controller_test.rb +1 -1
- data/test/functional/api/v2/discovery_rules_controller_test.rb +1 -1
- data/test/functional/api/v2/fact_value_extensions_test.rb +1 -1
- data/test/functional/api/v2/settings_controller_test.rb +1 -1
- data/test/functional/discovered_hosts_controller_test.rb +3 -2
- data/test/functional/discovery_rules_controller_test.rb +3 -2
- data/test/functional/foreman_discovery/concerns/hosts_controller_extensions_test.rb +1 -1
- data/test/integration/discovered_hosts_test.rb +1 -1
- data/test/models/setting_test.rb +1 -1
- data/test/test_helper_discovery.rb +6 -2
- data/test/test_plugin_helper.rb +2 -3
- data/test/unit/discovered_extensions_test.rb +7 -3
- data/test/unit/discovered_mailer_test.rb +1 -1
- data/test/unit/discovery_attribute_set_test.rb +2 -6
- data/test/unit/discovery_rule_test.rb +1 -1
- data/test/unit/discovery_taxonomy_extensions_test.rb +5 -6
- data/test/unit/fact_parser_test.rb +1 -1
- data/test/unit/host_discovered_test.rb +36 -36
- data/test/unit/lldp_neighbors_test.rb +3 -7
- data/test/unit/managed_extensions_test.rb +4 -7
- data/test/unit/setting_discovered_test.rb +1 -1
- data/test/unit/ui_notifications/destroy_host_test.rb +1 -5
- data/test/unit/ui_notifications/new_host_test.rb +2 -6
- metadata +38 -16
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 49c30c64f46b94cdebd54bcc42191a28d4657b5cac08b9b85b55e033193f3e30
|
4
|
+
data.tar.gz: 578f6f1feecbea23a712a13e5e4ece7df31a1e1fa3ec89dc0224df9472e4999b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 77d0a31672abf4bb351b0296c2fe2ac418b746fddefb7f3a9e8a2f58c7dd5d90ecaddf23cf35e2884ec49e187894abae9028e35b819ca83f31925adeb4ab18eb
|
7
|
+
data.tar.gz: a5703c3c800bad9be03d9110dbc4ab831c849e8ba31fa2ae4667b70e4013a5e923b1c170be7b8a0fa5d55499cec8265bcd7d71740e4cae4bb375226631c49127
|
@@ -51,7 +51,9 @@ module Foreman::Controller::DiscoveredExtensions
|
|
51
51
|
host.discovery_rule = rule
|
52
52
|
# render hostname only when all other fields are set
|
53
53
|
original_name = host.name
|
54
|
-
|
54
|
+
source = Foreman::Renderer::Source::String.new(name: 'Hostname template', content: rule.hostname)
|
55
|
+
scope = Foreman::Renderer.get_scope(host: host, source: source)
|
56
|
+
host.name = Foreman::Renderer.render(source, scope)
|
55
57
|
# fallback to the original if template did not expand
|
56
58
|
host.name = original_name if host.name.empty?
|
57
59
|
# explicitly set all inheritable attributes from hostgroup
|
@@ -5,7 +5,6 @@ class Host::Discovered < ::Host::Base
|
|
5
5
|
has_many :audits, -> { where(:auditable_type => 'Host::Base') }, :foreign_key => :auditable_id, :class_name => 'Audited::Audit'
|
6
6
|
|
7
7
|
include ScopedSearchExtensions
|
8
|
-
include Foreman::Renderer
|
9
8
|
include BelongsToProxies
|
10
9
|
include ::Hostext::OperatingSystem
|
11
10
|
|
@@ -107,7 +106,7 @@ class Host::Discovered < ::Host::Base
|
|
107
106
|
# record the last time it sent facts...
|
108
107
|
self.last_report = Time.now
|
109
108
|
# Set the correct facts type for new foreman facts importing code.
|
110
|
-
facts[:_type] = :foreman_discovery
|
109
|
+
facts[:_type] = :foreman_discovery
|
111
110
|
super(facts)
|
112
111
|
end
|
113
112
|
|
@@ -121,93 +120,24 @@ class Host::Discovered < ::Host::Base
|
|
121
120
|
super
|
122
121
|
end
|
123
122
|
|
124
|
-
def populate_fields_from_facts(
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
super(parser, type, source_proxy)
|
130
|
-
else
|
131
|
-
# backwards compatibility
|
132
|
-
facts = params[0] || self.facts_hash
|
133
|
-
parser = super(facts, :foreman_discovery)
|
134
|
-
end
|
123
|
+
def populate_fields_from_facts(parser, type, source_proxy)
|
124
|
+
facts = parser.facts
|
125
|
+
|
126
|
+
# detect interfaces and primary interface using extensions
|
127
|
+
super(parser, type, source_proxy)
|
135
128
|
|
136
129
|
populate_discovery_fields_from_facts(facts)
|
137
130
|
create_notification
|
138
131
|
parser
|
139
132
|
end
|
140
133
|
|
134
|
+
# set additional discovery attributes
|
141
135
|
def populate_discovery_fields_from_facts(facts)
|
142
|
-
|
143
|
-
self.discovery_attribute_set = DiscoveryAttributeSet.where(:host_id => id).first_or_create
|
144
|
-
self.discovery_attribute_set.update_attributes(import_from_facts)
|
145
|
-
# set additional discovery attributes
|
146
|
-
::ForemanDiscovery::LldpNeighbors.eventually_make_bond(self) if Setting[:discovery_auto_bond]
|
147
|
-
primary_ip = self.primary_interface.ip
|
148
|
-
unless primary_ip.nil?
|
149
|
-
subnet = Subnet.subnet_for(primary_ip)
|
150
|
-
if subnet
|
151
|
-
Rails.logger.info "Detected subnet: #{subnet} with taxonomy #{subnet.organizations.collect(&:name)}/#{subnet.locations.collect(&:name)}"
|
152
|
-
else
|
153
|
-
Rails.logger.warn "Subnet could not be detected for #{primary_ip}"
|
154
|
-
end
|
155
|
-
# set subnet
|
156
|
-
self.primary_interface.subnet = subnet
|
157
|
-
# set location and organization
|
158
|
-
if SETTINGS[:locations_enabled]
|
159
|
-
self.location = Location.find_by_title(facts["foreman_location"] || facts["discovery_location"]) ||
|
160
|
-
Location.find_by_title(Setting[:discovery_location]) ||
|
161
|
-
subnet.try(:locations).try(:first) ||
|
162
|
-
Location.first
|
163
|
-
Rails.logger.info "Assigned location: #{self.location}"
|
164
|
-
end
|
165
|
-
if SETTINGS[:organizations_enabled]
|
166
|
-
self.organization = Organization.find_by_title(facts["foreman_organization"] || facts["discovery_organization"]) ||
|
167
|
-
Organization.find_by_title(Setting[:discovery_organization]) ||
|
168
|
-
subnet.try(:organizations).try(:first) ||
|
169
|
-
Organization.first
|
170
|
-
Rails.logger.info "Assigned organization: #{self.organization}"
|
171
|
-
end
|
172
|
-
else
|
173
|
-
Rails.logger.warn "Unable to assign subnet - reboot trigger may not be possible, primary interface is missing IP address"
|
174
|
-
end
|
175
|
-
|
176
|
-
# lock the host into discovery via PXE, if feature is enabled in settings
|
177
|
-
lock_templates if Setting::Discovered.discovery_lock? && self.subnet.tftp?
|
136
|
+
ForemanDiscovery::ImportHookService.new(host: self, facts: facts).after_populate
|
178
137
|
ensure
|
179
138
|
self.save!
|
180
139
|
end
|
181
140
|
|
182
|
-
def lock_templates
|
183
|
-
@host = self
|
184
|
-
TemplateKind::PXE.each do |kind|
|
185
|
-
template_name = Setting["discovery_#{kind.downcase}_lock_template"]
|
186
|
-
Rails.logger.info "Locking discovered host #{self.mac} in subnet #{subnet} via #{template_name} template"
|
187
|
-
template = unattended_render(::ProvisioningTemplate.find_by_name(template_name).template)
|
188
|
-
subnet.tftp_proxy.set(kind, mac, :pxeconfig => template)
|
189
|
-
end
|
190
|
-
rescue ::Foreman::Exception => e
|
191
|
-
::Foreman::Logging.exception("Could not set tftp_proxy from proxy", e)
|
192
|
-
end
|
193
|
-
|
194
|
-
def import_from_facts(facts = self.facts_hash)
|
195
|
-
cpu_count = facts['physicalprocessorcount'].to_i rescue 0
|
196
|
-
memory = facts['memorysize_mb'].to_f.ceil rescue 0
|
197
|
-
disks = facts.select { |key, value| key.to_s =~ /blockdevice.*_size/ }
|
198
|
-
disks_size = 0
|
199
|
-
disk_count = 0
|
200
|
-
|
201
|
-
if disks.any?
|
202
|
-
disks.values.each { |size| disks_size += (size.to_f rescue 0) }
|
203
|
-
disk_count = disks.size
|
204
|
-
# Turning disks_size to closest Mega for easier to read UI
|
205
|
-
disks_size = (disks_size / 1024 / 1024).ceil if disks_size > 0
|
206
|
-
end
|
207
|
-
|
208
|
-
{:cpu_count => cpu_count, :memory => memory, :disk_count => disk_count, :disks_size => disks_size}
|
209
|
-
end
|
210
|
-
|
211
141
|
def proxied?
|
212
142
|
subnet.present? && subnet.discovery.present?
|
213
143
|
end
|
@@ -17,7 +17,7 @@ module Host::ManagedExtensions
|
|
17
17
|
return
|
18
18
|
end
|
19
19
|
return if new_record? # Discovered Hosts already exist, and new_records will break `find`
|
20
|
-
return unless
|
20
|
+
return unless will_save_change_to_attribute?(:type, from: 'Host::Discovered')
|
21
21
|
# reboot task must be high priority and there is no compensation action apparently
|
22
22
|
if facts['discovery_kexec'] && provisioning_template(:kind => 'kexec')
|
23
23
|
post_queue.create(:name => _("Reloading kernel on %s") % self, :priority => 10000, :action => [self, :setKexec])
|
@@ -63,12 +63,12 @@ module Host::ManagedExtensions
|
|
63
63
|
|
64
64
|
def delete_discovery_attribute_set
|
65
65
|
return if new_record?
|
66
|
-
DiscoveryAttributeSet.where(:host_id => self.id).destroy_all if
|
66
|
+
DiscoveryAttributeSet.where(:host_id => self.id).destroy_all if saved_change_to_attribute?(:type)
|
67
67
|
end
|
68
68
|
|
69
69
|
def update_notifications
|
70
70
|
return if new_record?
|
71
|
-
return unless
|
71
|
+
return unless saved_change_to_attribute?(:type)
|
72
72
|
ForemanDiscovery::UINotifications::DestroyHost.deliver!(self)
|
73
73
|
end
|
74
74
|
end
|
@@ -8,7 +8,7 @@ module Nic::ManagedExtensions
|
|
8
8
|
def discovery_queue_rebuild_dns
|
9
9
|
return unless (dns? || dns6? || reverse_dns? || reverse_dns6?) && errors.empty? && Setting[:discovery_always_rebuild_dns]
|
10
10
|
return if self.host.new_record? || old.nil? # Discovered Hosts already exist, and new_records will break `find`
|
11
|
-
return unless self.host.
|
11
|
+
return unless self.host.will_save_change_to_attribute?(:type, from: 'Host::Discovered')
|
12
12
|
return if self.pending_dns_record_changes?
|
13
13
|
logger.debug "Queuing DNS rebuild for #{self}"
|
14
14
|
queue.create(:name => _("Rebuild DNS for %s") % self, :priority => 10, :action => [self, :set_discovery_rebuild_dns])
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module ForemanDiscovery
|
2
|
+
class ImportHookService
|
3
|
+
HOOKS = [
|
4
|
+
ForemanDiscovery::ImportHooks::DiscoveryAttribute,
|
5
|
+
ForemanDiscovery::ImportHooks::LldpNeighbor,
|
6
|
+
ForemanDiscovery::ImportHooks::SubnetAndTaxonomy,
|
7
|
+
ForemanDiscovery::ImportHooks::LockTemplates
|
8
|
+
]
|
9
|
+
|
10
|
+
attr_reader :host, :facts
|
11
|
+
|
12
|
+
def initialize(host:, facts:)
|
13
|
+
@host = host
|
14
|
+
@facts = facts
|
15
|
+
end
|
16
|
+
|
17
|
+
def after_populate
|
18
|
+
HOOKS.each do |hook_class|
|
19
|
+
hook = hook_class.new(host: host, facts: facts)
|
20
|
+
hook.after_populate
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# set discovery search attributes first
|
2
|
+
module ForemanDiscovery
|
3
|
+
module ImportHooks
|
4
|
+
class DiscoveryAttribute < ImportHook
|
5
|
+
def after_populate
|
6
|
+
host.discovery_attribute_set = DiscoveryAttributeSet.where(host_id: host.id).first_or_create
|
7
|
+
host.discovery_attribute_set.update(import_from_facts)
|
8
|
+
end
|
9
|
+
|
10
|
+
def import_from_facts
|
11
|
+
cpu_count = facts['physicalprocessorcount'].to_i rescue 0
|
12
|
+
memory = facts['memorysize_mb'].to_f.ceil rescue 0
|
13
|
+
disks = facts.select { |key, value| key.to_s =~ /blockdevice.*_size/ }
|
14
|
+
disks_size = 0
|
15
|
+
disk_count = 0
|
16
|
+
|
17
|
+
if disks.any?
|
18
|
+
disks.values.each { |size| disks_size += (size.to_f rescue 0) }
|
19
|
+
disk_count = disks.size
|
20
|
+
# Turning disks_size to closest Mega for easier to read UI
|
21
|
+
disks_size = (disks_size / 1024 / 1024).ceil if disks_size > 0
|
22
|
+
end
|
23
|
+
|
24
|
+
{
|
25
|
+
cpu_count: cpu_count,
|
26
|
+
memory: memory,
|
27
|
+
disk_count: disk_count,
|
28
|
+
disks_size: disks_size
|
29
|
+
}
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
# Automatically bonds interfaces based on lldp facts
|
2
|
+
module ForemanDiscovery
|
3
|
+
module ImportHooks
|
4
|
+
class LldpNeighbor < ImportHook
|
5
|
+
def after_populate
|
6
|
+
return unless Setting[:discovery_auto_bond]
|
7
|
+
::ForemanDiscovery::LldpNeighbors.eventually_make_bond(host)
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# lock the host into discovery via PXE if feature is enabled in settings
|
2
|
+
module ForemanDiscovery
|
3
|
+
module ImportHooks
|
4
|
+
class LockTemplates < ImportHook
|
5
|
+
def after_populate
|
6
|
+
lock_templates if Setting::Discovered.discovery_lock? && host.subnet.tftp?
|
7
|
+
end
|
8
|
+
|
9
|
+
def lock_templates
|
10
|
+
TemplateKind::PXE.each do |kind|
|
11
|
+
setting = "discovery_#{kind.downcase}_lock_template"
|
12
|
+
template_name = Setting[setting]
|
13
|
+
logger.info "Locking discovered host #{host.mac} in subnet #{host.subnet} via #{template_name} template"
|
14
|
+
template = ::ProvisioningTemplate.unscoped.find_by_name(template_name)
|
15
|
+
if template.nil?
|
16
|
+
logger.warn "Template '#{template_name}' provided by setting '#{setting}' does not exist, not locking"
|
17
|
+
next
|
18
|
+
end
|
19
|
+
rendered_template = host.render_template(template: template, params: { host: host })
|
20
|
+
host.subnet.tftp_proxy.set(kind, host.mac, pxeconfig: rendered_template)
|
21
|
+
end
|
22
|
+
rescue ::Foreman::Exception => e
|
23
|
+
::Foreman::Logging.exception('Could not set tftp_proxy from proxy', e)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
# Sets subnet, location and organization of a host based on the discovery facts
|
2
|
+
module ForemanDiscovery
|
3
|
+
module ImportHooks
|
4
|
+
class SubnetAndTaxonomy < ImportHook
|
5
|
+
def after_populate
|
6
|
+
primary_ip = host.primary_interface.ip
|
7
|
+
|
8
|
+
unless primary_ip
|
9
|
+
logger.warn "Unable to assign subnet - reboot trigger may not be possible, primary interface is missing IP address"
|
10
|
+
return
|
11
|
+
end
|
12
|
+
|
13
|
+
# set subnet
|
14
|
+
set_subnet(primary_ip)
|
15
|
+
# set location and organization
|
16
|
+
set_location
|
17
|
+
set_organization
|
18
|
+
end
|
19
|
+
|
20
|
+
private
|
21
|
+
|
22
|
+
def set_subnet(ip)
|
23
|
+
host.primary_interface.subnet = suggested_subnet(ip)
|
24
|
+
end
|
25
|
+
|
26
|
+
def suggested_subnet(ip)
|
27
|
+
subnet = Subnet.subnet_for(ip)
|
28
|
+
if subnet
|
29
|
+
logger.info "Detected subnet: #{subnet} with taxonomy #{subnet.organizations.collect(&:name)}/#{subnet.locations.collect(&:name)}"
|
30
|
+
else
|
31
|
+
logger.warn "Subnet could not be detected for #{ip}"
|
32
|
+
end
|
33
|
+
subnet
|
34
|
+
end
|
35
|
+
|
36
|
+
def set_location
|
37
|
+
return unless SETTINGS[:locations_enabled]
|
38
|
+
host.location = suggested_location
|
39
|
+
logger.info "Assigned location: #{host.location}"
|
40
|
+
end
|
41
|
+
|
42
|
+
def suggested_location
|
43
|
+
Location.find_by_title(facts["foreman_location"] || facts["discovery_location"]) ||
|
44
|
+
Location.find_by_title(Setting[:discovery_location]) ||
|
45
|
+
host.subnet.try(:locations).try(:first) ||
|
46
|
+
Location.first
|
47
|
+
end
|
48
|
+
|
49
|
+
def set_organization
|
50
|
+
return unless SETTINGS[:organizations_enabled]
|
51
|
+
host.organization = suggested_organization
|
52
|
+
logger.info "Assigned organization: #{host.organization}"
|
53
|
+
end
|
54
|
+
|
55
|
+
def suggested_organization
|
56
|
+
Organization.find_by_title(facts["foreman_organization"] || facts["discovery_organization"]) ||
|
57
|
+
Organization.find_by_title(Setting[:discovery_organization]) ||
|
58
|
+
host.subnet.try(:organizations).try(:first) ||
|
59
|
+
Organization.first
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
@@ -21,7 +21,7 @@
|
|
21
21
|
<% end -%>
|
22
22
|
<th class="hidden-tablet hidden-xs"><%= sort :subnet, :as => _("Subnet") %></th>
|
23
23
|
<th class="hidden-tablet hidden-xs"><%= sort :last_report, :as => _("Last Facts Upload") %></th>
|
24
|
-
<th
|
24
|
+
<th class="hidden-tablet hidden-xs"><%= _("Actions") %></th>
|
25
25
|
</tr>
|
26
26
|
<% @hosts.each do |host| -%>
|
27
27
|
<tr>
|
@@ -24,16 +24,17 @@ Please read kexec(8) man page for more information about semantics.
|
|
24
24
|
mask = @host.facts['discovery_netmask']
|
25
25
|
gw = @host.facts['discovery_gateway']
|
26
26
|
dns = @host.facts['discovery_dns']
|
27
|
-
|
28
|
-
options
|
27
|
+
options = ["nomodeset", "auto=true"]
|
28
|
+
options << @host.facts['append']
|
29
29
|
options << "domain=#{@host.domain}"
|
30
30
|
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
31
|
options << "locale=#{@host.params['lang'] || 'en_US'}"
|
32
|
+
options << "inst.stage2=#{@host.operatingsystem.medium_uri(@host)}" if @host.operatingsystem.name.match(/Atomic/i)
|
32
33
|
-%>
|
33
34
|
{
|
34
35
|
"comment": "WARNING: Both kernel and initram are not set in preview mode due to http://projects.theforeman.org/issues/19737",
|
35
36
|
"kernel": "<%= @kexec_kernel %>",
|
36
37
|
"initram": "<%= @kexec_initrd %>",
|
37
|
-
"append": "url=<%= foreman_url('provision') + "&static=yes" %> interface=<%= mac %> netcfg/get_ipaddress=<%= ip %> netcfg/get_netmask=<%= mask %> netcfg/get_gateway=<%= gw %> netcfg/get_nameservers=<%= dns %> netcfg/disable_dhcp=true netcfg/get_hostname=<%= @host.name %> BOOTIF=<%= bootif %> <%= options.join(' ') %>",
|
38
|
+
"append": "url=<%= foreman_url('provision') + "&static=yes" %> interface=<%= mac %> netcfg/get_ipaddress=<%= ip %> netcfg/get_netmask=<%= mask %> netcfg/get_gateway=<%= gw %> netcfg/get_nameservers=<%= dns %> netcfg/disable_dhcp=true netcfg/get_hostname=<%= @host.name %> BOOTIF=<%= bootif %> <%= options.compact.join(' ') %>",
|
38
39
|
"extra": []
|
39
40
|
}
|
@@ -34,7 +34,9 @@ Please read kexec(8) man page for more information about semantics.
|
|
34
34
|
mask = @host.facts['discovery_netmask']
|
35
35
|
gw = @host.facts['discovery_gateway']
|
36
36
|
dns = @host.facts['discovery_dns']
|
37
|
-
|
37
|
+
options = ["nomodeset"]
|
38
|
+
options << @host.facts['append']
|
39
|
+
options << "inst.stage2=#{@host.operatingsystem.medium_uri(@host)}" if @host.operatingsystem.name.match(/Atomic/i)
|
38
40
|
-%>
|
39
41
|
{
|
40
42
|
"comment": "WARNING: Both kernel and initram are not set in preview mode due to http://projects.theforeman.org/issues/19737",
|
@@ -44,7 +46,7 @@ Please read kexec(8) man page for more information about semantics.
|
|
44
46
|
(@host.operatingsystem.name != 'Fedora' and @host.operatingsystem.major.to_i >= 7) -%>
|
45
47
|
"append": "ks=<%= foreman_url('provision') + "&static=yes" %> inst.ks.sendmac <%= "ip=#{ip}::#{gw}:#{mask}:::none nameserver=#{dns} ksdevice=bootif BOOTIF=#{bootif} nomodeset #{append}" %>",
|
46
48
|
<% else -%>
|
47
|
-
"append": "ks=<%= foreman_url('provision') + "&static=yes" %> kssendmac nicdelay=5 <%= "ip=#{ip} netmask=#{mask} gateway=#{gw} dns=#{dns} ksdevice=#{mac} BOOTIF=#{bootif}
|
49
|
+
"append": "ks=<%= foreman_url('provision') + "&static=yes" %> kssendmac nicdelay=5 <%= "ip=#{ip} netmask=#{mask} gateway=#{gw} dns=#{dns} ksdevice=#{mac} BOOTIF=#{bootif} " + options.compact.join(' ') %>",
|
48
50
|
<% end -%>
|
49
51
|
"extra": []
|
50
52
|
}
|
@@ -7,8 +7,7 @@ class FillDiscoveryAttributeSetsForExistingHosts < ActiveRecord::Migration[4.2]
|
|
7
7
|
FakeDiscoveredHost.where(:type => "Host::Discovered").all.each do |host|
|
8
8
|
begin
|
9
9
|
say "Populating attribute set for discovered host #{host.name}"
|
10
|
-
host
|
11
|
-
host.discovery_attribute_set.update_attributes(host.import_from_facts)
|
10
|
+
ForemanDiscovery::ImportHooks::DiscoveryAttribute.new(host: host, facts: host.facts_hash).after_populate
|
12
11
|
host.save!
|
13
12
|
rescue Exception => e
|
14
13
|
say "Error while populating host #{host.name}, deleting: #{e.message}:\n" + e.backtrace.join("\n")
|
@@ -1,4 +1,9 @@
|
|
1
|
-
|
1
|
+
organizations = Organization.unscoped.all
|
2
|
+
locations = Location.unscoped.all
|
3
|
+
|
4
|
+
kind = TemplateKind.unscoped.find_or_create_by(name: 'kexec')
|
5
|
+
kind.description = N_("Command line options for kexec during PXE-less provisioning.")
|
6
|
+
kind.save!
|
2
7
|
|
3
8
|
ProvisioningTemplate.without_auditing do
|
4
9
|
[['redhat_kexec.erb', 'Red Hat'], ['debian_kexec.erb', 'Debian']].each do |tmpl_names|
|
@@ -12,8 +17,10 @@ ProvisioningTemplate.without_auditing do
|
|
12
17
|
:template => content,
|
13
18
|
:default => true,
|
14
19
|
:vendor => "Foreman Discovery",
|
15
|
-
:locked =>
|
20
|
+
:locked => true
|
16
21
|
}
|
22
|
+
tmpl.organizations = organizations if SETTINGS[:organizations_enabled]
|
23
|
+
tmpl.locations = locations if SETTINGS[:locations_enabled]
|
17
24
|
tmpl.save!(:validate => false) if tmpl.changes.present?
|
18
25
|
end
|
19
26
|
end
|
data/extra/discover-host
CHANGED
@@ -5,7 +5,7 @@ require 'rest-client'
|
|
5
5
|
|
6
6
|
def find_base name="default"
|
7
7
|
return name if File.exists?(name)
|
8
|
-
file = File.absolute_path(File.dirname(__FILE__) + "/
|
8
|
+
file = File.absolute_path(File.dirname(__FILE__) + "../../test/facts/#{name}.json")
|
9
9
|
raise "Unable to find file #{file}" unless File.exists?(file)
|
10
10
|
file
|
11
11
|
end
|