foreman_remote_execution 1.4.1 → 1.4.2
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 +11 -9
- data/.rubocop_todo.yml +146 -116
- data/app/controllers/api/v2/job_invocations_controller.rb +6 -1
- data/app/controllers/api/v2/job_templates_controller.rb +0 -1
- data/app/controllers/job_invocations_controller.rb +6 -1
- data/app/lib/actions/remote_execution/run_host_job.rb +1 -1
- data/app/models/concerns/foreman_remote_execution/errors_flattener.rb +3 -0
- data/app/models/concerns/foreman_remote_execution/host_extensions.rb +1 -1
- data/app/models/concerns/foreman_remote_execution/subnet_extensions.rb +1 -1
- data/app/models/foreign_input_set.rb +1 -1
- data/app/models/job_invocation.rb +1 -1
- data/app/models/job_invocation_composer.rb +2 -2
- data/app/models/job_invocation_task_group.rb +1 -1
- data/app/models/job_template.rb +3 -3
- data/app/models/job_template_effective_user.rb +1 -1
- data/app/models/remote_execution_feature.rb +1 -1
- data/app/models/target_remote_execution_proxy.rb +1 -1
- data/app/models/targeting.rb +2 -2
- data/app/models/targeting_host.rb +1 -1
- data/app/models/template_input.rb +1 -1
- data/app/models/template_invocation.rb +1 -1
- data/app/models/template_invocation_input_value.rb +1 -1
- data/db/migrate/20150612121541_add_job_template_to_template.rb +1 -1
- data/db/migrate/20150616080015_create_template_input.rb +1 -1
- data/db/migrate/20150708133241_add_targeting.rb +1 -1
- data/db/migrate/20150708133242_add_invocation.rb +1 -1
- data/db/migrate/20150708133305_add_template_invocation.rb +1 -1
- data/db/migrate/20150812110800_add_resolved_at_to_targeting.rb +1 -1
- data/db/migrate/20150812145900_add_last_task_id_to_job_invocation.rb +1 -1
- data/db/migrate/20150826191632_create_target_remote_execution_proxies.rb +1 -1
- data/db/migrate/20150827144500_change_targeting_search_query_type.rb +1 -1
- data/db/migrate/20150827152730_add_options_to_template_input.rb +1 -1
- data/db/migrate/20150903192731_add_execution_to_interface.rb +2 -2
- data/db/migrate/20150923125825_add_job_invocation_task_group.rb +1 -1
- data/db/migrate/20151013135415_add_pub_key_to_smart_proxy.rb +1 -1
- data/db/migrate/20151022105508_rename_last_task_id_column.rb +1 -1
- data/db/migrate/20151116105412_add_triggering_to_job_invocation.rb +1 -1
- data/db/migrate/20151120171100_add_effective_user_to_template_invocation.rb +1 -1
- data/db/migrate/20151124162300_create_job_template_effective_users.rb +1 -1
- data/db/migrate/20151203100824_add_description_to_job_invocation.rb +1 -1
- data/db/migrate/20151215114631_add_host_id_to_template_invocation.rb +2 -2
- data/db/migrate/20151217092555_migrate_to_task_groups.rb +2 -2
- data/db/migrate/20160108134600_create_template_input_sets.rb +1 -1
- data/db/migrate/20160108141144_make_job_name_default_to_something.rb +1 -1
- data/db/migrate/20160111113032_upcase_ssh_feature.rb +2 -2
- data/db/migrate/20160113161916_add_run_host_job_task_id_to_template_invocation.rb +1 -1
- data/db/migrate/20160113162007_expand_all_template_invocations.rb +3 -3
- data/db/migrate/20160114120200_rename_job_categories.rb +1 -1
- data/db/migrate/20160114125628_rename_job_name_to_job_category.rb +1 -1
- data/db/migrate/20160118124600_create_remote_execution_features.rb +1 -1
- data/db/migrate/20160125155108_make_job_template_name_unique.rb +1 -1
- data/db/migrate/20160127134031_add_advanced_to_template_input.rb +1 -1
- data/db/migrate/20160127162711_reword_puppet_template_description.rb +1 -1
- data/db/migrate/20160203104056_add_concurrency_options_to_job_invocation.rb +1 -1
- data/db/migrate/20160926225841_update_template_input_value.rb +1 -1
- data/db/migrate/20170110145641_add_host_action_button_to_remote_execution_feature.rb +1 -1
- data/db/migrate/20170613101039_add_timeout_to_job_templates_and_job_invocations.rb +1 -1
- data/db/migrate/20180110104432_rename_template_invocation_permission.rb +25 -0
- data/db/migrate/20180112125015_fix_taxable_taxonomies_job_template.rb +14 -0
- data/db/seeds.d/90-bookmarks.rb +1 -1
- data/foreman_remote_execution.gemspec +2 -1
- data/lib/foreman_remote_execution/engine.rb +3 -3
- data/lib/foreman_remote_execution/version.rb +1 -1
- data/test/benchmark/run_hosts_job_benchmark.rb +10 -10
- data/test/benchmark/targeting_benchmark.rb +6 -6
- data/test/factories/foreman_remote_execution_factories.rb +14 -14
- data/test/functional/api/v2/foreign_input_sets_controller_test.rb +10 -15
- data/test/functional/api/v2/job_invocations_controller_test.rb +19 -8
- data/test/functional/api/v2/job_templates_controller_test.rb +12 -16
- data/test/functional/api/v2/remote_execution_features_controller_test.rb +3 -4
- data/test/functional/api/v2/template_inputs_controller_test.rb +8 -13
- data/test/test_plugin_helper.rb +4 -4
- data/test/unit/actions/run_hosts_job_test.rb +3 -3
- data/test/unit/concerns/exportable_test.rb +1 -1
- data/test/unit/concerns/foreman_tasks_cleaner_extensions_test.rb +2 -2
- data/test/unit/concerns/host_extensions_test.rb +20 -20
- data/test/unit/concerns/nic_extensions_test.rb +1 -1
- data/test/unit/input_template_renderer_test.rb +86 -86
- data/test/unit/job_invocation_composer_test.rb +17 -16
- data/test/unit/job_invocation_test.rb +10 -10
- data/test/unit/job_template_effective_user_test.rb +2 -2
- data/test/unit/job_template_importer_test.rb +3 -3
- data/test/unit/job_template_test.rb +15 -15
- data/test/unit/remote_execution_feature_test.rb +3 -3
- data/test/unit/remote_execution_provider_test.rb +15 -15
- data/test/unit/targeting_test.rb +3 -3
- data/test/unit/template_input_test.rb +1 -1
- data/test/unit/template_invocation_input_value_test.rb +17 -17
- metadata +19 -77
- data/doc/.gitignore +0 -7
- data/doc/Gemfile +0 -7
- data/doc/Rakefile +0 -41
- data/doc/_config.yml +0 -33
- data/doc/plugins/alert_block.rb +0 -27
- data/doc/plugins/div_tag.rb +0 -24
- data/doc/plugins/graphviz.rb +0 -121
- data/doc/plugins/plantuml.rb +0 -84
- data/doc/plugins/play.rb +0 -13
- data/doc/plugins/tags.rb +0 -137
- data/doc/plugins/toc.rb +0 -19
- data/doc/source/.nojekyll +0 -0
- data/doc/source/404.md +0 -6
- data/doc/source/_includes/footer.html +0 -21
- data/doc/source/_includes/header.html +0 -59
- data/doc/source/_includes/tocify.html +0 -6
- data/doc/source/_layouts/default.html +0 -9
- data/doc/source/_layouts/page.html +0 -25
- data/doc/source/atom.xml +0 -32
- data/doc/source/design/index.md +0 -1322
- data/doc/source/design/wireframes.pdf +0 -0
- data/doc/source/index.md +0 -18
- data/doc/source/static/css/bootstrap-responsive.min.css +0 -9
- data/doc/source/static/css/bootstrap.min.css +0 -866
- data/doc/source/static/css/jquery.tocify.css +0 -128
- data/doc/source/static/css/style.css +0 -285
- data/doc/source/static/css/syntax.css +0 -60
- data/doc/source/static/images/foreman.png +0 -0
- data/doc/source/static/images/glyphicons-halflings-white.png +0 -0
- data/doc/source/static/images/glyphicons-halflings.png +0 -0
- data/doc/source/static/js/bootstrap.min.js +0 -7
- data/doc/source/static/js/jquery-ui-1.9.2.custom.min.js +0 -6
- data/doc/source/static/js/jquery.js +0 -2
- data/doc/source/static/js/jquery.tocify.min.js +0 -3
- data/doc/source/static/js/scroll.js +0 -24
@@ -7,7 +7,7 @@ module Api
|
|
7
7
|
@remote_execution_feature = RemoteExecutionFeature.register(:my_awesome_feature, 'My awesome feature',
|
8
8
|
:description => 'You will not believe what it does',
|
9
9
|
:provided_inputs => ['awesomeness_level'])
|
10
|
-
@template =
|
10
|
+
@template = FactoryBot.create(:job_template, :with_input)
|
11
11
|
end
|
12
12
|
|
13
13
|
test 'should get index' do
|
@@ -18,7 +18,7 @@ module Api
|
|
18
18
|
end
|
19
19
|
|
20
20
|
test 'should get input set detail' do
|
21
|
-
get :show, :id => @remote_execution_feature.to_param
|
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
|
refute remote_execution_feature.empty?
|
@@ -26,8 +26,7 @@ module Api
|
|
26
26
|
end
|
27
27
|
|
28
28
|
test 'should update valid' do
|
29
|
-
put :update, :id => @remote_execution_feature.to_param,
|
30
|
-
:job_template_id => @template.id
|
29
|
+
put :update, params: { :id => @remote_execution_feature.to_param, :job_template_id => @template.id }
|
31
30
|
assert_response :ok
|
32
31
|
end
|
33
32
|
end
|
@@ -4,19 +4,19 @@ module Api
|
|
4
4
|
module V2
|
5
5
|
class TemplateInputsControllerTest < ActionController::TestCase
|
6
6
|
setup do
|
7
|
-
@template =
|
7
|
+
@template = FactoryBot.create(:job_template, :with_input)
|
8
8
|
@input = @template.template_inputs.first
|
9
9
|
end
|
10
10
|
|
11
11
|
test 'should get index' do
|
12
|
-
get :index, :template_id => @template.id
|
12
|
+
get :index, params: { :template_id => @template.id }
|
13
13
|
inputs = ActiveSupport::JSON.decode(@response.body)
|
14
14
|
assert !inputs.empty?, 'Should respond with inputs'
|
15
15
|
assert_response :success
|
16
16
|
end
|
17
17
|
|
18
18
|
test 'should get input detail' do
|
19
|
-
get :show, :template_id => @template.to_param, :id => @input.to_param
|
19
|
+
get :show, params: { :template_id => @template.to_param, :id => @input.to_param }
|
20
20
|
assert_response :success
|
21
21
|
input = ActiveSupport::JSON.decode(@response.body)
|
22
22
|
assert !input.empty?
|
@@ -25,34 +25,29 @@ module Api
|
|
25
25
|
|
26
26
|
test 'should create valid' do
|
27
27
|
valid_attrs = { :name => 'is_potato', :input_type => 'user', :options => ['true', 'false'] }
|
28
|
-
post :create, :template_input => valid_attrs, :template_id => @template.to_param
|
28
|
+
post :create, params: { :template_input => valid_attrs, :template_id => @template.to_param }
|
29
29
|
input = ActiveSupport::JSON.decode(@response.body)
|
30
30
|
assert input['name'] == 'is_potato'
|
31
31
|
assert_response :success
|
32
32
|
end
|
33
33
|
|
34
34
|
test 'should not create invalid' do
|
35
|
-
post :create, :template_id => @template.to_param
|
35
|
+
post :create, params: { :template_id => @template.to_param }
|
36
36
|
assert_response :unprocessable_entity
|
37
37
|
end
|
38
38
|
|
39
39
|
test 'should update valid' do
|
40
|
-
put :update,
|
41
|
-
:id => @input.to_param,
|
42
|
-
:template_input => { :name => 'blah' }
|
40
|
+
put :update, params: { :template_id => @template.to_param, :id => @input.to_param, :template_input => { :name => 'blah' } }
|
43
41
|
assert_response :ok
|
44
42
|
end
|
45
43
|
|
46
44
|
test 'should not update invalid' do
|
47
|
-
put :update,
|
48
|
-
:id => @input.to_param,
|
49
|
-
:template_input => { :name => '' }
|
45
|
+
put :update, params: { :template_id => @template.to_param, :id => @input.to_param, :template_input => { :name => '' } }
|
50
46
|
assert_response :unprocessable_entity
|
51
47
|
end
|
52
48
|
|
53
49
|
test 'should destroy' do
|
54
|
-
delete :destroy,
|
55
|
-
:id => @input.to_param
|
50
|
+
delete :destroy, params: { :template_id => @template.to_param, :id => @input.to_param }
|
56
51
|
assert_response :ok
|
57
52
|
refute TemplateInput.exists?(@input.id)
|
58
53
|
end
|
data/test/test_plugin_helper.rb
CHANGED
@@ -2,8 +2,8 @@
|
|
2
2
|
require 'test_helper'
|
3
3
|
require 'dynflow/testing'
|
4
4
|
|
5
|
-
# Add plugin to
|
6
|
-
|
5
|
+
# Add plugin to FactoryBot's paths
|
6
|
+
FactoryBot.definition_file_paths << File.join(File.dirname(__FILE__), 'factories')
|
7
7
|
# Add foreman tasks factories too
|
8
|
-
|
9
|
-
|
8
|
+
FactoryBot.definition_file_paths << "#{ForemanTasks::Engine.root}/test/factories"
|
9
|
+
FactoryBot.reload
|
@@ -5,11 +5,11 @@ module ForemanRemoteExecution
|
|
5
5
|
class RunHostsJobTest < ActiveSupport::TestCase
|
6
6
|
include Dynflow::Testing
|
7
7
|
|
8
|
-
let(:host) {
|
8
|
+
let(:host) { FactoryBot.create(:host, :with_execution) }
|
9
9
|
let(:proxy) { host.remote_execution_proxies('SSH')[:subnet].first }
|
10
|
-
let(:targeting) {
|
10
|
+
let(:targeting) { FactoryBot.create(:targeting, :search_query => "name = #{host.name}", :user => User.current) }
|
11
11
|
let(:job_invocation) do
|
12
|
-
|
12
|
+
FactoryBot.build(:job_invocation, :with_template).tap do |invocation|
|
13
13
|
invocation.targeting = targeting
|
14
14
|
invocation.description = 'Some short description'
|
15
15
|
invocation.save
|
@@ -5,7 +5,7 @@ module ForemanRemoteExecution
|
|
5
5
|
class SampleModel
|
6
6
|
include ::ForemanRemoteExecution::Exportable
|
7
7
|
|
8
|
-
attr_accessor :name, :attrs, :subnet, :mac, :password
|
8
|
+
attr_accessor :name, :attrs, :subnet, :mac, :password
|
9
9
|
attr_exportable :name, :attrs, :mac, :subnet, :mac => ->(m) { m.mac.upcase if m.mac },
|
10
10
|
:custom_attr => ->(m) { 'hello world' }
|
11
11
|
|
@@ -2,13 +2,13 @@ require 'test_plugin_helper'
|
|
2
2
|
|
3
3
|
class ForemanRemoteExecutionForemanTasksCleanerExtensionsTest < ActiveSupport::TestCase
|
4
4
|
it 'tries to delete associated job invocations' do
|
5
|
-
job =
|
5
|
+
job = FactoryBot.create(:job_invocation, :with_task)
|
6
6
|
ForemanTasks::Cleaner.new(:filter => "id = #{job.task.id}").delete
|
7
7
|
JobInvocation.where(:id => job.id).must_be :empty?
|
8
8
|
end
|
9
9
|
|
10
10
|
it 'removes orphaned job invocations' do
|
11
|
-
job =
|
11
|
+
job = FactoryBot.create(:job_invocation, :with_task)
|
12
12
|
JobInvocation.where(:id => job.id).count.must_equal 1
|
13
13
|
job.task.delete
|
14
14
|
job.reload
|
@@ -6,11 +6,11 @@ class ForemanRemoteExecutionHostExtensionsTest < ActiveSupport::TestCase
|
|
6
6
|
end
|
7
7
|
let(:provider) { 'SSH' }
|
8
8
|
|
9
|
-
before { User.current =
|
9
|
+
before { User.current = FactoryBot.build(:user, :admin) }
|
10
10
|
after { User.current = nil }
|
11
11
|
|
12
12
|
describe 'ssh specific params' do
|
13
|
-
let(:host) {
|
13
|
+
let(:host) { FactoryBot.create(:host, :with_execution) }
|
14
14
|
let(:sshkey) { 'ssh-rsa AAAAB3NzaC1yc2EAAAABJQ foo@example.com' }
|
15
15
|
|
16
16
|
before do
|
@@ -24,7 +24,7 @@ class ForemanRemoteExecutionHostExtensionsTest < ActiveSupport::TestCase
|
|
24
24
|
end
|
25
25
|
|
26
26
|
it 'can override ssh user' do
|
27
|
-
host.host_parameters <<
|
27
|
+
host.host_parameters << FactoryBot.create(:host_parameter, :host => host, :name => 'remote_execution_ssh_user', :value => 'amy')
|
28
28
|
host.params['remote_execution_ssh_user'].must_equal 'amy'
|
29
29
|
end
|
30
30
|
|
@@ -33,7 +33,7 @@ class ForemanRemoteExecutionHostExtensionsTest < ActiveSupport::TestCase
|
|
33
33
|
end
|
34
34
|
|
35
35
|
it 'can override effective user method' do
|
36
|
-
host.host_parameters <<
|
36
|
+
host.host_parameters << FactoryBot.create(:host_parameter, :host => host, :name => 'remote_execution_effective_user_method', :value => 'su')
|
37
37
|
host.params['remote_execution_effective_user_method'].must_equal 'su'
|
38
38
|
end
|
39
39
|
|
@@ -43,7 +43,7 @@ class ForemanRemoteExecutionHostExtensionsTest < ActiveSupport::TestCase
|
|
43
43
|
|
44
44
|
it 'has ssh keys in the parameters even when no user specified' do
|
45
45
|
# this is a case, when using the helper in provisioning templates
|
46
|
-
|
46
|
+
FactoryBot.create(:smart_proxy, :ssh)
|
47
47
|
host.interfaces.first.subnet.remote_execution_proxies.clear
|
48
48
|
User.current = nil
|
49
49
|
host.remote_execution_ssh_keys.must_include sshkey
|
@@ -51,10 +51,10 @@ class ForemanRemoteExecutionHostExtensionsTest < ActiveSupport::TestCase
|
|
51
51
|
end
|
52
52
|
|
53
53
|
context 'host has multiple nics' do
|
54
|
-
let(:host) {
|
54
|
+
let(:host) { FactoryBot.build(:host, :with_execution) }
|
55
55
|
|
56
56
|
it 'should only have one execution interface' do
|
57
|
-
host.interfaces <<
|
57
|
+
host.interfaces << FactoryBot.build(:nic_managed)
|
58
58
|
host.interfaces.each { |interface| interface.execution = true }
|
59
59
|
host.wont_be :valid?
|
60
60
|
end
|
@@ -66,14 +66,14 @@ class ForemanRemoteExecutionHostExtensionsTest < ActiveSupport::TestCase
|
|
66
66
|
|
67
67
|
context 'scoped search' do
|
68
68
|
let(:job) do
|
69
|
-
job =
|
70
|
-
job.template_invocations <<
|
69
|
+
job = FactoryBot.create(:job_invocation, :with_task)
|
70
|
+
job.template_invocations << FactoryBot.create(:template_invocation, :with_host, :with_failed_task)
|
71
71
|
job
|
72
72
|
end
|
73
73
|
|
74
74
|
let(:job2) do
|
75
|
-
job =
|
76
|
-
job.template_invocations <<
|
75
|
+
job = FactoryBot.create(:job_invocation, :with_task)
|
76
|
+
job.template_invocations << FactoryBot.create(:template_invocation, :with_host, :with_failed_task)
|
77
77
|
job
|
78
78
|
end
|
79
79
|
|
@@ -112,17 +112,17 @@ class ForemanRemoteExecutionHostExtensionsTest < ActiveSupport::TestCase
|
|
112
112
|
|
113
113
|
describe 'proxy determination strategies' do
|
114
114
|
context 'subnet strategy' do
|
115
|
-
let(:host) {
|
115
|
+
let(:host) { FactoryBot.build(:host, :with_execution) }
|
116
116
|
it { host.remote_execution_proxies(provider)[:subnet].must_include host.subnet.remote_execution_proxies.first }
|
117
117
|
end
|
118
118
|
|
119
119
|
context 'fallback strategy' do
|
120
|
-
let(:host) {
|
120
|
+
let(:host) { FactoryBot.build(:host, :with_puppet) }
|
121
121
|
|
122
122
|
context 'enabled' do
|
123
123
|
before do
|
124
124
|
Setting[:remote_execution_fallback_proxy] = true
|
125
|
-
host.puppet_proxy.features <<
|
125
|
+
host.puppet_proxy.features << FactoryBot.create(:feature, :ssh)
|
126
126
|
end
|
127
127
|
|
128
128
|
it 'returns a fallback proxy' do
|
@@ -133,7 +133,7 @@ class ForemanRemoteExecutionHostExtensionsTest < ActiveSupport::TestCase
|
|
133
133
|
context 'disabled' do
|
134
134
|
before do
|
135
135
|
Setting[:remote_execution_fallback_proxy] = false
|
136
|
-
host.puppet_proxy.features <<
|
136
|
+
host.puppet_proxy.features << FactoryBot.create(:feature, :ssh)
|
137
137
|
end
|
138
138
|
|
139
139
|
it 'returns no proxy' do
|
@@ -143,11 +143,11 @@ class ForemanRemoteExecutionHostExtensionsTest < ActiveSupport::TestCase
|
|
143
143
|
end
|
144
144
|
|
145
145
|
context 'global strategy' do
|
146
|
-
let(:tax_organization) {
|
147
|
-
let(:tax_location) {
|
148
|
-
let(:host) {
|
149
|
-
let(:proxy_in_taxonomies) {
|
150
|
-
let(:proxy_no_taxonomies) {
|
146
|
+
let(:tax_organization) { FactoryBot.build(:organization) }
|
147
|
+
let(:tax_location) { FactoryBot.build(:location) }
|
148
|
+
let(:host) { FactoryBot.build(:host, :organization => tax_organization, :location => tax_location) }
|
149
|
+
let(:proxy_in_taxonomies) { FactoryBot.create(:smart_proxy, :ssh, :organizations => [tax_organization], :locations => [tax_location]) }
|
150
|
+
let(:proxy_no_taxonomies) { FactoryBot.create(:smart_proxy, :ssh) }
|
151
151
|
|
152
152
|
context 'enabled' do
|
153
153
|
before { Setting[:remote_execution_global_proxy] = true }
|
@@ -1,7 +1,7 @@
|
|
1
1
|
require 'test_plugin_helper'
|
2
2
|
|
3
3
|
class ForemanRemoteExecutionNicExtensionsTest < ActiveSupport::TestCase
|
4
|
-
let(:host) {
|
4
|
+
let(:host) { FactoryBot.create(:host) }
|
5
5
|
|
6
6
|
it 'sets the first primary interface as the execution interface' do
|
7
7
|
host.execution_interface.must_equal host.interfaces.first
|
@@ -2,7 +2,7 @@ require 'test_plugin_helper'
|
|
2
2
|
|
3
3
|
class InputTemplateRendererTest < ActiveSupport::TestCase
|
4
4
|
context 'renderer for simple template without inputs' do
|
5
|
-
let(:renderer) { InputTemplateRenderer.new(
|
5
|
+
let(:renderer) { InputTemplateRenderer.new(FactoryBot.build(:job_template, :template => 'id <%= preview? %>')) }
|
6
6
|
|
7
7
|
it 'should render the content' do
|
8
8
|
renderer.render.must_equal 'id false'
|
@@ -14,7 +14,7 @@ class InputTemplateRendererTest < ActiveSupport::TestCase
|
|
14
14
|
end
|
15
15
|
|
16
16
|
context 'renderer for template with user input used' do
|
17
|
-
let(:template) {
|
17
|
+
let(:template) { FactoryBot.build(:job_template, :template => 'service restart <%= input("service_name") -%>') }
|
18
18
|
let(:renderer) { InputTemplateRenderer.new(template) }
|
19
19
|
|
20
20
|
context 'but without input defined' do
|
@@ -43,12 +43,12 @@ class InputTemplateRendererTest < ActiveSupport::TestCase
|
|
43
43
|
|
44
44
|
context 'with matching input defined' do
|
45
45
|
|
46
|
-
let(:job_invocation) {
|
47
|
-
let(:template_invocation) {
|
46
|
+
let(:job_invocation) { FactoryBot.create(:job_invocation) }
|
47
|
+
let(:template_invocation) { FactoryBot.build(:template_invocation, :template => template) }
|
48
48
|
let(:result) { renderer.render }
|
49
49
|
|
50
50
|
before do
|
51
|
-
template.template_inputs <<
|
51
|
+
template.template_inputs << FactoryBot.build(:template_input, :name => 'service_name', :input_type => 'user')
|
52
52
|
job_invocation.template_invocations << template_invocation
|
53
53
|
end
|
54
54
|
|
@@ -78,10 +78,10 @@ class InputTemplateRendererTest < ActiveSupport::TestCase
|
|
78
78
|
|
79
79
|
context 'with invocation specified' do
|
80
80
|
before do
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
81
|
+
FactoryBot.create(:template_invocation_input_value,
|
82
|
+
:template_invocation => template_invocation,
|
83
|
+
:template_input => template.template_inputs.first,
|
84
|
+
:value => 'foreman')
|
85
85
|
renderer.invocation = template_invocation
|
86
86
|
renderer.invocation.reload
|
87
87
|
end
|
@@ -98,21 +98,21 @@ class InputTemplateRendererTest < ActiveSupport::TestCase
|
|
98
98
|
|
99
99
|
describe 'with circular reference' do
|
100
100
|
let(:recursive_template_with_inputs) do
|
101
|
-
|
101
|
+
FactoryBot.create(:job_template, :name => 'test', :template => 'test')
|
102
102
|
end
|
103
103
|
|
104
104
|
let(:template_with_inputs) do
|
105
|
-
|
106
|
-
template.foreign_input_sets <<
|
105
|
+
FactoryBot.create(:job_template, :template => 'test').tap do |template|
|
106
|
+
template.foreign_input_sets << FactoryBot.build(:foreign_input_set, :target_template => recursive_template_with_inputs)
|
107
107
|
end
|
108
108
|
end
|
109
109
|
|
110
110
|
let(:recursive_template_without_inputs) do
|
111
|
-
|
111
|
+
FactoryBot.create(:job_template, :name => 'recursive template', :template => '<%= render_template("template with inputs", "action" => "install") %>')
|
112
112
|
end
|
113
113
|
|
114
114
|
let(:template_without_inputs) do
|
115
|
-
|
115
|
+
FactoryBot.create(:job_template, :name => 'template with inputs', :template => "<%= render_template('#{recursive_template_without_inputs.name}') %>")
|
116
116
|
end
|
117
117
|
|
118
118
|
before do
|
@@ -120,7 +120,7 @@ class InputTemplateRendererTest < ActiveSupport::TestCase
|
|
120
120
|
end
|
121
121
|
|
122
122
|
it 'handles circular references in templates' do
|
123
|
-
renderer.invocation =
|
123
|
+
renderer.invocation = FactoryBot.build(:template_invocation, :template => template_without_inputs)
|
124
124
|
renderer.template = template_without_inputs
|
125
125
|
refute renderer.render
|
126
126
|
renderer.error_message.must_include 'Recursive rendering of templates detected'
|
@@ -128,8 +128,8 @@ class InputTemplateRendererTest < ActiveSupport::TestCase
|
|
128
128
|
|
129
129
|
it 'handles circular references in inputs' do
|
130
130
|
assert_raises(ActiveRecord::RecordInvalid) do
|
131
|
-
input_set =
|
132
|
-
|
131
|
+
input_set = FactoryBot.build(:foreign_input_set, :target_template => template_with_inputs, :include_all => false,
|
132
|
+
:include => 'package, debug', :exclude => 'action,debug')
|
133
133
|
recursive_template_with_inputs.foreign_input_sets << input_set
|
134
134
|
recursive_template_with_inputs.save!
|
135
135
|
end
|
@@ -140,31 +140,31 @@ class InputTemplateRendererTest < ActiveSupport::TestCase
|
|
140
140
|
|
141
141
|
context 'renderer for template with input set and render_template' do
|
142
142
|
let(:command_template) do
|
143
|
-
|
144
|
-
template.template_inputs <<
|
145
|
-
template.template_inputs <<
|
143
|
+
FactoryBot.build(:job_template, :name => 'command action', :template => '<%= input("command") -%>').tap do |template|
|
144
|
+
template.template_inputs << FactoryBot.build(:template_input, :name => 'command', :input_type => 'user')
|
145
|
+
template.template_inputs << FactoryBot.build(:template_input, :name => 'debug', :input_type => 'user')
|
146
146
|
end
|
147
147
|
end
|
148
148
|
|
149
149
|
let(:package_template) do
|
150
|
-
|
150
|
+
FactoryBot.build(:job_template, :name => 'package action', :template => <<-TEMPLATE.strip_heredoc) do |template|
|
151
151
|
<%= render_template("command action", "command" => "yum -y \#{ input("action") } \#{ input('package') }") -%>
|
152
152
|
TEMPLATE
|
153
|
-
template.template_inputs <<
|
154
|
-
template.template_inputs <<
|
155
|
-
template.foreign_input_sets <<
|
153
|
+
template.template_inputs << FactoryBot.build(:template_input, :name => 'package', :input_type => 'user')
|
154
|
+
template.template_inputs << FactoryBot.build(:template_input, :name => 'action', :input_type => 'user')
|
155
|
+
template.foreign_input_sets << FactoryBot.build(:foreign_input_set, :target_template => command_template, :include_all => true, :exclude => 'command')
|
156
156
|
end
|
157
157
|
end
|
158
158
|
|
159
159
|
let(:template) do
|
160
|
-
|
161
|
-
|
162
|
-
template.foreign_input_sets <<
|
160
|
+
FactoryBot.create(:job_template,
|
161
|
+
:template => '<%= render_template("package action", { :action => "install" }, { :with_foreign_input_set => true }) %>').tap do |template|
|
162
|
+
template.foreign_input_sets << FactoryBot.build(:foreign_input_set, :target_template => package_template, :include_all => true, :exclude => 'action')
|
163
163
|
end
|
164
164
|
end
|
165
165
|
|
166
|
-
let(:job_invocation) {
|
167
|
-
let(:template_invocation) {
|
166
|
+
let(:job_invocation) { FactoryBot.create(:job_invocation) }
|
167
|
+
let(:template_invocation) { FactoryBot.build(:template_invocation, :template => template) }
|
168
168
|
let(:renderer) { InputTemplateRenderer.new(template) }
|
169
169
|
let(:result) { renderer.render }
|
170
170
|
|
@@ -178,15 +178,15 @@ class InputTemplateRendererTest < ActiveSupport::TestCase
|
|
178
178
|
describe 'foreign input set' do
|
179
179
|
describe 'with include_all' do
|
180
180
|
let(:template) do
|
181
|
-
|
182
|
-
template.foreign_input_sets <<
|
181
|
+
FactoryBot.create(:job_template, :template => '<%= render_template("package action", "action" => "install") %>').tap do |template|
|
182
|
+
template.foreign_input_sets << FactoryBot.build(:foreign_input_set, :target_template => package_template, :include_all => true)
|
183
183
|
end
|
184
184
|
end
|
185
185
|
|
186
186
|
let(:template_2) do
|
187
|
-
|
188
|
-
template.foreign_input_sets <<
|
189
|
-
|
187
|
+
FactoryBot.create(:job_template, :template => '<%= render_template("package action", "action" => "install") %>').tap do |template|
|
188
|
+
template.foreign_input_sets << FactoryBot.build(:foreign_input_set,
|
189
|
+
:target_template => package_template, :include_all => true, :include => '', :exclude => '')
|
190
190
|
end
|
191
191
|
end
|
192
192
|
|
@@ -198,8 +198,8 @@ class InputTemplateRendererTest < ActiveSupport::TestCase
|
|
198
198
|
|
199
199
|
describe 'with include_all and some excludes' do
|
200
200
|
let(:template) do
|
201
|
-
|
202
|
-
template.foreign_input_sets <<
|
201
|
+
FactoryBot.create(:job_template, :template => '<%= render_template("package action", "action" => "install") %>').tap do |template|
|
202
|
+
template.foreign_input_sets << FactoryBot.build(:foreign_input_set, :target_template => package_template, :include_all => true, :exclude => 'action,debug')
|
203
203
|
end
|
204
204
|
end
|
205
205
|
|
@@ -210,9 +210,9 @@ class InputTemplateRendererTest < ActiveSupport::TestCase
|
|
210
210
|
|
211
211
|
describe 'with some includes and some excludes' do
|
212
212
|
let(:template) do
|
213
|
-
|
214
|
-
template.foreign_input_sets <<
|
215
|
-
|
213
|
+
FactoryBot.create(:job_template, :template => '<%= render_template("package action", "action" => "install") %>').tap do |template|
|
214
|
+
template.foreign_input_sets << FactoryBot.build(:foreign_input_set, :target_template => package_template, :include_all => false,
|
215
|
+
:include => 'package, debug', :exclude => 'action,debug')
|
216
216
|
end
|
217
217
|
end
|
218
218
|
|
@@ -224,10 +224,10 @@ class InputTemplateRendererTest < ActiveSupport::TestCase
|
|
224
224
|
|
225
225
|
context 'with invocation specified' do
|
226
226
|
before do
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
227
|
+
FactoryBot.create(:template_invocation_input_value,
|
228
|
+
:template_invocation => template_invocation,
|
229
|
+
:template_input => template.template_inputs_with_foreign.find { |input| input.name == 'package' },
|
230
|
+
:value => 'zsh')
|
231
231
|
renderer.invocation = template_invocation
|
232
232
|
renderer.invocation.reload
|
233
233
|
end
|
@@ -241,8 +241,8 @@ class InputTemplateRendererTest < ActiveSupport::TestCase
|
|
241
241
|
|
242
242
|
context 'with explicitly specifying inputs' do
|
243
243
|
let(:template) do
|
244
|
-
|
245
|
-
|
244
|
+
FactoryBot.create(:job_template,
|
245
|
+
:template => '<%= render_template("package action", {"action" => "install", :package => "zsh"}) %>')
|
246
246
|
end
|
247
247
|
|
248
248
|
before do
|
@@ -267,12 +267,12 @@ class InputTemplateRendererTest < ActiveSupport::TestCase
|
|
267
267
|
|
268
268
|
context 'with options specified' do
|
269
269
|
|
270
|
-
let(:job_invocation) {
|
271
|
-
let(:template_invocation) {
|
270
|
+
let(:job_invocation) { FactoryBot.create(:job_invocation) }
|
271
|
+
let(:template_invocation) { FactoryBot.build(:template_invocation, :template => template) }
|
272
272
|
let(:result) { renderer.render }
|
273
273
|
|
274
274
|
before do
|
275
|
-
template.template_inputs <<
|
275
|
+
template.template_inputs << FactoryBot.build(:template_input, :name => 'service_name', :input_type => 'user', :options => "httpd\nforeman")
|
276
276
|
end
|
277
277
|
|
278
278
|
context 'with a valid input defined' do
|
@@ -280,10 +280,10 @@ class InputTemplateRendererTest < ActiveSupport::TestCase
|
|
280
280
|
job_invocation.template_invocations << template_invocation
|
281
281
|
renderer.invocation = template_invocation
|
282
282
|
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
|
283
|
+
FactoryBot.create(:template_invocation_input_value,
|
284
|
+
:template_invocation => template_invocation,
|
285
|
+
:template_input => template.template_inputs.first,
|
286
|
+
:value => 'foreman')
|
287
287
|
renderer.invocation.reload
|
288
288
|
end
|
289
289
|
|
@@ -295,11 +295,11 @@ class InputTemplateRendererTest < ActiveSupport::TestCase
|
|
295
295
|
end
|
296
296
|
|
297
297
|
context 'renderer for template with fact input used' do
|
298
|
-
let(:template) {
|
298
|
+
let(:template) { FactoryBot.build(:job_template, :template => 'echo <%= input("issue") -%> > /etc/issue') }
|
299
299
|
let(:renderer) { InputTemplateRenderer.new(template) }
|
300
300
|
|
301
301
|
context 'with matching input defined' do
|
302
|
-
before { renderer.template.template_inputs<<
|
302
|
+
before { renderer.template.template_inputs<< FactoryBot.build(:template_input, :name => 'issue', :input_type => 'fact', :fact_name => 'issue') }
|
303
303
|
let(:result) { renderer.render }
|
304
304
|
|
305
305
|
describe 'rendering' do
|
@@ -314,7 +314,7 @@ class InputTemplateRendererTest < ActiveSupport::TestCase
|
|
314
314
|
end
|
315
315
|
|
316
316
|
context 'with host specified' do
|
317
|
-
before { renderer.host =
|
317
|
+
before { renderer.host = FactoryBot.create(:host) }
|
318
318
|
|
319
319
|
describe 'rendering' do
|
320
320
|
it 'can\'t render the content without host since we don\'t have fact value' do
|
@@ -335,7 +335,7 @@ class InputTemplateRendererTest < ActiveSupport::TestCase
|
|
335
335
|
end
|
336
336
|
|
337
337
|
context 'with existing fact' do
|
338
|
-
let(:fact) {
|
338
|
+
let(:fact) { FactoryBot.create(:fact_name, :name => 'issue') }
|
339
339
|
|
340
340
|
describe 'rendering' do
|
341
341
|
it 'can\'t render the content without host since we don\'t have fact value' do
|
@@ -357,7 +357,7 @@ class InputTemplateRendererTest < ActiveSupport::TestCase
|
|
357
357
|
end
|
358
358
|
|
359
359
|
context 'with fact issue value' do
|
360
|
-
before {
|
360
|
+
before { FactoryBot.create(:fact_value, :host => renderer.host, :fact_name => fact, :value => 'banner') }
|
361
361
|
|
362
362
|
let(:result) { renderer.render }
|
363
363
|
|
@@ -376,9 +376,9 @@ class InputTemplateRendererTest < ActiveSupport::TestCase
|
|
376
376
|
|
377
377
|
context 'with host specified' do
|
378
378
|
before do
|
379
|
-
host =
|
380
|
-
fact =
|
381
|
-
|
379
|
+
host = FactoryBot.create(:host)
|
380
|
+
fact = FactoryBot.create(:fact_name, :name => 'issue')
|
381
|
+
FactoryBot.create(:fact_value, :host => host, :fact_name => fact, :value => 'banner')
|
382
382
|
renderer.host = host
|
383
383
|
end
|
384
384
|
|
@@ -393,11 +393,11 @@ class InputTemplateRendererTest < ActiveSupport::TestCase
|
|
393
393
|
end
|
394
394
|
|
395
395
|
context 'renderer for template with variable input used' do
|
396
|
-
let(:template) {
|
396
|
+
let(:template) { FactoryBot.build(:job_template, :template => 'echo <%= input("client_key") -%> > /etc/chef/client.pem') }
|
397
397
|
let(:renderer) { InputTemplateRenderer.new(template) }
|
398
398
|
|
399
399
|
context 'with matching input defined' do
|
400
|
-
before { renderer.template.template_inputs<<
|
400
|
+
before { renderer.template.template_inputs<< FactoryBot.build(:template_input, :name => 'client_key', :input_type => 'variable', :variable_name => 'client_key') }
|
401
401
|
let(:result) { renderer.render }
|
402
402
|
|
403
403
|
describe 'rendering' do
|
@@ -412,11 +412,11 @@ class InputTemplateRendererTest < ActiveSupport::TestCase
|
|
412
412
|
end
|
413
413
|
|
414
414
|
context 'with host specified' do
|
415
|
-
before { User.current =
|
415
|
+
before { User.current = FactoryBot.build(:user, :admin) }
|
416
416
|
after { User.current = nil }
|
417
417
|
|
418
|
-
let(:environment) {
|
419
|
-
before { renderer.host =
|
418
|
+
let(:environment) { FactoryBot.create(:environment) }
|
419
|
+
before { renderer.host = FactoryBot.create(:host, :environment => environment) }
|
420
420
|
|
421
421
|
describe 'rendering' do
|
422
422
|
it 'can\'t render the content without host since we don\'t have variable value in classification' do
|
@@ -438,7 +438,7 @@ class InputTemplateRendererTest < ActiveSupport::TestCase
|
|
438
438
|
|
439
439
|
|
440
440
|
context 'with existing variable implemented as host parameter' do
|
441
|
-
let(:parameter) {
|
441
|
+
let(:parameter) { FactoryBot.create(:host_parameter, :host => renderer.host, :name => 'client_key', :value => 'RSA KEY') }
|
442
442
|
|
443
443
|
describe 'rendering' do
|
444
444
|
it 'renders the value from host parameter' do
|
@@ -459,15 +459,15 @@ class InputTemplateRendererTest < ActiveSupport::TestCase
|
|
459
459
|
|
460
460
|
context 'with existing variable implemented as smart variable' do
|
461
461
|
let(:puppet_class) do
|
462
|
-
puppetclass =
|
462
|
+
puppetclass = FactoryBot.create(:puppetclass, :environments => [environment])
|
463
463
|
puppetclass.update_attribute(:hosts, [renderer.host])
|
464
464
|
puppetclass
|
465
465
|
end
|
466
466
|
let(:lookup_key) do
|
467
|
-
|
468
|
-
|
469
|
-
|
470
|
-
|
467
|
+
FactoryBot.create(:variable_lookup_key,
|
468
|
+
:key => 'client_key',
|
469
|
+
:puppetclass => puppet_class,
|
470
|
+
:overrides => {"fqdn=#{renderer.host.fqdn}" => 'RSA KEY'})
|
471
471
|
end
|
472
472
|
|
473
473
|
describe 'rendering' do
|
@@ -496,16 +496,16 @@ class InputTemplateRendererTest < ActiveSupport::TestCase
|
|
496
496
|
end
|
497
497
|
|
498
498
|
context 'renderer for template with puppet parameter input used' do
|
499
|
-
let(:template) {
|
499
|
+
let(:template) { FactoryBot.build(:job_template, :template => 'echo "This is WebServer with nginx <%= input("nginx_version") -%>" > /etc/motd') }
|
500
500
|
let(:renderer) { InputTemplateRenderer.new(template) }
|
501
501
|
|
502
502
|
context 'with matching input defined' do
|
503
503
|
before do
|
504
|
-
renderer.template.template_inputs<<
|
505
|
-
|
506
|
-
|
507
|
-
|
508
|
-
|
504
|
+
renderer.template.template_inputs<< FactoryBot.build(:template_input,
|
505
|
+
:name => 'nginx_version',
|
506
|
+
:input_type => 'puppet_parameter',
|
507
|
+
:puppet_parameter_name => 'version',
|
508
|
+
:puppet_class_name => 'nginx')
|
509
509
|
end
|
510
510
|
let(:result) { renderer.render }
|
511
511
|
|
@@ -521,8 +521,8 @@ class InputTemplateRendererTest < ActiveSupport::TestCase
|
|
521
521
|
end
|
522
522
|
|
523
523
|
context 'with host specified' do
|
524
|
-
let(:environment) {
|
525
|
-
before { renderer.host =
|
524
|
+
let(:environment) { FactoryBot.create(:environment) }
|
525
|
+
before { renderer.host = FactoryBot.create(:host, :environment => environment) }
|
526
526
|
|
527
527
|
describe 'rendering' do
|
528
528
|
it 'can\'t render the content without host since we don\'t have puppet parameter in classification' do
|
@@ -544,17 +544,17 @@ class InputTemplateRendererTest < ActiveSupport::TestCase
|
|
544
544
|
|
545
545
|
context 'with existing puppet parameter with matching override' do
|
546
546
|
let(:puppet_class) do
|
547
|
-
puppetclass =
|
547
|
+
puppetclass = FactoryBot.create(:puppetclass, :environments => [environment], :name => 'nginx')
|
548
548
|
puppetclass.update_attribute(:hosts, [renderer.host])
|
549
549
|
puppetclass
|
550
550
|
end
|
551
551
|
let(:lookup_key) do
|
552
|
-
|
553
|
-
|
554
|
-
|
555
|
-
|
556
|
-
|
557
|
-
|
552
|
+
FactoryBot.create(:puppetclass_lookup_key, :as_smart_class_param,
|
553
|
+
:key => 'version',
|
554
|
+
:puppetclass => puppet_class,
|
555
|
+
:path => 'fqdn',
|
556
|
+
:override => true,
|
557
|
+
:overrides => {"fqdn=#{renderer.host.fqdn}" => '1.4.7'})
|
558
558
|
end
|
559
559
|
|
560
560
|
describe 'rendering' do
|