foreman_remote_execution 1.6.5 → 1.6.6
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 +5 -5
- data/.rubocop.yml +3 -0
- data/app/controllers/job_invocations_controller.rb +5 -5
- data/app/helpers/remote_execution_helper.rb +19 -0
- data/app/views/job_invocations/index.html.erb +2 -0
- data/app/views/template_invocations/_output_line_set.html.erb +1 -1
- data/app/views/template_invocations/show.html.erb +1 -1
- data/db/migrate/20150612121541_add_job_template_to_template.rb +4 -2
- data/db/migrate/20160203104056_add_concurrency_options_to_job_invocation.rb +4 -2
- data/db/migrate/20171129103615_add_secrets_to_job_invocations.rb +4 -2
- data/lib/foreman_remote_execution/version.rb +1 -1
- data/test/functional/api/v2/foreign_input_sets_controller_test.rb +3 -3
- data/test/functional/api/v2/job_invocations_controller_test.rb +2 -2
- data/test/functional/api/v2/job_templates_controller_test.rb +6 -6
- data/test/functional/api/v2/remote_execution_features_controller_test.rb +2 -2
- data/test/helpers/remote_execution_helper_test.rb +26 -0
- data/test/unit/actions/run_host_job_test.rb +1 -1
- data/test/unit/actions/run_hosts_job_test.rb +3 -3
- data/test/unit/input_template_renderer_test.rb +9 -9
- data/test/unit/job_invocation_composer_test.rb +5 -5
- data/test/unit/job_invocation_test.rb +4 -4
- data/test/unit/job_template_effective_user_test.rb +1 -1
- data/test/unit/job_template_test.rb +4 -4
- data/test/unit/remote_execution_feature_test.rb +1 -1
- data/test/unit/targeting_test.rb +1 -1
- metadata +5 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 50fc3a3d806569cd6ef1430201210365ab43135ff49037437b5ff7d5ae26e95c
|
4
|
+
data.tar.gz: 49444e24cc7ce4d174942869a87815c7f58ac1d824493df7cba3c5f592c0dc89
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 221de0ed7b0c41a9451b8fc5fa5d1cc2cea6ef25b969e9b28e166ac31c971da5fdbfe624cca3006832f7618cc6e63aff674264d5d6346e83847f7fdb46aa6969
|
7
|
+
data.tar.gz: 2aa565d2f95cb0704cbc73d49aa7806489fb497a5a73c3738cc23240b8fc582667b8427f892da6a8523baaf69970fba4d343b1751e29e125a84cbba262551ef6
|
data/.rubocop.yml
CHANGED
@@ -51,17 +51,17 @@ class JobInvocationsController < ApplicationController
|
|
51
51
|
def show
|
52
52
|
@job_invocation = resource_base.includes(:template_invocations => :run_host_job_task).find(params[:id])
|
53
53
|
@auto_refresh = @job_invocation.task.try(:pending?)
|
54
|
-
|
54
|
+
@resource_base = @job_invocation.targeting.hosts.authorized(:view_hosts, Host)
|
55
55
|
# There's no need to do the joining if we're not filtering
|
56
56
|
unless params[:search].nil?
|
57
|
-
|
58
|
-
|
57
|
+
@resource_base = @resource_base.joins(:template_invocations)
|
58
|
+
.where(:template_invocations => { :job_invocation_id => @job_invocation.id})
|
59
59
|
end
|
60
|
-
@hosts =
|
60
|
+
@hosts = resource_base_search_and_page
|
61
61
|
end
|
62
62
|
|
63
63
|
def index
|
64
|
-
@job_invocations =
|
64
|
+
@job_invocations = resource_base_search_and_page.with_task.order('job_invocations.id DESC')
|
65
65
|
end
|
66
66
|
|
67
67
|
# refreshes the form
|
@@ -169,6 +169,25 @@ module RemoteExecutionHelper
|
|
169
169
|
end
|
170
170
|
end
|
171
171
|
|
172
|
+
# we assume that a line_set will always end with a line break. Sometimes however, the lines can
|
173
|
+
# be cut in the middle. This methods makes sure the cut line ends up in on line set
|
174
|
+
def normalize_line_sets(line_sets)
|
175
|
+
previous_line_break = true
|
176
|
+
line_sets.each_with_index do |line_set, index|
|
177
|
+
# if previous line_set was missing break, add the first line from next set
|
178
|
+
unless previous_line_break
|
179
|
+
first_line_pattern = /\A.*\n/
|
180
|
+
first_line = line_set['output'][first_line_pattern]
|
181
|
+
if first_line
|
182
|
+
line_sets[index - 1]['output'] << first_line
|
183
|
+
line_set['output'].sub!(first_line_pattern, '')
|
184
|
+
end
|
185
|
+
end
|
186
|
+
previous_line_break = line_set['output'] =~ /\n\Z/
|
187
|
+
end
|
188
|
+
line_sets
|
189
|
+
end
|
190
|
+
|
172
191
|
def time_in_words_span(time)
|
173
192
|
if time.nil?
|
174
193
|
_('N/A')
|
@@ -6,6 +6,7 @@
|
|
6
6
|
<thead>
|
7
7
|
<tr>
|
8
8
|
<th><%= sort :description, :as => _('Description') %></th>
|
9
|
+
<th class="col-md-1"><%= _('Search Query') %></th>
|
9
10
|
<th class="col-md-1"><%= _('Status') %></th>
|
10
11
|
<th class="col-md-1"><%= _('Succeeded') %></th>
|
11
12
|
<th class="col-md-1"><%= _('Failed') %></th>
|
@@ -19,6 +20,7 @@
|
|
19
20
|
<% @job_invocations.each do |invocation| %>
|
20
21
|
<tr>
|
21
22
|
<td><%= link_to_if_authorized invocation_description(invocation), hash_for_job_invocation_path(invocation).merge(:auth_object => invocation, :permission => :view_job_invocations, :authorizer => authorizer) %></td>
|
23
|
+
<td><%= trunc_with_tooltip(invocation&.targeting&.search_query, 15) %></td>
|
22
24
|
<td><%= link_to_invocation_task_if_authorized(invocation) %></td>
|
23
25
|
<td><%= invocation_result(invocation, :success_count) %></td>
|
24
26
|
<td><%= invocation_result(invocation, :failed_count) %></td>
|
@@ -1,4 +1,4 @@
|
|
1
|
-
<% output_line_set['output'].gsub("\r\n", "\n").split("\n", -1).each do |line| %>
|
1
|
+
<% output_line_set['output'].gsub("\r\n", "\n").sub(/\n\Z/, '').split("\n", -1).each do |line| %>
|
2
2
|
<%= content_tag :div, :class => 'line ' + output_line_set['output_type'], :data => { :timestamp => output_line_set['timestamp'] } do %>
|
3
3
|
|
4
4
|
<%= content_tag(:span, (@line_counter += 1).to_s.rjust(4).gsub(' ', ' ').html_safe + ':', :class => 'counter', :title => (output_line_set['timestamp'] && Time.at(output_line_set['timestamp']))) %>
|
@@ -36,7 +36,7 @@
|
|
36
36
|
<%= link_to_function(_('Scroll to bottom'), '$("html, body").animate({ scrollTop: $(document).height() }, "slow");', :class => 'pull-right scroll-link-bottom') %>
|
37
37
|
|
38
38
|
<div class="printable">
|
39
|
-
<%= render :partial => 'output_line_set', :collection => @line_sets %>
|
39
|
+
<%= render :partial => 'output_line_set', :collection => normalize_line_sets(@line_sets) %>
|
40
40
|
</div>
|
41
41
|
|
42
42
|
<%= link_to_function(_('Scroll to top'), '$("html, body").animate({ scrollTop: 0 }, "slow");', :class => 'pull-right scroll-link-top') %>
|
@@ -1,6 +1,8 @@
|
|
1
1
|
class AddJobTemplateToTemplate < ActiveRecord::Migration[4.2]
|
2
2
|
def change
|
3
|
-
|
4
|
-
|
3
|
+
change_table :templates, :bulk => true do |t|
|
4
|
+
t.column :job_name, :string, :limit => 255
|
5
|
+
t.column :provider_type, :string, :limit => 255
|
6
|
+
end
|
5
7
|
end
|
6
8
|
end
|
@@ -1,6 +1,8 @@
|
|
1
1
|
class AddConcurrencyOptionsToJobInvocation < ActiveRecord::Migration[4.2]
|
2
2
|
def change
|
3
|
-
|
4
|
-
|
3
|
+
change_table :job_invocations, :bulk => true do |t|
|
4
|
+
t.column :concurrency_level, :integer, :null => true
|
5
|
+
t.column :time_span, :integer, :null => true
|
6
|
+
end
|
5
7
|
end
|
6
8
|
end
|
@@ -1,6 +1,8 @@
|
|
1
1
|
class AddSecretsToJobInvocations < ActiveRecord::Migration[4.2]
|
2
2
|
def change
|
3
|
-
|
4
|
-
|
3
|
+
change_table :job_invocations, :bulk => true do |t|
|
4
|
+
t.column :password, :string
|
5
|
+
t.column :key_passphrase, :string
|
6
|
+
end
|
5
7
|
end
|
6
8
|
end
|
@@ -13,7 +13,7 @@ module Api
|
|
13
13
|
test 'should get index' do
|
14
14
|
get :index, params: { :template_id => @template.id }
|
15
15
|
input_sets = ActiveSupport::JSON.decode(@response.body)
|
16
|
-
|
16
|
+
assert_not input_sets.empty?, 'Should respond with input sets'
|
17
17
|
assert_response :success
|
18
18
|
end
|
19
19
|
|
@@ -21,7 +21,7 @@ module Api
|
|
21
21
|
get :show, params: { :template_id => @template.to_param, :id => @input_set.to_param }
|
22
22
|
assert_response :success
|
23
23
|
input_set = ActiveSupport::JSON.decode(@response.body)
|
24
|
-
|
24
|
+
assert_not input_set.empty?
|
25
25
|
assert_equal input_set['target_template_name'], @foreign_template.name
|
26
26
|
end
|
27
27
|
|
@@ -51,7 +51,7 @@ module Api
|
|
51
51
|
test 'should destroy' do
|
52
52
|
delete :destroy, params: { :template_id => @template.to_param, :id => @input_set.to_param }
|
53
53
|
assert_response :ok
|
54
|
-
|
54
|
+
assert_not ForeignInputSet.exists?(@input_set.id)
|
55
55
|
end
|
56
56
|
end
|
57
57
|
end
|
@@ -16,7 +16,7 @@ module Api
|
|
16
16
|
test 'should get index' do
|
17
17
|
get :index
|
18
18
|
invocations = ActiveSupport::JSON.decode(@response.body)
|
19
|
-
|
19
|
+
assert_not_empty invocations, 'Should response with invocation'
|
20
20
|
assert_response :success
|
21
21
|
end
|
22
22
|
|
@@ -24,7 +24,7 @@ module Api
|
|
24
24
|
get :show, params: { :id => @invocation.id }
|
25
25
|
assert_response :success
|
26
26
|
template = ActiveSupport::JSON.decode(@response.body)
|
27
|
-
|
27
|
+
assert_not_empty template
|
28
28
|
assert_equal template['job_category'], @invocation.job_category
|
29
29
|
end
|
30
30
|
|
@@ -10,7 +10,7 @@ module Api
|
|
10
10
|
test 'should get index' do
|
11
11
|
get :index
|
12
12
|
templates = ActiveSupport::JSON.decode(@response.body)
|
13
|
-
|
13
|
+
assert_not templates.empty?, 'Should response with template'
|
14
14
|
assert_response :success
|
15
15
|
end
|
16
16
|
|
@@ -20,7 +20,7 @@ module Api
|
|
20
20
|
@template.save!
|
21
21
|
get :index, params: { :organization_id => @organization.id }
|
22
22
|
templates = ActiveSupport::JSON.decode(@response.body)
|
23
|
-
|
23
|
+
assert_not templates.empty?, 'Should respond with template'
|
24
24
|
assert_response :success
|
25
25
|
end
|
26
26
|
|
@@ -28,10 +28,10 @@ module Api
|
|
28
28
|
get :show, params: { :id => @template.to_param }
|
29
29
|
assert_response :success
|
30
30
|
template = ActiveSupport::JSON.decode(@response.body)
|
31
|
-
|
31
|
+
assert_not template.empty?
|
32
32
|
assert_equal template['name'], @template.name
|
33
|
-
|
34
|
-
|
33
|
+
assert_not_nil template['created_at']
|
34
|
+
assert_not_nil template['updated_at']
|
35
35
|
end
|
36
36
|
|
37
37
|
test 'should create valid' do
|
@@ -74,7 +74,7 @@ module Api
|
|
74
74
|
test 'should destroy' do
|
75
75
|
delete :destroy, params: { :id => @template.to_param }
|
76
76
|
assert_response :ok
|
77
|
-
|
77
|
+
assert_not JobTemplate.exists?(@template.id)
|
78
78
|
end
|
79
79
|
|
80
80
|
test 'should clone template' do
|
@@ -13,7 +13,7 @@ module Api
|
|
13
13
|
test 'should get index' do
|
14
14
|
get :index
|
15
15
|
remote_execution_features = ActiveSupport::JSON.decode(@response.body)
|
16
|
-
|
16
|
+
assert_not remote_execution_features.empty?, 'Should respond with input sets'
|
17
17
|
assert_response :success
|
18
18
|
end
|
19
19
|
|
@@ -21,7 +21,7 @@ module Api
|
|
21
21
|
get :show, params: { :id => @remote_execution_feature.to_param }
|
22
22
|
assert_response :success
|
23
23
|
remote_execution_feature = ActiveSupport::JSON.decode(@response.body)
|
24
|
-
|
24
|
+
assert_not remote_execution_feature.empty?
|
25
25
|
assert_equal remote_execution_feature['name'], @remote_execution_feature.name
|
26
26
|
end
|
27
27
|
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'test_plugin_helper'
|
2
|
+
|
3
|
+
class RemoteExecutionHelperTest < ActionView::TestCase
|
4
|
+
describe '#normalize_line_sets' do
|
5
|
+
let :line_sets do
|
6
|
+
[{"output_type"=>"stdout", "output"=>"one", "timestamp"=>1},
|
7
|
+
{"output_type"=>"stdout", "output"=>"\r\ntwo\r\n", "timestamp"=>2},
|
8
|
+
{"output_type"=>"stdout", "output"=>"\r\nthr", "timestamp"=>3},
|
9
|
+
{"output_type"=>"stdout", "output"=>"ee\r\nfour\r\n", "timestamp"=>4},
|
10
|
+
{"output_type"=>"stdout", "output"=>"\r\n\r\n", "timestamp"=>5},
|
11
|
+
{"output_type"=>"stdout", "output"=>"five\r\n", "timestamp"=>6},
|
12
|
+
{"output_type"=>"stdout", "output"=>"Exit status: 0", "timestamp"=>7}]
|
13
|
+
end
|
14
|
+
|
15
|
+
it 'ensures the line sets end with new line' do
|
16
|
+
new_line_sets = normalize_line_sets(line_sets)
|
17
|
+
new_line_sets.map { |s| s['output'] }.must_equal(["one\r\n",
|
18
|
+
"two\r\n",
|
19
|
+
"\r\nthree\r\n",
|
20
|
+
"four\r\n",
|
21
|
+
"\r\n\r\n",
|
22
|
+
"five\r\n",
|
23
|
+
"Exit status: 0"])
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -50,15 +50,15 @@ module ForemanRemoteExecution
|
|
50
50
|
context 'targeting resolving' do
|
51
51
|
it 'resolves dynamic targeting in plan' do
|
52
52
|
targeting.targeting_type = 'dynamic_query'
|
53
|
-
|
53
|
+
assert_not targeting.resolved?
|
54
54
|
delayed
|
55
|
-
|
55
|
+
assert_not targeting.resolved?
|
56
56
|
planned
|
57
57
|
targeting.hosts.must_include(host)
|
58
58
|
end
|
59
59
|
|
60
60
|
it 'resolves the hosts on static targeting in delay' do
|
61
|
-
|
61
|
+
assert_not targeting.resolved?
|
62
62
|
delayed
|
63
63
|
targeting.hosts.must_include(host)
|
64
64
|
# Verify Targeting#resolve_hosts! won't be hit again
|
@@ -73,7 +73,7 @@ class InputTemplateRendererTest < ActiveSupport::TestCase
|
|
73
73
|
end
|
74
74
|
|
75
75
|
it 'cannot render the content' do
|
76
|
-
|
76
|
+
assert_not result
|
77
77
|
renderer.error_message.wont_be_nil
|
78
78
|
renderer.error_message.wont_be_empty
|
79
79
|
end
|
@@ -125,7 +125,7 @@ class InputTemplateRendererTest < ActiveSupport::TestCase
|
|
125
125
|
it 'handles circular references in templates' do
|
126
126
|
renderer.invocation = FactoryBot.build(:template_invocation, :template => template_without_inputs)
|
127
127
|
renderer.template = template_without_inputs
|
128
|
-
|
128
|
+
assert_not renderer.render
|
129
129
|
renderer.error_message.must_include 'Recursive rendering of templates detected'
|
130
130
|
end
|
131
131
|
|
@@ -335,7 +335,7 @@ class InputTemplateRendererTest < ActiveSupport::TestCase
|
|
335
335
|
|
336
336
|
describe 'rendering' do
|
337
337
|
it 'can\'t render the content without host since we don\'t have facts' do
|
338
|
-
|
338
|
+
assert_not result
|
339
339
|
end
|
340
340
|
|
341
341
|
it 'registers an error' do
|
@@ -349,7 +349,7 @@ class InputTemplateRendererTest < ActiveSupport::TestCase
|
|
349
349
|
|
350
350
|
describe 'rendering' do
|
351
351
|
it 'can\'t render the content without host since we don\'t have fact value' do
|
352
|
-
|
352
|
+
assert_not result
|
353
353
|
end
|
354
354
|
|
355
355
|
it 'registers an error' do
|
@@ -371,7 +371,7 @@ class InputTemplateRendererTest < ActiveSupport::TestCase
|
|
371
371
|
describe 'rendering' do
|
372
372
|
it 'can\'t render the content without host since we don\'t have fact value' do
|
373
373
|
fact # let is lazy
|
374
|
-
|
374
|
+
assert_not result
|
375
375
|
end
|
376
376
|
|
377
377
|
it 'registers an error' do
|
@@ -433,7 +433,7 @@ class InputTemplateRendererTest < ActiveSupport::TestCase
|
|
433
433
|
|
434
434
|
describe 'rendering' do
|
435
435
|
it 'can\'t render the content without host since we don\'t have host so no classification' do
|
436
|
-
|
436
|
+
assert_not result
|
437
437
|
end
|
438
438
|
|
439
439
|
it 'registers an error' do
|
@@ -451,7 +451,7 @@ class InputTemplateRendererTest < ActiveSupport::TestCase
|
|
451
451
|
|
452
452
|
describe 'rendering' do
|
453
453
|
it 'can\'t render the content without host since we don\'t have variable value in classification' do
|
454
|
-
|
454
|
+
assert_not result
|
455
455
|
end
|
456
456
|
|
457
457
|
it 'registers an error' do
|
@@ -542,7 +542,7 @@ class InputTemplateRendererTest < ActiveSupport::TestCase
|
|
542
542
|
|
543
543
|
describe 'rendering' do
|
544
544
|
it 'can\'t render the content without host since we don\'t have host so no classification' do
|
545
|
-
|
545
|
+
assert_not result
|
546
546
|
end
|
547
547
|
|
548
548
|
it 'registers an error' do
|
@@ -557,7 +557,7 @@ class InputTemplateRendererTest < ActiveSupport::TestCase
|
|
557
557
|
|
558
558
|
describe 'rendering' do
|
559
559
|
it 'can\'t render the content without host since we don\'t have puppet parameter in classification' do
|
560
|
-
|
560
|
+
assert_not result
|
561
561
|
end
|
562
562
|
|
563
563
|
it 'registers an error' do
|
@@ -131,7 +131,7 @@ class JobInvocationComposerTest < ActiveSupport::TestCase
|
|
131
131
|
|
132
132
|
it 'returns false if there is one provider' do
|
133
133
|
composer.stubs(:available_provider_types => [ 'SSH' ])
|
134
|
-
|
134
|
+
assert_not composer.needs_provider_type_selection?
|
135
135
|
end
|
136
136
|
end
|
137
137
|
|
@@ -440,7 +440,7 @@ class JobInvocationComposerTest < ActiveSupport::TestCase
|
|
440
440
|
composer.job_invocation.expects(:valid?).returns(false)
|
441
441
|
composer.targeting.expects(:valid?).returns(false)
|
442
442
|
composer.pattern_template_invocations.each { |invocation| invocation.expects(:valid?).returns(false) }
|
443
|
-
|
443
|
+
assert_not composer.valid?
|
444
444
|
end
|
445
445
|
end
|
446
446
|
|
@@ -621,7 +621,7 @@ class JobInvocationComposerTest < ActiveSupport::TestCase
|
|
621
621
|
assert composer.save!
|
622
622
|
assert_equal bookmark, composer.job_invocation.targeting.bookmark
|
623
623
|
assert_equal composer.job_invocation.targeting.user, User.current
|
624
|
-
|
624
|
+
assert_not_empty composer.job_invocation.pattern_template_invocations
|
625
625
|
end
|
626
626
|
end
|
627
627
|
|
@@ -636,7 +636,7 @@ class JobInvocationComposerTest < ActiveSupport::TestCase
|
|
636
636
|
it 'creates invocation with a search query' do
|
637
637
|
assert composer.save!
|
638
638
|
assert_equal 'some hosts', composer.job_invocation.targeting.search_query
|
639
|
-
|
639
|
+
assert_not_empty composer.job_invocation.pattern_template_invocations
|
640
640
|
end
|
641
641
|
end
|
642
642
|
|
@@ -772,7 +772,7 @@ class JobInvocationComposerTest < ActiveSupport::TestCase
|
|
772
772
|
|
773
773
|
it 'accepts the params' do
|
774
774
|
composer.save!
|
775
|
-
|
775
|
+
assert_not composer.job_invocation.new_record?
|
776
776
|
end
|
777
777
|
end
|
778
778
|
|
@@ -55,8 +55,8 @@ class JobInvocationTest < ActiveSupport::TestCase
|
|
55
55
|
job_invocation.pattern_template_invocations.first.reload
|
56
56
|
end
|
57
57
|
|
58
|
-
it {
|
59
|
-
it {
|
58
|
+
it { assert_not job_invocation.reload.pattern_template_invocations.empty? }
|
59
|
+
it { assert_not job_invocation.reload.pattern_template_invocations.first.input_values.empty? }
|
60
60
|
|
61
61
|
it "can look up templates not belonging to user's organization" do
|
62
62
|
organization = job_invocation.pattern_template_invocations.first.template.organizations.first
|
@@ -73,7 +73,7 @@ class JobInvocationTest < ActiveSupport::TestCase
|
|
73
73
|
it 'validates required inputs have values' do
|
74
74
|
assert job_invocation.valid?
|
75
75
|
@input_value.destroy
|
76
|
-
|
76
|
+
assert_not job_invocation.reload.valid?
|
77
77
|
end
|
78
78
|
|
79
79
|
describe 'descriptions' do
|
@@ -179,7 +179,7 @@ class JobInvocationTest < ActiveSupport::TestCase
|
|
179
179
|
|
180
180
|
it 'returns false if task state is pending' do
|
181
181
|
job_invocation.task.expects(:pending?).returns(true)
|
182
|
-
|
182
|
+
assert_not job_invocation.finished?
|
183
183
|
end
|
184
184
|
|
185
185
|
it 'returns true if task is not pending' do
|
@@ -13,11 +13,11 @@ class JobTemplateTest < ActiveSupport::TestCase
|
|
13
13
|
it 'has a unique name' do
|
14
14
|
template1 = FactoryBot.create(:job_template)
|
15
15
|
template2 = FactoryBot.build(:job_template, :name => template1.name)
|
16
|
-
|
16
|
+
assert_not template2.valid?
|
17
17
|
end
|
18
18
|
|
19
19
|
it 'needs a job_category' do
|
20
|
-
|
20
|
+
assert_not job_template.valid?
|
21
21
|
end
|
22
22
|
|
23
23
|
it 'does not need a job_category if it is a snippet' do
|
@@ -29,7 +29,7 @@ class JobTemplateTest < ActiveSupport::TestCase
|
|
29
29
|
job_template.job_category = 'Miscellaneous'
|
30
30
|
job_template.foreign_input_sets << FactoryBot.build(:foreign_input_set, :target_template => template_with_inputs)
|
31
31
|
job_template.foreign_input_sets << FactoryBot.build(:foreign_input_set, :target_template => template_with_inputs)
|
32
|
-
|
32
|
+
assert_not job_template.valid?
|
33
33
|
job_template.errors.full_messages.first.must_include 'Duplicated inputs detected: ["command"]'
|
34
34
|
end
|
35
35
|
end
|
@@ -213,7 +213,7 @@ class JobTemplateTest < ActiveSupport::TestCase
|
|
213
213
|
|
214
214
|
it 'will not overwrite by default' do
|
215
215
|
existing
|
216
|
-
|
216
|
+
assert_not JobTemplate.import_raw!(updated)
|
217
217
|
end
|
218
218
|
|
219
219
|
let(:synced_template) do
|
@@ -60,7 +60,7 @@ class RemoteExecutionFeatureTest < ActiveSupport::TestCase
|
|
60
60
|
feature.must_be :persisted?
|
61
61
|
feature.label.must_equal 'new_feature_that_does_not_exist'
|
62
62
|
feature.name.must_equal 'name'
|
63
|
-
|
63
|
+
assert_not feature.host_action_button
|
64
64
|
end
|
65
65
|
|
66
66
|
it 'creates a feature with host action flag' do
|
data/test/unit/targeting_test.rb
CHANGED
@@ -12,7 +12,7 @@ class TargetingTest < ActiveSupport::TestCase
|
|
12
12
|
describe '#resolved?' do
|
13
13
|
context 'resolved_at is nil' do
|
14
14
|
before { targeting.resolved_at = nil }
|
15
|
-
it {
|
15
|
+
it { assert_not targeting.resolved? }
|
16
16
|
end
|
17
17
|
|
18
18
|
context 'resolved_at is set' do
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: foreman_remote_execution
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.6.
|
4
|
+
version: 1.6.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Foreman Remote Execution team
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-
|
11
|
+
date: 2018-12-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: deface
|
@@ -360,6 +360,7 @@ files:
|
|
360
360
|
- test/functional/api/v2/template_invocations_controller_test.rb
|
361
361
|
- test/functional/job_invocations_controller_test.rb
|
362
362
|
- test/functional/job_templates_controller_test.rb
|
363
|
+
- test/helpers/remote_execution_helper_test.rb
|
363
364
|
- test/test_plugin_helper.rb
|
364
365
|
- test/unit/actions/run_host_job_test.rb
|
365
366
|
- test/unit/actions/run_hosts_job_test.rb
|
@@ -408,7 +409,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
408
409
|
version: '0'
|
409
410
|
requirements: []
|
410
411
|
rubyforge_project:
|
411
|
-
rubygems_version: 2.
|
412
|
+
rubygems_version: 2.7.3
|
412
413
|
signing_key:
|
413
414
|
specification_version: 4
|
414
415
|
summary: A plugin bringing remote execution to the Foreman, completing the config
|
@@ -424,6 +425,7 @@ test_files:
|
|
424
425
|
- test/functional/api/v2/template_invocations_controller_test.rb
|
425
426
|
- test/functional/job_invocations_controller_test.rb
|
426
427
|
- test/functional/job_templates_controller_test.rb
|
428
|
+
- test/helpers/remote_execution_helper_test.rb
|
427
429
|
- test/test_plugin_helper.rb
|
428
430
|
- test/unit/actions/run_host_job_test.rb
|
429
431
|
- test/unit/actions/run_hosts_job_test.rb
|