foreman_discovery 5.0.0 → 5.0.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.
Files changed (81) hide show
  1. checksums.yaml +4 -4
  2. data/app/controllers/api/v2/discovered_hosts_controller.rb +41 -51
  3. data/app/controllers/concerns/foreman/controller/discovered_extensions.rb +20 -23
  4. data/app/controllers/discovered_hosts_controller.rb +50 -46
  5. data/app/helpers/concerns/foreman_discovery/settings_helper_extensions.rb +34 -0
  6. data/app/helpers/discovery_rules_helper.rb +5 -6
  7. data/app/mailers/discovered_mailer.rb +19 -0
  8. data/app/models/discovery_rule.rb +3 -3
  9. data/app/models/host/discovered.rb +33 -11
  10. data/app/models/host/managed_extensions.rb +10 -0
  11. data/app/models/hostgroup_extensions.rb +1 -1
  12. data/app/models/setting/discovered.rb +17 -11
  13. data/app/services/foreman_discovery/fact_parser.rb +16 -0
  14. data/app/services/foreman_discovery/host_converter.rb +0 -4
  15. data/app/services/foreman_discovery/node_api/power.rb +3 -3
  16. data/app/views/discovered_hosts/_discovered_host.html.erb +4 -2
  17. data/app/views/discovered_hosts/_discovered_hosts_list.html.erb +1 -1
  18. data/app/views/discovered_mailer/_discovered_host.html.erb +10 -0
  19. data/app/views/discovered_mailer/discovered_summary.html.erb +35 -0
  20. data/app/views/discovered_mailer/discovered_summary.text.erb +24 -0
  21. data/config/routes.rb +3 -3
  22. data/db/seeds.d/70_discovery_mail_notification.rb +9 -0
  23. data/lib/foreman_discovery/engine.rb +12 -9
  24. data/lib/foreman_discovery/version.rb +1 -1
  25. data/locale/ca/LC_MESSAGES/foreman_discovery.mo +0 -0
  26. data/locale/ca/foreman_discovery.edit.po +780 -0
  27. data/locale/ca/foreman_discovery.po +358 -261
  28. data/locale/de/LC_MESSAGES/foreman_discovery.mo +0 -0
  29. data/locale/de/foreman_discovery.edit.po +774 -0
  30. data/locale/de/foreman_discovery.po +418 -311
  31. data/locale/en_GB/LC_MESSAGES/foreman_discovery.mo +0 -0
  32. data/locale/en_GB/foreman_discovery.edit.po +779 -0
  33. data/locale/en_GB/foreman_discovery.po +423 -313
  34. data/locale/es/LC_MESSAGES/foreman_discovery.mo +0 -0
  35. data/locale/es/foreman_discovery.edit.po +781 -0
  36. data/locale/es/foreman_discovery.po +425 -313
  37. data/locale/foreman_discovery.pot +496 -159
  38. data/locale/fr/LC_MESSAGES/foreman_discovery.mo +0 -0
  39. data/locale/fr/foreman_discovery.edit.po +778 -0
  40. data/locale/fr/foreman_discovery.po +458 -322
  41. data/locale/gl/LC_MESSAGES/foreman_discovery.mo +0 -0
  42. data/locale/gl/foreman_discovery.edit.po +757 -0
  43. data/locale/gl/foreman_discovery.po +306 -215
  44. data/locale/it/LC_MESSAGES/foreman_discovery.mo +0 -0
  45. data/locale/it/foreman_discovery.edit.po +771 -0
  46. data/locale/it/foreman_discovery.po +411 -301
  47. data/locale/ja/LC_MESSAGES/foreman_discovery.mo +0 -0
  48. data/locale/ja/foreman_discovery.edit.po +770 -0
  49. data/locale/ja/foreman_discovery.po +395 -300
  50. data/locale/ko/LC_MESSAGES/foreman_discovery.mo +0 -0
  51. data/locale/ko/foreman_discovery.edit.po +768 -0
  52. data/locale/ko/foreman_discovery.po +393 -299
  53. data/locale/pt_BR/LC_MESSAGES/foreman_discovery.mo +0 -0
  54. data/locale/pt_BR/foreman_discovery.edit.po +780 -0
  55. data/locale/pt_BR/foreman_discovery.po +438 -309
  56. data/locale/ru/LC_MESSAGES/foreman_discovery.mo +0 -0
  57. data/locale/ru/foreman_discovery.edit.po +775 -0
  58. data/locale/ru/foreman_discovery.po +413 -308
  59. data/locale/sv_SE/LC_MESSAGES/foreman_discovery.mo +0 -0
  60. data/locale/sv_SE/foreman_discovery.edit.po +766 -0
  61. data/locale/sv_SE/foreman_discovery.po +321 -232
  62. data/locale/zh_CN/LC_MESSAGES/foreman_discovery.mo +0 -0
  63. data/locale/zh_CN/foreman_discovery.edit.po +769 -0
  64. data/locale/zh_CN/foreman_discovery.po +393 -302
  65. data/locale/zh_TW/LC_MESSAGES/foreman_discovery.mo +0 -0
  66. data/locale/zh_TW/foreman_discovery.edit.po +769 -0
  67. data/locale/zh_TW/foreman_discovery.po +395 -302
  68. data/test/functional/api/v2/discovered_hosts_controller_test.rb +8 -0
  69. data/test/functional/api/v2/discovery_rules_controller_test.rb +9 -0
  70. data/test/functional/discovered_hosts_controller_test.rb +26 -17
  71. data/test/functional/discovery_rules_controller_test.rb +9 -8
  72. data/test/test_helper.rb +0 -4
  73. data/test/test_helper_discovery.rb +24 -0
  74. data/test/unit/discovered_extensions_test.rb +31 -0
  75. data/test/unit/discovered_mailer_test.rb +44 -0
  76. data/test/unit/discovery_attribute_set_test.rb +12 -0
  77. data/test/unit/discovery_rule_test.rb +20 -0
  78. data/test/unit/{puppet_fact_parser_extensions_test.rb → fact_parser_test.rb} +3 -16
  79. data/test/unit/host_discovered_test.rb +56 -11
  80. metadata +29 -5
  81. data/app/lib/puppet_fact_parser_extensions.rb +0 -29
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 3f374078ca62446b7d03fd98a002238e45cc9564
4
- data.tar.gz: 843df4136fa29c634e7446349ba2ad358902662f
3
+ metadata.gz: 502993f89f5431e289e5efb8461e7cc0ebaacd8e
4
+ data.tar.gz: de1e98597a4aa81d8a79c47eb92e16d839217306
5
5
  SHA512:
6
- metadata.gz: 1a8eeb66a019a1d99e8c2705698a7fd410e6ed993cb00a1ee1b5c16d39fe22168d4c01cb5bcc72f49dd40bc4d08545d94ab0be95cd682ac843d9eb462a8f79b5
7
- data.tar.gz: debdc05bee101a87d3154f03ff600f090e5186e05f941d8d7c7e61377acfa4679396b999d442b98583e5a7355e6ffdcc2bf42eb4c7a0e19b6f3fc2d06262d331
6
+ metadata.gz: 8cc594acebdc231572f3b2057a04e3317506ac454c5befd1c51aad5d81efb19e343cc37cc6a3ed77eac8e30388486e3e782afe812a7094fccc978c054cebea0c
7
+ data.tar.gz: 1d1cb83f0c3ada7a3c43c8f150db2e0e143cb4abbca4c783c5f48c7dc06faa7c2301b4615681bec8b56dd88b3c73a7b82b3f768810241f566bc2d9f6ebea95f8
@@ -76,12 +76,10 @@ module Api
76
76
  end
77
77
 
78
78
  def update
79
- Host.transaction do
80
- @host = ::ForemanDiscovery::HostConverter.to_managed(@discovered_host)
81
- forward_request_url
82
- update_response = @host.update_attributes(params[:discovered_host])
83
- process_response update_response
84
- end
79
+ @host = ::ForemanDiscovery::HostConverter.to_managed(@discovered_host)
80
+ forward_request_url
81
+ update_response = @host.update_attributes(params[:discovered_host])
82
+ process_response update_response
85
83
  end
86
84
 
87
85
  api :DELETE, "/discovered_hosts/:id/", N_("Delete a discovered host")
@@ -96,16 +94,12 @@ module Api
96
94
 
97
95
  def facts
98
96
  state = true
99
- Host.transaction do
100
- @discovered_host, state = Host::Discovered.import_host_and_facts(params[:facts])
101
- end
97
+ @discovered_host, state = Host::Discovered.import_host_and_facts(params[:facts])
102
98
  if Setting['discovery_auto']
103
- Host.transaction do
104
- if state && rule = find_discovery_rule(@discovered_host)
105
- state = perform_auto_provision(@discovered_host, rule)
106
- else
107
- Rails.logger.warn "Discovered facts import unsuccessful, skipping auto provisioning"
108
- end
99
+ if state && rule = find_discovery_rule(@discovered_host)
100
+ state = perform_auto_provision(@discovered_host, rule)
101
+ else
102
+ Rails.logger.warn "Discovered facts import unsuccessful, skipping auto provisioning"
109
103
  end
110
104
  end
111
105
  process_response state
@@ -119,21 +113,19 @@ module Api
119
113
  param :id, :identifier, :required => true
120
114
 
121
115
  def auto_provision
122
- Host.transaction do
123
- if rule = find_discovery_rule(@discovered_host)
124
- if perform_auto_provision(@discovered_host, rule)
125
- msg = _("Host %{host} was provisioned with rule %{rule}") % {:host => @discovered_host.name, :rule => rule.name}
126
- render :json => {:message => msg}
127
- else
128
- msg = _("Unable to provision %{host}: %{errors}") % {:host => @discovered_host.name, :errors => @discovered_host.errors.full_messages.join(' ')}
129
- render :json => {:message => msg}, :status => :unprocessable_entity
130
- end
116
+ if rule = find_discovery_rule(@discovered_host)
117
+ if perform_auto_provision(@discovered_host, rule)
118
+ msg = _("Host %{host} was provisioned with rule %{rule}") % {:host => @discovered_host.name, :rule => rule.name}
119
+ render :json => {:message => msg}
131
120
  else
132
- render_error :custom_error, :status => :not_found,
133
- :locals => {
134
- :message => _("No rule found for host %s") % @discovered_host.name
135
- }
121
+ msg = _("Unable to provision %{host}: %{errors}") % {:host => @discovered_host.name, :errors => @discovered_host.errors.full_messages.join(' ')}
122
+ render :json => {:message => msg}, :status => :unprocessable_entity
136
123
  end
124
+ else
125
+ render_error :custom_error, :status => :not_found,
126
+ :locals => {
127
+ :message => _("No rule found for host %s") % @discovered_host.name
128
+ }
137
129
  end
138
130
  rescue ::Foreman::Exception => e
139
131
  render :json => {'message' => e.to_s}, :status => :unprocessable_entity
@@ -151,34 +143,32 @@ module Api
151
143
  end
152
144
 
153
145
  total_count = 0
154
- Host.transaction do
155
- overall_errors = ""
156
- Host::Discovered.all.each do |discovered_host|
157
- if rule = find_discovery_rule(discovered_host)
158
- result &= perform_auto_provision(discovered_host, rule)
159
- unless discovered_host.errors.empty?
160
- errors = discovered_host.errors.full_messages.join(' ')
161
- logger.warn "Failed to auto provision host %s: %s" % [discovered_host.name, errors]
162
- overall_errors << "#{discovered_host.name}: #{errors} "
163
- else
164
- total_count += 1
165
- end
146
+ overall_errors = ""
147
+ Host::Discovered.all.each do |discovered_host|
148
+ if rule = find_discovery_rule(discovered_host)
149
+ result &= perform_auto_provision(discovered_host, rule)
150
+ unless discovered_host.errors.empty?
151
+ errors = discovered_host.errors.full_messages.join(' ')
152
+ logger.warn "Failed to auto provision host %s: %s" % [discovered_host.name, errors]
153
+ overall_errors << "#{discovered_host.name}: #{errors} "
166
154
  else
167
- logger.warn "No rule found for host %s" % discovered_host.name
155
+ total_count += 1
168
156
  end
169
- end
170
-
171
- if result
172
- msg = _("%s discovered hosts were provisioned") % total_count
173
- render :json => {:message => msg}
174
157
  else
175
- render_error :custom_error,
176
- :status => :unprocessable_entity,
177
- :locals => {
178
- :message => error_message % overall_errors
179
- }
158
+ logger.warn "No rule found for host %s" % discovered_host.name
180
159
  end
181
160
  end
161
+
162
+ if result
163
+ msg = _("%s discovered hosts were provisioned") % total_count
164
+ render :json => {:message => msg}
165
+ else
166
+ render_error :custom_error,
167
+ :status => :unprocessable_entity,
168
+ :locals => {
169
+ :message => error_message % overall_errors
170
+ }
171
+ end
182
172
  end
183
173
 
184
174
  api :PUT, "/discovered_hosts/:id/refresh_facts", N_("Refreshing the facts of a discovered host")
@@ -44,19 +44,18 @@ module Foreman::Controller::DiscoveredExtensions
44
44
 
45
45
  # trigger the provisioning
46
46
  def perform_auto_provision original_host, rule
47
- Host.transaction do
48
- host = ::ForemanDiscovery::HostConverter.to_managed(original_host)
49
- host.hostgroup_id = rule.hostgroup_id
50
- host.comment = "Auto-discovered and provisioned via rule '#{rule.name}'"
51
- host.discovery_rule = rule
52
- # render hostname only when all other fields are set
53
- original_name = host.name
54
- host.name = host.render_template(rule.hostname) unless rule.hostname.empty?
55
- # fallback to the original if template did not expand
56
- host.name = original_name if host.name.empty?
57
- # save! does not work here
58
- host.save
59
- end
47
+ raise(::Foreman::Exception.new(N_("No hostgroup associated with rule '%s'"), rule)) if rule.hostgroup.nil?
48
+ host = ::ForemanDiscovery::HostConverter.to_managed(original_host)
49
+ host.hostgroup_id = rule.hostgroup_id
50
+ host.comment = "Auto-discovered and provisioned via rule '#{rule.name}'"
51
+ host.discovery_rule = rule
52
+ # render hostname only when all other fields are set
53
+ original_name = host.name
54
+ host.name = host.render_template(rule.hostname) unless rule.hostname.empty?
55
+ # fallback to the original if template did not expand
56
+ host.name = original_name if host.name.empty?
57
+ # save! does not work here
58
+ host.save
60
59
  end
61
60
 
62
61
  def perform_reboot_all hosts = Host::Discovered.all
@@ -65,19 +64,17 @@ module Foreman::Controller::DiscoveredExtensions
65
64
  overall_errors = ""
66
65
 
67
66
  if hosts.count > 0
68
- Host.transaction do
69
- hosts.each do |discovered_host|
70
- begin
71
- unless discovered_host.reboot
72
- error = "#{discovered_host.name}: failed to reboot "
73
- overall_errors << error
74
- logger.error error
75
- end
76
- rescue Exception => e
77
- error = "#{discovered_host.name}: #{e.to_s} "
67
+ hosts.each do |discovered_host|
68
+ begin
69
+ unless discovered_host.reboot
70
+ error = "#{discovered_host.name}: failed to reboot "
78
71
  overall_errors << error
79
72
  logger.error error
80
73
  end
74
+ rescue Exception => e
75
+ error = "#{discovered_host.name}: #{e.to_s} "
76
+ overall_errors << error
77
+ logger.error error
81
78
  end
82
79
  end
83
80
  else
@@ -3,7 +3,6 @@ class DiscoveredHostsController < ::ApplicationController
3
3
  include Foreman::Controller::TaxonomyMultiple
4
4
  include Foreman::Controller::DiscoveredExtensions
5
5
  include ActionView::Helpers::NumberHelper
6
- unloadable
7
6
 
8
7
  before_filter :find_by_name, :only => %w[edit update destroy refresh_facts convert reboot auto_provision]
9
8
  before_filter :find_by_name_incl_subnet, :only => [:show]
@@ -23,6 +22,10 @@ class DiscoveredHostsController < ::ApplicationController
23
22
  :model,
24
23
  :discovery_attribute_set
25
24
  ], {:interfaces => :subnet}).paginate(:page => params[:page])
25
+ fact_array = @hosts.collect do |host|
26
+ [host.id, Hash[host.fact_values.joins(:fact_name).where('fact_names.name' => Setting::Discovered.discovery_fact_column_array).pluck(:name, :value)]]
27
+ end
28
+ @host_facts = Hash[fact_array]
26
29
  end
27
30
 
28
31
  def show
@@ -46,25 +49,21 @@ class DiscoveredHostsController < ::ApplicationController
46
49
  end
47
50
 
48
51
  def edit
49
- Host.transaction do
50
- @host = ::ForemanDiscovery::HostConverter.to_managed(@host, true, false) unless @host.nil?
51
- render :template => 'hosts/edit'
52
- end
52
+ @host = ::ForemanDiscovery::HostConverter.to_managed(@host, true, false) unless @host.nil?
53
+ render :template => 'hosts/edit'
53
54
  end
54
55
 
55
56
  def update
56
- Host.transaction do
57
- @host = ::ForemanDiscovery::HostConverter.to_managed(@host)
58
- forward_url_options
59
- Taxonomy.no_taxonomy_scope do
60
- if @host.update_attributes(params[:host])
61
- process_success :success_redirect => host_path(@host), :redirect_xhr => request.xhr?
62
- else
63
- taxonomy_scope
64
- load_vars_for_ajax
65
- offer_to_overwrite_conflicts
66
- process_error :object => @host, :render => 'hosts/edit'
67
- end
57
+ @host = ::ForemanDiscovery::HostConverter.to_managed(@host)
58
+ forward_url_options
59
+ Taxonomy.no_taxonomy_scope do
60
+ if @host.update_attributes(params[:host])
61
+ process_success :success_redirect => host_path(@host), :redirect_xhr => request.xhr?
62
+ else
63
+ taxonomy_scope
64
+ load_vars_for_ajax
65
+ offer_to_overwrite_conflicts
66
+ process_error :object => @host, :render => 'hosts/edit'
68
67
  end
69
68
  end
70
69
  end
@@ -75,6 +74,10 @@ class DiscoveredHostsController < ::ApplicationController
75
74
  else
76
75
  process_error :error_msg => _("Failed to refresh facts for %s") % @host.name, :redirect => :back
77
76
  end
77
+ rescue => e
78
+ exception = Foreman::WrappedException.new(e, N_("Failed to refresh facts for %{hostname} with error %{error_message}"), :hostname => @host.name, :error_message => e.message)
79
+ Foreman::Logging.exception exception.message, e
80
+ process_error :error_msg => exception.message, :redirect => :back
78
81
  end
79
82
 
80
83
  def reboot
@@ -87,9 +90,10 @@ class DiscoveredHostsController < ::ApplicationController
87
90
  else
88
91
  process_error :error_msg => _("Failed to reboot host %s") % @host.name, :redirect => :back
89
92
  end
90
- rescue => e
91
- process_error :error_msg => _("Failed to reboot host %{hostname} with error %{error_message}") % {:hostname => @host.name, :error_message => e.message},
92
- :redirect => :back
93
+ rescue => e
94
+ exception = Foreman::WrappedException.new(e, N_("Failed to reboot host %{hostname} with error %{error_message}"), :hostname => @host.name, :error_message => e.message)
95
+ Foreman::Logging.exception exception.message, e
96
+ process_error :error_msg => exception.message, :redirect => :back
93
97
  end
94
98
 
95
99
  def reboot_all
@@ -100,6 +104,10 @@ class DiscoveredHostsController < ::ApplicationController
100
104
  else
101
105
  process_success :success_msg => _("Discovered hosts are rebooting now"), :success_redirect => :back
102
106
  end
107
+ rescue => e
108
+ exception = Foreman::WrappedException.new(e, N_("Failed to reboot hosts with error %s"), e.message)
109
+ Foreman::Logging.exception exception.message, e
110
+ process_error :error_msg => exception.message, :redirect => :back
103
111
  end
104
112
 
105
113
  def multiple_destroy
@@ -107,7 +115,7 @@ class DiscoveredHostsController < ::ApplicationController
107
115
 
108
116
  def submit_multiple_destroy
109
117
  # keep all the ones that were not deleted for notification.
110
- @hosts.delete_if {|host| host.destroy}
118
+ @hosts.to_a.delete_if {|host| host.destroy}
111
119
 
112
120
  missed_hosts = @hosts.map(&:name).join('<br/>')
113
121
  if @hosts.empty?
@@ -134,18 +142,16 @@ class DiscoveredHostsController < ::ApplicationController
134
142
  end
135
143
 
136
144
  def auto_provision
137
- Host.transaction do
138
- if rule = find_discovery_rule(@host)
139
- if perform_auto_provision(@host, rule)
140
- process_success :success_msg => _("Host %{host} was provisioned with rule %{rule}") % {:host => @host.name, :rule => rule.name}, :success_redirect => discovered_hosts_path
141
- else
142
- errors = @host.errors.full_messages.join(' ')
143
- logger.warn "Failed to auto provision host %s: %s" % [@host.name, errors]
144
- process_error :error_msg => _("Failed to auto provision host %s: %s") % [@host.name, errors], :redirect => :back
145
- end
145
+ if rule = find_discovery_rule(@host)
146
+ if perform_auto_provision(@host, rule)
147
+ process_success :success_msg => _("Host %{host} was provisioned with rule %{rule}") % {:host => @host.name, :rule => rule.name}, :success_redirect => discovered_hosts_path
146
148
  else
147
- process_success :success_msg => _("No rule found for host %s") % @host.name, :success_redirect => :back
149
+ errors = @host.errors.full_messages.join(' ')
150
+ logger.warn "Failed to auto provision host %s: %s" % [@host.name, errors]
151
+ process_error :error_msg => _("Failed to auto provision host %s: %s") % [@host.name, errors], :redirect => :back
148
152
  end
153
+ else
154
+ process_success :success_msg => _("No rule found for host %s") % @host.name, :success_redirect => :back
149
155
  end
150
156
  end
151
157
 
@@ -158,23 +164,21 @@ class DiscoveredHostsController < ::ApplicationController
158
164
  result = false
159
165
  end
160
166
 
161
- Host.transaction do
162
- overall_errors = ""
163
- Host::Discovered.all.each do |discovered_host|
164
- if rule = find_discovery_rule(discovered_host)
165
- result &= perform_auto_provision(discovered_host, rule)
166
- unless discovered_host.errors.empty?
167
- errors = discovered_host.errors.full_messages.join(' ')
168
- logger.warn "Failed to auto provision host %s: %s" % [discovered_host.name, errors]
169
- overall_errors << "#{discovered_host.name}: #{errors} "
170
- end
167
+ overall_errors = ""
168
+ Host::Discovered.all.each do |discovered_host|
169
+ if rule = find_discovery_rule(discovered_host)
170
+ result &= perform_auto_provision(discovered_host, rule)
171
+ unless discovered_host.errors.empty?
172
+ errors = discovered_host.errors.full_messages.join(' ')
173
+ logger.warn "Failed to auto provision host %s: %s" % [discovered_host.name, errors]
174
+ overall_errors << "#{discovered_host.name}: #{errors} "
171
175
  end
172
176
  end
173
- if result
174
- process_success :success_msg => _("Discovered hosts are provisioning now"), :success_redirect => :back
175
- else
176
- process_error :error_msg => error_message % overall_errors, :redirect => :back
177
- end
177
+ end
178
+ if result
179
+ process_success :success_msg => _("Discovered hosts are provisioning now"), :success_redirect => :back
180
+ else
181
+ process_error :error_msg => error_message % overall_errors, :redirect => :back
178
182
  end
179
183
  end
180
184
 
@@ -0,0 +1,34 @@
1
+ module ForemanDiscovery
2
+ module SettingsHelperExtensions
3
+ extend ActiveSupport::Concern
4
+
5
+ included do
6
+ alias_method_chain :value, :discovery
7
+ end
8
+
9
+ def value_with_discovery(setting)
10
+ return value_without_discovery(setting) unless [
11
+ 'discovery_location',
12
+ 'discovery_organization'].include?(setting.name)
13
+
14
+ case setting.name
15
+ when "discovery_location"
16
+ edit_select(
17
+ setting,
18
+ :value,
19
+ :select_values => discovery_taxonomy_values(Location))
20
+ when "discovery_organization"
21
+ edit_select(
22
+ setting,
23
+ :value,
24
+ :select_values => discovery_taxonomy_values(Organization))
25
+ end
26
+ end
27
+
28
+ private
29
+
30
+ def discovery_taxonomy_values(taxonomy_class)
31
+ Hash[taxonomy_class.all.map{ |org| [org[:title], org[:title]] }].to_json
32
+ end
33
+ end
34
+ end
@@ -23,14 +23,13 @@ module DiscoveryRulesHelper
23
23
  end
24
24
 
25
25
  def permitted_discovery_actions(rule)
26
- actions = [display_delete_if_authorized(hash_for_discovery_rule_path(:id => rule).
27
- merge(:auth_object => rule, :authorizer => authorizer), :confirm => _("Delete %s?") % rule)]
26
+ actions = [display_link_if_authorized(_('Discovered Hosts'), hash_for_discovered_hosts_path.merge(:search => rule.search))]
27
+ actions << display_link_if_authorized(_('Associated Hosts'), hash_for_hosts_path.merge(:search => "discovery_rule = \"#{rule.name}\""))
28
28
  if rule.enabled?
29
- actions << display_link_if_authorized(_('Disable'), hash_for_disable_discovery_rule_path(:id => rule),
30
- {:confirm => _('Disable rule?')})
29
+ actions << display_link_if_authorized(_('Disable'), hash_for_disable_discovery_rule_path(:id => rule).merge(:auth_object => rule, :authorizer => authorizer), :confirm => _("Disable rule '%s'?") % rule)
31
30
  else
32
- actions << display_link_if_authorized(_('Enable'), hash_for_enable_discovery_rule_path(:id => rule),
33
- {:confirm => _('Enable rule?')})
31
+ actions << display_link_if_authorized(_('Enable'), hash_for_enable_discovery_rule_path(:id => rule).merge(:auth_object => rule, :authorizer => authorizer), :confirm => _("Enable rule '%s'?") % rule)
34
32
  end
33
+ actions << display_delete_if_authorized(hash_for_discovery_rule_path(:id => rule).merge(:auth_object => rule, :authorizer => authorizer), :confirm => _("Delete rule '%s'?") % rule)
35
34
  end
36
35
  end
@@ -0,0 +1,19 @@
1
+ class DiscoveredMailer < ::ApplicationMailer
2
+ helper :discovered_hosts
3
+ def discovered_summary(options = {})
4
+ raise ::Foreman::Exception.new(N_("Must specify a user with email enabled")) unless (user = User.find(options[:user])) && user.mail_enabled?
5
+ begin
6
+ Time.zone = user.timezone
7
+ rescue ArgumentError
8
+ Time.zone = 'UTC'
9
+ end
10
+
11
+ set_url
12
+ @time = options[:time] || 1.day.ago
13
+ @discovered_hosts = Host::Discovered.authorized_as(user, :view_discovered_hosts, Host::Discovered).where("created_at >= ?", @time)
14
+ set_locale_for(user) do
15
+ subject = _("Discovered hosts summary")
16
+ mail(:to => user.mail, :subject => subject)
17
+ end
18
+ end
19
+ end
@@ -13,14 +13,14 @@ class DiscoveryRule < ActiveRecord::Base
13
13
  validates :hostname, :format => { :with => /\A[a-zA-Z<]/, :message => N_("must start with a letter or ERB.") },
14
14
  :allow_blank => true
15
15
  validates :hostgroup_id, :presence => true
16
- validates :max_count, :numericality => { :only_integer => true, :greater_than_or_equal_to => 0 }
17
- validates :priority, :presence => true, :numericality => { :only_integer => true, :greater_than_or_equal_to => 0 }
16
+ validates :max_count, :numericality => { :only_integer => true, :greater_than_or_equal_to => 0, :less_than => 2**31 }
17
+ validates :priority, :presence => true, :numericality => { :only_integer => true, :greater_than_or_equal_to => 0, :less_than => 2**31 }
18
18
  validates_lengths_from_database
19
19
  before_validation :default_int_attributes
20
20
  before_validation :enforce_taxonomy
21
21
 
22
22
  belongs_to :hostgroup
23
- has_many :hosts
23
+ has_many :hosts, :dependent => :nullify
24
24
 
25
25
  scoped_search :on => :name, :complete_value => :true
26
26
  scoped_search :on => :priority