foreman_remote_execution 1.3.0 → 1.3.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (84) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +28 -2
  3. data/.rubocop_todo.yml +0 -7
  4. data/Gemfile +1 -1
  5. data/app/controllers/api/v2/foreign_input_sets_controller.rb +1 -2
  6. data/app/controllers/api/v2/job_invocations_controller.rb +2 -2
  7. data/app/controllers/api/v2/job_templates_controller.rb +2 -3
  8. data/app/controllers/api/v2/remote_execution_features_controller.rb +1 -2
  9. data/app/controllers/api/v2/template_inputs_controller.rb +1 -2
  10. data/app/controllers/concerns/foreman/controller/parameters/job_template.rb +3 -3
  11. data/app/controllers/concerns/foreman/controller/parameters/template_input.rb +2 -2
  12. data/app/controllers/job_invocations_controller.rb +4 -7
  13. data/app/controllers/job_templates_controller.rb +2 -2
  14. data/app/controllers/remote_execution_features_controller.rb +1 -2
  15. data/app/helpers/remote_execution_helper.rb +22 -17
  16. data/app/lib/actions/remote_execution/run_host_job.rb +4 -10
  17. data/app/models/concerns/foreman_remote_execution/host_extensions.rb +29 -1
  18. data/app/models/host_status/execution_status.rb +1 -1
  19. data/app/models/input_template_renderer.rb +1 -1
  20. data/app/models/job_invocation.rb +12 -7
  21. data/app/models/job_invocation_composer.rb +15 -6
  22. data/app/models/job_invocation_task_group.rb +1 -1
  23. data/app/models/job_template.rb +45 -29
  24. data/app/models/job_template_importer.rb +21 -9
  25. data/app/models/remote_execution_feature.rb +4 -4
  26. data/app/models/setting/remote_execution.rb +7 -5
  27. data/app/models/ssh_execution_provider.rb +1 -3
  28. data/app/models/targeting.rb +6 -5
  29. data/app/models/template_invocation.rb +43 -1
  30. data/app/views/job_invocations/_form.html.erb +1 -1
  31. data/app/views/job_invocations/_tab_overview.html.erb +10 -1
  32. data/config/routes.rb +2 -2
  33. data/db/migrate/20150903192731_add_execution_to_interface.rb +6 -6
  34. data/db/migrate/20151215114631_add_host_id_to_template_invocation.rb +3 -2
  35. data/db/migrate/20160114120200_rename_job_categories.rb +1 -1
  36. data/db/migrate/20160127134031_add_advanced_to_template_input.rb +1 -1
  37. data/db/seeds.d/70-job_templates.rb +1 -1
  38. data/db/seeds.d/90-bookmarks.rb +1 -1
  39. data/doc/Gemfile +1 -1
  40. data/lib/foreman_remote_execution/engine.rb +1 -1
  41. data/lib/foreman_remote_execution/version.rb +1 -1
  42. data/lib/tasks/foreman_remote_execution_tasks.rake +1 -1
  43. data/locale/action_names.rb +1 -1
  44. data/locale/de/LC_MESSAGES/foreman_remote_execution.mo +0 -0
  45. data/locale/de/foreman_remote_execution.po +39 -12
  46. data/locale/en/foreman_remote_execution.po +38 -11
  47. data/locale/en_GB/foreman_remote_execution.po +38 -11
  48. data/locale/es/LC_MESSAGES/foreman_remote_execution.mo +0 -0
  49. data/locale/es/foreman_remote_execution.po +39 -12
  50. data/locale/foreman_remote_execution.pot +175 -141
  51. data/locale/fr/LC_MESSAGES/foreman_remote_execution.mo +0 -0
  52. data/locale/fr/foreman_remote_execution.po +39 -12
  53. data/locale/ja/LC_MESSAGES/foreman_remote_execution.mo +0 -0
  54. data/locale/ja/foreman_remote_execution.po +39 -12
  55. data/locale/ko/LC_MESSAGES/foreman_remote_execution.mo +0 -0
  56. data/locale/ko/foreman_remote_execution.po +39 -12
  57. data/locale/pt_BR/LC_MESSAGES/foreman_remote_execution.mo +0 -0
  58. data/locale/pt_BR/foreman_remote_execution.po +39 -12
  59. data/locale/ru/LC_MESSAGES/foreman_remote_execution.mo +0 -0
  60. data/locale/ru/foreman_remote_execution.po +39 -12
  61. data/locale/zh_CN/LC_MESSAGES/foreman_remote_execution.mo +0 -0
  62. data/locale/zh_CN/foreman_remote_execution.po +39 -12
  63. data/locale/zh_TW/LC_MESSAGES/foreman_remote_execution.mo +0 -0
  64. data/locale/zh_TW/foreman_remote_execution.po +39 -12
  65. data/test/benchmark/run_hosts_job_benchmark.rb +2 -2
  66. data/test/benchmark/targeting_benchmark.rb +2 -2
  67. data/test/factories/foreman_remote_execution_factories.rb +27 -2
  68. data/test/functional/api/v2/job_templates_controller_test.rb +1 -1
  69. data/test/test_plugin_helper.rb +2 -19
  70. data/test/unit/concerns/host_extensions_test.rb +54 -5
  71. data/test/unit/concerns/nic_extensions_test.rb +1 -1
  72. data/test/unit/execution_task_status_mapper_test.rb +1 -2
  73. data/test/unit/input_template_renderer_test.rb +1 -1
  74. data/test/unit/job_invocation_composer_test.rb +21 -29
  75. data/test/unit/job_invocation_test.rb +1 -2
  76. data/test/unit/job_template_effective_user_test.rb +1 -1
  77. data/test/unit/job_template_importer_test.rb +38 -20
  78. data/test/unit/job_template_test.rb +8 -8
  79. data/test/unit/remote_execution_feature_test.rb +6 -6
  80. data/test/unit/remote_execution_provider_test.rb +2 -1
  81. data/test/unit/targeting_test.rb +6 -6
  82. data/test/unit/template_input_test.rb +1 -1
  83. data/test/unit/template_invocation_input_value_test.rb +3 -3
  84. metadata +3 -3
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: e008f8d140c9b90f475730f271f2eef1722d9ea3
4
- data.tar.gz: 0a60b9e6cf46ec5d233aec53f39c2c8b60ab77b7
3
+ metadata.gz: e4de9b6ef4385fb25d736b6e2a3c79ad3d6240e6
4
+ data.tar.gz: de38d2967d75a10fa0d759d1927eb5a637c9a73a
5
5
  SHA512:
6
- metadata.gz: ec1c4582b54752cffd9fe0c1f944dee4449787be282ca619511a934ee36d2a30b3d0af3bbb0ed050cfbbf19533bd1afd78b96776f6efa95e99fdef4bdbc6eef5
7
- data.tar.gz: cea15e552318c30f00417d3af6d57ebbd38d2fc2fb5dd54c7c8bee435b08933d203cc476b450f236537e2dc2464dcafeafd3abe9e4a8d5737cc556a656af5499
6
+ metadata.gz: 91604a14604487b8d821e4e81991402c281c0cc342105de1b124bc4c4be18809414f54b9da28c92774c5bb5663c190c7775ed1d76341f5b2ce36e41388d5f7e4
7
+ data.tar.gz: 67cfafed4dc9d8a204d478781c227937a657a0134630739bb4670744c3c505f26b1d97e9777e9b9ed7e046729faa9ef8ce4f7f1a5e1dba3224be110876babbdf
@@ -2,13 +2,18 @@ inherit_from:
2
2
  - .rubocop_todo.yml
3
3
 
4
4
  AllCops:
5
- RunRailsCops: true # always run the rails cops
6
5
  Exclude:
7
6
  - 'doc/plugins/**'
8
7
 
8
+ Rails:
9
+ Enabled: true
10
+
9
11
  Rails/Date:
10
12
  Enabled: false
11
13
 
14
+ Rails/HttpPositionalArguments:
15
+ Enabled: false
16
+
12
17
  # Don't enforce documentation
13
18
  Style/Documentation:
14
19
  Enabled: false
@@ -20,9 +25,12 @@ Rails/ActionFilter:
20
25
  Metrics/MethodLength:
21
26
  Max: 40
22
27
 
23
- Style/TrailingComma:
28
+ Style/TrailingCommaInLiteral:
24
29
  Enabled: false
25
30
 
31
+ #Style/TrailingCommaInArguments:
32
+ #Enabled: false
33
+
26
34
  Style/AccessorMethodName:
27
35
  Enabled: false
28
36
 
@@ -31,6 +39,8 @@ Style/RedundantSelf:
31
39
 
32
40
  Metrics/ClassLength:
33
41
  Max: 500
42
+ Exclude:
43
+ - 'test/**/*'
34
44
 
35
45
  Style/FileName:
36
46
  Exclude:
@@ -51,5 +61,21 @@ Style/ClassAndModuleChildren:
51
61
  Style/EachWithObject:
52
62
  Enabled: false
53
63
 
64
+ Style/GuardClause:
65
+ Enabled: false
66
+
67
+ Metrics/BlockLength:
68
+ Exclude:
69
+ - 'config/routes.rb'
70
+ - 'lib/foreman_remote_execution/engine.rb'
71
+ - 'test/**/*'
72
+
54
73
  Metrics/ParameterLists:
55
74
  Enabled: false
75
+
76
+ Style/VariableNumber:
77
+ Enabled: false
78
+
79
+ # a == 0 is not the same as a.zero?, when a is not a number
80
+ Style/NumericPredicate:
81
+ Enabled: false
@@ -39,13 +39,6 @@ Metrics/LineLength:
39
39
  Metrics/PerceivedComplexity:
40
40
  Max: 8
41
41
 
42
- # Offense count: 2
43
- # Configuration parameters: Include.
44
- Rails/DefaultScope:
45
- Exclude:
46
- - 'app/models/job_invocation.rb'
47
- - 'app/models/job_template.rb'
48
-
49
42
  # Offense count: 2
50
43
  # Configuration parameters: EnforcedStyle, SupportedStyles.
51
44
  Rails/TimeZone:
data/Gemfile CHANGED
@@ -1,3 +1,3 @@
1
1
  source 'http://rubygems.org'
2
2
 
3
- gemspec
3
+ gemspec :name => 'foreman_remote_execution'
@@ -18,8 +18,7 @@ module Api
18
18
  api :GET, '/templates/:template_id/foreign_input_sets/:id', N_('Show foreign input set details')
19
19
  param :template_id, :identifier, :required => true
20
20
  param :id, :identifier, :required => true
21
- def show
22
- end
21
+ def show; end
23
22
 
24
23
  def_param_group :foreign_input_set do
25
24
  param :foreign_input_set, Hash, :required => true, :action_aware => true do
@@ -20,9 +20,9 @@ module Api
20
20
 
21
21
  api :GET, '/job_invocations/:id', N_('Show job invocation')
22
22
  param :id, :identifier, :required => true
23
- def show
24
- end
23
+ def show; end
25
24
 
25
+ # rubocop:disable Metrics/BlockLength
26
26
  def_param_group :job_invocation do
27
27
  param :job_invocation, Hash, :required => true, :action_aware => true do
28
28
  param :job_template_id, String, :required => true, :desc => N_('The job template to use')
@@ -29,7 +29,7 @@ module Api
29
29
  def import
30
30
  options = params[:overwrite] ? { :update => true } : { :build_new => true }
31
31
 
32
- @job_template = JobTemplate.import(params[:template], options)
32
+ @job_template = JobTemplate.import_raw(params[:template], options)
33
33
  @job_template ||= JobTemplate.new
34
34
  process_response @job_template.save
35
35
  end
@@ -43,8 +43,7 @@ module Api
43
43
 
44
44
  api :GET, '/job_templates/:id', N_('Show job template details')
45
45
  param :id, :identifier, :required => true
46
- def show
47
- end
46
+ def show; end
48
47
 
49
48
  def_param_group :job_template do
50
49
  param :job_template, Hash, :required => true, :action_aware => true do
@@ -13,8 +13,7 @@ module Api
13
13
 
14
14
  api :GET, '/remote_execution_features/:id', N_('Show remote execution feature')
15
15
  param :id, :identifier, :required => true
16
- def show
17
- end
16
+ def show; end
18
17
 
19
18
  def_param_group :remote_execution_feature do
20
19
  param :remote_execution_feature, Hash, :required => true, :action_aware => true do
@@ -19,8 +19,7 @@ module Api
19
19
  api :GET, '/templates/:template_id/template_inputs/:id', N_('Show template input details')
20
20
  param :template_id, :identifier, :required => true
21
21
  param :id, :identifier, :required => true
22
- def show
23
- end
22
+ def show; end
24
23
 
25
24
  def_param_group :template_input do
26
25
  param :template_input, Hash, :required => true, :action_aware => true do
@@ -16,9 +16,9 @@ module Foreman::Controller::Parameters::JobTemplate
16
16
  def job_template_params_filter
17
17
  Foreman::ParameterFilter.new(::TemplateInput).tap do |filter|
18
18
  filter.permit :job_category, :provider_type, :description_format,
19
- :effective_user_attributes => [job_template_effective_user_filter],
20
- :template_inputs_attributes => [template_input_params_filter],
21
- :foreign_input_sets_attributes => [foreign_input_set_params_filter]
19
+ :effective_user_attributes => [job_template_effective_user_filter],
20
+ :template_inputs_attributes => [template_input_params_filter],
21
+ :foreign_input_sets_attributes => [foreign_input_set_params_filter]
22
22
  add_template_params_filter(filter)
23
23
  add_taxonomix_params_filter(filter)
24
24
  end
@@ -5,8 +5,8 @@ module Foreman::Controller::Parameters::TemplateInput
5
5
  def template_input_params_filter
6
6
  Foreman::ParameterFilter.new(::TemplateInput).tap do |filter|
7
7
  filter.permit_by_context :id, :_destroy, :name, :required, :input_type, :fact_name,
8
- :variable_name, :puppet_class_name, :puppet_parameter_name, :description, :template_id,
9
- :options, :advanced, :nested => true
8
+ :variable_name, :puppet_class_name, :puppet_parameter_name, :description, :template_id,
9
+ :options, :advanced, :nested => true
10
10
  end
11
11
  end
12
12
  end
@@ -11,7 +11,7 @@ class JobInvocationsController < ApplicationController
11
11
  }
12
12
  }
13
13
 
14
- if (template = JobTemplate.find_by_id(params[:template_id]))
14
+ if (template = JobTemplate.find_by(id: params[:template_id]))
15
15
  ui_params[:job_invocation] = {
16
16
  :job_category => template.job_category,
17
17
  :providers => {
@@ -25,12 +25,7 @@ class JobInvocationsController < ApplicationController
25
25
 
26
26
  def rerun
27
27
  job_invocation = resource_base.find(params[:id])
28
- @composer = JobInvocationComposer.from_job_invocation(job_invocation)
29
- if params[:failed_only]
30
- host_ids = job_invocation.failed_host_ids
31
- @composer.search_query = Targeting.build_query_from_hosts(host_ids)
32
- end
33
-
28
+ @composer = JobInvocationComposer.from_job_invocation(job_invocation, params)
34
29
  render :action => 'new'
35
30
  end
36
31
 
@@ -48,6 +43,8 @@ class JobInvocationsController < ApplicationController
48
43
  @job_invocation = resource_base.includes(:template_invocations => :run_host_job_task).find(params[:id])
49
44
  @auto_refresh = @job_invocation.task.try(:pending?)
50
45
  hosts_base = @job_invocation.targeting.hosts.authorized(:view_hosts, Host)
46
+ .joins(:template_invocations)
47
+ .merge(TemplateInvocation.where(:job_invocation_id => @job_invocation.id))
51
48
  @hosts = hosts_base.search_for(params[:search], :order => params[:order] || 'name ASC').paginate(:page => params[:page])
52
49
  end
53
50
 
@@ -29,12 +29,12 @@ class JobTemplatesController < ::TemplatesController
29
29
  def import
30
30
  contents = params.fetch(:imported_template, {}).fetch(:template, nil).try(:read)
31
31
 
32
- @template = JobTemplate.import(contents, :update => Foreman::Cast.to_bool(params[:imported_template][:overwrite]))
32
+ @template = JobTemplate.import_raw(contents, :update => Foreman::Cast.to_bool(params[:imported_template][:overwrite]))
33
33
  if @template && @template.save
34
34
  flash[:notice] = _('Job template imported successfully.')
35
35
  redirect_to job_templates_path(:search => "name = \"#{@template.name}\"")
36
36
  else
37
- @template ||= JobTemplate.import(contents, :build_new => true)
37
+ @template ||= JobTemplate.import_raw(contents, :build_new => true)
38
38
  @template.valid?
39
39
  flash[:warning] = _('Unable to save template. Correct highlighted errors')
40
40
  render :action => 'new'
@@ -6,8 +6,7 @@ class RemoteExecutionFeaturesController < ::ApplicationController
6
6
  @remote_execution_features = resource_base.all
7
7
  end
8
8
 
9
- def show
10
- end
9
+ def show; end
11
10
 
12
11
  def update
13
12
  if @remote_execution_feature.update_attributes(remote_execution_feature_params)
@@ -11,7 +11,7 @@ module RemoteExecutionHelper
11
11
  def job_invocation_chart(invocation)
12
12
  options = { :class => 'statistics-pie small', :expandable => true, :border => 0, :show_title => true }
13
13
 
14
- if (invocation.task)
14
+ if invocation.task
15
15
  # Request precise subtask counts only if the task is stopped
16
16
  report = invocation.progress_report
17
17
  flot_pie_chart('status', job_invocation_status(invocation, report[:progress]),
@@ -29,10 +29,14 @@ module RemoteExecutionHelper
29
29
  @job_hosts_authorizer ||= Authorizer.new(User.current, :collection => @hosts)
30
30
  end
31
31
 
32
- def job_invocation_status(invocation, percent = nil)
32
+ def job_invocation_status(invocation, percent = nil, verbose = true)
33
33
  case invocation.status
34
34
  when HostStatus::ExecutionStatus::QUEUED
35
- _('queued')
35
+ if verbose && invocation.task
36
+ _('queued to start executing in %{time}') % {:time => time_ago_in_words(invocation.task.start_at) }
37
+ else
38
+ _('queued')
39
+ end
36
40
  when HostStatus::ExecutionStatus::RUNNING
37
41
  percent ||= invocation.progress_report[:progress]
38
42
  _('running %{percent}%%') % {:percent => percent}
@@ -141,8 +145,9 @@ module RemoteExecutionHelper
141
145
  end
142
146
 
143
147
  def link_to_invocation_task_if_authorized(invocation)
148
+ status = job_invocation_status(invocation, nil, false)
144
149
  if invocation.queued?
145
- job_invocation_status(invocation)
150
+ status
146
151
  else
147
152
  task_authorizer = Authorizer.new(User.current, :collection => [invocation.task])
148
153
  link_to_if_authorized job_invocation_status(invocation),
@@ -166,7 +171,7 @@ module RemoteExecutionHelper
166
171
 
167
172
  def invocation_result(invocation, key)
168
173
  unknown = '&mdash;'
169
- result = invocation_count(invocation, :output_key => key, :unknown_string => unknown.html_safe)
174
+ result = invocation_count(invocation, :output_key => key, :unknown_string => unknown.html_safe) # rubocop:disable Rails/OutputSafety
170
175
  label = key == :failed_count ? 'danger' : 'info'
171
176
  result == unknown ? result : report_event_column(result, "label-#{label}")
172
177
  end
@@ -175,15 +180,13 @@ module RemoteExecutionHelper
175
180
  renderer = InputTemplateRenderer.new(template_invocation.template, target, template_invocation)
176
181
  if (preview = renderer.preview)
177
182
  content_tag :pre, preview
183
+ elsif target.nil?
184
+ alert :text => _('Could not render the preview because no host matches the search query.'),
185
+ :class => 'alert alert-block alert-warning base',
186
+ :close => false
178
187
  else
179
- if target.nil?
180
- alert :text => _('Could not render the preview because no host matches the search query.'),
181
- :class => 'alert alert-block alert-warning base',
182
- :close => false
183
- else
184
- alert :class => 'alert-block alert-danger base in fade has-error',
185
- :text => renderer.error_message.html_safe
186
- end
188
+ alert :class => 'alert-block alert-danger base in fade has-error',
189
+ :text => renderer.error_message.html_safe # rubocop:disable Rails/OutputSafety
187
190
  end
188
191
  end
189
192
 
@@ -215,9 +218,11 @@ module RemoteExecutionHelper
215
218
 
216
219
  def template_input_header(f, template)
217
220
  header = _('Template input')
218
- header += ' ' + remove_child_link('x', f, {:rel => 'twipsy', :'data-title' => _('remove template input'), :'data-placement' => 'left',
219
- :class => 'fr badge badge-danger'}) unless template.locked?
220
- header.html_safe
221
+ unless template.locked?
222
+ header += ' ' + remove_child_link('x', f, {:rel => 'twipsy', :'data-title' => _('remove template input'), :'data-placement' => 'left',
223
+ :class => 'fr badge badge-danger'})
224
+ end
225
+ header.html_safe # rubocop:disable Rails/OutputSafety
221
226
  end
222
227
 
223
228
  def description_checkbox_f(f, job_template, disabled)
@@ -245,7 +250,7 @@ module RemoteExecutionHelper
245
250
  _('This template is used to generate the description.<br/>' +
246
251
  'Input values can be used using the syntax %{package}.<br/>' +
247
252
  'You may also include the job category and template<br/>' +
248
- 'name using %{job_category} and %{template_name}.').html_safe
253
+ 'name using %{job_category} and %{template_name}.').html_safe # rubocop:disable Rails/OutputSafety
249
254
  end
250
255
 
251
256
  def advanced_switch_f(default_text, switch_text)
@@ -10,6 +10,7 @@ module Actions
10
10
  :link
11
11
  end
12
12
 
13
+ # rubocop:disable Metrics/AbcSize
13
14
  def plan(job_invocation, host, template_invocation, proxy_selector = ::RemoteExecutionProxySelector.new, options = {})
14
15
  action_subject(host, :job_category => job_invocation.job_category, :description => job_invocation.description)
15
16
 
@@ -57,9 +58,7 @@ module Actions
57
58
  end
58
59
 
59
60
  def check_exit_status
60
- if delegated_output[:exit_status].to_s != '0'
61
- error! _('Playbook execution failed')
62
- end
61
+ error! _('Job execution failed') if exit_status.to_s != '0'
63
62
  end
64
63
 
65
64
  def live_output
@@ -76,12 +75,6 @@ module Actions
76
75
  N_('Remote action:')
77
76
  end
78
77
 
79
- def finalize
80
- if exit_status.to_s != '0'
81
- error! _('Job execution failed')
82
- end
83
- end
84
-
85
78
  def rescue_strategy
86
79
  ::Dynflow::Action::Rescue::Fail
87
80
  end
@@ -120,7 +113,8 @@ module Actions
120
113
  super
121
114
  elsif phase?(Present)
122
115
  # for compatibility with old actions
123
- if old_action = all_planned_actions.first
116
+ old_action = all_planned_actions.first
117
+ if old_action
124
118
  old_action.output.fetch('proxy_output', {})
125
119
  else
126
120
  {}
@@ -2,6 +2,7 @@ module ForemanRemoteExecution
2
2
  module HostExtensions
3
3
  extend ActiveSupport::Concern
4
4
 
5
+ # rubocop:disable Metrics/BlockLength
5
6
  included do
6
7
  alias_method_chain :build_required_interfaces, :remote_execution
7
8
  alias_method_chain :reload, :remote_execution
@@ -11,10 +12,36 @@ module ForemanRemoteExecution
11
12
  has_many :targeting_hosts, :dependent => :destroy, :foreign_key => 'host_id'
12
13
  has_many :template_invocations, :dependent => :destroy, :foreign_key => 'host_id'
13
14
  has_one :execution_status_object, :class_name => 'HostStatus::ExecutionStatus', :foreign_key => 'host_id'
15
+ has_many :run_host_job_tasks, :through => :template_invocations
16
+
17
+ scoped_search :relation => :run_host_job_tasks, :on => :result, :rename => 'job_invocation.result',
18
+ :ext_method => :search_by_job_invocation,
19
+ :only_explicit => true,
20
+ :complete_value => TemplateInvocation::TaskResultMap::REVERSE_MAP
21
+
22
+ scoped_search :relation => :template_invocations, :on => :job_invocation_id,
23
+ :rename => 'job_invocation.id', :only_explicit => true, :ext_method => :search_by_job_invocation
14
24
 
15
25
  scoped_search :in => :execution_status_object, :on => :status, :rename => :execution_status,
16
26
  :complete_value => { :ok => HostStatus::ExecutionStatus::OK, :error => HostStatus::ExecutionStatus::ERROR }
27
+
28
+ def self.search_by_job_invocation(key, operator, value)
29
+ if key == 'job_invocation.result'
30
+ operator = operator == '=' ? 'IN' : 'NOT IN'
31
+ value = TemplateInvocation::TaskResultMap.status_to_task_result(value)
32
+ end
33
+
34
+ mapping = {
35
+ 'job_invocation.id' => %(#{TemplateInvocation.table_name}.job_invocation_id #{operator} ?),
36
+ 'job_invocation.result' => %(#{ForemanTasks::Task.table_name}.result #{operator} (?))
37
+ }
38
+ {
39
+ :conditions => sanitize_sql_for_conditions([mapping[key], value_to_sql(operator, value)]),
40
+ :joins => { :template_invocations => [:run_host_job_task] }
41
+ }
42
+ end
17
43
  end
44
+ # rubocop:enable Metrics/BlockLength
18
45
 
19
46
  def execution_status(options = {})
20
47
  @execution_status ||= get_status(HostStatus::ExecutionStatus).to_status(options)
@@ -39,6 +66,7 @@ module ForemanRemoteExecution
39
66
  get_interface_by_flag(:execution)
40
67
  end
41
68
 
69
+ # rubocop:disable Metrics/PerceivedComplexity
42
70
  def remote_execution_proxies(provider, authorized = true)
43
71
  proxies = {}
44
72
  proxies[:subnet] = execution_interface.subnet.remote_execution_proxies.with_features(provider) if execution_interface && execution_interface.subnet
@@ -48,7 +76,7 @@ module ForemanRemoteExecution
48
76
  proxy_scope = if Taxonomy.enabled_taxonomies.any? && User.current.present?
49
77
  ::SmartProxy.with_taxonomy_scope_override(location, organization)
50
78
  else
51
- proxy_scope = ::SmartProxy.unscoped
79
+ ::SmartProxy.unscoped
52
80
  end
53
81
 
54
82
  proxy_scope = proxy_scope.authorized if authorized
@@ -8,7 +8,7 @@ class HostStatus::ExecutionStatus < HostStatus::Status
8
8
  # execution is in progress, dynflow task was created
9
9
  RUNNING = 3
10
10
  # mapping to string representation
11
- STATUS_NAMES = { OK => 'succeeded', ERROR => 'failed', QUEUED => 'queued', RUNNING => 'running' }
11
+ STATUS_NAMES = { OK => 'succeeded', ERROR => 'failed', QUEUED => 'queued', RUNNING => 'running' }.freeze
12
12
 
13
13
  def relevant?(*args)
14
14
  execution_tasks.present?
@@ -42,7 +42,7 @@ class InputTemplateRenderer
42
42
 
43
43
  def input(name)
44
44
  return @input_values[name.to_s] if @input_values
45
- input = find_by_name(@template.template_inputs_with_foreign, name)
45
+ input = find_by_name(@template.template_inputs_with_foreign, name) # rubocop:disable Rails/DynamicFindBy
46
46
  if input
47
47
  @preview ? input.preview(self) : input.value(self)
48
48
  else