foreman-tasks 1.0.1 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (56) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +12 -12
  3. data/.rubocop_todo.yml +34 -116
  4. data/app/controllers/foreman_tasks/api/recurring_logics_controller.rb +20 -1
  5. data/app/controllers/foreman_tasks/api/tasks_controller.rb +29 -9
  6. data/app/controllers/foreman_tasks/concerns/hosts_controller_extension.rb +1 -1
  7. data/app/controllers/foreman_tasks/recurring_logics_controller.rb +19 -0
  8. data/app/helpers/foreman_tasks/foreman_tasks_helper.rb +1 -3
  9. data/app/lib/actions/helpers/humanizer.rb +1 -3
  10. data/app/lib/actions/proxy_action.rb +33 -12
  11. data/app/models/foreman_tasks/concerns/action_triggering.rb +1 -1
  12. data/app/models/foreman_tasks/recurring_logic.rb +1 -0
  13. data/app/models/foreman_tasks/remote_task.rb +1 -0
  14. data/app/models/foreman_tasks/task.rb +4 -0
  15. data/app/models/foreman_tasks/task/dynflow_task.rb +1 -1
  16. data/app/models/foreman_tasks/task/search.rb +11 -1
  17. data/app/services/foreman_tasks/troubleshooting_help_generator.rb +0 -4
  18. data/app/views/foreman_tasks/api/recurring_logics/base.json.rabl +2 -1
  19. data/app/views/foreman_tasks/api/tasks/details.json.rabl +1 -0
  20. data/app/views/foreman_tasks/api/tasks/show.json.rabl +1 -1
  21. data/app/views/foreman_tasks/recurring_logics/index.html.erb +30 -0
  22. data/app/views/foreman_tasks/tasks/show.html.erb +3 -0
  23. data/config/routes.rb +7 -0
  24. data/foreman-tasks.gemspec +4 -6
  25. data/lib/foreman_tasks/dynflow/console_authorizer.rb +2 -2
  26. data/lib/foreman_tasks/engine.rb +15 -13
  27. data/lib/foreman_tasks/tasks/cleanup.rake +1 -1
  28. data/lib/foreman_tasks/tasks/export_tasks.rake +2 -2
  29. data/lib/foreman_tasks/test_extensions.rb +1 -1
  30. data/lib/foreman_tasks/version.rb +1 -1
  31. data/locale/action_names.rb +1 -1
  32. data/package.json +1 -2
  33. data/script/rails +2 -2
  34. data/test/factories/task_factory.rb +34 -2
  35. data/test/foreman_tasks_test_helper.rb +4 -0
  36. data/test/unit/actions/action_with_sub_plans_test.rb +1 -1
  37. data/test/unit/task_test.rb +160 -74
  38. data/webpack/ForemanTasks/Components/TaskDetails/Components/Task.js +4 -0
  39. data/webpack/ForemanTasks/Components/TaskDetails/Components/TaskInfo.js +3 -12
  40. data/webpack/ForemanTasks/Components/TaskDetails/Components/__tests__/Task.test.js +1 -0
  41. data/webpack/ForemanTasks/Components/TaskDetails/Components/__tests__/__snapshots__/Task.test.js.snap +3 -1
  42. data/webpack/ForemanTasks/Components/TaskDetails/Components/__tests__/__snapshots__/TaskInfo.test.js.snap +2 -6
  43. data/webpack/ForemanTasks/Components/TaskDetails/TaskDetailsSelectors.js +4 -1
  44. data/webpack/ForemanTasks/Components/TaskDetails/__tests__/__snapshots__/TaskDetails.test.js.snap +1 -0
  45. data/webpack/ForemanTasks/Components/TaskDetails/index.js +2 -0
  46. data/webpack/ForemanTasks/Components/TasksTable/SubTasksPage.js +3 -1
  47. data/webpack/ForemanTasks/Components/TasksTable/TasksTableActions.js +87 -21
  48. data/webpack/ForemanTasks/Components/TasksTable/TasksTableConstants.js +7 -7
  49. data/webpack/ForemanTasks/Components/TasksTable/TasksTablePage.js +31 -22
  50. data/webpack/ForemanTasks/Components/TasksTable/__tests__/TasksTable.fixtures.js +2 -1
  51. data/webpack/ForemanTasks/Components/TasksTable/__tests__/TasksTableActions.test.js +44 -46
  52. data/webpack/ForemanTasks/Components/TasksTable/__tests__/__snapshots__/SubTasksPage.test.js.snap +3 -1
  53. data/webpack/ForemanTasks/Components/TasksTable/__tests__/__snapshots__/TasksIndexPage.test.js.snap +2 -1
  54. data/webpack/ForemanTasks/Components/TasksTable/__tests__/__snapshots__/TasksTableActions.test.js.snap +61 -5
  55. data/webpack/ForemanTasks/Components/TasksTable/__tests__/__snapshots__/TasksTablePage.test.js.snap +6 -2
  56. metadata +10 -10
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 523767f29aa2c7e5485b4f18978a03120eb2369e510f5340ecb940d03372229e
4
- data.tar.gz: 8db1c0c802560d5d8f910f0b8ae30be95640a4ad99c19145529aab2c6ab67ba8
3
+ metadata.gz: 933e58fce5919b151351e1a148a2360faea964f688a79b5db85223dd62653f51
4
+ data.tar.gz: 53b98db8cf8f6dc19c489a78a4eb923389413464dcb9fa4ca732888a032063ee
5
5
  SHA512:
6
- metadata.gz: 284dc372bba144d11030df2ca96bfc01a716726e74e2d9797f88508984fe053d49d917f34b717b6e1806f2719df28e050750d274fe114ca0d6189b32ac5819bc
7
- data.tar.gz: 4f7cdfc025e74b30177d8a437b5e01a7eb9be1159ef68eb8ab4243301850547fc9d72bbabbb629223dbcab0e77a3416ccd5a4586bf39f6f2240a09cb26b63a11
6
+ metadata.gz: e3a7334ab5a5efb4dd3957ead30a520836311def55777ffba66b60c272b93137ab1fbdad7a9c32ab70c23a9b5308442a6a0c1a48da00dc4d4eb8868cd9c931e9
7
+ data.tar.gz: df1a0dc013edb5c5baebb3e97a275b8ac9075963546cbb318743c368db9d373fc3277739a690a346b79db72397f437be86c1159cfd78cf2ae407ab7ecde8ee75
@@ -1,8 +1,9 @@
1
- require: rubocop-rails
1
+ require:
2
+ - rubocop-minitest
3
+ - rubocop-performance
4
+ - rubocop-rails
2
5
 
3
- # TODO: remove this file by either moving cops here or fixing code
4
- inherit_from:
5
- - .rubocop_todo.yml
6
+ inherit_from: .rubocop_todo.yml
6
7
 
7
8
  AllCops:
8
9
  Include:
@@ -55,12 +56,11 @@ Rails/FilePath:
55
56
  Rails/ReversibleMigration:
56
57
  Enabled: false
57
58
 
58
- Metrics/BlockLength:
59
- Exclude:
60
- - config/routes.rb
61
- - lib/foreman_tasks/engine.rb
62
- - test/**/*
63
- - lib/foreman_tasks/tasks/**/*
59
+ Metrics:
60
+ Enabled: false
61
+
62
+ Layout/LineLength:
63
+ Enabled: false
64
64
 
65
65
  Naming/FileName:
66
66
  Exclude:
@@ -69,7 +69,7 @@ Naming/FileName:
69
69
  - db/seeds.d/*
70
70
  - lib/foreman-tasks.rb
71
71
 
72
- Layout/IndentHeredoc:
72
+ Layout/HeredocIndentation:
73
73
  Exclude:
74
74
  - '*.gemspec'
75
75
  - bin/*
@@ -101,7 +101,7 @@ Style/FormatStringToken:
101
101
  Style/RegexpLiteral:
102
102
  Enabled: false
103
103
 
104
- Layout/AlignHash:
104
+ Layout/HashAlignment:
105
105
  Enabled: false
106
106
 
107
107
  Metrics/ClassLength:
@@ -1,113 +1,49 @@
1
- # This configuration was generated by
2
- # `rubocop --auto-gen-config`
3
- # on 2018-04-02 18:15:37 +0200 using RuboCop version 0.54.0.
4
- # The point is for the user to remove these configuration records
5
- # one by one as the offenses are removed from the code base.
6
- # Note that changes in the inspected code, or installation of new
7
- # versions of RuboCop, may require this file to be generated again.
8
-
9
- # Offense count: 3
10
- # Cop supports --auto-correct.
11
- # Configuration parameters: Include, TreatCommentsAsGroupSeparators.
12
- # Include: **/*.gemspec
13
- Gemspec/OrderedDependencies:
14
- Exclude:
15
- - 'foreman-tasks.gemspec'
16
-
17
- # Offense count: 1
18
- # Cop supports --auto-correct.
19
- # Configuration parameters: EnforcedStyle.
20
- # SupportedStyles: final_newline, final_blank_line
21
- Layout/TrailingBlankLines:
22
- Exclude:
23
- - 'locale/action_names.rb'
24
-
25
1
  # Offense count: 1
26
2
  Lint/EmptyWhen:
27
3
  Exclude:
28
4
  - 'app/lib/actions/proxy_action.rb'
29
5
 
30
- # Offense count: 2
6
+ # Offense count: 1
31
7
  Lint/UselessAssignment:
32
8
  Exclude:
33
9
  - 'lib/foreman_tasks/tasks/export_tasks.rake'
34
10
 
35
- # Offense count: 32
36
- Metrics/AbcSize:
37
- Max: 41
38
-
39
- # Offense count: 2
40
- # Configuration parameters: CountComments, ExcludedMethods.
41
- Metrics/BlockLength:
42
- Max: 32
43
-
44
- # Offense count: 13
45
- # Configuration parameters: CountComments.
46
- Metrics/ClassLength:
47
- Max: 230
48
-
49
- # Offense count: 9
50
- Metrics/CyclomaticComplexity:
51
- Max: 9
52
-
53
- # Offense count: 482
54
- # Configuration parameters: AllowHeredoc, AllowURI, URISchemes, IgnoreCopDirectives, IgnoredPatterns.
55
- # URISchemes: http, https
56
- Metrics/LineLength:
57
- Max: 211
58
-
59
- # Offense count: 54
60
- # Configuration parameters: CountComments.
61
- Metrics/MethodLength:
62
- Max: 29
63
-
64
- # Offense count: 2
65
- # Configuration parameters: CountComments.
66
- Metrics/ModuleLength:
67
- Max: 167
11
+ Minitest/AssertEmpty:
12
+ Enabled: false
68
13
 
69
- # Offense count: 1
70
- # Configuration parameters: CountKeywordArgs.
71
- Metrics/ParameterLists:
72
- Max: 6
14
+ Minitest/AssertEqual:
15
+ Enabled: false
73
16
 
74
- # Offense count: 4
75
- Metrics/PerceivedComplexity:
76
- Max: 9
17
+ Minitest/GlobalExpectations:
18
+ Enabled: false
77
19
 
78
20
  # Offense count: 3
21
+ # Configuration parameters: EnforcedStyleForLeadingUnderscores.
22
+ # SupportedStylesForLeadingUnderscores: disallowed, required, optional
79
23
  Naming/MemoizedInstanceVariableName:
80
24
  Exclude:
81
25
  - 'app/controllers/foreman_tasks/recurring_logics_controller.rb'
82
26
  - 'app/lib/actions/recurring_action.rb'
83
27
  - 'lib/foreman_tasks_core/otp_manager.rb'
84
28
 
29
+ # Offense count: 11
30
+ # Configuration parameters: MinNameLength, AllowNamesEndingInNumbers, AllowedNames, ForbiddenNames.
31
+ # AllowedNames: io, id, to, by, on, in, at, ip, db, os, pp
32
+ Naming/MethodParameterName:
33
+ Exclude:
34
+ - 'app/helpers/foreman_tasks/foreman_tasks_helper.rb'
35
+
85
36
  # Offense count: 1
86
- # Configuration parameters: NamePrefix, NamePrefixBlacklist, NameWhitelist, MethodDefinitionMacros.
37
+ # Configuration parameters: NamePrefix, ForbiddenPrefixes, AllowedMethods, MethodDefinitionMacros.
87
38
  # NamePrefix: is_, has_, have_
88
- # NamePrefixBlacklist: is_, has_, have_
89
- # NameWhitelist: is_a?
39
+ # ForbiddenPrefixes: is_, has_, have_
40
+ # AllowedMethods: is_a?
90
41
  # MethodDefinitionMacros: define_method, define_singleton_method
91
42
  Naming/PredicateName:
92
43
  Exclude:
93
44
  - 'spec/**/*'
94
45
  - 'app/models/foreman_tasks/task/status_explicator.rb'
95
46
 
96
- # Offense count: 12
97
- # Configuration parameters: MinNameLength, AllowNamesEndingInNumbers, AllowedNames, ForbiddenNames.
98
- # AllowedNames: io, id, to
99
- Naming/UncommunicativeMethodParamName:
100
- Exclude:
101
- - 'app/helpers/foreman_tasks/foreman_tasks_helper.rb'
102
- - 'app/models/foreman_tasks/recurring_logic.rb'
103
-
104
- # Offense count: 3
105
- # Cop supports --auto-correct.
106
- Rails/ActiveRecordAliases:
107
- Exclude:
108
- - 'app/models/foreman_tasks/task/dynflow_task.rb'
109
- - 'test/factories/task_factory.rb'
110
-
111
47
  # Offense count: 6
112
48
  # Configuration parameters: Include.
113
49
  # Include: db/migrate/*.rb
@@ -119,14 +55,6 @@ Rails/CreateTableWithTimestamps:
119
55
  - 'db/migrate/20150907131503_create_task_groups.rb'
120
56
  - 'db/migrate/20151112152108_create_triggerings.rb'
121
57
 
122
- # Offense count: 1
123
- # Cop supports --auto-correct.
124
- # Configuration parameters: EnforcedStyle.
125
- # SupportedStyles: numeric, symbolic
126
- Rails/HttpStatus:
127
- Exclude:
128
- - 'app/controllers/foreman_tasks/concerns/hosts_controller_extension.rb'
129
-
130
58
  # Offense count: 1
131
59
  # Configuration parameters: Include.
132
60
  # Include: app/**/*.rb, config/**/*.rb, db/**/*.rb, lib/**/*.rb
@@ -139,7 +67,14 @@ Rails/OutputSafety:
139
67
  Exclude:
140
68
  - 'app/helpers/foreman_tasks/foreman_tasks_helper.rb'
141
69
 
142
- # Offense count: 11
70
+ # Offense count: 1
71
+ # Configuration parameters: Include.
72
+ # Include: **/Rakefile, **/*.rake
73
+ Rails/RakeEnvironment:
74
+ Exclude:
75
+ - 'lib/foreman_tasks/tasks/test.rake'
76
+
77
+ # Offense count: 12
143
78
  # Cop supports --auto-correct.
144
79
  # Configuration parameters: AutoCorrect, EnforcedStyle.
145
80
  # SupportedStyles: nested, compact
@@ -163,33 +98,16 @@ Style/DoubleNegation:
163
98
  - 'app/models/foreman_tasks/lock.rb'
164
99
  - 'app/models/foreman_tasks/recurring_logic.rb'
165
100
 
166
- # Offense count: 2
167
- # Cop supports --auto-correct.
168
- Style/Encoding:
169
- Exclude:
170
- - 'foreman-tasks-core.gemspec'
171
- - 'foreman-tasks.gemspec'
172
-
173
- # Offense count: 6
174
- # Cop supports --auto-correct.
175
- Style/ExpandPathArguments:
176
- Exclude:
177
- - 'foreman-tasks-core.gemspec'
178
- - 'foreman-tasks.gemspec'
179
- - 'lib/foreman_tasks/engine.rb'
180
- - 'script/rails'
181
-
182
- # Offense count: 32
101
+ # Offense count: 36
183
102
  # Configuration parameters: MinBodyLength.
184
103
  Style/GuardClause:
185
104
  Enabled: false
186
105
 
187
- # Offense count: 1
188
- # Cop supports --auto-correct.
189
- # Configuration parameters: AllowMultipleReturnValues.
190
- Style/RedundantReturn:
191
- Exclude:
192
- - 'app/models/foreman_tasks/concerns/action_triggering.rb'
106
+ Style/HashEachMethods:
107
+ Enabled: false
108
+
109
+ Style/HashTransformKeys:
110
+ Enabled: false
193
111
 
194
- Lint/SendWithMixinArgument:
112
+ Style/HashTransformValues:
195
113
  Enabled: false
@@ -10,6 +10,12 @@ module ForemanTasks
10
10
  api_base_url '/foreman_tasks/api'
11
11
  end
12
12
 
13
+ # Foreman right now doesn't have mechanism to
14
+ # cause general BadRequest handling, resuing the Apipie::ParamError
15
+ # for now http://projects.theforeman.org/issues/3957
16
+ class BadRequest < Apipie::ParamError
17
+ end
18
+
13
19
  before_action :find_resource, :only => %w[show cancel update]
14
20
 
15
21
  api :GET, '/recurring_logics', N_('List recurring logics')
@@ -39,9 +45,22 @@ module ForemanTasks
39
45
  ForemanTasks::RecurringLogic
40
46
  end
41
47
 
48
+ api :POST, '/recurring_logics/bulk_destroy', N_('Delete recurring logics by search query')
49
+ param :search, String, :desc => N_('Search query'), :required => true
50
+ def bulk_destroy
51
+ if params[:search].blank?
52
+ raise BadRequest, _('Please provide a search parameter in the request')
53
+ end
54
+ scope = resource_scope.search_for(params[:search])
55
+ scope.each(&:destroy!)
56
+ render json: { destroyed: scope }
57
+ rescue ActiveRecord::RecordNotDestroyed => error
58
+ render json: { error: error, scope: scope }, status: :bad_request
59
+ end
60
+
42
61
  def action_permission
43
62
  case params[:action]
44
- when 'cancel'
63
+ when 'cancel', 'bulk_destroy'
45
64
  'edit'
46
65
  else
47
66
  super
@@ -89,19 +89,13 @@ module ForemanTasks
89
89
  param :search, String, :desc => N_('Resume tasks matching search string')
90
90
  param :task_ids, Array, :desc => N_('Resume specific tasks by ID')
91
91
  def bulk_resume
92
- scope = resource_scope
93
- scope = scope.search_for(params[:search]) if params[:search]
94
- scope = scope.select('DISTINCT foreman_tasks_tasks.*')
95
92
  if params[:search].nil? && params[:task_ids].nil?
96
- scope = scope.where(:state => :paused)
97
- scope = scope.where(:result => :error)
93
+ raise BadRequest, _('Please provide at least one of search or task_ids parameters in the request')
98
94
  end
99
- scope = scope.where(:id => params[:task_ids]) if params[:task_ids]
100
-
101
95
  resumed = []
102
96
  failed = []
103
97
  skipped = []
104
- scope.each do |task|
98
+ bulk_scope.each do |task|
105
99
  if task.resumable?
106
100
  begin
107
101
  ForemanTasks.dynflow.world.execute(task.execution_plan.id)
@@ -122,6 +116,24 @@ module ForemanTasks
122
116
  }
123
117
  end
124
118
 
119
+ api :POST, '/tasks/bulk_cancel', N_('Cancel all cancellable tasks')
120
+ param :search, String, :desc => N_('Cancel tasks matching search string')
121
+ param :task_ids, Array, :desc => N_('Cancel specific tasks by ID')
122
+ def bulk_cancel
123
+ if params[:search].nil? && params[:task_ids].nil?
124
+ raise BadRequest, _('Please provide at least one of search or task_ids parameters in the request')
125
+ end
126
+
127
+ cancelled, skipped = bulk_scope.partition(&:cancellable?)
128
+
129
+ cancelled.each(&:cancel)
130
+ render :json => {
131
+ total: cancelled.length + skipped.length,
132
+ cancelled: cancelled,
133
+ skipped: skipped
134
+ }
135
+ end
136
+
125
137
  api :GET, '/tasks', N_('List tasks')
126
138
  param :search, String, :desc => N_('Search string')
127
139
  param :page, :number, :desc => N_('Page number, starting at 1')
@@ -272,7 +284,7 @@ module ForemanTasks
272
284
  case params[:action]
273
285
  when 'bulk_search', 'summary', 'details', 'sub_tasks'
274
286
  :view
275
- when 'bulk_resume'
287
+ when 'bulk_resume', 'bulk_cancel'
276
288
  :edit
277
289
  else
278
290
  super
@@ -311,6 +323,14 @@ module ForemanTasks
311
323
  results: results
312
324
  }
313
325
  end
326
+
327
+ def bulk_scope
328
+ scope = resource_scope
329
+ scope = scope.search_for(params[:search]) if params[:search]
330
+ scope = scope.select('DISTINCT foreman_tasks_tasks.*')
331
+ scope = scope.where(:id => params[:task_ids]) if params[:task_ids]
332
+ scope
333
+ end
314
334
  end
315
335
  end
316
336
  end
@@ -9,7 +9,7 @@ module ForemanTasks
9
9
  params[:certname],
10
10
  detected_proxy.try(:id))
11
11
 
12
- render :json => { :task_id => task.id }, :status => 202
12
+ render :json => { :task_id => task.id }, :status => :accepted
13
13
  rescue ::Foreman::Exception => e
14
14
  render :json => { 'message' => e.to_s }, :status => :unprocessable_entity
15
15
  end
@@ -22,6 +22,12 @@ module ForemanTasks
22
22
  redirect_to :action => :index
23
23
  end
24
24
 
25
+ def clear_cancelled
26
+ scope = resource_base.search_for('state=cancelled')
27
+ scope.destroy_all
28
+ redirect_to :action => :index
29
+ end
30
+
25
31
  def controller_name
26
32
  'foreman_tasks_recurring_logics'
27
33
  end
@@ -49,5 +55,18 @@ module ForemanTasks
49
55
  scope.search_for(params[:search])
50
56
  .paginate(:page => params[:page], :per_page => params[:per_page])
51
57
  end
58
+
59
+ def action_permission
60
+ case params[:action]
61
+ when 'clear_cancelled'
62
+ 'edit'
63
+ else
64
+ super
65
+ end
66
+ end
67
+
68
+ def controller_permission
69
+ 'recurring_logics'
70
+ end
52
71
  end
53
72
  end
@@ -1,5 +1,4 @@
1
1
  module ForemanTasks
2
- # rubocop:disable Metrics/ModuleLength
3
2
  module ForemanTasksHelper
4
3
  def recurring_logic_state(recurring_logic)
5
4
  icon, status = case recurring_logic.state
@@ -28,7 +27,7 @@ module ForemanTasks
28
27
  def troubleshooting_info_text
29
28
  return if @task.state != 'paused' || @task.main_action.nil?
30
29
  helper = TroubleshootingHelpGenerator.new(@task.main_action)
31
- helper.generate_text
30
+ helper.generate_html
32
31
  end
33
32
 
34
33
  def username_link_task(owner, username)
@@ -209,5 +208,4 @@ module ForemanTasks
209
208
  tags.join.html_safe
210
209
  end
211
210
  end
212
- # rubocop:enable Metrics/ModuleLength
213
211
  end
@@ -78,9 +78,7 @@ module Actions
78
78
  else
79
79
  head, *tail = subkeys
80
80
  if data.is_a?(Hash) && data.key?(head)
81
- return fetch_data(data[head], *tail)
82
- else
83
- return nil
81
+ fetch_data(data[head], *tail)
84
82
  end
85
83
  end
86
84
  end
@@ -41,12 +41,7 @@ module Actions
41
41
  with_connection_error_handling(event) do |event|
42
42
  case event
43
43
  when nil
44
- if remote_task
45
- on_resume
46
- else
47
- trigger_proxy_task
48
- end
49
- suspend
44
+ start_or_resume
50
45
  when ::Dynflow::Action::Skip
51
46
  # do nothing
52
47
  when ::Dynflow::Action::Cancellable::Cancel
@@ -77,6 +72,12 @@ module Actions
77
72
  end
78
73
  end
79
74
 
75
+ def trigger_remote_task
76
+ suspend do |_suspended_action|
77
+ ForemanTasks::RemoteTask.batch_trigger(remote_task.operation, [remote_task])
78
+ end
79
+ end
80
+
80
81
  def proxy_input(task_id = task.id)
81
82
  input.merge(:callback => { :task_id => task_id,
82
83
  :step_id => run_step_id })
@@ -88,7 +89,7 @@ module Actions
88
89
  if response['result'] == 'error'
89
90
  raise ::Foreman::Exception, _('The smart proxy task %s failed.') % proxy_task_id
90
91
  else
91
- on_data(response['actions'].find { |block_action| block_action['class'] == proxy_action_name }['output'])
92
+ on_data(get_proxy_data(response))
92
93
  end
93
94
  else
94
95
  suspend
@@ -154,10 +155,8 @@ module Actions
154
155
  if output.key?(:proxy_output) || state == :error
155
156
  output.fetch(:proxy_output, {})
156
157
  elsif live && proxy_task_id
157
- proxy_data = proxy.status_of_task(proxy_task_id)['actions'].detect do |action|
158
- action['class'] == proxy_action_name || action.fetch('input', {})['proxy_operation_name'] == proxy_operation_name
159
- end
160
- proxy_data.fetch('output', {})
158
+ response = proxy.status_of_task(proxy_task_id)
159
+ get_proxy_data(response)
161
160
  else
162
161
  {}
163
162
  end
@@ -205,6 +204,26 @@ module Actions
205
204
 
206
205
  private
207
206
 
207
+ def start_or_resume
208
+ if remote_task
209
+ if remote_task.state == 'external'
210
+ trigger_remote_task
211
+ else
212
+ on_resume
213
+ end
214
+ else
215
+ trigger_proxy_task
216
+ end
217
+ suspend
218
+ end
219
+
220
+ def get_proxy_data(response)
221
+ proxy_data = response['actions'].detect do |action|
222
+ action['class'] == proxy_action_name || action.fetch('input', {})['proxy_operation_name'] == proxy_operation_name
223
+ end
224
+ proxy_data.fetch('output', {})
225
+ end
226
+
208
227
  def proxy_version(proxy)
209
228
  match = proxy.statuses[:version].version['version'].match(/(\d+)\.(\d+)\.(\d+)/)
210
229
  { :major => match[1].to_i, :minor => match[2].to_i, :patch => match[3].to_i }
@@ -247,10 +266,12 @@ module Actions
247
266
  end
248
267
 
249
268
  def prepare_remote_task
269
+ state = input[:use_concurrency_control] ? 'external' : 'new'
250
270
  ::ForemanTasks::RemoteTask.new(:execution_plan_id => execution_plan_id,
251
271
  :proxy_url => input[:proxy_url],
252
272
  :step_id => run_step_id,
253
- :operation => proxy_operation_name)
273
+ :operation => proxy_operation_name,
274
+ :state => state)
254
275
  end
255
276
 
256
277
  def proxy_task_id