foreman_discovery 5.0.0 → 5.0.1

Sign up to get free protection for your applications and to get access to all the features.
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