foreman_remote_execution 3.0.3 → 3.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.
- checksums.yaml +4 -4
- data/.hound.yml +2 -1
- data/.rubocop.yml +80 -50
- data/.rubocop_todo.yml +113 -73
- data/Gemfile +4 -0
- data/app/controllers/api/v2/foreign_input_sets_controller.rb +3 -2
- data/app/controllers/api/v2/job_invocations_controller.rb +7 -6
- data/app/controllers/api/v2/job_templates_controller.rb +3 -2
- data/app/controllers/api/v2/remote_execution_features_controller.rb +3 -2
- data/app/controllers/api/v2/template_invocations_controller.rb +1 -1
- data/app/controllers/cockpit_controller.rb +1 -0
- data/app/controllers/concerns/foreman/controller/parameters/foreign_input_set.rb +1 -1
- data/app/controllers/concerns/foreman/controller/parameters/job_template.rb +4 -4
- data/app/controllers/job_invocations_controller.rb +10 -6
- data/app/controllers/job_templates_controller.rb +1 -1
- data/app/controllers/remote_execution_features_controller.rb +3 -2
- data/app/helpers/concerns/foreman_remote_execution/hosts_helper_extensions.rb +16 -5
- data/app/helpers/job_invocations_chart_helper.rb +11 -10
- data/app/helpers/job_invocations_helper.rb +13 -5
- data/app/helpers/remote_execution_helper.rb +43 -46
- data/app/lib/actions/remote_execution/run_host_job.rb +5 -6
- data/app/lib/actions/remote_execution/run_hosts_job.rb +2 -2
- data/app/lib/foreman_remote_execution/renderer/scope/input.rb +1 -0
- data/app/models/concerns/foreman_remote_execution/errors_flattener.rb +0 -2
- data/app/models/concerns/foreman_remote_execution/host_extensions.rb +3 -5
- data/app/models/concerns/foreman_remote_execution/nic_extensions.rb +1 -0
- data/app/models/concerns/foreman_remote_execution/smart_proxy_extensions.rb +1 -0
- data/app/models/foreign_input_set.rb +3 -2
- data/app/models/input_template_renderer.rb +1 -1
- data/app/models/job_invocation.rb +10 -12
- data/app/models/job_invocation_composer.rb +20 -14
- data/app/models/job_invocation_task_group.rb +1 -1
- data/app/models/job_template.rb +3 -3
- data/app/models/remote_execution_feature.rb +0 -2
- data/app/models/remote_execution_provider.rb +4 -2
- data/app/models/setting/remote_execution.rb +54 -56
- data/app/models/ssh_execution_provider.rb +2 -2
- data/app/models/targeting.rb +1 -0
- data/app/models/template_invocation.rb +2 -3
- data/app/views/api/v2/job_invocations/base.json.rabl +1 -1
- data/app/views/api/v2/job_invocations/main.json.rabl +5 -2
- data/app/views/job_invocations/_card_target_hosts.html.erb +12 -0
- data/app/views/job_invocations/_card_user_input.html.erb +1 -1
- data/app/views/job_invocations/_form.html.erb +3 -2
- data/app/views/job_invocations/_rerun_taxonomies.html.erb +22 -0
- data/app/views/job_invocations/_user_input.html.erb +1 -1
- data/app/views/job_invocations/show.html.erb +2 -0
- data/db/migrate/20151215114631_add_host_id_to_template_invocation.rb +1 -0
- data/db/migrate/20180110104432_rename_template_invocation_permission.rb +1 -0
- data/db/seeds.d/50-notification_blueprints.rb +4 -4
- data/db/seeds.d/90-bookmarks.rb +1 -0
- data/extra/cockpit/foreman-cockpit-session +7 -2
- data/lib/foreman_remote_execution/engine.rb +18 -17
- data/lib/foreman_remote_execution/version.rb +1 -1
- data/test/benchmark/run_hosts_job_benchmark.rb +1 -1
- data/test/factories/foreman_remote_execution_factories.rb +1 -1
- data/test/functional/api/v2/job_invocations_controller_test.rb +9 -9
- data/test/functional/api/v2/job_templates_controller_test.rb +1 -1
- data/test/functional/api/v2/remote_execution_features_controller_test.rb +2 -2
- data/test/functional/api/v2/template_invocations_controller_test.rb +4 -4
- data/test/functional/job_invocations_controller_test.rb +11 -11
- data/test/functional/job_templates_controller_test.rb +1 -1
- data/test/unit/actions/run_hosts_job_test.rb +8 -8
- data/test/unit/concerns/foreman_tasks_cleaner_extensions_test.rb +3 -3
- data/test/unit/concerns/host_extensions_test.rb +19 -19
- data/test/unit/concerns/nic_extensions_test.rb +1 -1
- data/test/unit/execution_task_status_mapper_test.rb +10 -10
- data/test/unit/input_template_renderer_test.rb +77 -77
- data/test/unit/job_invocation_composer_test.rb +100 -96
- data/test/unit/job_invocation_test.rb +29 -29
- data/test/unit/job_template_effective_user_test.rb +3 -3
- data/test/unit/job_template_test.rb +31 -31
- data/test/unit/remote_execution_feature_test.rb +19 -19
- data/test/unit/remote_execution_provider_test.rb +29 -29
- data/test/unit/renderer_scope_input.rb +6 -6
- data/test/unit/targeting_test.rb +6 -6
- data/test/unit/template_invocation_input_value_test.rb +3 -3
- metadata +3 -2
@@ -57,13 +57,13 @@ class JobInvocationComposerTest < ActiveSupport::TestCase
|
|
57
57
|
describe '#available_templates_for(job_category)' do
|
58
58
|
it 'find the templates only for a given job name' do
|
59
59
|
results = composer.available_templates_for(trying_job_template_1.job_category)
|
60
|
-
results.must_include trying_job_template_1
|
61
|
-
results.wont_include trying_job_template_2
|
60
|
+
_(results).must_include trying_job_template_1
|
61
|
+
_(results).wont_include trying_job_template_2
|
62
62
|
end
|
63
63
|
|
64
64
|
it 'it respects view permissions' do
|
65
65
|
results = composer.available_templates_for(trying_job_template_1.job_category)
|
66
|
-
results.wont_include unauthorized_job_template_1
|
66
|
+
_(results).wont_include unauthorized_job_template_1
|
67
67
|
end
|
68
68
|
end
|
69
69
|
|
@@ -71,13 +71,13 @@ class JobInvocationComposerTest < ActiveSupport::TestCase
|
|
71
71
|
let(:job_categories) { composer.available_job_categories }
|
72
72
|
|
73
73
|
it 'find only job names that user is granted to view' do
|
74
|
-
job_categories.must_include trying_job_template_1.job_category
|
75
|
-
job_categories.must_include trying_job_template_2.job_category
|
76
|
-
job_categories.wont_include unauthorized_job_template_2.job_category
|
74
|
+
_(job_categories).must_include trying_job_template_1.job_category
|
75
|
+
_(job_categories).must_include trying_job_template_2.job_category
|
76
|
+
_(job_categories).wont_include unauthorized_job_template_2.job_category
|
77
77
|
end
|
78
78
|
|
79
79
|
it 'every job name is listed just once' do
|
80
|
-
job_categories.uniq.must_equal job_categories
|
80
|
+
_(job_categories.uniq).must_equal job_categories
|
81
81
|
end
|
82
82
|
end
|
83
83
|
|
@@ -86,13 +86,13 @@ class JobInvocationComposerTest < ActiveSupport::TestCase
|
|
86
86
|
|
87
87
|
it 'finds only providers which user is granted to view' do
|
88
88
|
composer.job_invocation.job_category = 'trying_job_template_1'
|
89
|
-
provider_types.must_include 'SSH'
|
90
|
-
provider_types.wont_include 'Mcollective'
|
91
|
-
provider_types.wont_include 'Ansible'
|
89
|
+
_(provider_types).must_include 'SSH'
|
90
|
+
_(provider_types).wont_include 'Mcollective'
|
91
|
+
_(provider_types).wont_include 'Ansible'
|
92
92
|
end
|
93
93
|
|
94
94
|
it 'every provider type is listed just once' do
|
95
|
-
provider_types.uniq.must_equal provider_types
|
95
|
+
_(provider_types.uniq).must_equal provider_types
|
96
96
|
end
|
97
97
|
end
|
98
98
|
|
@@ -104,9 +104,9 @@ class JobInvocationComposerTest < ActiveSupport::TestCase
|
|
104
104
|
end
|
105
105
|
|
106
106
|
it 'returns only authorized inputs based on templates' do
|
107
|
-
composer.available_template_inputs.must_include(input1)
|
108
|
-
composer.available_template_inputs.must_include(input2)
|
109
|
-
composer.available_template_inputs.wont_include(unauthorized_input1)
|
107
|
+
_(composer.available_template_inputs).must_include(input1)
|
108
|
+
_(composer.available_template_inputs).must_include(input2)
|
109
|
+
_(composer.available_template_inputs).wont_include(unauthorized_input1)
|
110
110
|
end
|
111
111
|
|
112
112
|
context 'params contains job template ids' do
|
@@ -116,9 +116,9 @@ class JobInvocationComposerTest < ActiveSupport::TestCase
|
|
116
116
|
let(:params) { { :job_invocation => providers_params }.with_indifferent_access }
|
117
117
|
|
118
118
|
it 'finds the inputs only specified job templates' do
|
119
|
-
composer.available_template_inputs.must_include(input1)
|
120
|
-
composer.available_template_inputs.wont_include(input2)
|
121
|
-
composer.available_template_inputs.wont_include(unauthorized_input1)
|
119
|
+
_(composer.available_template_inputs).must_include(input1)
|
120
|
+
_(composer.available_template_inputs).wont_include(input2)
|
121
|
+
_(composer.available_template_inputs).wont_include(unauthorized_input1)
|
122
122
|
end
|
123
123
|
end
|
124
124
|
end
|
@@ -143,40 +143,40 @@ class JobInvocationComposerTest < ActiveSupport::TestCase
|
|
143
143
|
it 'returns all templates for a given provider respecting template permissions' do
|
144
144
|
trying_job_template_4 = FactoryBot.create(:job_template, :job_category => 'trying_job_template_1', :name => 'trying4', :provider_type => 'Ansible')
|
145
145
|
result = composer.templates_for_provider('SSH')
|
146
|
-
result.must_include trying_job_template_1
|
147
|
-
result.must_include trying_job_template_3
|
148
|
-
result.wont_include unauthorized_job_template_1
|
149
|
-
result.wont_include trying_job_template_4
|
146
|
+
_(result).must_include trying_job_template_1
|
147
|
+
_(result).must_include trying_job_template_3
|
148
|
+
_(result).wont_include unauthorized_job_template_1
|
149
|
+
_(result).wont_include trying_job_template_4
|
150
150
|
|
151
151
|
result = composer.templates_for_provider('Ansible')
|
152
|
-
result.wont_include trying_job_template_1
|
153
|
-
result.wont_include trying_job_template_3
|
154
|
-
result.wont_include unauthorized_job_template_2
|
155
|
-
result.must_include trying_job_template_4
|
152
|
+
_(result).wont_include trying_job_template_1
|
153
|
+
_(result).wont_include trying_job_template_3
|
154
|
+
_(result).wont_include unauthorized_job_template_2
|
155
|
+
_(result).must_include trying_job_template_4
|
156
156
|
end
|
157
157
|
end
|
158
158
|
|
159
159
|
describe '#rerun_possible?' do
|
160
160
|
it 'is true when not rerunning' do
|
161
|
-
composer.must_be :rerun_possible?
|
161
|
+
_(composer).must_be :rerun_possible?
|
162
162
|
end
|
163
163
|
|
164
164
|
it 'is true when rerunning with pattern tempalte invocations' do
|
165
165
|
composer.expects(:reruns).returns(1)
|
166
166
|
composer.job_invocation.expects(:pattern_template_invocations).returns([1])
|
167
|
-
composer.must_be :rerun_possible?
|
167
|
+
_(composer).must_be :rerun_possible?
|
168
168
|
end
|
169
169
|
|
170
170
|
it 'is false when rerunning without pattern template invocations' do
|
171
171
|
composer.expects(:reruns).returns(1)
|
172
172
|
composer.job_invocation.expects(:pattern_template_invocations).returns([])
|
173
|
-
composer.wont_be :rerun_possible?
|
173
|
+
_(composer).wont_be :rerun_possible?
|
174
174
|
end
|
175
175
|
end
|
176
176
|
|
177
177
|
describe '#selected_job_templates' do
|
178
178
|
it 'returns no template if none was selected through params' do
|
179
|
-
composer.selected_job_templates.must_be_empty
|
179
|
+
_(composer.selected_job_templates).must_be_empty
|
180
180
|
end
|
181
181
|
|
182
182
|
context 'extra unavailable templates id were selected' do
|
@@ -189,14 +189,14 @@ class JobInvocationComposerTest < ActiveSupport::TestCase
|
|
189
189
|
|
190
190
|
it 'ignores unauthorized template' do
|
191
191
|
unauthorized # make sure unautorized exists
|
192
|
-
composer.selected_job_templates.wont_include unauthorized
|
192
|
+
_(composer.selected_job_templates).wont_include unauthorized
|
193
193
|
end
|
194
194
|
|
195
195
|
it 'contains only authorized template specified in params' do
|
196
196
|
mcollective_authorized # make sure mcollective_authorized exists
|
197
|
-
composer.selected_job_templates.must_include trying_job_template_1
|
198
|
-
composer.selected_job_templates.must_include mcollective_authorized
|
199
|
-
composer.selected_job_templates.wont_include trying_job_template_3
|
197
|
+
_(composer.selected_job_templates).must_include trying_job_template_1
|
198
|
+
_(composer.selected_job_templates).must_include mcollective_authorized
|
199
|
+
_(composer.selected_job_templates).wont_include trying_job_template_3
|
200
200
|
end
|
201
201
|
end
|
202
202
|
end
|
@@ -204,7 +204,7 @@ class JobInvocationComposerTest < ActiveSupport::TestCase
|
|
204
204
|
describe '#preselected_template_for_provider(provider_type)' do
|
205
205
|
context 'none template was selected through params' do
|
206
206
|
it 'returns nil' do
|
207
|
-
composer.preselected_template_for_provider('SSH').must_be_nil
|
207
|
+
_(composer.preselected_template_for_provider('SSH')).must_be_nil
|
208
208
|
end
|
209
209
|
end
|
210
210
|
|
@@ -213,7 +213,7 @@ class JobInvocationComposerTest < ActiveSupport::TestCase
|
|
213
213
|
let(:params) { { :job_invocation => providers_params }.with_indifferent_access }
|
214
214
|
|
215
215
|
it 'returns the selected template because it is available for provider' do
|
216
|
-
composer.preselected_template_for_provider('SSH').must_equal trying_job_template_1
|
216
|
+
_(composer.preselected_template_for_provider('SSH')).must_equal trying_job_template_1
|
217
217
|
end
|
218
218
|
end
|
219
219
|
end
|
@@ -223,17 +223,17 @@ class JobInvocationComposerTest < ActiveSupport::TestCase
|
|
223
223
|
{ :job_template_id => trying_job_template_1.id.to_s,
|
224
224
|
:job_templates => {
|
225
225
|
trying_job_template_1.id.to_s => {
|
226
|
-
:input_values => { input1.id.to_s => { :value => 'value1' }, unauthorized_input1.id.to_s => { :value => 'dropped' } }
|
227
|
-
}
|
226
|
+
:input_values => { input1.id.to_s => { :value => 'value1' }, unauthorized_input1.id.to_s => { :value => 'dropped' } },
|
227
|
+
},
|
228
228
|
}}
|
229
229
|
end
|
230
230
|
let(:params) { { :job_invocation => { :providers => { :ssh => ssh_params } } }.with_indifferent_access }
|
231
231
|
let(:invocations) { composer.pattern_template_invocations }
|
232
232
|
|
233
233
|
it 'builds pattern template invocations based on passed params and it filters out wrong inputs' do
|
234
|
-
invocations.size.must_equal 1
|
235
|
-
invocations.first.input_values.size.must_equal 1
|
236
|
-
invocations.first.input_values.first.value.must_equal 'value1'
|
234
|
+
_(invocations.size).must_equal 1
|
235
|
+
_(invocations.first.input_values.size).must_equal 1
|
236
|
+
_(invocations.first.input_values.first.value).must_equal 'value1'
|
237
237
|
end
|
238
238
|
end
|
239
239
|
|
@@ -242,13 +242,13 @@ class JobInvocationComposerTest < ActiveSupport::TestCase
|
|
242
242
|
{ :job_template_id => trying_job_template_1.id.to_s,
|
243
243
|
:job_templates => {
|
244
244
|
trying_job_template_1.id.to_s => {
|
245
|
-
:effective_user => invocation_effective_user
|
246
|
-
}
|
245
|
+
:effective_user => invocation_effective_user,
|
246
|
+
},
|
247
247
|
}}
|
248
248
|
end
|
249
249
|
let(:params) { { :job_invocation => { :providers => { :ssh => ssh_params } } }.with_indifferent_access }
|
250
250
|
let(:template_invocation) do
|
251
|
-
trying_job_template_1.effective_user.
|
251
|
+
trying_job_template_1.effective_user.update(:overridable => overridable, :value => 'template user')
|
252
252
|
composer.pattern_template_invocations.first
|
253
253
|
end
|
254
254
|
|
@@ -261,7 +261,7 @@ class JobInvocationComposerTest < ActiveSupport::TestCase
|
|
261
261
|
let(:invocation_effective_user) { 'invocation user' }
|
262
262
|
|
263
263
|
it 'takes the value from the template invocation' do
|
264
|
-
template_invocation.effective_user.must_equal 'invocation user'
|
264
|
+
_(template_invocation.effective_user).must_equal 'invocation user'
|
265
265
|
end
|
266
266
|
end
|
267
267
|
|
@@ -270,7 +270,7 @@ class JobInvocationComposerTest < ActiveSupport::TestCase
|
|
270
270
|
let(:invocation_effective_user) { '' }
|
271
271
|
|
272
272
|
it 'takes the value from the job template' do
|
273
|
-
template_invocation.effective_user.must_equal 'template user'
|
273
|
+
_(template_invocation.effective_user).must_equal 'template user'
|
274
274
|
end
|
275
275
|
end
|
276
276
|
|
@@ -279,14 +279,14 @@ class JobInvocationComposerTest < ActiveSupport::TestCase
|
|
279
279
|
let(:invocation_effective_user) { 'invocation user' }
|
280
280
|
|
281
281
|
it 'takes the value from the job template' do
|
282
|
-
template_invocation.effective_user.must_equal 'template user'
|
282
|
+
_(template_invocation.effective_user).must_equal 'template user'
|
283
283
|
end
|
284
284
|
end
|
285
285
|
end
|
286
286
|
|
287
287
|
describe '#displayed_search_query' do
|
288
288
|
it 'is empty by default' do
|
289
|
-
composer.displayed_search_query.must_be_empty
|
289
|
+
_(composer.displayed_search_query).must_be_empty
|
290
290
|
end
|
291
291
|
|
292
292
|
let(:host) { FactoryBot.create(:host) }
|
@@ -296,7 +296,7 @@ class JobInvocationComposerTest < ActiveSupport::TestCase
|
|
296
296
|
let(:params) { { :targeting => { :search_query => 'a', :bookmark_id => bookmark.id }, :host_ids => [ host.id ] }.with_indifferent_access }
|
297
297
|
|
298
298
|
it 'explicit search query has highest priority' do
|
299
|
-
composer.displayed_search_query.must_equal 'a'
|
299
|
+
_(composer.displayed_search_query).must_equal 'a'
|
300
300
|
end
|
301
301
|
end
|
302
302
|
|
@@ -304,7 +304,7 @@ class JobInvocationComposerTest < ActiveSupport::TestCase
|
|
304
304
|
let(:params) { { :targeting => { :bookmark_id => bookmark.id }, :host_ids => [ host.id ] }.with_indifferent_access }
|
305
305
|
|
306
306
|
it 'hosts will be used instead of a bookmark' do
|
307
|
-
composer.displayed_search_query.must_include host.name
|
307
|
+
_(composer.displayed_search_query).must_include host.name
|
308
308
|
end
|
309
309
|
end
|
310
310
|
|
@@ -313,20 +313,20 @@ class JobInvocationComposerTest < ActiveSupport::TestCase
|
|
313
313
|
|
314
314
|
it 'bookmark query is used if it is available for the user' do
|
315
315
|
bookmark.update_attribute :public, false
|
316
|
-
composer.displayed_search_query.must_equal bookmark.query
|
316
|
+
_(composer.displayed_search_query).must_equal bookmark.query
|
317
317
|
end
|
318
318
|
|
319
319
|
it 'bookmark query is used if the bookmark is public' do
|
320
320
|
bookmark.owner = nil
|
321
321
|
bookmark.save(:validate => false) # skip validations so owner remains nil
|
322
|
-
composer.displayed_search_query.must_equal bookmark.query
|
322
|
+
_(composer.displayed_search_query).must_equal bookmark.query
|
323
323
|
end
|
324
324
|
|
325
325
|
it 'empty search is returned if bookmark is not owned by the user and is not public' do
|
326
326
|
bookmark.public = false
|
327
327
|
bookmark.owner = nil
|
328
328
|
bookmark.save(:validate => false) # skip validations so owner remains nil
|
329
|
-
composer.displayed_search_query.must_be_empty
|
329
|
+
_(composer.displayed_search_query).must_be_empty
|
330
330
|
end
|
331
331
|
end
|
332
332
|
end
|
@@ -347,9 +347,9 @@ class JobInvocationComposerTest < ActiveSupport::TestCase
|
|
347
347
|
hosts
|
348
348
|
dashboard
|
349
349
|
hostgroups
|
350
|
-
composer.available_bookmarks.must_include hosts
|
351
|
-
composer.available_bookmarks.must_include dashboard
|
352
|
-
composer.available_bookmarks.wont_include hostgroups
|
350
|
+
_(composer.available_bookmarks).must_include hosts
|
351
|
+
_(composer.available_bookmarks).must_include dashboard
|
352
|
+
_(composer.available_bookmarks).wont_include hostgroups
|
353
353
|
end
|
354
354
|
end
|
355
355
|
end
|
@@ -365,17 +365,17 @@ class JobInvocationComposerTest < ActiveSupport::TestCase
|
|
365
365
|
|
366
366
|
it 'searches hosts based on displayed_search_query' do
|
367
367
|
composer.stubs(:displayed_search_query => "name = #{host.name}")
|
368
|
-
composer.targeted_hosts_count.must_equal 1
|
368
|
+
_(composer.targeted_hosts_count).must_equal 1
|
369
369
|
end
|
370
370
|
|
371
371
|
it 'returns 0 for queries with syntax errors' do
|
372
372
|
composer.stubs(:displayed_search_query => 'name = ')
|
373
|
-
composer.targeted_hosts_count.must_equal 0
|
373
|
+
_(composer.targeted_hosts_count).must_equal 0
|
374
374
|
end
|
375
375
|
|
376
376
|
it 'returns 0 when no query is present' do
|
377
377
|
composer.stubs(:displayed_search_query => '')
|
378
|
-
composer.targeted_hosts_count.must_equal 0
|
378
|
+
_(composer.targeted_hosts_count).must_equal 0
|
379
379
|
end
|
380
380
|
end
|
381
381
|
|
@@ -383,7 +383,7 @@ class JobInvocationComposerTest < ActiveSupport::TestCase
|
|
383
383
|
let(:value1) { composer.input_value_for(input1) }
|
384
384
|
it 'returns new empty input value if there is no invocation' do
|
385
385
|
assert value1.new_record?
|
386
|
-
value1.value.must_be_empty
|
386
|
+
_(value1.value).must_be_empty
|
387
387
|
end
|
388
388
|
|
389
389
|
context 'there are invocations without input values for a given input' do
|
@@ -391,15 +391,15 @@ class JobInvocationComposerTest < ActiveSupport::TestCase
|
|
391
391
|
{ :job_template_id => trying_job_template_1.id.to_s,
|
392
392
|
:job_templates => {
|
393
393
|
trying_job_template_1.id.to_s => {
|
394
|
-
:input_values => { }
|
395
|
-
}
|
394
|
+
:input_values => { },
|
395
|
+
},
|
396
396
|
} }
|
397
397
|
end
|
398
398
|
let(:params) { { :job_invocation => { :providers => { :ssh => ssh_params } } }.with_indifferent_access }
|
399
399
|
|
400
400
|
it 'returns new empty input value' do
|
401
401
|
assert value1.new_record?
|
402
|
-
value1.value.must_be_empty
|
402
|
+
_(value1.value).must_be_empty
|
403
403
|
end
|
404
404
|
end
|
405
405
|
|
@@ -408,14 +408,14 @@ class JobInvocationComposerTest < ActiveSupport::TestCase
|
|
408
408
|
{ :job_template_id => trying_job_template_1.id.to_s,
|
409
409
|
:job_templates => {
|
410
410
|
trying_job_template_1.id.to_s => {
|
411
|
-
:input_values => { input1.id.to_s => { :value => 'value1' } }
|
412
|
-
}
|
411
|
+
:input_values => { input1.id.to_s => { :value => 'value1' } },
|
412
|
+
},
|
413
413
|
} }
|
414
414
|
end
|
415
415
|
let(:params) { { :job_invocation => { :providers => { :ssh => ssh_params } } }.with_indifferent_access }
|
416
416
|
|
417
417
|
it 'finds the value among template invocations' do
|
418
|
-
value1.value.must_equal 'value1'
|
418
|
+
_(value1.value).must_equal 'value1'
|
419
419
|
end
|
420
420
|
end
|
421
421
|
end
|
@@ -426,8 +426,8 @@ class JobInvocationComposerTest < ActiveSupport::TestCase
|
|
426
426
|
{ :job_template_id => trying_job_template_1.id.to_s,
|
427
427
|
:job_templates => {
|
428
428
|
trying_job_template_1.id.to_s => {
|
429
|
-
:input_values => { input1.id.to_s => { :value => 'value1' } }
|
430
|
-
}
|
429
|
+
:input_values => { input1.id.to_s => { :value => 'value1' } },
|
430
|
+
},
|
431
431
|
} }
|
432
432
|
end
|
433
433
|
|
@@ -452,24 +452,28 @@ class JobInvocationComposerTest < ActiveSupport::TestCase
|
|
452
452
|
end
|
453
453
|
|
454
454
|
it 'accepts the concurrency options' do
|
455
|
-
composer.job_invocation.concurrency_level.must_equal 5
|
456
|
-
composer.job_invocation.time_span.must_equal 60
|
455
|
+
_(composer.job_invocation.concurrency_level).must_equal 5
|
456
|
+
_(composer.job_invocation.time_span).must_equal 60
|
457
457
|
end
|
458
458
|
end
|
459
459
|
|
460
460
|
it 'can be disabled' do
|
461
|
-
composer.job_invocation.concurrency_level.must_be_nil
|
462
|
-
composer.job_invocation.time_span.must_be_nil
|
461
|
+
_(composer.job_invocation.concurrency_level).must_be_nil
|
462
|
+
_(composer.job_invocation.time_span).must_be_nil
|
463
463
|
end
|
464
464
|
end
|
465
465
|
|
466
466
|
describe 'triggering' do
|
467
467
|
let(:params) do
|
468
|
-
{ :job_invocation => { :providers => { :ssh => ssh_params } }, :triggering => { :mode => 'future' }}.with_indifferent_access
|
468
|
+
{ :job_invocation => { :providers => { :ssh => ssh_params } }, :triggering => { :mode => 'future', :end_time=> {"end_time(3i)": 1, "end_time(2i)": 2, "end_time(1i)": 3, "end_time(4i)": 4, "end_time(5i)": 5} }}.with_indifferent_access
|
469
469
|
end
|
470
470
|
|
471
471
|
it 'accepts the triggering params' do
|
472
|
-
composer.job_invocation.triggering.mode.must_equal :future
|
472
|
+
_(composer.job_invocation.triggering.mode).must_equal :future
|
473
|
+
end
|
474
|
+
|
475
|
+
it 'formats the triggering end time when its unordered' do
|
476
|
+
_(composer.job_invocation.triggering.end_time).must_equal Time.local(3,2,1,4,5)
|
473
477
|
end
|
474
478
|
end
|
475
479
|
|
@@ -503,7 +507,7 @@ class JobInvocationComposerTest < ActiveSupport::TestCase
|
|
503
507
|
|
504
508
|
it 'sets the password properly' do
|
505
509
|
composer
|
506
|
-
composer.job_invocation.password.must_equal password
|
510
|
+
_(composer.job_invocation.password).must_equal password
|
507
511
|
end
|
508
512
|
end
|
509
513
|
|
@@ -515,7 +519,7 @@ class JobInvocationComposerTest < ActiveSupport::TestCase
|
|
515
519
|
|
516
520
|
it 'sets the key passphrase properly' do
|
517
521
|
composer
|
518
|
-
composer.job_invocation.key_passphrase.must_equal key_passphrase
|
522
|
+
_(composer.job_invocation.key_passphrase).must_equal key_passphrase
|
519
523
|
end
|
520
524
|
end
|
521
525
|
|
@@ -527,7 +531,7 @@ class JobInvocationComposerTest < ActiveSupport::TestCase
|
|
527
531
|
|
528
532
|
it 'sets the sudo password properly' do
|
529
533
|
composer
|
530
|
-
composer.job_invocation.sudo_password.must_equal sudo_password
|
534
|
+
_(composer.job_invocation.sudo_password).must_equal sudo_password
|
531
535
|
end
|
532
536
|
end
|
533
537
|
|
@@ -545,8 +549,8 @@ class JobInvocationComposerTest < ActiveSupport::TestCase
|
|
545
549
|
{ :job_template_id => trying_job_template_1.id.to_s,
|
546
550
|
:job_templates => {
|
547
551
|
trying_job_template_1.id.to_s => {
|
548
|
-
:input_values => { input1.id.to_s => { :value => 'value1' } }
|
549
|
-
}
|
552
|
+
:input_values => { input1.id.to_s => { :value => 'value1' } },
|
553
|
+
},
|
550
554
|
} }
|
551
555
|
end
|
552
556
|
let(:params) do
|
@@ -558,8 +562,8 @@ class JobInvocationComposerTest < ActiveSupport::TestCase
|
|
558
562
|
},
|
559
563
|
:targeting => {
|
560
564
|
:search_query => "name = #{host.name}",
|
561
|
-
:targeting_type => Targeting::STATIC_TYPE
|
562
|
-
}
|
565
|
+
:targeting_type => Targeting::STATIC_TYPE,
|
566
|
+
},
|
563
567
|
}.with_indifferent_access
|
564
568
|
end
|
565
569
|
let(:existing) { composer.job_invocation }
|
@@ -570,30 +574,30 @@ class JobInvocationComposerTest < ActiveSupport::TestCase
|
|
570
574
|
end
|
571
575
|
|
572
576
|
it 'sets the same job name' do
|
573
|
-
new_composer.job_category.must_equal existing.job_category
|
577
|
+
_(new_composer.job_category).must_equal existing.job_category
|
574
578
|
end
|
575
579
|
|
576
580
|
it 'accepts additional host ids' do
|
577
581
|
new_composer = JobInvocationComposer.from_job_invocation(composer.job_invocation, { :host_ids => [host.id] })
|
578
|
-
new_composer.search_query.must_equal("name ^ (#{host.name})")
|
582
|
+
_(new_composer.search_query).must_equal("name ^ (#{host.name})")
|
579
583
|
end
|
580
584
|
|
581
585
|
it 'builds new targeting object which keeps search query' do
|
582
|
-
new_composer.targeting.wont_equal existing.targeting
|
583
|
-
new_composer.search_query.must_equal existing.targeting.search_query
|
586
|
+
_(new_composer.targeting).wont_equal existing.targeting
|
587
|
+
_(new_composer.search_query).must_equal existing.targeting.search_query
|
584
588
|
end
|
585
589
|
|
586
590
|
it 'keeps job template ids' do
|
587
|
-
new_composer.job_template_ids.must_equal existing.pattern_template_invocations.map(&:template_id)
|
591
|
+
_(new_composer.job_template_ids).must_equal existing.pattern_template_invocations.map(&:template_id)
|
588
592
|
end
|
589
593
|
|
590
594
|
it 'keeps template invocations and their values' do
|
591
|
-
new_composer.pattern_template_invocations.size.must_equal existing.pattern_template_invocations.size
|
595
|
+
_(new_composer.pattern_template_invocations.size).must_equal existing.pattern_template_invocations.size
|
592
596
|
end
|
593
597
|
|
594
598
|
it 'sets the same concurrency control options' do
|
595
|
-
new_composer.job_invocation.concurrency_level.must_equal existing.concurrency_level
|
596
|
-
new_composer.job_invocation.time_span.must_equal existing.time_span
|
599
|
+
_(new_composer.job_invocation.concurrency_level).must_equal existing.concurrency_level
|
600
|
+
_(new_composer.job_invocation.time_span).must_equal existing.time_span
|
597
601
|
end
|
598
602
|
|
599
603
|
end
|
@@ -669,7 +673,7 @@ class JobInvocationComposerTest < ActiveSupport::TestCase
|
|
669
673
|
|
670
674
|
it 'sets the effective user based on the input' do
|
671
675
|
assert composer.save!
|
672
|
-
template_invocation.effective_user.must_equal 'invocation user'
|
676
|
+
_(template_invocation.effective_user).must_equal 'invocation user'
|
673
677
|
end
|
674
678
|
end
|
675
679
|
|
@@ -681,7 +685,7 @@ class JobInvocationComposerTest < ActiveSupport::TestCase
|
|
681
685
|
:job_template_id => trying_job_template_1.id,
|
682
686
|
:concurrency_control => {
|
683
687
|
:concurrency_level => level,
|
684
|
-
:time_span => time_span
|
688
|
+
:time_span => time_span,
|
685
689
|
},
|
686
690
|
:targeting_type => 'static_query',
|
687
691
|
:search_query => 'some hosts',
|
@@ -690,8 +694,8 @@ class JobInvocationComposerTest < ActiveSupport::TestCase
|
|
690
694
|
|
691
695
|
it 'sets the concurrency level and time span based on the input' do
|
692
696
|
assert composer.save!
|
693
|
-
composer.job_invocation.time_span.must_equal time_span
|
694
|
-
composer.job_invocation.concurrency_level.must_equal level
|
697
|
+
_(composer.job_invocation.time_span).must_equal time_span
|
698
|
+
_(composer.job_invocation.concurrency_level).must_equal level
|
695
699
|
end
|
696
700
|
end
|
697
701
|
|
@@ -708,7 +712,7 @@ class JobInvocationComposerTest < ActiveSupport::TestCase
|
|
708
712
|
|
709
713
|
it 'sets the remote execution feature based on the input' do
|
710
714
|
assert composer.save!
|
711
|
-
composer.job_invocation.remote_execution_feature.must_equal feature
|
715
|
+
_(composer.job_invocation.remote_execution_feature).must_equal feature
|
712
716
|
end
|
713
717
|
end
|
714
718
|
|
@@ -757,7 +761,7 @@ class JobInvocationComposerTest < ActiveSupport::TestCase
|
|
757
761
|
error = assert_raises(ActiveRecord::RecordNotSaved) do
|
758
762
|
composer.save!
|
759
763
|
end
|
760
|
-
error.message.must_include "Template #{trying_job_template_1.name}: Input #{input3.name.downcase}: Value can't be blank"
|
764
|
+
_(error.message).must_include "Template #{trying_job_template_1.name}: Input #{input3.name.downcase}: Value can't be blank"
|
761
765
|
end
|
762
766
|
end
|
763
767
|
|
@@ -786,13 +790,13 @@ class JobInvocationComposerTest < ActiveSupport::TestCase
|
|
786
790
|
end
|
787
791
|
|
788
792
|
it 'handles errors' do
|
789
|
-
input3.must_be :required
|
793
|
+
_(input3).must_be :required
|
790
794
|
|
791
795
|
error = assert_raises(ActiveRecord::RecordNotSaved) do
|
792
796
|
composer.save!
|
793
797
|
end
|
794
798
|
|
795
|
-
error.message.must_include "Template #{trying_job_template_1.name}: Not all required inputs have values. Missing inputs: #{input3.name}"
|
799
|
+
_(error.message).must_include "Template #{trying_job_template_1.name}: Not all required inputs have values. Missing inputs: #{input3.name}"
|
796
800
|
end
|
797
801
|
end
|
798
802
|
end
|