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
@@ -6,10 +6,10 @@ class JobInvocationsControllerTest < ActionController::TestCase
|
|
6
6
|
test 'should parse inputs coming from the URL params' do
|
7
7
|
template = FactoryBot.create(:job_template, :with_input)
|
8
8
|
feature = FactoryBot.create(:remote_execution_feature,
|
9
|
-
|
9
|
+
:job_template => template)
|
10
10
|
params = {
|
11
11
|
feature: feature.label,
|
12
|
-
inputs: { template.template_inputs.first.name => 'foobar' }
|
12
|
+
inputs: { template.template_inputs.first.name => 'foobar' },
|
13
13
|
}
|
14
14
|
|
15
15
|
get :new, params: params, session: set_session_user
|
@@ -19,20 +19,20 @@ class JobInvocationsControllerTest < ActionController::TestCase
|
|
19
19
|
[
|
20
20
|
{
|
21
21
|
'value' => 'foobar',
|
22
|
-
'template_input_id' => template.template_inputs.first.id
|
23
|
-
}
|
22
|
+
'template_input_id' => template.template_inputs.first.id,
|
23
|
+
},
|
24
24
|
],
|
25
|
-
'template_id' => template.id
|
26
|
-
}
|
25
|
+
'template_id' => template.id,
|
26
|
+
},
|
27
27
|
]
|
28
28
|
assert_equal(template_invocation_params,
|
29
|
-
|
29
|
+
assigns(:composer).params['template_invocations'])
|
30
30
|
end
|
31
31
|
|
32
32
|
test 'should allow no inputs' do
|
33
33
|
template = FactoryBot.create(:job_template)
|
34
34
|
feature = FactoryBot.create(:remote_execution_feature,
|
35
|
-
|
35
|
+
:job_template => template)
|
36
36
|
params = {
|
37
37
|
feature: feature.label,
|
38
38
|
}
|
@@ -40,10 +40,10 @@ class JobInvocationsControllerTest < ActionController::TestCase
|
|
40
40
|
template_invocation_params = [
|
41
41
|
{
|
42
42
|
'template_id' => template.id,
|
43
|
-
'input_values' => {}
|
44
|
-
}
|
43
|
+
'input_values' => {},
|
44
|
+
},
|
45
45
|
]
|
46
46
|
assert_equal(template_invocation_params,
|
47
|
-
|
47
|
+
assigns(:composer).params['template_invocations'])
|
48
48
|
end
|
49
49
|
end
|
@@ -16,7 +16,7 @@ class JobTemplatesControllerTest < ActionController::TestCase
|
|
16
16
|
post :preview, params: {
|
17
17
|
job_template: template.to_param,
|
18
18
|
template: '<%= @host.name %>',
|
19
|
-
preview_host_id: host.id
|
19
|
+
preview_host_id: host.id,
|
20
20
|
}, session: set_session_user
|
21
21
|
assert_response :success
|
22
22
|
assert_equal host.name, @response.body
|
@@ -54,13 +54,13 @@ module ForemanRemoteExecution
|
|
54
54
|
delayed
|
55
55
|
assert_not targeting.resolved?
|
56
56
|
planned
|
57
|
-
targeting.hosts.must_include(host)
|
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
|
-
targeting.hosts.must_include(host)
|
63
|
+
_(targeting.hosts).must_include(host)
|
64
64
|
# Verify Targeting#resolve_hosts! won't be hit again
|
65
65
|
targeting.expects(:resolve_hosts!).never
|
66
66
|
planned
|
@@ -68,7 +68,7 @@ module ForemanRemoteExecution
|
|
68
68
|
|
69
69
|
it 'resolves the hosts on static targeting in plan phase if not resolved yet' do
|
70
70
|
planned
|
71
|
-
targeting.hosts.must_include(host)
|
71
|
+
_(targeting.hosts).must_include(host)
|
72
72
|
end
|
73
73
|
end
|
74
74
|
|
@@ -80,16 +80,16 @@ module ForemanRemoteExecution
|
|
80
80
|
|
81
81
|
it 'uses the BindJobInvocation middleware' do
|
82
82
|
planned
|
83
|
-
job_invocation.task_id.must_equal uuid
|
83
|
+
_(job_invocation.task_id).must_equal uuid
|
84
84
|
end
|
85
85
|
|
86
86
|
# In plan phase this is handled by #action_subject
|
87
87
|
# which is expected in tests
|
88
88
|
it 'sets input in delay phase when delayed' do
|
89
89
|
job_invocation_hash = delayed.input[:job_invocation]
|
90
|
-
job_invocation_hash['id'].must_equal job_invocation.id
|
91
|
-
job_invocation_hash['name'].must_equal job_invocation.job_category
|
92
|
-
job_invocation_hash['description'].must_equal job_invocation.description
|
90
|
+
_(job_invocation_hash['id']).must_equal job_invocation.id
|
91
|
+
_(job_invocation_hash['name']).must_equal job_invocation.job_category
|
92
|
+
_(job_invocation_hash['description']).must_equal job_invocation.description
|
93
93
|
planned # To make the expectations happy
|
94
94
|
end
|
95
95
|
|
@@ -100,7 +100,7 @@ module ForemanRemoteExecution
|
|
100
100
|
it 'can be disabled' do
|
101
101
|
job_invocation.expects(:concurrency_level)
|
102
102
|
job_invocation.expects(:time_span)
|
103
|
-
planned.input.key?(:concurrency_control).must_equal false
|
103
|
+
_(planned.input.key?(:concurrency_control)).must_equal false
|
104
104
|
end
|
105
105
|
|
106
106
|
it 'can limit concurrency level' do
|
@@ -18,11 +18,11 @@ class ForemanRemoteExecutionForemanTasksCleanerExtensionsTest < ActiveSupport::T
|
|
18
18
|
|
19
19
|
it 'removes orphaned job invocations' do
|
20
20
|
job = FactoryBot.create(:job_invocation, :with_task)
|
21
|
-
JobInvocation.where(:id => job.id).count.must_equal 1
|
21
|
+
_(JobInvocation.where(:id => job.id).count).must_equal 1
|
22
22
|
job.task.delete
|
23
23
|
job.reload
|
24
|
-
job.task.must_be :nil?
|
25
|
-
job.task_id.wont_be :nil?
|
24
|
+
_(job.task).must_be :nil?
|
25
|
+
_(job.task_id).wont_be :nil?
|
26
26
|
ForemanTasks::Cleaner.new(:filter => '').delete
|
27
27
|
JobInvocation.where(:id => job.id).must_be :empty?
|
28
28
|
end
|
@@ -20,32 +20,32 @@ class ForemanRemoteExecutionHostExtensionsTest < ActiveSupport::TestCase
|
|
20
20
|
end
|
21
21
|
|
22
22
|
it 'has ssh user in the parameters' do
|
23
|
-
host.host_param('remote_execution_ssh_user').must_equal Setting[:remote_execution_ssh_user]
|
23
|
+
_(host.host_param('remote_execution_ssh_user')).must_equal Setting[:remote_execution_ssh_user]
|
24
24
|
end
|
25
25
|
|
26
26
|
it 'can override ssh user' do
|
27
27
|
host.host_parameters << FactoryBot.create(:host_parameter, :host => host, :name => 'remote_execution_ssh_user', :value => 'amy')
|
28
|
-
host.host_param('remote_execution_ssh_user').must_equal 'amy'
|
28
|
+
_(host.host_param('remote_execution_ssh_user')).must_equal 'amy'
|
29
29
|
end
|
30
30
|
|
31
31
|
it 'has effective user method in the parameters' do
|
32
|
-
host.host_param('remote_execution_effective_user_method').must_equal Setting[:remote_execution_effective_user_method]
|
32
|
+
_(host.host_param('remote_execution_effective_user_method')).must_equal Setting[:remote_execution_effective_user_method]
|
33
33
|
end
|
34
34
|
|
35
35
|
it 'can override effective user method' do
|
36
36
|
host.host_parameters << FactoryBot.create(:host_parameter, :host => host, :name => 'remote_execution_effective_user_method', :value => 'su')
|
37
|
-
host.host_param('remote_execution_effective_user_method').must_equal 'su'
|
37
|
+
_(host.host_param('remote_execution_effective_user_method')).must_equal 'su'
|
38
38
|
end
|
39
39
|
|
40
40
|
it 'has ssh keys in the parameters' do
|
41
|
-
host.remote_execution_ssh_keys.must_include sshkey
|
41
|
+
_(host.remote_execution_ssh_keys).must_include sshkey
|
42
42
|
end
|
43
43
|
|
44
44
|
it 'merges ssh keys from host parameters and proxies' do
|
45
45
|
key = 'ssh-rsa not-even-a-key something@somewhere.com'
|
46
46
|
host.host_parameters << FactoryBot.create(:host_parameter, :host => host, :name => 'remote_execution_ssh_keys', :value => [key])
|
47
|
-
host.host_param('remote_execution_ssh_keys').must_include key
|
48
|
-
host.host_param('remote_execution_ssh_keys').must_include sshkey
|
47
|
+
_(host.host_param('remote_execution_ssh_keys')).must_include key
|
48
|
+
_(host.host_param('remote_execution_ssh_keys')).must_include sshkey
|
49
49
|
end
|
50
50
|
|
51
51
|
it 'has ssh keys in the parameters even when no user specified' do
|
@@ -53,7 +53,7 @@ class ForemanRemoteExecutionHostExtensionsTest < ActiveSupport::TestCase
|
|
53
53
|
FactoryBot.create(:smart_proxy, :ssh)
|
54
54
|
host.interfaces.first.subnet.remote_execution_proxies.clear
|
55
55
|
User.current = nil
|
56
|
-
host.remote_execution_ssh_keys.must_include sshkey
|
56
|
+
_(host.remote_execution_ssh_keys).must_include sshkey
|
57
57
|
end
|
58
58
|
end
|
59
59
|
|
@@ -63,11 +63,11 @@ class ForemanRemoteExecutionHostExtensionsTest < ActiveSupport::TestCase
|
|
63
63
|
it 'should only have one execution interface' do
|
64
64
|
host.interfaces << FactoryBot.build(:nic_managed)
|
65
65
|
host.interfaces.each { |interface| interface.execution = true }
|
66
|
-
host.wont_be :valid?
|
66
|
+
_(host).wont_be :valid?
|
67
67
|
end
|
68
68
|
|
69
69
|
it 'returns the execution interface' do
|
70
|
-
host.execution_interface.must_be_kind_of Nic::Managed
|
70
|
+
_(host.execution_interface).must_be_kind_of Nic::Managed
|
71
71
|
end
|
72
72
|
end
|
73
73
|
|
@@ -86,16 +86,16 @@ class ForemanRemoteExecutionHostExtensionsTest < ActiveSupport::TestCase
|
|
86
86
|
|
87
87
|
it 'finds hosts for job_invocation.id' do
|
88
88
|
found_ids = Host.search_for("job_invocation.id = #{job.id}").map(&:id).sort
|
89
|
-
found_ids.must_equal job.template_invocations_host_ids.sort
|
89
|
+
_(found_ids).must_equal job.template_invocations_host_ids.sort
|
90
90
|
end
|
91
91
|
|
92
92
|
it 'finds hosts by job_invocation.result' do
|
93
93
|
success, failed = job.template_invocations
|
94
94
|
.partition { |template| template.run_host_job_task.result == 'success' }
|
95
95
|
found_ids = Host.search_for('job_invocation.result = success').map(&:id)
|
96
|
-
found_ids.must_equal success.map(&:host_id)
|
96
|
+
_(found_ids).must_equal success.map(&:host_id)
|
97
97
|
found_ids = Host.search_for('job_invocation.result = failed').map(&:id)
|
98
|
-
found_ids.must_equal failed.map(&:host_id)
|
98
|
+
_(found_ids).must_equal failed.map(&:host_id)
|
99
99
|
end
|
100
100
|
|
101
101
|
it 'finds hosts by job_invocation.id and job_invocation.result' do
|
@@ -103,17 +103,17 @@ class ForemanRemoteExecutionHostExtensionsTest < ActiveSupport::TestCase
|
|
103
103
|
job
|
104
104
|
job2
|
105
105
|
|
106
|
-
Host.search_for("job_invocation.id = #{job.id}").count.must_equal 2
|
107
|
-
Host.search_for("job_invocation.id = #{job2.id}").count.must_equal 2
|
108
|
-
Host.search_for('job_invocation.result = success').count.must_equal 2
|
109
|
-
Host.search_for('job_invocation.result = failed').count.must_equal 2
|
106
|
+
_(Host.search_for("job_invocation.id = #{job.id}").count).must_equal 2
|
107
|
+
_(Host.search_for("job_invocation.id = #{job2.id}").count).must_equal 2
|
108
|
+
_(Host.search_for('job_invocation.result = success').count).must_equal 2
|
109
|
+
_(Host.search_for('job_invocation.result = failed').count).must_equal 2
|
110
110
|
|
111
111
|
success, failed = job.template_invocations
|
112
112
|
.partition { |template| template.run_host_job_task.result == 'success' }
|
113
113
|
found_ids = Host.search_for("job_invocation.id = #{job.id} AND job_invocation.result = success").map(&:id)
|
114
|
-
found_ids.must_equal success.map(&:host_id)
|
114
|
+
_(found_ids).must_equal success.map(&:host_id)
|
115
115
|
found_ids = Host.search_for("job_invocation.id = #{job.id} AND job_invocation.result = failed").map(&:id)
|
116
|
-
found_ids.must_equal failed.map(&:host_id)
|
116
|
+
_(found_ids).must_equal failed.map(&:host_id)
|
117
117
|
end
|
118
118
|
end
|
119
119
|
|
@@ -4,6 +4,6 @@ class ForemanRemoteExecutionNicExtensionsTest < ActiveSupport::TestCase
|
|
4
4
|
let(:host) { FactoryBot.create(:host) }
|
5
5
|
|
6
6
|
it 'sets the first primary interface as the execution interface' do
|
7
|
-
host.execution_interface.must_equal host.interfaces.first
|
7
|
+
_(host.execution_interface).must_equal host.interfaces.first
|
8
8
|
end
|
9
9
|
end
|
@@ -5,11 +5,11 @@ class ExecutionTaskStatusMapperTest < ActiveSupport::TestCase
|
|
5
5
|
let(:subject) { HostStatus::ExecutionStatus::ExecutionTaskStatusMapper }
|
6
6
|
|
7
7
|
it 'accepts status number as well as string representation' do
|
8
|
-
subject.sql_conditions_for(HostStatus::ExecutionStatus::ERROR).must_equal subject.sql_conditions_for('failed')
|
8
|
+
_(subject.sql_conditions_for(HostStatus::ExecutionStatus::ERROR)).must_equal subject.sql_conditions_for('failed')
|
9
9
|
end
|
10
10
|
|
11
11
|
it 'does not find any task for unknown state' do
|
12
|
-
subject.sql_conditions_for(-1).must_equal [ '1 = 0' ]
|
12
|
+
_(subject.sql_conditions_for(-1)).must_equal [ '1 = 0' ]
|
13
13
|
end
|
14
14
|
end
|
15
15
|
|
@@ -22,12 +22,12 @@ class ExecutionTaskStatusMapperTest < ActiveSupport::TestCase
|
|
22
22
|
describe 'is queued' do
|
23
23
|
context 'when there is no task' do
|
24
24
|
before { subject.task = nil }
|
25
|
-
specify { subject.status.must_equal HostStatus::ExecutionStatus::QUEUED }
|
25
|
+
specify { _(subject.status).must_equal HostStatus::ExecutionStatus::QUEUED }
|
26
26
|
end
|
27
27
|
|
28
28
|
context 'when the task is scheduled in future' do
|
29
29
|
before { subject.task.state = 'scheduled' }
|
30
|
-
specify { subject.status.must_equal HostStatus::ExecutionStatus::QUEUED }
|
30
|
+
specify { _(subject.status).must_equal HostStatus::ExecutionStatus::QUEUED }
|
31
31
|
end
|
32
32
|
end
|
33
33
|
|
@@ -37,19 +37,19 @@ class ExecutionTaskStatusMapperTest < ActiveSupport::TestCase
|
|
37
37
|
describe 'is succeeded' do
|
38
38
|
context 'without error' do
|
39
39
|
before { subject.task.result = 'success' }
|
40
|
-
specify { subject.status.must_equal HostStatus::ExecutionStatus::OK }
|
40
|
+
specify { _(subject.status).must_equal HostStatus::ExecutionStatus::OK }
|
41
41
|
end
|
42
42
|
end
|
43
43
|
|
44
44
|
describe 'is failed' do
|
45
45
|
context 'with error' do
|
46
46
|
before { subject.task.result = 'error' }
|
47
|
-
specify { subject.status.must_equal HostStatus::ExecutionStatus::ERROR }
|
47
|
+
specify { _(subject.status).must_equal HostStatus::ExecutionStatus::ERROR }
|
48
48
|
end
|
49
49
|
|
50
50
|
context 'without error but just with warning (sub task failed)' do
|
51
51
|
before { subject.task.result = 'warning' }
|
52
|
-
specify { subject.status.must_equal HostStatus::ExecutionStatus::ERROR }
|
52
|
+
specify { _(subject.status).must_equal HostStatus::ExecutionStatus::ERROR }
|
53
53
|
end
|
54
54
|
end
|
55
55
|
end
|
@@ -58,7 +58,7 @@ class ExecutionTaskStatusMapperTest < ActiveSupport::TestCase
|
|
58
58
|
before { subject.task.state = 'running' }
|
59
59
|
|
60
60
|
describe 'is pending' do
|
61
|
-
specify { subject.status.must_equal HostStatus::ExecutionStatus::RUNNING }
|
61
|
+
specify { _(subject.status).must_equal HostStatus::ExecutionStatus::RUNNING }
|
62
62
|
end
|
63
63
|
end
|
64
64
|
end
|
@@ -73,7 +73,7 @@ class ExecutionTaskStatusMapperTest < ActiveSupport::TestCase
|
|
73
73
|
end
|
74
74
|
|
75
75
|
it 'returns ok label' do
|
76
|
-
subject.must_equal HostStatus::ExecutionStatus::STATUS_NAMES[HostStatus::ExecutionStatus::OK]
|
76
|
+
_(subject).must_equal HostStatus::ExecutionStatus::STATUS_NAMES[HostStatus::ExecutionStatus::OK]
|
77
77
|
end
|
78
78
|
end
|
79
79
|
|
@@ -84,7 +84,7 @@ class ExecutionTaskStatusMapperTest < ActiveSupport::TestCase
|
|
84
84
|
end
|
85
85
|
|
86
86
|
it 'returns failed label' do
|
87
|
-
subject.must_equal HostStatus::ExecutionStatus::STATUS_NAMES[HostStatus::ExecutionStatus::ERROR]
|
87
|
+
_(subject).must_equal HostStatus::ExecutionStatus::STATUS_NAMES[HostStatus::ExecutionStatus::ERROR]
|
88
88
|
end
|
89
89
|
end
|
90
90
|
end
|
@@ -7,17 +7,17 @@ class InputTemplateRendererTest < ActiveSupport::TestCase
|
|
7
7
|
let(:renderer) { InputTemplateRenderer.new(FactoryBot.build(:job_template, :template => 'id <%= preview? %>')) }
|
8
8
|
|
9
9
|
it 'should render the content' do
|
10
|
-
renderer.render.must_equal 'id false'
|
10
|
+
_(renderer.render).must_equal 'id false'
|
11
11
|
end
|
12
12
|
|
13
13
|
it 'should render preview' do
|
14
|
-
renderer.preview.must_equal 'id true'
|
14
|
+
_(renderer.preview).must_equal 'id true'
|
15
15
|
end
|
16
16
|
|
17
17
|
it 'should allow accessing current_user' do
|
18
18
|
setup_user(:view_job_templates)
|
19
19
|
renderer = InputTemplateRenderer.new(FactoryBot.build(:job_template, :template => "They call me '<%= current_user %>'"))
|
20
|
-
renderer.preview.must_equal "They call me '#{User.current.login}'"
|
20
|
+
_(renderer.preview).must_equal "They call me '#{User.current.login}'"
|
21
21
|
end
|
22
22
|
end
|
23
23
|
|
@@ -28,23 +28,23 @@ class InputTemplateRendererTest < ActiveSupport::TestCase
|
|
28
28
|
context 'but without input defined' do
|
29
29
|
describe 'rendering' do
|
30
30
|
let(:result) { renderer.render }
|
31
|
-
it { result.must_equal false }
|
31
|
+
it { _(result).must_equal false }
|
32
32
|
|
33
33
|
it 'registers an error' do
|
34
34
|
result # let is lazy
|
35
|
-
renderer.error_message.wont_be_nil
|
36
|
-
renderer.error_message.wont_be_empty
|
35
|
+
_(renderer.error_message).wont_be_nil
|
36
|
+
_(renderer.error_message).wont_be_empty
|
37
37
|
end
|
38
38
|
end
|
39
39
|
|
40
40
|
describe 'preview' do
|
41
41
|
let(:result) { renderer.preview }
|
42
|
-
it { result.must_equal false }
|
42
|
+
it { _(result).must_equal false }
|
43
43
|
|
44
44
|
it 'registers an error' do
|
45
45
|
result # let is lazy
|
46
|
-
renderer.error_message.wont_be_nil
|
47
|
-
renderer.error_message.wont_be_empty
|
46
|
+
_(renderer.error_message).wont_be_nil
|
47
|
+
_(renderer.error_message).wont_be_empty
|
48
48
|
end
|
49
49
|
end
|
50
50
|
end
|
@@ -62,41 +62,41 @@ class InputTemplateRendererTest < ActiveSupport::TestCase
|
|
62
62
|
|
63
63
|
describe 'rendering' do
|
64
64
|
it 'can preview' do
|
65
|
-
renderer.preview.must_equal 'service restart $USER_INPUT[service_name]'
|
65
|
+
_(renderer.preview).must_equal 'service restart $USER_INPUT[service_name]'
|
66
66
|
end
|
67
67
|
|
68
68
|
context 'with invocation specified and a required input' do
|
69
69
|
before do
|
70
|
-
template.template_inputs.first.
|
70
|
+
template.template_inputs.first.update(:required => true)
|
71
71
|
template_invocation.reload
|
72
72
|
renderer.invocation = template_invocation
|
73
73
|
end
|
74
74
|
|
75
75
|
it 'cannot render the content' do
|
76
76
|
assert_not result
|
77
|
-
renderer.error_message.wont_be_nil
|
78
|
-
renderer.error_message.wont_be_empty
|
77
|
+
_(renderer.error_message).wont_be_nil
|
78
|
+
_(renderer.error_message).wont_be_empty
|
79
79
|
end
|
80
80
|
end
|
81
81
|
|
82
82
|
context 'with invocation specified' do
|
83
83
|
before do
|
84
84
|
FactoryBot.create(:template_invocation_input_value,
|
85
|
-
|
86
|
-
|
87
|
-
|
85
|
+
:template_invocation => template_invocation,
|
86
|
+
:template_input => template.template_inputs.first,
|
87
|
+
:value => 'foreman')
|
88
88
|
template_invocation.reload # need to get input_values findable
|
89
89
|
renderer.invocation = template_invocation
|
90
90
|
end
|
91
91
|
|
92
92
|
it 'can render with job invocation with corresponding value' do
|
93
|
-
renderer.render.must_equal 'service restart foreman'
|
93
|
+
_(renderer.render).must_equal 'service restart foreman'
|
94
94
|
end
|
95
95
|
end
|
96
96
|
|
97
97
|
it 'renders even without an input value' do
|
98
98
|
renderer.invocation = template_invocation
|
99
|
-
renderer.render.must_equal 'service restart '
|
99
|
+
_(renderer.render).must_equal 'service restart '
|
100
100
|
end
|
101
101
|
|
102
102
|
describe 'with circular reference' do
|
@@ -126,7 +126,7 @@ class InputTemplateRendererTest < ActiveSupport::TestCase
|
|
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
|
-
renderer.error_message.must_include 'Recursive rendering of templates detected'
|
129
|
+
_(renderer.error_message).must_include 'Recursive rendering of templates detected'
|
130
130
|
end
|
131
131
|
|
132
132
|
it 'handles circular references in inputs' do
|
@@ -161,7 +161,7 @@ class InputTemplateRendererTest < ActiveSupport::TestCase
|
|
161
161
|
|
162
162
|
let(:template) do
|
163
163
|
FactoryBot.create(:job_template,
|
164
|
-
|
164
|
+
:template => '<%= render_template("package action", { :action => "install" }, { :with_foreign_input_set => true }) %>').tap do |template|
|
165
165
|
template.foreign_input_sets << FactoryBot.build(:foreign_input_set, :target_template => package_template, :include_all => true, :exclude => 'action')
|
166
166
|
end
|
167
167
|
end
|
@@ -189,13 +189,13 @@ class InputTemplateRendererTest < ActiveSupport::TestCase
|
|
189
189
|
let(:template_2) do
|
190
190
|
FactoryBot.create(:job_template, :template => '<%= render_template("package action", "action" => "install") %>').tap do |template|
|
191
191
|
template.foreign_input_sets << FactoryBot.build(:foreign_input_set,
|
192
|
-
|
192
|
+
:target_template => package_template, :include_all => true, :include => '', :exclude => '')
|
193
193
|
end
|
194
194
|
end
|
195
195
|
|
196
196
|
it 'includes all inputs from the imported template' do
|
197
|
-
template.template_inputs_with_foreign.map(&:name).sort.must_equal ['action', 'debug', 'package']
|
198
|
-
template_2.template_inputs_with_foreign.map(&:name).sort.must_equal ['action', 'debug', 'package']
|
197
|
+
_(template.template_inputs_with_foreign.map(&:name).sort).must_equal ['action', 'debug', 'package']
|
198
|
+
_(template_2.template_inputs_with_foreign.map(&:name).sort).must_equal ['action', 'debug', 'package']
|
199
199
|
end
|
200
200
|
end
|
201
201
|
|
@@ -207,7 +207,7 @@ class InputTemplateRendererTest < ActiveSupport::TestCase
|
|
207
207
|
end
|
208
208
|
|
209
209
|
it 'includes all inputs from the imported template except the listed once' do
|
210
|
-
template.template_inputs_with_foreign.map(&:name).sort.must_equal ['package']
|
210
|
+
_(template.template_inputs_with_foreign.map(&:name).sort).must_equal ['package']
|
211
211
|
end
|
212
212
|
end
|
213
213
|
|
@@ -220,7 +220,7 @@ class InputTemplateRendererTest < ActiveSupport::TestCase
|
|
220
220
|
end
|
221
221
|
|
222
222
|
it 'includes all inputs from the imported template' do
|
223
|
-
template.template_inputs_with_foreign.map(&:name).sort.must_equal ['package']
|
223
|
+
_(template.template_inputs_with_foreign.map(&:name).sort).must_equal ['package']
|
224
224
|
end
|
225
225
|
end
|
226
226
|
end
|
@@ -228,24 +228,24 @@ class InputTemplateRendererTest < ActiveSupport::TestCase
|
|
228
228
|
context 'with invocation specified' do
|
229
229
|
before do
|
230
230
|
FactoryBot.create(:template_invocation_input_value,
|
231
|
-
|
232
|
-
|
233
|
-
|
231
|
+
:template_invocation => template_invocation,
|
232
|
+
:template_input => template.template_inputs_with_foreign.find { |input| input.name == 'package' },
|
233
|
+
:value => 'zsh')
|
234
234
|
renderer.invocation = template_invocation
|
235
235
|
renderer.invocation.reload
|
236
236
|
end
|
237
237
|
|
238
238
|
it 'can render with job invocation with corresponding value' do
|
239
239
|
rendered = renderer.render
|
240
|
-
renderer.error_message.must_be_nil
|
241
|
-
rendered.must_equal 'yum -y install zsh'
|
240
|
+
_(renderer.error_message).must_be_nil
|
241
|
+
_(rendered).must_equal 'yum -y install zsh'
|
242
242
|
end
|
243
243
|
end
|
244
244
|
|
245
245
|
context 'with explicitly specifying inputs' do
|
246
246
|
let(:template) do
|
247
247
|
FactoryBot.create(:job_template,
|
248
|
-
|
248
|
+
:template => '<%= render_template("package action", {"action" => "install", :package => "zsh"}) %>')
|
249
249
|
end
|
250
250
|
|
251
251
|
before do
|
@@ -255,16 +255,16 @@ class InputTemplateRendererTest < ActiveSupport::TestCase
|
|
255
255
|
|
256
256
|
it 'can render with job invocation with corresponding value' do
|
257
257
|
rendered = renderer.render
|
258
|
-
renderer.error_message.must_be_nil
|
259
|
-
rendered.must_equal 'yum -y install zsh'
|
258
|
+
_(renderer.error_message).must_be_nil
|
259
|
+
_(rendered).must_equal 'yum -y install zsh'
|
260
260
|
end
|
261
261
|
end
|
262
262
|
|
263
263
|
it 'renders even without an input value' do
|
264
264
|
renderer.invocation = template_invocation
|
265
265
|
rendered = renderer.render
|
266
|
-
renderer.error_message.must_be_nil
|
267
|
-
rendered.must_equal 'yum -y install '
|
266
|
+
_(renderer.error_message).must_be_nil
|
267
|
+
_(rendered).must_equal 'yum -y install '
|
268
268
|
end
|
269
269
|
end
|
270
270
|
|
@@ -275,9 +275,9 @@ class InputTemplateRendererTest < ActiveSupport::TestCase
|
|
275
275
|
let(:required) { false }
|
276
276
|
let(:input) do
|
277
277
|
FactoryBot.create(:template_invocation_input_value,
|
278
|
-
|
279
|
-
|
280
|
-
|
278
|
+
:template_invocation => template_invocation,
|
279
|
+
:template_input => template.template_inputs.first,
|
280
|
+
:value => 'foreman')
|
281
281
|
end
|
282
282
|
|
283
283
|
before do
|
@@ -291,7 +291,7 @@ class InputTemplateRendererTest < ActiveSupport::TestCase
|
|
291
291
|
context 'with a valid input defined' do
|
292
292
|
context 'with an optional input' do
|
293
293
|
it 'can render with job invocation with corresponding value' do
|
294
|
-
result.must_equal 'service restart foreman'
|
294
|
+
_(result).must_equal 'service restart foreman'
|
295
295
|
end
|
296
296
|
end
|
297
297
|
|
@@ -299,7 +299,7 @@ class InputTemplateRendererTest < ActiveSupport::TestCase
|
|
299
299
|
let(:required) { true }
|
300
300
|
|
301
301
|
it 'renders the template when the input is provided' do
|
302
|
-
result.must_equal 'service restart foreman'
|
302
|
+
_(result).must_equal 'service restart foreman'
|
303
303
|
end
|
304
304
|
end
|
305
305
|
end
|
@@ -309,7 +309,7 @@ class InputTemplateRendererTest < ActiveSupport::TestCase
|
|
309
309
|
|
310
310
|
context 'with optional input' do
|
311
311
|
it 'renders the template' do
|
312
|
-
result.must_equal 'service restart '
|
312
|
+
_(result).must_equal 'service restart '
|
313
313
|
end
|
314
314
|
end
|
315
315
|
|
@@ -340,8 +340,8 @@ class InputTemplateRendererTest < ActiveSupport::TestCase
|
|
340
340
|
|
341
341
|
it 'registers an error' do
|
342
342
|
result # let is lazy
|
343
|
-
renderer.error_message.wont_be_nil
|
344
|
-
renderer.error_message.wont_be_empty
|
343
|
+
_(renderer.error_message).wont_be_nil
|
344
|
+
_(renderer.error_message).wont_be_empty
|
345
345
|
end
|
346
346
|
|
347
347
|
context 'with host specified' do
|
@@ -354,14 +354,14 @@ class InputTemplateRendererTest < ActiveSupport::TestCase
|
|
354
354
|
|
355
355
|
it 'registers an error' do
|
356
356
|
result # let is lazy
|
357
|
-
renderer.error_message.wont_be_nil
|
358
|
-
renderer.error_message.wont_be_empty
|
357
|
+
_(renderer.error_message).wont_be_nil
|
358
|
+
_(renderer.error_message).wont_be_empty
|
359
359
|
end
|
360
360
|
end
|
361
361
|
|
362
362
|
describe 'preview' do
|
363
363
|
it 'should render preview' do
|
364
|
-
renderer.preview.must_equal 'echo $FACT_INPUT[issue] > /etc/issue'
|
364
|
+
_(renderer.preview).must_equal 'echo $FACT_INPUT[issue] > /etc/issue'
|
365
365
|
end
|
366
366
|
end
|
367
367
|
|
@@ -376,14 +376,14 @@ class InputTemplateRendererTest < ActiveSupport::TestCase
|
|
376
376
|
|
377
377
|
it 'registers an error' do
|
378
378
|
result # let is lazy
|
379
|
-
renderer.error_message.wont_be_nil
|
380
|
-
renderer.error_message.wont_be_empty
|
379
|
+
_(renderer.error_message).wont_be_nil
|
380
|
+
_(renderer.error_message).wont_be_empty
|
381
381
|
end
|
382
382
|
end
|
383
383
|
|
384
384
|
describe 'preview' do
|
385
385
|
it 'should render preview' do
|
386
|
-
renderer.preview.must_equal 'echo $FACT_INPUT[issue] > /etc/issue'
|
386
|
+
_(renderer.preview).must_equal 'echo $FACT_INPUT[issue] > /etc/issue'
|
387
387
|
end
|
388
388
|
end
|
389
389
|
|
@@ -393,7 +393,7 @@ class InputTemplateRendererTest < ActiveSupport::TestCase
|
|
393
393
|
let(:result) { renderer.render }
|
394
394
|
|
395
395
|
it 'can render with job invocation with corresponding value' do
|
396
|
-
result.must_equal 'echo banner > /etc/issue'
|
396
|
+
_(result).must_equal 'echo banner > /etc/issue'
|
397
397
|
end
|
398
398
|
end
|
399
399
|
end
|
@@ -402,7 +402,7 @@ class InputTemplateRendererTest < ActiveSupport::TestCase
|
|
402
402
|
|
403
403
|
describe 'preview' do
|
404
404
|
it 'should render preview' do
|
405
|
-
renderer.preview.must_equal 'echo $FACT_INPUT[issue] > /etc/issue'
|
405
|
+
_(renderer.preview).must_equal 'echo $FACT_INPUT[issue] > /etc/issue'
|
406
406
|
end
|
407
407
|
|
408
408
|
context 'with host specified' do
|
@@ -416,7 +416,7 @@ class InputTemplateRendererTest < ActiveSupport::TestCase
|
|
416
416
|
let(:result) { renderer.render }
|
417
417
|
|
418
418
|
it 'uses the value even in preview' do
|
419
|
-
result.must_equal 'echo banner > /etc/issue'
|
419
|
+
_(result).must_equal 'echo banner > /etc/issue'
|
420
420
|
end
|
421
421
|
end
|
422
422
|
end
|
@@ -438,8 +438,8 @@ class InputTemplateRendererTest < ActiveSupport::TestCase
|
|
438
438
|
|
439
439
|
it 'registers an error' do
|
440
440
|
result # let is lazy
|
441
|
-
renderer.error_message.wont_be_nil
|
442
|
-
renderer.error_message.wont_be_empty
|
441
|
+
_(renderer.error_message).wont_be_nil
|
442
|
+
_(renderer.error_message).wont_be_empty
|
443
443
|
end
|
444
444
|
|
445
445
|
context 'with host specified' do
|
@@ -456,14 +456,14 @@ class InputTemplateRendererTest < ActiveSupport::TestCase
|
|
456
456
|
|
457
457
|
it 'registers an error' do
|
458
458
|
result # let is lazy
|
459
|
-
renderer.error_message.wont_be_nil
|
460
|
-
renderer.error_message.wont_be_empty
|
459
|
+
_(renderer.error_message).wont_be_nil
|
460
|
+
_(renderer.error_message).wont_be_empty
|
461
461
|
end
|
462
462
|
end
|
463
463
|
|
464
464
|
describe 'preview' do
|
465
465
|
it 'should render preview' do
|
466
|
-
renderer.preview.must_equal 'echo $VARIABLE_INPUT[client_key] > /etc/chef/client.pem'
|
466
|
+
_(renderer.preview).must_equal 'echo $VARIABLE_INPUT[client_key] > /etc/chef/client.pem'
|
467
467
|
end
|
468
468
|
end
|
469
469
|
|
@@ -475,7 +475,7 @@ class InputTemplateRendererTest < ActiveSupport::TestCase
|
|
475
475
|
it 'renders the value from host parameter' do
|
476
476
|
parameter
|
477
477
|
renderer.host.reload
|
478
|
-
result.must_equal 'echo RSA KEY > /etc/chef/client.pem'
|
478
|
+
_(result).must_equal 'echo RSA KEY > /etc/chef/client.pem'
|
479
479
|
end
|
480
480
|
end
|
481
481
|
|
@@ -483,7 +483,7 @@ class InputTemplateRendererTest < ActiveSupport::TestCase
|
|
483
483
|
it 'should render preview' do
|
484
484
|
parameter
|
485
485
|
renderer.host.reload
|
486
|
-
renderer.preview.must_equal 'echo RSA KEY > /etc/chef/client.pem'
|
486
|
+
_(renderer.preview).must_equal 'echo RSA KEY > /etc/chef/client.pem'
|
487
487
|
end
|
488
488
|
end
|
489
489
|
end
|
@@ -491,7 +491,7 @@ class InputTemplateRendererTest < ActiveSupport::TestCase
|
|
491
491
|
|
492
492
|
describe 'preview' do
|
493
493
|
it 'should render preview' do
|
494
|
-
renderer.preview.must_equal 'echo $VARIABLE_INPUT[client_key] > /etc/chef/client.pem'
|
494
|
+
_(renderer.preview).must_equal 'echo $VARIABLE_INPUT[client_key] > /etc/chef/client.pem'
|
495
495
|
end
|
496
496
|
end
|
497
497
|
end
|
@@ -505,10 +505,10 @@ class InputTemplateRendererTest < ActiveSupport::TestCase
|
|
505
505
|
context 'with matching input defined' do
|
506
506
|
before do
|
507
507
|
renderer.template.template_inputs<< FactoryBot.build(:template_input,
|
508
|
-
|
509
|
-
|
510
|
-
|
511
|
-
|
508
|
+
:name => 'nginx_version',
|
509
|
+
:input_type => 'puppet_parameter',
|
510
|
+
:puppet_parameter_name => 'version',
|
511
|
+
:puppet_class_name => 'nginx')
|
512
512
|
end
|
513
513
|
let(:result) { renderer.render }
|
514
514
|
|
@@ -519,8 +519,8 @@ class InputTemplateRendererTest < ActiveSupport::TestCase
|
|
519
519
|
|
520
520
|
it 'registers an error' do
|
521
521
|
result # let is lazy
|
522
|
-
renderer.error_message.wont_be_nil
|
523
|
-
renderer.error_message.wont_be_empty
|
522
|
+
_(renderer.error_message).wont_be_nil
|
523
|
+
_(renderer.error_message).wont_be_empty
|
524
524
|
end
|
525
525
|
|
526
526
|
context 'with host specified' do
|
@@ -534,14 +534,14 @@ class InputTemplateRendererTest < ActiveSupport::TestCase
|
|
534
534
|
|
535
535
|
it 'registers an error' do
|
536
536
|
result # let is lazy
|
537
|
-
renderer.error_message.wont_be_nil
|
538
|
-
renderer.error_message.wont_be_empty
|
537
|
+
_(renderer.error_message).wont_be_nil
|
538
|
+
_(renderer.error_message).wont_be_empty
|
539
539
|
end
|
540
540
|
end
|
541
541
|
|
542
542
|
describe 'preview' do
|
543
543
|
it 'should render preview' do
|
544
|
-
renderer.preview.must_equal 'echo "This is WebServer with nginx $PUPPET_PARAMETER_INPUT[nginx_version]" > /etc/motd'
|
544
|
+
_(renderer.preview).must_equal 'echo "This is WebServer with nginx $PUPPET_PARAMETER_INPUT[nginx_version]" > /etc/motd'
|
545
545
|
end
|
546
546
|
end
|
547
547
|
|
@@ -553,24 +553,24 @@ class InputTemplateRendererTest < ActiveSupport::TestCase
|
|
553
553
|
end
|
554
554
|
let(:lookup_key) do
|
555
555
|
FactoryBot.create(:puppetclass_lookup_key, :as_smart_class_param,
|
556
|
-
|
557
|
-
|
558
|
-
|
559
|
-
|
560
|
-
|
556
|
+
:key => 'version',
|
557
|
+
:puppetclass => puppet_class,
|
558
|
+
:path => 'fqdn',
|
559
|
+
:override => true,
|
560
|
+
:overrides => {"fqdn=#{renderer.host.fqdn}" => '1.4.7'})
|
561
561
|
end
|
562
562
|
|
563
563
|
describe 'rendering' do
|
564
564
|
it 'renders the value from puppet parameter' do
|
565
565
|
lookup_key
|
566
|
-
result.must_equal 'echo "This is WebServer with nginx 1.4.7" > /etc/motd'
|
566
|
+
_(result).must_equal 'echo "This is WebServer with nginx 1.4.7" > /etc/motd'
|
567
567
|
end
|
568
568
|
end
|
569
569
|
|
570
570
|
describe 'preview' do
|
571
571
|
it 'should render preview' do
|
572
572
|
lookup_key
|
573
|
-
renderer.preview.must_equal 'echo "This is WebServer with nginx 1.4.7" > /etc/motd'
|
573
|
+
_(renderer.preview).must_equal 'echo "This is WebServer with nginx 1.4.7" > /etc/motd'
|
574
574
|
end
|
575
575
|
end
|
576
576
|
end
|
@@ -578,7 +578,7 @@ class InputTemplateRendererTest < ActiveSupport::TestCase
|
|
578
578
|
|
579
579
|
describe 'preview' do
|
580
580
|
it 'should render preview' do
|
581
|
-
renderer.preview.must_equal 'echo "This is WebServer with nginx $PUPPET_PARAMETER_INPUT[nginx_version]" > /etc/motd'
|
581
|
+
_(renderer.preview).must_equal 'echo "This is WebServer with nginx $PUPPET_PARAMETER_INPUT[nginx_version]" > /etc/motd'
|
582
582
|
end
|
583
583
|
end
|
584
584
|
end
|