foreman_discovery 11.0.0 → 12.0.0
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 +5 -5
- data/app/controllers/api/v2/discovered_hosts_controller.rb +1 -2
- data/app/controllers/concerns/foreman/controller/discovered_extensions.rb +1 -1
- data/app/controllers/discovered_hosts_controller.rb +21 -11
- data/app/controllers/foreman_discovery/concerns/hosts_controller_extensions.rb +1 -1
- data/app/helpers/discovered_hosts_helper.rb +9 -11
- data/app/models/discovery_rule.rb +3 -0
- data/app/models/host/discovered.rb +59 -19
- data/app/models/setting/discovered.rb +1 -0
- data/app/services/foreman_discovery/fact_parser.rb +6 -2
- data/app/services/foreman_discovery/ui_notifications/new_host.rb +3 -1
- data/app/views/dashboard/_discovery_widget_host_list.html.erb +1 -1
- data/app/views/discovered_hosts/_discovered_hosts_list.html.erb +2 -3
- data/app/views/discovered_hosts/_selected_hosts.html.erb +1 -1
- data/app/views/discovered_hosts/index.html.erb +0 -2
- data/app/views/discovered_hosts/multiple_auto_provision.html.erb +4 -0
- data/app/views/discovered_hosts/multiple_reboot.html.erb +4 -0
- data/app/views/discovered_hosts/show.html.erb +27 -15
- data/app/views/discovery_rules/_form.html.erb +9 -3
- data/app/views/discovery_rules/edit.html.erb +1 -1
- data/app/views/discovery_rules/index.html.erb +2 -2
- data/app/views/foreman_discovery/debian_kexec.erb +1 -1
- data/app/views/foreman_discovery/redhat_kexec.erb +1 -1
- data/config/as_deprecation_whitelist.yaml +395 -0
- data/config/routes.rb +7 -5
- data/db/migrate/20171222120314_add_constraints_on_discovery_rules_hostgroups.rb +10 -0
- data/db/migrate/20180412124505_add_priority_score_to_discovery_rules.rb +24 -0
- data/extra/discover-host +7 -5
- data/extra/discovery/simple-bond.json +167 -0
- data/lib/foreman_discovery/engine.rb +9 -3
- 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 +148 -221
- data/locale/ca/foreman_discovery.po +25 -19
- data/locale/de/LC_MESSAGES/foreman_discovery.mo +0 -0
- data/locale/de/foreman_discovery.edit.po +147 -221
- data/locale/de/foreman_discovery.po +26 -20
- data/locale/en/foreman_discovery.edit.po +106 -98
- data/locale/en/foreman_discovery.po +24 -18
- data/locale/en_GB/LC_MESSAGES/foreman_discovery.mo +0 -0
- data/locale/en_GB/foreman_discovery.edit.po +149 -222
- data/locale/en_GB/foreman_discovery.po +26 -20
- data/locale/es/LC_MESSAGES/foreman_discovery.mo +0 -0
- data/locale/es/foreman_discovery.edit.po +149 -222
- data/locale/es/foreman_discovery.po +26 -20
- data/locale/foreman_discovery.pot +115 -103
- data/locale/fr/LC_MESSAGES/foreman_discovery.mo +0 -0
- data/locale/fr/foreman_discovery.edit.po +147 -221
- data/locale/fr/foreman_discovery.po +26 -20
- data/locale/gl/foreman_discovery.edit.po +147 -220
- data/locale/gl/foreman_discovery.po +24 -18
- data/locale/it/LC_MESSAGES/foreman_discovery.mo +0 -0
- data/locale/it/foreman_discovery.edit.po +148 -221
- data/locale/it/foreman_discovery.po +25 -19
- data/locale/ja/LC_MESSAGES/foreman_discovery.mo +0 -0
- data/locale/ja/foreman_discovery.edit.po +149 -222
- data/locale/ja/foreman_discovery.po +26 -20
- data/locale/ko/LC_MESSAGES/foreman_discovery.mo +0 -0
- data/locale/ko/foreman_discovery.edit.po +149 -221
- data/locale/ko/foreman_discovery.po +26 -20
- data/locale/pt_BR/LC_MESSAGES/foreman_discovery.mo +0 -0
- data/locale/pt_BR/foreman_discovery.edit.po +149 -222
- data/locale/pt_BR/foreman_discovery.po +26 -20
- data/locale/ru/LC_MESSAGES/foreman_discovery.mo +0 -0
- data/locale/ru/foreman_discovery.edit.po +152 -223
- data/locale/ru/foreman_discovery.po +26 -20
- data/locale/sv_SE/LC_MESSAGES/foreman_discovery.mo +0 -0
- data/locale/sv_SE/foreman_discovery.edit.po +147 -220
- data/locale/sv_SE/foreman_discovery.po +24 -18
- data/locale/zh_CN/LC_MESSAGES/foreman_discovery.mo +0 -0
- data/locale/zh_CN/foreman_discovery.edit.po +155 -224
- data/locale/zh_CN/foreman_discovery.po +26 -20
- data/locale/zh_TW/LC_MESSAGES/foreman_discovery.mo +0 -0
- data/locale/zh_TW/foreman_discovery.edit.po +151 -222
- data/locale/zh_TW/foreman_discovery.po +26 -20
- data/test/functional/api/v2/discovered_hosts_controller_test.rb +2 -0
- data/test/functional/api/v2/discovery_rules_controller_test.rb +96 -9
- data/test/functional/api/v2/settings_controller_test.rb +22 -0
- data/test/functional/discovered_hosts_controller_test.rb +20 -21
- data/test/functional/discovery_rules_controller_test.rb +5 -4
- data/test/integration/discovered_hosts_test.rb +20 -10
- data/test/models/setting_test.rb +11 -0
- data/test/test_helper_discovery.rb +1 -0
- data/test/unit/discovered_extensions_test.rb +2 -13
- data/test/unit/discovery_rule_test.rb +87 -1
- data/test/unit/fact_parser_test.rb +2 -2
- data/test/unit/host_discovered_test.rb +60 -28
- data/test/unit/ui_notifications/destroy_host_test.rb +14 -4
- data/test/unit/ui_notifications/new_host_test.rb +8 -1
- metadata +22 -4
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
|
-
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
2
|
+
SHA256:
|
|
3
|
+
metadata.gz: 057e3a38102117de8da88c00a3cb4f7d7bcf56c73264bec062b6c5b0a26d879b
|
|
4
|
+
data.tar.gz: 3fa992f91692c8ff8ead22f5fe1dd1f68c53f68ec50d4226cfc7d13ea43e2f00
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 2a1b935890e1563516cbb65aaa0f69bc35509a0f379fb0bfe7f9c4e221c26663573c22a6bcab5efdaf3c239f228c846d6465b5d8b5380f5a9f70b69f24c337f2
|
|
7
|
+
data.tar.gz: 2a0c18633011f2d16f5ac91985e2ed10e3fab325e143cd029258fb710c9cd6db3398a8160105584ff47f5a7f4e6c18f7e79e3756c9de607d112c905ecc72d4ae
|
|
@@ -109,8 +109,7 @@ module Api
|
|
|
109
109
|
end
|
|
110
110
|
process_response state
|
|
111
111
|
rescue Exception => e
|
|
112
|
-
|
|
113
|
-
logger.debug e.message + "\n" + e.backtrace.join("\n")
|
|
112
|
+
Foreman::Logging.exception("Host discovery failed, facts: #{facts}", e)
|
|
114
113
|
render :json => {'message'=>e.to_s}, :status => :unprocessable_entity
|
|
115
114
|
end
|
|
116
115
|
|
|
@@ -6,7 +6,7 @@ module Foreman::Controller::DiscoveredExtensions
|
|
|
6
6
|
raise(::Foreman::Exception.new(N_("Unable to find a discovery rule, no host provided (check permissions)"))) if host.nil?
|
|
7
7
|
Rails.logger.debug "Finding auto discovery rule for host #{host.name} (#{host.id})"
|
|
8
8
|
# rule with *lower* priority wins (older wins for same priority)
|
|
9
|
-
DiscoveryRule.where(:enabled => true).reorder(:priority
|
|
9
|
+
DiscoveryRule.where(:enabled => true).reorder(:priority).each do |rule|
|
|
10
10
|
max = rule.max_count
|
|
11
11
|
usage = rule.hosts.size
|
|
12
12
|
Rails.logger.debug "Found rule #{rule.name} (#{rule.id}) [#{usage}/#{max}]"
|
|
@@ -7,7 +7,7 @@ class DiscoveredHostsController < ::ApplicationController
|
|
|
7
7
|
|
|
8
8
|
before_action :find_by_name, :only => %w[edit update destroy refresh_facts convert reboot auto_provision]
|
|
9
9
|
before_action :find_by_name_incl_subnet, :only => [:show]
|
|
10
|
-
before_action :find_multiple, :only => [:multiple_destroy, :submit_multiple_destroy]
|
|
10
|
+
before_action :find_multiple, :only => [:multiple_destroy, :submit_multiple_destroy, :multiple_reboot, :submit_multiple_reboot, :multiple_auto_provision, :submit_multiple_auto_provision]
|
|
11
11
|
before_action :taxonomy_scope, :only => [:edit]
|
|
12
12
|
|
|
13
13
|
around_action :skip_bullet, :only => [:edit]
|
|
@@ -21,12 +21,12 @@ class DiscoveredHostsController < ::ApplicationController
|
|
|
21
21
|
end
|
|
22
22
|
|
|
23
23
|
def index
|
|
24
|
-
@hosts =
|
|
24
|
+
@hosts = resource_base_search_and_page.includes([
|
|
25
25
|
:location,
|
|
26
26
|
:organization,
|
|
27
27
|
:model,
|
|
28
28
|
:discovery_attribute_set
|
|
29
|
-
], {:interfaces => :subnet})
|
|
29
|
+
], {:interfaces => :subnet})
|
|
30
30
|
fact_array = @hosts.collect do |host|
|
|
31
31
|
[host.id, Hash[host.fact_values.joins(:fact_name).where('fact_names.name' => Setting::Discovered.discovery_fact_column_array).pluck(:name, :value)]]
|
|
32
32
|
end
|
|
@@ -54,10 +54,12 @@ class DiscoveredHostsController < ::ApplicationController
|
|
|
54
54
|
end
|
|
55
55
|
|
|
56
56
|
def edit
|
|
57
|
+
quick = params.delete(:quick_submit)
|
|
57
58
|
@host = ::ForemanDiscovery::HostConverter.to_managed(@host, true, false, discovered_host_params_host) unless @host.nil?
|
|
58
59
|
setup_host_class_variables
|
|
59
60
|
@override_taxonomy = true
|
|
60
|
-
|
|
61
|
+
# need to permit this one but don't know how
|
|
62
|
+
if quick
|
|
61
63
|
perform_update(@host, _('Successfully provisioned %s') % @host.name)
|
|
62
64
|
else
|
|
63
65
|
@host.build = true
|
|
@@ -69,6 +71,7 @@ class DiscoveredHostsController < ::ApplicationController
|
|
|
69
71
|
@host = ::ForemanDiscovery::HostConverter.to_managed(@host, true, true, managed_host_params_host)
|
|
70
72
|
forward_url_options
|
|
71
73
|
|
|
74
|
+
@override_taxonomy = true
|
|
72
75
|
perform_update(@host)
|
|
73
76
|
end
|
|
74
77
|
|
|
@@ -116,8 +119,8 @@ class DiscoveredHostsController < ::ApplicationController
|
|
|
116
119
|
process_error :error_msg => exception.message, :redirect => :back
|
|
117
120
|
end
|
|
118
121
|
|
|
119
|
-
def
|
|
120
|
-
error_message = perform_reboot_all
|
|
122
|
+
def submit_multiple_reboot
|
|
123
|
+
error_message = perform_reboot_all(@hosts)
|
|
121
124
|
|
|
122
125
|
if error_message
|
|
123
126
|
process_error :error_msg => error_message, :redirect => :back
|
|
@@ -133,11 +136,17 @@ class DiscoveredHostsController < ::ApplicationController
|
|
|
133
136
|
def multiple_destroy
|
|
134
137
|
end
|
|
135
138
|
|
|
139
|
+
def multiple_reboot
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
def multiple_auto_provision
|
|
143
|
+
end
|
|
144
|
+
|
|
136
145
|
def submit_multiple_destroy
|
|
137
146
|
# keep all the ones that were not deleted for notification.
|
|
138
147
|
missed_hosts = @hosts.select {|host| !host.destroy }
|
|
139
148
|
if missed_hosts
|
|
140
|
-
|
|
149
|
+
success _("Destroyed selected hosts")
|
|
141
150
|
else
|
|
142
151
|
error _("The following hosts were not deleted: %s") % missed_hosts
|
|
143
152
|
end
|
|
@@ -158,7 +167,7 @@ class DiscoveredHostsController < ::ApplicationController
|
|
|
158
167
|
end
|
|
159
168
|
end
|
|
160
169
|
|
|
161
|
-
def
|
|
170
|
+
def submit_multiple_auto_provision
|
|
162
171
|
result = true
|
|
163
172
|
error_message = _("Errors during auto provisioning: %s")
|
|
164
173
|
|
|
@@ -168,7 +177,7 @@ class DiscoveredHostsController < ::ApplicationController
|
|
|
168
177
|
end
|
|
169
178
|
|
|
170
179
|
overall_errors = ""
|
|
171
|
-
|
|
180
|
+
@hosts.each do |discovered_host|
|
|
172
181
|
if rule = find_discovery_rule(discovered_host)
|
|
173
182
|
result &= perform_auto_provision(discovered_host, rule)
|
|
174
183
|
unless discovered_host.errors.empty?
|
|
@@ -259,11 +268,12 @@ class DiscoveredHostsController < ::ApplicationController
|
|
|
259
268
|
|
|
260
269
|
def action_permission
|
|
261
270
|
case params[:action]
|
|
262
|
-
when 'refresh_facts', 'reboot', '
|
|
271
|
+
when 'refresh_facts', 'reboot', 'multiple_reboot', 'update_multiple_location',
|
|
272
|
+
'select_multiple_organization', 'update_multiple_organization', 'select_multiple_location', 'submit_multiple_reboot'
|
|
263
273
|
:edit
|
|
264
274
|
when 'submit_multiple_destroy', 'multiple_destroy'
|
|
265
275
|
:destroy
|
|
266
|
-
when 'auto_provision', '
|
|
276
|
+
when 'auto_provision', 'multiple_auto_provision', 'submit_multiple_auto_provision'
|
|
267
277
|
:auto_provision
|
|
268
278
|
else
|
|
269
279
|
super
|
|
@@ -19,10 +19,6 @@ module DiscoveredHostsHelper
|
|
|
19
19
|
link_to(_("Back"), :back, :class => "btn btn-default")
|
|
20
20
|
),
|
|
21
21
|
select_action_button( _("Select Action"), {}, provision_button(host, hash_for_edit_discovered_host_path(:id => host)), actions.map { |action| display_link_if_authorized(action[0] , action[1], action[2] || {}) }.flatten ),
|
|
22
|
-
button_group(
|
|
23
|
-
link_to(_("Expand All"),"#", :id => "expand_all", :class => "btn btn-default"
|
|
24
|
-
)
|
|
25
|
-
),
|
|
26
22
|
button_group(
|
|
27
23
|
display_delete_if_authorized(hash_for_discovered_host_path(:id => host).merge(:auth_object => host, :permission => :destroy_discovered_hosts), :class => "btn btn-default", :data => { :confirm => _('Delete %s?') % host.name })
|
|
28
24
|
)
|
|
@@ -30,9 +26,11 @@ module DiscoveredHostsHelper
|
|
|
30
26
|
end
|
|
31
27
|
|
|
32
28
|
def multiple_discovered_hosts_actions_select
|
|
33
|
-
actions = [[_('
|
|
29
|
+
actions = [[_('Auto Provision'), multiple_auto_provision_discovered_hosts_path, hash_for_multiple_auto_provision_discovered_hosts_path]]
|
|
30
|
+
actions << [_('Reboot'), multiple_reboot_discovered_hosts_path, hash_for_multiple_reboot_discovered_hosts_path]
|
|
34
31
|
actions << [_('Assign Organization'), select_multiple_organization_discovered_hosts_path, hash_for_select_multiple_organization_discovered_hosts_path] if SETTINGS[:organizations_enabled]
|
|
35
32
|
actions << [_('Assign Location'), select_multiple_location_discovered_hosts_path, hash_for_select_multiple_location_discovered_hosts_path] if SETTINGS[:locations_enabled]
|
|
33
|
+
actions << [_('Delete'), multiple_destroy_discovered_hosts_path, hash_for_multiple_destroy_discovered_hosts_path]
|
|
36
34
|
|
|
37
35
|
select_action_button( _("Select Action"), {:id => 'submit_multiple'},
|
|
38
36
|
actions.map do |action|
|
|
@@ -56,17 +54,17 @@ module DiscoveredHostsHelper
|
|
|
56
54
|
|
|
57
55
|
def discovery_status_icon(host)
|
|
58
56
|
if host.created_at > 1.day.ago
|
|
59
|
-
status_glyph = '
|
|
57
|
+
status_glyph = 'pficon-on-running'
|
|
60
58
|
status_message = _('New in the last 24 hours')
|
|
61
|
-
status_color = '#
|
|
59
|
+
status_color = '#0088ce'
|
|
62
60
|
elsif host.last_report.present? && host.last_report < 7.days.ago
|
|
63
|
-
status_glyph = '
|
|
61
|
+
status_glyph = 'pficon-paused'
|
|
64
62
|
status_message = _('Not reported in more than 7 days')
|
|
65
|
-
status_color = '#
|
|
63
|
+
status_color = '#ec7a08'
|
|
66
64
|
else
|
|
67
|
-
status_glyph = '
|
|
65
|
+
status_glyph = 'pficon-on'
|
|
68
66
|
status_message = _('Reported in the last 7 days')
|
|
69
|
-
status_color = '#
|
|
67
|
+
status_color = '#72767b'
|
|
70
68
|
end
|
|
71
69
|
|
|
72
70
|
"<span class='glyphicon #{status_glyph}' style='color: #{status_color}'
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
class DiscoveryRule < ApplicationRecord
|
|
2
|
+
audited :associated_with => :hostgroup
|
|
2
3
|
include Authorizable
|
|
3
4
|
extend FriendlyId
|
|
4
5
|
friendly_id :name
|
|
@@ -11,9 +12,11 @@ class DiscoveryRule < ApplicationRecord
|
|
|
11
12
|
validates :hostname, :format => { :with => /\A[a-zA-Z<]/, :message => N_("must start with a letter or ERB.") },
|
|
12
13
|
:allow_blank => true
|
|
13
14
|
validates :hostgroup_id, :presence => true
|
|
15
|
+
validates :hostgroup, :presence => {:message => N_("must be present.")}
|
|
14
16
|
validates :max_count, :numericality => { :only_integer => true, :greater_than_or_equal_to => 0, :less_than => 2**31 }
|
|
15
17
|
validates :priority, :presence => true, :numericality => { :only_integer => true, :greater_than_or_equal_to => 0, :less_than => 2**31 }
|
|
16
18
|
validates_lengths_from_database
|
|
19
|
+
validates_uniqueness_of :priority
|
|
17
20
|
before_validation :default_int_attributes
|
|
18
21
|
before_validation :enforce_taxonomy
|
|
19
22
|
|
|
@@ -1,16 +1,19 @@
|
|
|
1
1
|
class Host::Discovered < ::Host::Base
|
|
2
|
+
audited :except => [:last_report]
|
|
3
|
+
has_associated_audits
|
|
4
|
+
# redefine audits relation because of the type change (by default the relation will look for auditable_type = 'Host::Managed')
|
|
5
|
+
has_many :audits, -> { where(:auditable_type => 'Host::Base') }, :foreign_key => :auditable_id, :class_name => 'Audited::Audit'
|
|
6
|
+
|
|
2
7
|
include ScopedSearchExtensions
|
|
3
8
|
include Foreman::Renderer
|
|
4
9
|
include BelongsToProxies
|
|
5
10
|
include ::Hostext::OperatingSystem
|
|
6
11
|
|
|
7
|
-
|
|
8
|
-
has_one :discovery_attribute_set, :foreign_key => :host_id, :dependent => :destroy
|
|
12
|
+
has_one :discovery_attribute_set, :foreign_key => :host_id, :dependent => :destroy
|
|
9
13
|
|
|
10
14
|
validates :discovery_attribute_set, :presence => true
|
|
11
15
|
|
|
12
|
-
delegate :memory, :cpu_count, :disk_count, :disks_size, :to => :discovery_attribute_set
|
|
13
|
-
after_create :create_notification
|
|
16
|
+
delegate :memory, :cpu_count, :disk_count, :disks_size, :to => :discovery_attribute_set, :allow_nil => true
|
|
14
17
|
after_destroy :delete_notification
|
|
15
18
|
|
|
16
19
|
scoped_search :on => :name, :complete_value => true
|
|
@@ -39,6 +42,11 @@ class Host::Discovered < ::Host::Base
|
|
|
39
42
|
where(taxonomy_conditions).order("hosts.created_at DESC")
|
|
40
43
|
}
|
|
41
44
|
|
|
45
|
+
# Discovery import workflow:
|
|
46
|
+
# discovered#import_host ->
|
|
47
|
+
# discovered#import_facts -> base#import_facts -> base#parse_facts ->
|
|
48
|
+
# discovered#populate_fields_from_facts -> base#populate_fields_from_facts -> base#set_interfaces
|
|
49
|
+
# discovered#populate_discovery_fields_from_facts
|
|
42
50
|
def self.import_host facts
|
|
43
51
|
raise(::Foreman::Exception.new(N_("Invalid facts, must be a Hash"))) unless facts.is_a?(Hash) || facts.is_a?(ActionController::Parameters)
|
|
44
52
|
|
|
@@ -56,16 +64,25 @@ class Host::Discovered < ::Host::Base
|
|
|
56
64
|
hostname = normalize_string_for_hostname("#{hostname_prefix}#{name_fact}")
|
|
57
65
|
Rails.logger.warn "Hostname does not start with an alphabetical character" unless hostname.downcase.match(/^[a-z]/)
|
|
58
66
|
|
|
59
|
-
#
|
|
67
|
+
# check for existing managed hosts and fail or warn
|
|
60
68
|
bootif_mac = FacterUtils::bootif_mac(facts).try(:downcase)
|
|
61
|
-
|
|
62
|
-
if
|
|
69
|
+
existing_managed = Nic::Managed.joins(:host).where(:mac => bootif_mac, :provision => true, :hosts => {:type => "Host::Managed"}).limit(1)
|
|
70
|
+
if existing_managed.count > 0
|
|
71
|
+
if Setting[:discovery_error_on_existing]
|
|
72
|
+
raise ::Foreman::Exception.new("One or more existing managed hosts found: %s", "#{existing_managed.first.name}/#{bootif_mac}")
|
|
73
|
+
else
|
|
74
|
+
Rails.logger.warn("One or more existing managed hosts found: #{existing_managed.first.name}/#{bootif_mac}")
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
# find existing discovered host (pick the oldest if multiple) or create new discovery host record
|
|
79
|
+
existing_discovery_hosts = Nic::Managed.joins(:host).where(:mac => bootif_mac, :provision => true, :hosts => {:type => "Host::Discovered"}).order('created_at DESC')
|
|
80
|
+
if existing_discovery_hosts.empty?
|
|
63
81
|
host = Host.new(:name => hostname, :type => "Host::Discovered")
|
|
64
82
|
else
|
|
65
|
-
Rails.logger.warn "Multiple
|
|
66
|
-
host =
|
|
83
|
+
Rails.logger.warn "Multiple (#{existing_discovery_hosts.count}) discovery hosts found with MAC address #{name_fact} - picking most recent NIC entry" if existing_discovery_hosts.count > 1
|
|
84
|
+
host = existing_discovery_hosts.first.host
|
|
67
85
|
end
|
|
68
|
-
raise ::Foreman::Exception.new("Host already exists as managed: %s", "#{host.name}/#{bootif_mac}") if host.type != "Host::Discovered"
|
|
69
86
|
|
|
70
87
|
# and save (interfaces are created via puppet parser extension)
|
|
71
88
|
host.save(:validate => false) if host.new_record?
|
|
@@ -105,10 +122,14 @@ class Host::Discovered < ::Host::Base
|
|
|
105
122
|
end
|
|
106
123
|
|
|
107
124
|
populate_discovery_fields_from_facts(facts)
|
|
125
|
+
create_notification
|
|
108
126
|
parser
|
|
109
127
|
end
|
|
110
128
|
|
|
111
129
|
def populate_discovery_fields_from_facts(facts)
|
|
130
|
+
# set discovery search attributes first
|
|
131
|
+
self.discovery_attribute_set = DiscoveryAttributeSet.where(:host_id => id).first_or_create
|
|
132
|
+
self.discovery_attribute_set.update_attributes(import_from_facts)
|
|
112
133
|
# set additional discovery attributes
|
|
113
134
|
primary_ip = self.primary_interface.ip
|
|
114
135
|
unless primary_ip.nil?
|
|
@@ -136,12 +157,12 @@ class Host::Discovered < ::Host::Base
|
|
|
136
157
|
Rails.logger.info "Assigned organization: #{self.organization}"
|
|
137
158
|
end
|
|
138
159
|
else
|
|
139
|
-
|
|
160
|
+
Rails.logger.warn "Unable to assign subnet - reboot trigger may not be possible, primary interface is missing IP address"
|
|
140
161
|
end
|
|
141
|
-
|
|
142
|
-
self.discovery_attribute_set.update_attributes(import_from_facts)
|
|
162
|
+
|
|
143
163
|
# lock the host into discovery via PXE, if feature is enabled in settings
|
|
144
164
|
lock_templates if Setting::Discovered.discovery_lock? && self.subnet.tftp?
|
|
165
|
+
ensure
|
|
145
166
|
self.save!
|
|
146
167
|
end
|
|
147
168
|
|
|
@@ -174,11 +195,6 @@ class Host::Discovered < ::Host::Base
|
|
|
174
195
|
{:cpu_count => cpu_count, :memory => memory, :disk_count => disk_count, :disks_size => disks_size}
|
|
175
196
|
end
|
|
176
197
|
|
|
177
|
-
# no need to store anything in the db if the password is our default
|
|
178
|
-
def root_pass
|
|
179
|
-
read_attribute(:root_pass).blank? ? (hostgroup.try(:root_pass) || Setting[:root_pass]) : read_attribute(:root_pass)
|
|
180
|
-
end
|
|
181
|
-
|
|
182
198
|
def proxied?
|
|
183
199
|
subnet.present? && subnet.discovery.present?
|
|
184
200
|
end
|
|
@@ -196,7 +212,7 @@ class Host::Discovered < ::Host::Base
|
|
|
196
212
|
raise ::Foreman::WrappedException.new(e, N_("Could not get facts from proxy %{url}: %{error}"), :url => proxy_url, :error => e)
|
|
197
213
|
end
|
|
198
214
|
|
|
199
|
-
def reboot
|
|
215
|
+
def reboot
|
|
200
216
|
resource = ::ForemanDiscovery::NodeAPI::Power.service(:url => proxy_url)
|
|
201
217
|
resource.reboot
|
|
202
218
|
rescue => e
|
|
@@ -247,4 +263,28 @@ class Host::Discovered < ::Host::Base
|
|
|
247
263
|
def delete_notification
|
|
248
264
|
ForemanDiscovery::UINotifications::DestroyHost.deliver!(self)
|
|
249
265
|
end
|
|
266
|
+
|
|
267
|
+
def notification_recipients_ids
|
|
268
|
+
org_recipients = find_organization_users if Taxonomy.organizations_enabled
|
|
269
|
+
org_recipients ||= []
|
|
270
|
+
|
|
271
|
+
admins = User.unscoped.only_admin.except_hidden.
|
|
272
|
+
reorder('').distinct.pluck(:id)
|
|
273
|
+
(org_recipients + admins).uniq
|
|
274
|
+
end
|
|
275
|
+
|
|
276
|
+
private
|
|
277
|
+
|
|
278
|
+
def find_organization_users
|
|
279
|
+
return [] unless organization.present?
|
|
280
|
+
organization_users = if organization.ignore_types.include? 'User'
|
|
281
|
+
User.unscoped.all
|
|
282
|
+
else
|
|
283
|
+
organization.users
|
|
284
|
+
end
|
|
285
|
+
|
|
286
|
+
organization_users.find_all do |user|
|
|
287
|
+
user.can? :create_hosts
|
|
288
|
+
end.pluck(:id)
|
|
289
|
+
end
|
|
250
290
|
end
|
|
@@ -34,6 +34,7 @@ class Setting::Discovered < ::Setting
|
|
|
34
34
|
self.set('discovery_pxegrub_lock_template', N_("PXEGrub template to be used when pinning a host to discovery"), 'pxegrub_discovery', N_("Locked PXEGrub template name"), nil, { :collection => Proc.new {Hash[ProvisioningTemplate.where(:template_kind => TemplateKind.find_by_name(:snippet)).map{|template| [template[:name], template[:name]]}]} }),
|
|
35
35
|
self.set('discovery_pxegrub2_lock_template', N_("PXEGrub2 template to be used when pinning a host to discovery"), 'pxegrub2_discovery', N_("Locked PXEGrub2 template name"), nil, { :collection => Proc.new {Hash[ProvisioningTemplate.where(:template_kind => TemplateKind.find_by_name(:snippet)).map{|template| [template[:name], template[:name]]}]} }),
|
|
36
36
|
self.set('discovery_always_rebuild_dns', N_("Force DNS entries creation when provisioning discovered host"), true, N_("Force DNS")),
|
|
37
|
+
self.set('discovery_error_on_existing', N_("Do not allow to discover existing managed host matching MAC of a provisioning NIC (errors out early)"), false, N_("Error on existing NIC")),
|
|
37
38
|
].compact.each { |s| self.create s.update(:category => "Setting::Discovered")}
|
|
38
39
|
end
|
|
39
40
|
|
|
@@ -1,12 +1,16 @@
|
|
|
1
1
|
module ForemanDiscovery
|
|
2
2
|
class FactParser < ::PuppetFactParser
|
|
3
3
|
def suggested_primary_interface(host)
|
|
4
|
-
raise("Discovery fact parser does not work with non-discovery host
|
|
4
|
+
raise(::Foreman::Exception.new(N_("Discovery fact parser does not work with non-discovery host '%{host}'") %
|
|
5
|
+
{:host => host})) if host.type != "Host::Discovered"
|
|
6
|
+
raise(::Foreman::Exception.new(N_("Discovered host '%{host}' has all NICs filtered out, filter: %{filter}") %
|
|
7
|
+
{:host => host, :filter => Setting[:ignored_interface_identifiers]})) if interfaces.size == 0
|
|
5
8
|
bootif_mac = FacterUtils::bootif_mac(facts).try(:downcase)
|
|
6
9
|
detected = interfaces.detect { |_, values| values[:macaddress].try(:downcase) == bootif_mac }
|
|
7
10
|
Rails.logger.debug "Discovery fact parser detected primary interface: #{detected}"
|
|
8
11
|
# return the detected interface as array [name, facts]
|
|
9
|
-
detected || raise(::Foreman::Exception.new(N_("Unable to
|
|
12
|
+
detected || raise(::Foreman::Exception.new(N_("Unable to find primary NIC with %{mac} specified via '%{fact}', NIC filter: %{filter}") %
|
|
13
|
+
{:mac => bootif_mac, :fact => FacterUtils::bootif_name, :filter => Setting[:ignored_interface_identifiers]}))
|
|
10
14
|
end
|
|
11
15
|
|
|
12
16
|
def parse_interfaces?
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
1
2
|
module ForemanDiscovery
|
|
2
3
|
module UINotifications
|
|
3
4
|
# Adds notification upon newly discovered Hosts
|
|
@@ -17,7 +18,8 @@ module ForemanDiscovery
|
|
|
17
18
|
def add_notification
|
|
18
19
|
Notification.create!(
|
|
19
20
|
initiator: initiator,
|
|
20
|
-
audience: ::Notification::
|
|
21
|
+
audience: ::Notification::AUDIENCE_SUBJECT,
|
|
22
|
+
subject: subject,
|
|
21
23
|
notification_blueprint: blueprint
|
|
22
24
|
)
|
|
23
25
|
end
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
<%= javascript "host_checkbox" %>
|
|
2
2
|
<% title _('Discovered Hosts') %>
|
|
3
|
-
<table class="
|
|
3
|
+
<table class="<%= table_css_classes('table-condensed') %>" >
|
|
4
4
|
<tr>
|
|
5
5
|
<th class="ca"><%= check_box_tag "check_all", "", false, { :onclick => "toggleCheck()", :'check-title' => _("Select all items in this page"), :'uncheck-title'=> _("items selected. Uncheck to Clear") } %></th>
|
|
6
6
|
<th class=''><%= sort :name, :as => _('Name') %></th>
|
|
@@ -70,5 +70,4 @@
|
|
|
70
70
|
</div><!-- /.modal-dialog -->
|
|
71
71
|
</div><!-- /.modal -->
|
|
72
72
|
|
|
73
|
-
<%=
|
|
74
|
-
<%= will_paginate @hosts %>
|
|
73
|
+
<%= will_paginate_with_info @hosts %>
|
|
@@ -1,4 +1,2 @@
|
|
|
1
1
|
<% title_actions multiple_discovered_hosts_actions_select -%>
|
|
2
|
-
<% title_actions display_link_if_authorized(_("Reboot All"), hash_for_reboot_all_discovered_hosts_path, {:class => 'btn btn-default', :method => :put, :disabled => @hosts.empty?}) %>
|
|
3
|
-
<% title_actions display_link_if_authorized(_("Auto Provision All"), hash_for_auto_provision_all_discovered_hosts_path, {:class => 'btn btn-default', :method => :post, :disabled => @hosts.empty?}) %>
|
|
4
2
|
<%= render 'discovered_hosts_list' %>
|