foreman_remote_execution 14.0.2 → 14.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (78) hide show
  1. checksums.yaml +4 -4
  2. data/app/controllers/api/v2/job_invocations_controller.rb +34 -17
  3. data/app/helpers/remote_execution_helper.rb +2 -2
  4. data/app/lib/actions/remote_execution/proxy_action.rb +10 -5
  5. data/app/lib/actions/remote_execution/run_host_job.rb +1 -1
  6. data/app/lib/actions/remote_execution/template_invocation_progress_logging.rb +2 -3
  7. data/app/views/api/v2/job_invocations/hosts.json.rabl +15 -0
  8. data/config/routes.rb +1 -0
  9. data/db/migrate/20240312133027_extend_template_invocation_events.rb +19 -0
  10. data/lib/foreman_remote_execution/version.rb +1 -1
  11. data/webpack/JobInvocationDetail/JobInvocationActions.js +1 -1
  12. data/webpack/JobInvocationDetail/JobInvocationConstants.js +84 -0
  13. data/webpack/JobInvocationDetail/JobInvocationDetail.scss +0 -1
  14. data/webpack/JobInvocationDetail/JobInvocationHostTable.js +210 -0
  15. data/webpack/JobInvocationDetail/JobInvocationSelectors.js +2 -2
  16. data/webpack/JobInvocationDetail/__tests__/MainInformation.test.js +5 -1
  17. data/webpack/JobInvocationDetail/__tests__/fixtures.js +9 -0
  18. data/webpack/JobInvocationDetail/index.js +56 -34
  19. data/webpack/__mocks__/foremanReact/components/HostDetails/DetailsCard/DefaultLoaderEmptyState.js +1 -2
  20. data/webpack/react_app/components/RecentJobsCard/JobStatusIcon.js +38 -7
  21. data/webpack/react_app/components/RecentJobsCard/constants.js +4 -0
  22. data/webpack/react_app/components/TargetingHosts/__tests__/__snapshots__/HostStatus.test.js.snap +1 -1
  23. data/webpack/react_app/components/TargetingHosts/components/HostStatus.js +6 -6
  24. metadata +6 -94
  25. data/.babelrc.js +0 -3
  26. data/.eslintignore +0 -3
  27. data/.eslintrc +0 -13
  28. data/.github/workflows/js_ci.yml +0 -32
  29. data/.github/workflows/release.yml +0 -16
  30. data/.github/workflows/ruby_ci.yml +0 -19
  31. data/.gitignore +0 -19
  32. data/.packit.yaml +0 -45
  33. data/.prettierrc +0 -4
  34. data/.rubocop.yml +0 -105
  35. data/.rubocop_todo.yml +0 -516
  36. data/.tx/config +0 -10
  37. data/Gemfile +0 -5
  38. data/app/mailers/.gitkeep +0 -0
  39. data/app/views/dashboard/.gitkeep +0 -0
  40. data/foreman_remote_execution.gemspec +0 -33
  41. data/jsconfig.json +0 -8
  42. data/test/benchmark/run_hosts_job_benchmark.rb +0 -70
  43. data/test/benchmark/targeting_benchmark.rb +0 -31
  44. data/test/factories/foreman_remote_execution_factories.rb +0 -147
  45. data/test/functional/api/v2/foreign_input_sets_controller_test.rb +0 -58
  46. data/test/functional/api/v2/job_invocations_controller_test.rb +0 -446
  47. data/test/functional/api/v2/job_templates_controller_test.rb +0 -110
  48. data/test/functional/api/v2/registration_controller_test.rb +0 -73
  49. data/test/functional/api/v2/remote_execution_features_controller_test.rb +0 -34
  50. data/test/functional/api/v2/template_invocations_controller_test.rb +0 -33
  51. data/test/functional/cockpit_controller_test.rb +0 -16
  52. data/test/functional/job_invocations_controller_test.rb +0 -132
  53. data/test/functional/job_templates_controller_test.rb +0 -31
  54. data/test/functional/ui_job_wizard_controller_test.rb +0 -16
  55. data/test/graphql/mutations/job_invocations/create_test.rb +0 -58
  56. data/test/graphql/queries/job_invocation_query_test.rb +0 -31
  57. data/test/graphql/queries/job_invocations_query_test.rb +0 -35
  58. data/test/helpers/remote_execution_helper_test.rb +0 -46
  59. data/test/support/remote_execution_helper.rb +0 -5
  60. data/test/test_plugin_helper.rb +0 -9
  61. data/test/unit/actions/run_host_job_test.rb +0 -115
  62. data/test/unit/actions/run_hosts_job_test.rb +0 -214
  63. data/test/unit/api_params_test.rb +0 -25
  64. data/test/unit/concerns/foreman_tasks_cleaner_extensions_test.rb +0 -29
  65. data/test/unit/concerns/host_extensions_test.rb +0 -219
  66. data/test/unit/concerns/nic_extensions_test.rb +0 -9
  67. data/test/unit/execution_task_status_mapper_test.rb +0 -92
  68. data/test/unit/input_template_renderer_test.rb +0 -503
  69. data/test/unit/job_invocation_composer_test.rb +0 -974
  70. data/test/unit/job_invocation_report_template_test.rb +0 -60
  71. data/test/unit/job_invocation_test.rb +0 -232
  72. data/test/unit/job_template_effective_user_test.rb +0 -37
  73. data/test/unit/job_template_test.rb +0 -316
  74. data/test/unit/remote_execution_feature_test.rb +0 -86
  75. data/test/unit/remote_execution_provider_test.rb +0 -298
  76. data/test/unit/renderer_scope_input_test.rb +0 -49
  77. data/test/unit/targeting_test.rb +0 -206
  78. data/test/unit/template_invocation_input_value_test.rb +0 -38
@@ -1,446 +0,0 @@
1
- require 'test_plugin_helper'
2
-
3
- module Api
4
- module V2
5
- class JobInvocationsControllerTest < ActionController::TestCase
6
- setup do
7
- @invocation = FactoryBot.create(:job_invocation, :with_template, :with_task, :with_unplanned_host)
8
- @template = FactoryBot.create(:job_template, :with_input)
9
-
10
- # Without this the template in template_invocations and in pattern_template_invocations
11
- # would belong to different job_categories, causing trouble when trying to rerun
12
- @invocation.job_category = @invocation.pattern_template_invocations.first.template.job_category
13
- @invocation.save!
14
- end
15
-
16
- test 'should get index' do
17
- get :index
18
- invocations = ActiveSupport::JSON.decode(@response.body)
19
- assert_not_empty invocations, 'Should response with invocation'
20
- assert_response :success
21
- end
22
-
23
- describe 'show' do
24
- test 'should get invocation detail' do
25
- get :show, params: { :id => @invocation.id }
26
- assert_response :success
27
- template = ActiveSupport::JSON.decode(@response.body)
28
- assert_not_empty template
29
- assert_equal template['job_category'], @invocation.job_category
30
- assert_not_empty template['targeting']['hosts']
31
- end
32
-
33
- test 'should get invocation detail when taxonomies are set' do
34
- taxonomy_params = %w(organization location).reduce({}) { |acc, cur| acc.merge("#{cur}_id" => FactoryBot.create(cur)) }
35
- get :show, params: taxonomy_params.merge(:id => @invocation.id)
36
- assert_response :success
37
- end
38
-
39
- test 'should see only permitted hosts' do
40
- @user = FactoryBot.create(:user, admin: false)
41
- @invocation.task.update(user: @user)
42
- setup_user('view', 'job_invocations', nil, @user)
43
- setup_user('view', 'hosts', 'name ~ nope.example.com', @user)
44
-
45
- get :show, params: { :id => @invocation.id }, session: prepare_user(@user)
46
- assert_response :success
47
- response = ActiveSupport::JSON.decode(@response.body)
48
- assert_equal response['targeting']['hosts'], []
49
- end
50
- end
51
-
52
- context 'creation' do
53
- setup do
54
- @attrs = { :job_category => @template.job_category,
55
- :name => 'RandomName',
56
- :job_template_id => @template.id,
57
- :targeting_type => 'static_query',
58
- :search_query => 'foobar' }
59
- end
60
-
61
- test 'should create valid with job_template_id' do
62
- post :create, params: { job_invocation: @attrs }
63
-
64
- invocation = ActiveSupport::JSON.decode(@response.body)
65
- assert_equal @attrs[:job_category], invocation['job_category']
66
- assert_response :success
67
- end
68
-
69
- test 'should create with description format overridden' do
70
- @attrs[:description_format] = 'format'
71
- post :create, params: { job_invocation: @attrs }
72
-
73
- invocation = ActiveSupport::JSON.decode(@response.body)
74
- assert_equal @attrs[:description_format], invocation['description']
75
- end
76
-
77
- test 'should create with recurrence' do
78
- @attrs[:recurrence] = { cron_line: '5 * * * *' }
79
- post :create, params: { job_invocation: @attrs }
80
- invocation = ActiveSupport::JSON.decode(@response.body)
81
- assert_equal invocation['mode'], 'recurring'
82
- assert_response :success
83
- end
84
-
85
- test 'should propagate errors from triggering' do
86
- @attrs[:recurrence] = { cron_line: 'foo' }
87
- post :create, params: { job_invocation: @attrs }
88
- invocation = ActiveSupport::JSON.decode(@response.body)
89
- assert_match(/foo is not valid format of cron line/, invocation['error']['message'])
90
- assert_response 500
91
- end
92
-
93
- test 'should create with schedule' do
94
- @attrs[:scheduling] = { start_at: Time.now.to_s }
95
- post :create, params: { job_invocation: @attrs }
96
- invocation = ActiveSupport::JSON.decode(@response.body)
97
- assert_equal invocation['mode'], 'future'
98
- assert_response :success
99
- end
100
-
101
- test 'should create with a scheduled recurrence' do
102
- @attrs[:scheduling] = { start_at: (Time.now + 1.hour) }
103
- @attrs[:recurrence] = { cron_line: '5 * * * *' }
104
- post :create, params: { job_invocation: @attrs }
105
- invocation = ActiveSupport::JSON.decode(@response.body)
106
- assert_equal 'recurring', invocation['mode']
107
- assert invocation['start_at']
108
- assert_response :success
109
- end
110
-
111
- context 'with_feature' do
112
- setup do
113
- @feature = FactoryBot.create(:remote_execution_feature,
114
- :job_template => @template)
115
- @attrs = {
116
- feature: @feature.label,
117
- }
118
- end
119
-
120
- test 'host ids as array of FQDNs' do
121
- host = FactoryBot.create(:host)
122
- @attrs[:host_ids] = [host.fqdn]
123
- post :create, params: { job_invocation: @attrs }
124
- assert_response :success
125
- end
126
-
127
- test 'host ids as array of IDs' do
128
- host = FactoryBot.create(:host)
129
- host2 = FactoryBot.create(:host)
130
- @attrs[:host_ids] = [host.id, host2.id]
131
- post :create, params: { job_invocation: @attrs }
132
- assert_response :success
133
- end
134
-
135
- test 'host ids as search_query' do
136
- @attrs[:host_ids] = 'name = testfqdn'
137
- post :create, params: { job_invocation: @attrs }
138
- assert_response :success
139
- end
140
-
141
- test 'with search_query param' do
142
- @attrs[:targeting_type] = 'static_query'
143
- @attrs[:search_query] = 'name = testfqdn'
144
- post :create, params: { job_invocation: @attrs }
145
- assert_response :success
146
- end
147
-
148
- test 'with job_template_id param' do
149
- @attrs[:job_template_id] = 12_345
150
- post :create, params: { job_invocation: @attrs }
151
- assert_response :error
152
- end
153
- end
154
- end
155
-
156
- describe '#output' do
157
- let(:host) { @invocation.targeting.hosts.first }
158
-
159
- test 'should provide output for delayed task' do
160
- ForemanTasks::Task.any_instance.expects(:scheduled?).returns(true)
161
- get :output, params: { :job_invocation_id => @invocation.id, :host_id => host.id }
162
- result = ActiveSupport::JSON.decode(@response.body)
163
- assert_equal result['delayed'], true
164
- assert_equal result['refresh'], true
165
- assert_equal result['output'], []
166
- assert_response :success
167
- end
168
-
169
- test 'should provide empty output for host which does not have a task yet' do
170
- JobInvocation.any_instance.expects(:sub_task_for_host).returns(nil)
171
- JobInvocation.any_instance.expects(:finished?).returns(false)
172
- get :output, params: { :job_invocation_id => @invocation.id, :host_id => host.id }
173
- result = ActiveSupport::JSON.decode(@response.body)
174
- assert_equal result['refresh'], true
175
- assert_equal result['output'], []
176
- assert_response :success
177
- end
178
-
179
- test 'should provide empty output marked as done for host which does not have a task when the job is finished' do
180
- JobInvocation.any_instance.expects(:sub_task_for_host).returns(nil)
181
- get :output, params: { :job_invocation_id => @invocation.id, :host_id => host.id }
182
- result = ActiveSupport::JSON.decode(@response.body)
183
- assert_equal result['refresh'], false
184
- assert_equal result['output'], []
185
- assert_response :success
186
- end
187
-
188
- test 'should fail with 404 for non-existing job invocation' do
189
- invocation_id = @invocation.id + 1
190
- assert_empty JobInvocation.where(:id => invocation_id)
191
- get :output, params: { :job_invocation_id => invocation_id, :host_id => 1234 }
192
- result = ActiveSupport::JSON.decode(@response.body)
193
- assert_equal result['message'], "Job invocation not found by id '#{invocation_id}'"
194
- assert_response :missing
195
- end
196
-
197
- test 'should get output only for host in job invocation' do
198
- get :output, params: { job_invocation_id: @invocation.id,
199
- host_id: FactoryBot.create(:host).id }
200
- assert_response :missing
201
- end
202
-
203
- test 'should not break when taxonomy parameters are provided' do
204
- get :output, params: { :job_invocation_id => @invocation.id, :host_id => host.id, :organization_id => host.organization_id, :location_id => host.location_id }
205
- assert_response :success
206
- end
207
- end
208
-
209
- describe '#outputs' do
210
- test 'should provide outputs for hosts in the job' do
211
- get :outputs, params: { :id => @invocation.id }
212
- result = ActiveSupport::JSON.decode(@response.body)
213
- host_output = result['outputs'].first
214
- assert_equal host_output['host_id'], @invocation.targeting.host_ids.first
215
- assert_equal host_output['refresh'], false
216
- assert_equal host_output['output'], []
217
- assert_response :success
218
- end
219
-
220
- test 'should provide outputs for selected hosts in the job' do
221
- post :outputs, params: { :id => @invocation.id, :search_query => "id = #{@invocation.targeting.host_ids.first}" }, as: :json
222
- result = ActiveSupport::JSON.decode(@response.body)
223
- host_output = result['outputs'].first
224
- assert_equal host_output['host_id'], @invocation.targeting.host_ids.first
225
- assert_equal host_output['refresh'], false
226
- assert_equal host_output['output'], []
227
- assert_response :success
228
- end
229
-
230
- test 'should provide outputs for hosts in the job matching a search query' do
231
- get :outputs, params: { :id => @invocation.id, :search_query => "name = definitely_not_in_the_job" }
232
- result = ActiveSupport::JSON.decode(@response.body)
233
- assert_equal result['outputs'], []
234
- assert_response :success
235
- end
236
- end
237
-
238
- describe 'raw output' do
239
- let(:fake_output) do
240
- (1..5).map do |i|
241
- { 'timestamp' => (Time.now - (5 - i)).to_f, 'output' => "#{i}\n" }
242
- end
243
- end
244
- let(:fake_task) do
245
- OpenStruct.new :pending? => false, :main_action => OpenStruct.new(:live_output => fake_output)
246
- end
247
- let(:host) { @invocation.targeting.hosts.first }
248
-
249
- test 'should provide raw output for a host' do
250
- JobInvocation.any_instance.expects(:task).times(3).returns(OpenStruct.new(:scheduled? => false, :pending? => false))
251
- JobInvocation.any_instance.expects(:sub_task_for_host).returns(fake_task)
252
- get :raw_output, params: { :job_invocation_id => @invocation.id, :host_id => host.id }
253
- result = ActiveSupport::JSON.decode(@response.body)
254
- assert_equal result['complete'], true
255
- assert_equal result['output'], (1..5).map(&:to_s).join("\n") + "\n"
256
- assert_response :success
257
- end
258
-
259
- test 'should not break when taxonomy parameters are provided' do
260
- get :raw_output, params: { :job_invocation_id => @invocation.id, :host_id => host.id, :organization_id => host.organization_id, :location_id => host.location_id }
261
- assert_response :success
262
- end
263
-
264
- test 'should provide raw output for delayed task' do
265
- start_time = Time.now
266
- JobInvocation.any_instance
267
- .expects(:task).twice
268
- .returns(OpenStruct.new(:scheduled? => true, :start_at => start_time, :pending? => true))
269
- JobInvocation.any_instance.expects(:sub_task_for_host).never
270
- get :raw_output, params: { :job_invocation_id => @invocation.id, :host_id => host.id }
271
- result = ActiveSupport::JSON.decode(@response.body)
272
- assert_equal result['complete'], false
273
- assert_equal result['delayed'], true
274
- assert_nil result['output']
275
- assert_in_delta start_time.to_f, Time.parse(result['start_at']).to_f, 0.001
276
- assert_response :success
277
- end
278
-
279
- test 'should provide raw output for host without task' do
280
- JobInvocation.any_instance.expects(:task).times(3).returns(OpenStruct.new(:scheduled? => false, :pending? => true))
281
- JobInvocation.any_instance.expects(:sub_task_for_host)
282
- get :raw_output, params: { :job_invocation_id => @invocation.id, :host_id => host.id }
283
- result = ActiveSupport::JSON.decode(@response.body)
284
- assert_equal result['complete'], false
285
- assert_nil result['output']
286
- assert_response :success
287
- end
288
-
289
- test 'should get raw output only for host in job invocation' do
290
- get :raw_output, params: { job_invocation_id: @invocation.id,
291
- host_id: FactoryBot.create(:host).id }
292
- assert_response :missing
293
- end
294
- end
295
-
296
- test 'should cancel a job' do
297
- @invocation.task.expects(:cancellable?).returns(true)
298
- @invocation.task.expects(:cancel).returns(true)
299
- JobInvocation.expects(:from_param).with(@invocation.id.to_s).returns(@invocation)
300
- post :cancel, :params => { :id => @invocation.id }
301
- result = ActiveSupport::JSON.decode(@response.body)
302
- assert_equal result['cancelled'], true
303
- assert_equal result['id'], @invocation.id
304
-
305
- assert_response :success
306
- end
307
-
308
- test 'should abort a job' do
309
- @invocation.task.expects(:cancellable?).returns(true)
310
- @invocation.task.expects(:abort).returns(true)
311
- JobInvocation.expects(:from_param).with(@invocation.id.to_s).returns(@invocation)
312
- post :cancel, :params => { :id => @invocation.id, :force => true }
313
- result = ActiveSupport::JSON.decode(@response.body)
314
- assert_equal result['cancelled'], true
315
- assert_equal result['id'], @invocation.id
316
-
317
- assert_response :success
318
- end
319
-
320
- test 'should error when trying to cancel a stopped job' do
321
- @invocation.task.expects(:cancellable?).returns(false)
322
- JobInvocation.expects(:from_param).with(@invocation.id.to_s).returns(@invocation)
323
- post :cancel, :params => { :id => @invocation.id }
324
- assert_response 422
325
- end
326
-
327
- test 'should rerun' do
328
- JobInvocation.any_instance.expects(:generate_description)
329
- JobInvocationComposer.any_instance
330
- .expects(:validate_job_category)
331
- .with(@invocation.job_category)
332
- .returns(@invocation.job_category)
333
- post :rerun, params: { :id => @invocation.id }
334
- assert_response :success
335
- result = ActiveSupport::JSON.decode(@response.body)
336
- targeting = Targeting.find(result['targeting_id'])
337
- assert_equal users(:admin).id, targeting.user_id
338
- assert_equal @invocation.targeting.search_query, targeting.search_query
339
- end
340
-
341
- test 'should not raise an exception when reruning failed has no hosts' do
342
- @invocation.targeting.hosts.first.destroy
343
- JobInvocation.any_instance.expects(:generate_description)
344
- JobInvocationComposer.any_instance
345
- .expects(:validate_job_category)
346
- .with(@invocation.job_category)
347
- .returns(@invocation.job_category)
348
-
349
- post :rerun, params: { :id => @invocation.id, :failed_only => true }
350
- assert_response :success
351
- result = ActiveSupport::JSON.decode(@response.body)
352
- targeting = Targeting.find(result['targeting_id'])
353
- assert_equal users(:admin).id, targeting.user_id
354
- assert_equal 'name ^ ()', targeting.search_query
355
- end
356
-
357
- test 'should rerun failed only' do
358
- @invocation = FactoryBot.create(:job_invocation, :with_template, :with_failed_task)
359
- @invocation.job_category = @invocation.pattern_template_invocations.first.template.job_category
360
- @invocation.targeting.hosts = @invocation.template_invocations.map(&:host)
361
- @invocation.save!
362
- JobInvocation.any_instance.expects(:generate_description)
363
- JobInvocationComposer.any_instance
364
- .expects(:validate_job_category)
365
- .with(@invocation.job_category)
366
- .returns(@invocation.job_category)
367
- post :rerun, params: { :id => @invocation.id, :failed_only => true }
368
- assert_response :success
369
- result = ActiveSupport::JSON.decode(@response.body)
370
- targeting = Targeting.find(result['targeting_id'])
371
- hostnames = @invocation.template_invocations.map { |ti| ti.host.name }
372
- assert_equal users(:admin).id, targeting.user_id
373
- assert_equal "name ^ (#{hostnames.join(',')})", targeting.search_query
374
- end
375
-
376
- test 'should return 404 if template is not found' do
377
- @invocation.job_category = 'Missing category'
378
- @invocation.save!
379
- post :rerun, params: { :id => @invocation.id }
380
- assert_response 404
381
- end
382
-
383
- describe 'restricted access' do
384
- setup do
385
- @admin = FactoryBot.create(:user, mail: 'admin@test.foreman.com', admin: true)
386
- @user = FactoryBot.create(:user, mail: 'user@test.foreman.com', admin: false)
387
- @invocation = FactoryBot.create(:job_invocation, :with_template, :with_task, :with_unplanned_host)
388
- @invocation2 = FactoryBot.create(:job_invocation, :with_template, :with_task, :with_unplanned_host)
389
-
390
- @invocation.task.update(user: @admin)
391
- @invocation2.task.update(user: @user)
392
-
393
- setup_user 'view', 'hosts', nil, @user
394
- setup_user 'view', 'job_invocations', 'user = current_user', @user
395
- setup_user 'create', 'job_invocations', 'user = current_user', @user
396
- setup_user 'cancel', 'job_invocations', 'user = current_user', @user
397
- end
398
-
399
- let(:host) { @invocation.targeting.hosts.first }
400
- let(:host2) { @invocation2.targeting.hosts.first }
401
-
402
- context 'without user filter' do
403
- test '#index' do
404
- get :index, session: prepare_user(@admin)
405
- assert_response :success
406
- assert JSON.parse(@response.body)['results'].size >= 2
407
- end
408
-
409
- test '#show' do
410
- get :show, params: { id: @invocation2.id }, session: prepare_user(@admin)
411
- assert_response :success
412
- end
413
-
414
- test '#output' do
415
- get :output, params: { job_invocation_id: @invocation2.id, host_id: host2.id }, session: prepare_user(@admin)
416
- assert_response :success
417
- end
418
- end
419
-
420
- context 'with user filter' do
421
- test '#index' do
422
- get :index, session: prepare_user(@user)
423
- assert_response :success
424
- assert_equal 1, JSON.parse(@response.body)['results'].size
425
- end
426
-
427
- test '#show' do
428
- get :show, params: { id: @invocation.id }, session: prepare_user(@user)
429
- assert_response :not_found
430
- end
431
-
432
- test '#output' do
433
- get :output, params: { job_invocation_id: @invocation.id, host_id: host.id }, session: prepare_user(@user)
434
- assert_response :not_found
435
- assert_includes @response.body, 'Job invocation not found'
436
- end
437
- end
438
- end
439
-
440
- def prepare_user(user)
441
- User.current = user
442
- set_session_user(user)
443
- end
444
- end
445
- end
446
- end
@@ -1,110 +0,0 @@
1
- require 'test_plugin_helper'
2
-
3
- module Api
4
- module V2
5
- class JobTemplatesControllerTest < ActionController::TestCase
6
- setup do
7
- @template = FactoryBot.create :job_template
8
- end
9
-
10
- test 'should get index' do
11
- get :index
12
- templates = ActiveSupport::JSON.decode(@response.body)
13
- assert_not templates.empty?, 'Should response with template'
14
- assert_response :success
15
- end
16
-
17
- test 'should get templates of give organization' do
18
- @organization = FactoryBot.create(:organization)
19
- @template.organizations << @organization
20
- @template.save!
21
- get :index, params: { :organization_id => @organization.id }
22
- templates = ActiveSupport::JSON.decode(@response.body)
23
- assert_not templates.empty?, 'Should respond with template'
24
- assert_response :success
25
- end
26
-
27
- test 'should get template detail' do
28
- get :show, params: { :id => @template.to_param }
29
- assert_response :success
30
- template = ActiveSupport::JSON.decode(@response.body)
31
- assert_not template.empty?
32
- assert_equal template['name'], @template.name
33
- assert_not_nil template['created_at']
34
- assert_not_nil template['updated_at']
35
- end
36
-
37
- test 'should create valid' do
38
- JobTemplate.any_instance.stubs(:valid?).returns(true)
39
- valid_attrs = { :template => 'This is a test template', :name => 'RandomName', :provider_type => 'ssh' }
40
- post :create, params: { :job_template => valid_attrs }
41
- template = ActiveSupport::JSON.decode(@response.body)
42
- assert_equal template['name'], 'RandomName'
43
- assert_response :success
44
- end
45
-
46
- test 'should not create invalid' do
47
- post :create
48
- assert_response :unprocessable_entity
49
- end
50
-
51
- test 'should update valid' do
52
- JobTemplate.any_instance.stubs(:valid?).returns(true)
53
- put :update, params: { :id => @template.to_param, :job_template => { :template => 'blah' } }
54
- assert_response :ok
55
- end
56
-
57
- test 'should not update invalid' do
58
- put :update, params: { :id => @template.to_param, :job_template => { :name => '' } }
59
- assert_response :unprocessable_entity
60
- end
61
-
62
- test 'should update effective user' do
63
- template = { name: @template.name, job_category: @template.job_category,
64
- template: @template.template, provider_type: 'SSH',
65
- effective_user_attributes: {
66
- value: 'nobody',
67
- overridable: true,
68
- current_user: false,
69
- } }
70
- put :update, params: { id: @template.to_param, job_template: template }
71
- assert_response :ok
72
- end
73
-
74
- test 'should destroy' do
75
- delete :destroy, params: { :id => @template.to_param }
76
- assert_response :ok
77
- assert_not JobTemplate.exists?(@template.id)
78
- end
79
-
80
- test 'should clone template' do
81
- post :clone, params: { :id => @template.to_param, :job_template => {:name => 'MyClone'} }
82
- assert_response :success
83
- template = ActiveSupport::JSON.decode(@response.body)
84
- assert_equal(template['name'], 'MyClone')
85
- assert_equal(template['template'], @template.template)
86
- end
87
-
88
- test 'clone name should not be blank' do
89
- post :clone, params: { :id => @template.to_param, :job_template => {:name => ''} }
90
- assert_response :unprocessable_entity
91
- end
92
-
93
- test 'should export template' do
94
- get :export, params: { :id => @template.to_param }
95
- User.current = users(:admin)
96
- assert_equal @response.body, @template.to_erb
97
- assert_response :success
98
- end
99
-
100
- test 'should import template' do
101
- new_name = @template.name = "#{@template.name}_renamed"
102
- erb_data = @template.to_erb
103
- post :import, params: { :template => erb_data }
104
- assert_response :success
105
- assert JobTemplate.unscoped.find_by(name: new_name)
106
- end
107
- end
108
-
109
- end
110
- end
@@ -1,73 +0,0 @@
1
- require 'test_plugin_helper'
2
-
3
- module Api
4
- module V2
5
- # Tests for the extra methods to play roles on a Host
6
- class RegistrationControllerTest < ActionController::TestCase
7
- describe 'host registration' do
8
- let(:organization) { FactoryBot.create(:organization) }
9
- let(:tax_location) { FactoryBot.create(:location) }
10
- let(:template) do
11
- FactoryBot.create(
12
- :provisioning_template,
13
- template_kind: template_kinds(:host_init_config),
14
- template: 'template content <%= @host.name %>',
15
- locations: [tax_location],
16
- organizations: [organization]
17
- )
18
- end
19
- let(:os) do
20
- FactoryBot.create(
21
- :operatingsystem,
22
- :with_associations,
23
- family: 'Redhat',
24
- provisioning_templates: [
25
- template,
26
- ]
27
- )
28
- end
29
-
30
- let(:host_params) do
31
- { host: { name: 'centos-test.example.com',
32
- managed: false, build: false,
33
- organization_id: organization.id,
34
- location_id: tax_location.id,
35
- operatingsystem_id: os.id } }
36
- end
37
-
38
- describe 'remote_execution_interface' do
39
- setup do
40
- Setting[:default_host_init_config_template] = template.name
41
- @host = Host.create(host_params[:host])
42
- @interface0 = FactoryBot.create(:nic_managed, host: @host, identifier: 'dummy0', execution: false)
43
- end
44
-
45
- test 'with existing interface' do
46
- params = host_params.merge(remote_execution_interface: @interface0.identifier)
47
-
48
- post :host, params: params, session: set_session_user
49
- assert_response :success
50
- assert @interface0.reload.execution
51
- end
52
-
53
- test 'with not-existing interface' do
54
- params = host_params.merge(remote_execution_interface: 'dummy999')
55
-
56
- post :host, params: params, session: set_session_user
57
- assert_response :not_found
58
- end
59
-
60
- test 'with multiple interfaces' do
61
- interface1 = FactoryBot.create(:nic_managed, host: @host, identifier: 'dummy1', execution: false)
62
- params = host_params.merge(remote_execution_interface: interface1.identifier)
63
-
64
- post :host, params: params, session: set_session_user
65
- assert_response :success
66
- refute @interface0.reload.execution
67
- assert interface1.reload.execution
68
- end
69
- end
70
- end
71
- end
72
- end
73
- end
@@ -1,34 +0,0 @@
1
- require 'test_plugin_helper'
2
-
3
- module Api
4
- module V2
5
- class RemoteExecutionFeaturesControllerTest < ActionController::TestCase
6
- setup do
7
- @remote_execution_feature = RemoteExecutionFeature.register(:my_awesome_feature, 'My awesome feature',
8
- :description => 'You will not believe what it does',
9
- :provided_inputs => ['awesomeness_level'])
10
- @template = FactoryBot.create(:job_template, :with_input)
11
- end
12
-
13
- test 'should get index' do
14
- get :index
15
- remote_execution_features = ActiveSupport::JSON.decode(@response.body)
16
- assert_not remote_execution_features.empty?, 'Should respond with input sets'
17
- assert_response :success
18
- end
19
-
20
- test 'should get input set detail' do
21
- get :show, params: { :id => @remote_execution_feature.to_param }
22
- assert_response :success
23
- remote_execution_feature = ActiveSupport::JSON.decode(@response.body)
24
- assert_not remote_execution_feature.empty?
25
- assert_equal remote_execution_feature['name'], @remote_execution_feature.name
26
- end
27
-
28
- test 'should update valid' do
29
- put :update, params: { :id => @remote_execution_feature.to_param, :job_template_id => @template.id }
30
- assert_response :ok
31
- end
32
- end
33
- end
34
- end