foreman_deployments 0.0.1
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 +15 -0
- data/LICENSE +619 -0
- data/README.md +52 -0
- data/Rakefile +30 -0
- data/app/controllers/foreman_deployments/api/v2/base_controller.rb +25 -0
- data/app/controllers/foreman_deployments/api/v2/deployments_controller.rb +102 -0
- data/app/controllers/foreman_deployments/api/v2/stacks_controller.rb +52 -0
- data/app/controllers/foreman_deployments/create_resources_controller.rb +62 -0
- data/app/controllers/foreman_deployments/deployments_controller.rb +5 -0
- data/app/controllers/foreman_deployments/stacks_controller.rb +5 -0
- data/app/lib/foreman_deployments/base_dereference_visitor.rb +55 -0
- data/app/lib/foreman_deployments/config.rb +16 -0
- data/app/lib/foreman_deployments/config/array.rb +91 -0
- data/app/lib/foreman_deployments/config/configurator.rb +23 -0
- data/app/lib/foreman_deployments/config/hash.rb +81 -0
- data/app/lib/foreman_deployments/config/load_visitor.rb +23 -0
- data/app/lib/foreman_deployments/config/merge_visitor.rb +23 -0
- data/app/lib/foreman_deployments/config/save_visitor.rb +23 -0
- data/app/lib/foreman_deployments/inputs/base_input_definition.rb +39 -0
- data/app/lib/foreman_deployments/inputs/value.rb +25 -0
- data/app/lib/foreman_deployments/planner_visitor.rb +26 -0
- data/app/lib/foreman_deployments/registry.rb +67 -0
- data/app/lib/foreman_deployments/stack_definition.rb +37 -0
- data/app/lib/foreman_deployments/stack_parser.rb +121 -0
- data/app/lib/foreman_deployments/task_reference.rb +48 -0
- data/app/lib/foreman_deployments/tasks/base_action.rb +6 -0
- data/app/lib/foreman_deployments/tasks/base_definition.rb +72 -0
- data/app/lib/foreman_deployments/tasks/creation_task_definition.rb +68 -0
- data/app/lib/foreman_deployments/tasks/host_creation_task_definition.rb +44 -0
- data/app/lib/foreman_deployments/tasks/search_task_definition.rb +55 -0
- data/app/lib/foreman_deployments/tasks/stack_deploy_action.rb +10 -0
- data/app/lib/foreman_deployments/tasks/wait_until_built_task_definition.rb +65 -0
- data/app/lib/foreman_deployments/validation/dereference_visitor.rb +18 -0
- data/app/lib/foreman_deployments/validation/remove_ids_visitor.rb +59 -0
- data/app/lib/foreman_deployments/validation/validation_error.rb +12 -0
- data/app/lib/foreman_deployments/validation/validation_result.rb +26 -0
- data/app/lib/foreman_deployments/validation/validation_visitor.rb +20 -0
- data/app/lib/foreman_deployments/validation/validator.rb +29 -0
- data/app/models/foreman_deployments/concerns/belongs_to_single_taxonomy.rb +42 -0
- data/app/models/foreman_deployments/concerns/belongs_to_stack_taxonomy.rb +24 -0
- data/app/models/foreman_deployments/configuration.rb +26 -0
- data/app/models/foreman_deployments/deployment.rb +57 -0
- data/app/models/foreman_deployments/resource_models/create_resource.rb +18 -0
- data/app/models/foreman_deployments/stack.rb +20 -0
- data/app/views/foreman_deployments/api/v2/deployments/base.json.rabl +3 -0
- data/app/views/foreman_deployments/api/v2/deployments/create.json.rabl +3 -0
- data/app/views/foreman_deployments/api/v2/deployments/index.json.rabl +3 -0
- data/app/views/foreman_deployments/api/v2/deployments/main.json.rabl +5 -0
- data/app/views/foreman_deployments/api/v2/deployments/merge_configuration.json.rabl +3 -0
- data/app/views/foreman_deployments/api/v2/deployments/replace_configuration.json.rabl +3 -0
- data/app/views/foreman_deployments/api/v2/deployments/run.json.rabl +3 -0
- data/app/views/foreman_deployments/api/v2/deployments/show.json.rabl +11 -0
- data/app/views/foreman_deployments/api/v2/deployments/update.json.rabl +3 -0
- data/app/views/foreman_deployments/api/v2/stacks/base.json.rabl +3 -0
- data/app/views/foreman_deployments/api/v2/stacks/create.json.rabl +3 -0
- data/app/views/foreman_deployments/api/v2/stacks/index.json.rabl +3 -0
- data/app/views/foreman_deployments/api/v2/stacks/main.json.rabl +3 -0
- data/app/views/foreman_deployments/api/v2/stacks/show.json.rabl +7 -0
- data/app/views/foreman_deployments/api/v2/stacks/update.json.rabl +3 -0
- data/app/views/foreman_deployments/create_resources/new.html.erb +6 -0
- data/config/routes.rb +41 -0
- data/db/migrate/20150623140612_create_stacks.rb +10 -0
- data/db/migrate/20150814092932_create_deployment.rb +20 -0
- data/db/migrate/20150916133305_add_task_to_deployments.rb +5 -0
- data/db/migrate/20150917130618_add_taxonomy_to_deployments.rb +8 -0
- data/db/seeds.d/03-permissions.rb +14 -0
- data/doc/deployment_process.md +112 -0
- data/doc/design/capsule_stack.puml +51 -0
- data/doc/design/complete_stack.puml +17 -0
- data/doc/design/config_resource_overview.puml +15 -0
- data/doc/design/design.md +230 -0
- data/doc/design/diagrams/capsule_stack.png +0 -0
- data/doc/design/diagrams/capsule_stack.svg +1 -0
- data/doc/design/diagrams/complete_stack.png +0 -0
- data/doc/design/diagrams/complete_stack.svg +1 -0
- data/doc/design/diagrams/config_resource_overview.png +0 -0
- data/doc/design/diagrams/config_resource_overview.svg +1 -0
- data/doc/design/diagrams/ordered_resource_overview.png +0 -0
- data/doc/design/diagrams/ordered_resource_overview.svg +1 -0
- data/doc/design/diagrams/overview.png +0 -0
- data/doc/design/diagrams/overview.svg +1 -0
- data/doc/design/diagrams/overview_class.png +0 -0
- data/doc/design/diagrams/overview_class.svg +1 -0
- data/doc/design/diagrams/sat_stack.png +0 -0
- data/doc/design/diagrams/sat_stack.svg +1 -0
- data/doc/design/diagrams/solr_usecase.png +0 -0
- data/doc/design/diagrams/solr_usecase.svg +1 -0
- data/doc/design/examples.md +192 -0
- data/doc/design/generate-diagrams.sh +7 -0
- data/doc/design/implementation.md +128 -0
- data/doc/design/ordered_resource_overview.puml +15 -0
- data/doc/design/overview.puml +42 -0
- data/doc/design/overview_class.puml +64 -0
- data/doc/design/resources.md +134 -0
- data/doc/design/sat_stack.puml +37 -0
- data/doc/design/shared.puml +171 -0
- data/doc/design/solr_usecase.puml +189 -0
- data/doc/design/tasks.md +74 -0
- data/doc/design/user_interfaces.md +189 -0
- data/doc/introduction.md +84 -0
- data/doc/writing_stacks.md +102 -0
- data/lib/foreman_deployments.rb +7 -0
- data/lib/foreman_deployments/engine.rb +94 -0
- data/lib/foreman_deployments/monkey_patches.rb +9 -0
- data/lib/foreman_deployments/version.rb +3 -0
- data/lib/tasks/foreman_deployments_tasks.rake +22 -0
- data/locale/Makefile +62 -0
- data/test/factories/foreman_deployments.rb +70 -0
- data/test/functional/api/v2/deployments_controller_test.rb +318 -0
- data/test/functional/api/v2/stacks_controller_test.rb +140 -0
- data/test/test_plugin_helper.rb +14 -0
- data/test/unit/lib/config/array_test.rb +217 -0
- data/test/unit/lib/config/configurator_test.rb +66 -0
- data/test/unit/lib/config/hash_test.rb +178 -0
- data/test/unit/lib/inputs/value_test.rb +47 -0
- data/test/unit/lib/registry_test.rb +117 -0
- data/test/unit/lib/stack_definition_test.rb +54 -0
- data/test/unit/lib/stack_parser_test.rb +129 -0
- data/test/unit/lib/task_reference_test.rb +63 -0
- data/test/unit/lib/tasks/base_definition_test.rb +137 -0
- data/test/unit/lib/tasks/creation_task_definition_test.rb +57 -0
- data/test/unit/lib/tasks/host_creation_task_definition_test.rb +10 -0
- data/test/unit/lib/tasks/search_task_definition_test.rb +49 -0
- data/test/unit/lib/tasks/stack_deploy_action_test.rb +83 -0
- data/test/unit/lib/tasks/wait_until_built_task_definition_test.rb +71 -0
- data/test/unit/lib/validation/dereference_visitor_test.rb +48 -0
- data/test/unit/lib/validation/remove_ids_visitor_test.rb +90 -0
- data/test/unit/lib/validation/validation_result_test.rb +40 -0
- data/test/unit/lib/validation/validation_visitor_test.rb +67 -0
- data/test/unit/model/configuration_test.rb +88 -0
- data/test/unit/model/deployment_test.rb +159 -0
- data/test/unit/model/stack_test.rb +33 -0
- metadata +241 -0
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
require 'test_helper'
|
|
2
|
+
|
|
3
|
+
class CreationTaskDefinitionTest < ActiveSupport::TestCase
|
|
4
|
+
let(:definition_class) { ForemanDeployments::Tasks::CreationTaskDefinition }
|
|
5
|
+
|
|
6
|
+
describe 'build' do
|
|
7
|
+
test 'it returns instance of HostCreationTaskDefinition for Host' do
|
|
8
|
+
definition = definition_class.build('class' => 'Host')
|
|
9
|
+
assert_equal(ForemanDeployments::Tasks::HostCreationTaskDefinition, definition.class)
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
test 'it returns instance of HostCreationTaskDefinition for Host::Managed' do
|
|
13
|
+
definition = definition_class.build('class' => 'Host::Managed')
|
|
14
|
+
assert_equal(ForemanDeployments::Tasks::HostCreationTaskDefinition, definition.class)
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
test 'it returns instance of CreationTaskDefinition for other classes' do
|
|
18
|
+
definition = definition_class.build('class' => 'Architecture')
|
|
19
|
+
assert_equal(ForemanDeployments::Tasks::CreationTaskDefinition, definition.class)
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
describe 'object creation' do
|
|
24
|
+
test 'it returns instance of the class' do
|
|
25
|
+
object = definition_class.create_object(
|
|
26
|
+
'class' => 'Architecture'
|
|
27
|
+
)
|
|
28
|
+
assert_equal(Architecture, object.class)
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
test 'it sets the parameters' do
|
|
32
|
+
object = definition_class.create_object(
|
|
33
|
+
'class' => 'Architecture',
|
|
34
|
+
'params' => {
|
|
35
|
+
'name' => 'test'
|
|
36
|
+
}
|
|
37
|
+
)
|
|
38
|
+
assert_equal('test', object.name)
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
test "it ignores parameters that don't exist" do
|
|
42
|
+
object = definition_class.create_object(
|
|
43
|
+
'class' => 'Architecture',
|
|
44
|
+
'params' => {
|
|
45
|
+
'name' => 'test',
|
|
46
|
+
'unknown' => 123
|
|
47
|
+
}
|
|
48
|
+
)
|
|
49
|
+
assert_equal('test', object.name)
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
test 'it returns correct dynflow action' do
|
|
54
|
+
action = definition_class.build('class' => 'Architecture').dynflow_action
|
|
55
|
+
assert_equal(ForemanDeployments::Tasks::CreationTaskDefinition::Action, action)
|
|
56
|
+
end
|
|
57
|
+
end
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
require 'test_helper'
|
|
2
|
+
|
|
3
|
+
class HostCreationTaskDefinitionTest < ActiveSupport::TestCase
|
|
4
|
+
let(:definition_class) { ForemanDeployments::Tasks::HostCreationTaskDefinition }
|
|
5
|
+
|
|
6
|
+
test 'it returns correct dynflow action' do
|
|
7
|
+
action = definition_class.build('class' => 'Host').dynflow_action
|
|
8
|
+
assert_equal(ForemanDeployments::Tasks::HostCreationTaskDefinition::Action, action)
|
|
9
|
+
end
|
|
10
|
+
end
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
require 'test_helper'
|
|
2
|
+
|
|
3
|
+
class SearchTaskDefinitionTest < ActiveSupport::TestCase
|
|
4
|
+
class DummyModel < ActiveRecord::Base
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
setup do
|
|
8
|
+
@params = {
|
|
9
|
+
'class' => 'SearchTaskDefinitionTest::DummyModel',
|
|
10
|
+
'search_term' => 'a = b'
|
|
11
|
+
}
|
|
12
|
+
@params = HashWithIndifferentAccess[@params]
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
describe 'validate' do
|
|
16
|
+
test 'fails, if could not find a matching object' do
|
|
17
|
+
task = ForemanDeployments::Tasks::SearchTaskDefinition.new(@params)
|
|
18
|
+
DummyModel.expects(:search_for).returns([])
|
|
19
|
+
|
|
20
|
+
result = task.validate
|
|
21
|
+
|
|
22
|
+
assert_equal(1, result.messages.count)
|
|
23
|
+
assert_match(
|
|
24
|
+
"SearchTaskDefinitionTest::DummyModel.search_for('a = b') didn't return valid objects",
|
|
25
|
+
result.messages.first
|
|
26
|
+
)
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
test 'succeeds, if there is at least one matching object' do
|
|
30
|
+
task = ForemanDeployments::Tasks::SearchTaskDefinition.new(@params)
|
|
31
|
+
DummyModel.expects(:search_for).returns([mock('DummyModel1')])
|
|
32
|
+
|
|
33
|
+
result = task.validate
|
|
34
|
+
|
|
35
|
+
assert result.valid?
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
test 'should return valid search results for validation process' do
|
|
40
|
+
task = ForemanDeployments::Tasks::SearchTaskDefinition.new(@params)
|
|
41
|
+
search_result1 = mock('DummyModel1')
|
|
42
|
+
search_result1.expects(:id).returns(1)
|
|
43
|
+
DummyModel.expects(:search_for).returns([search_result1])
|
|
44
|
+
|
|
45
|
+
result = task.preliminary_output
|
|
46
|
+
|
|
47
|
+
assert_equal [search_result1], result['results']
|
|
48
|
+
end
|
|
49
|
+
end
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
require 'test_helper'
|
|
2
|
+
require 'dynflow/testing'
|
|
3
|
+
|
|
4
|
+
class StackDeployActionTest < ActiveSupport::TestCase
|
|
5
|
+
include ::Dynflow::Testing
|
|
6
|
+
|
|
7
|
+
class TestTaskDefinition < ForemanDeployments::Tasks::BaseDefinition
|
|
8
|
+
class Action < ForemanDeployments::Tasks::BaseAction; end
|
|
9
|
+
|
|
10
|
+
def dynflow_action
|
|
11
|
+
Action
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def get_planned_params(task)
|
|
16
|
+
task.planned.plan_input[0]
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
describe 'plan' do
|
|
20
|
+
test 'plans actions in deployment' do
|
|
21
|
+
stack = ForemanDeployments::StackDefinition.new(
|
|
22
|
+
:task1 => TestTaskDefinition.new,
|
|
23
|
+
:task2 => TestTaskDefinition.new,
|
|
24
|
+
:task3 => TestTaskDefinition.new
|
|
25
|
+
)
|
|
26
|
+
|
|
27
|
+
stack.tasks.each do |_task_id, task|
|
|
28
|
+
task.expects(:plan).once
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
create_and_plan_action(ForemanDeployments::Tasks::StackDeployAction, stack)
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
test 'planned actions recieve dereferenced input' do
|
|
35
|
+
task3 = TestTaskDefinition.new({})
|
|
36
|
+
task2 = TestTaskDefinition.new(
|
|
37
|
+
:param => ForemanDeployments::TaskReference.new(:task3, :id, task3)
|
|
38
|
+
)
|
|
39
|
+
task1 = TestTaskDefinition.new(
|
|
40
|
+
:param => ForemanDeployments::TaskReference.new(:task2, :some_value, task2)
|
|
41
|
+
)
|
|
42
|
+
|
|
43
|
+
stack = ForemanDeployments::StackDefinition.new(
|
|
44
|
+
:task1 => task1,
|
|
45
|
+
:task2 => task2,
|
|
46
|
+
:task3 => task3
|
|
47
|
+
)
|
|
48
|
+
|
|
49
|
+
create_and_plan_action(ForemanDeployments::Tasks::StackDeployAction, stack)
|
|
50
|
+
|
|
51
|
+
task_params = get_planned_params(task1)
|
|
52
|
+
assert_equal(Dynflow::ExecutionPlan::OutputReference, task_params['param'].class)
|
|
53
|
+
assert_equal(['some_value'], task_params['param'].subkeys)
|
|
54
|
+
|
|
55
|
+
task_params = get_planned_params(task2)
|
|
56
|
+
assert_equal(Dynflow::ExecutionPlan::OutputReference, task_params['param'].class)
|
|
57
|
+
assert_equal(['id'], task_params['param'].subkeys)
|
|
58
|
+
|
|
59
|
+
assert_equal({}, get_planned_params(task3))
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
test 'plans referenced tasks only once' do
|
|
63
|
+
task2 = TestTaskDefinition.new({})
|
|
64
|
+
task1 = TestTaskDefinition.new(
|
|
65
|
+
:param => ForemanDeployments::TaskReference.new(:task2, :some_value, task2)
|
|
66
|
+
)
|
|
67
|
+
|
|
68
|
+
stack = ForemanDeployments::StackDefinition.new(
|
|
69
|
+
:task1 => task1,
|
|
70
|
+
:task2 => task2
|
|
71
|
+
)
|
|
72
|
+
|
|
73
|
+
planned = mock
|
|
74
|
+
planned.stubs(:output)
|
|
75
|
+
|
|
76
|
+
stack.tasks.each do |_task_id, task|
|
|
77
|
+
task.expects(:plan).once.returns(planned)
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
create_and_plan_action(ForemanDeployments::Tasks::StackDeployAction, stack)
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
end
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
require 'test_helper'
|
|
2
|
+
|
|
3
|
+
class WaitUntilBuiltTaskDefinitionTest < ActiveSupport::TestCase
|
|
4
|
+
let(:definition_class) { ForemanDeployments::Tasks::WaitUntilBuiltTaskDefinition }
|
|
5
|
+
|
|
6
|
+
describe 'build' do
|
|
7
|
+
test 'it returns instance of WaitUntilBuiltTaskDefinition' do
|
|
8
|
+
definition = definition_class.build
|
|
9
|
+
assert_equal(ForemanDeployments::Tasks::WaitUntilBuiltTaskDefinition, definition.class)
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
describe 'build status' do
|
|
14
|
+
setup do
|
|
15
|
+
@reports = []
|
|
16
|
+
@host = stub(
|
|
17
|
+
:reports => @reports
|
|
18
|
+
)
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
test 'is negative for nil' do
|
|
22
|
+
status = definition_class.build_status(nil)
|
|
23
|
+
assert_equal(false, status['build'])
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
test 'is negative for host with only one report' do
|
|
27
|
+
@reports << stub(:error? => false)
|
|
28
|
+
status = definition_class.build_status(@host)
|
|
29
|
+
assert_equal(false, status['build'])
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
test 'is negative for host with two reports, where the last failed' do
|
|
33
|
+
@reports << stub(:error? => false)
|
|
34
|
+
@reports << stub(:error? => true)
|
|
35
|
+
status = definition_class.build_status(@host)
|
|
36
|
+
assert_equal(false, status['build'])
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
test 'is positive for host with two reports, where the last succeeded' do
|
|
40
|
+
@reports << stub(:error? => false)
|
|
41
|
+
@reports << stub(:error? => true)
|
|
42
|
+
@reports << stub(:error? => false)
|
|
43
|
+
status = definition_class.build_status(@host)
|
|
44
|
+
assert_equal(true, status['build'])
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
describe 'validation' do
|
|
49
|
+
setup do
|
|
50
|
+
@definition = definition_class.build
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
test 'it is valid when a host_id is passed' do
|
|
54
|
+
@definition.configure('host_id' => 1)
|
|
55
|
+
result = @definition.validate
|
|
56
|
+
|
|
57
|
+
assert result.valid?
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
test 'it is invalid when a host_id is missing' do
|
|
61
|
+
result = @definition.validate
|
|
62
|
+
refute result.valid?
|
|
63
|
+
assert result.messages.include?("'host_id' is a required parameter")
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
test 'it returns correct dynflow action' do
|
|
68
|
+
action = definition_class.build.dynflow_action
|
|
69
|
+
assert_equal(ForemanDeployments::Tasks::WaitUntilBuiltTaskDefinition::Action, action)
|
|
70
|
+
end
|
|
71
|
+
end
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
require 'test_helper'
|
|
2
|
+
|
|
3
|
+
class DereferenceVisitorTest < ActiveSupport::TestCase
|
|
4
|
+
class TestTask < ForemanDeployments::Tasks::BaseDefinition
|
|
5
|
+
def validate
|
|
6
|
+
ForemanDeployments::Validation::ValidationResult.new
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def preliminary_output
|
|
10
|
+
{}
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
setup do
|
|
15
|
+
@visitor = ForemanDeployments::Validation::DereferenceVisitor.new
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
test 'it resolves dependencies' do
|
|
19
|
+
# We're also testing presence of the cache by setting .expects(:preliminary_output).once
|
|
20
|
+
# and having multiple references to a single task
|
|
21
|
+
|
|
22
|
+
task3 = TestTask.new
|
|
23
|
+
task3.expects(:preliminary_output).once.returns('result' => 789)
|
|
24
|
+
|
|
25
|
+
task2 = TestTask.new(
|
|
26
|
+
'param1' => 2,
|
|
27
|
+
'param2' => ForemanDeployments::TaskReference.new('task3', 'result', task3)
|
|
28
|
+
)
|
|
29
|
+
task2.expects(:preliminary_output).once.returns('result1' => 123, 'result2' => 456)
|
|
30
|
+
|
|
31
|
+
task1 = TestTask.new(
|
|
32
|
+
'param1' => 1,
|
|
33
|
+
'param2' => ForemanDeployments::TaskReference.new('task2', 'result1', task2),
|
|
34
|
+
'param3' => ForemanDeployments::TaskReference.new('task2', 'result2', task2)
|
|
35
|
+
)
|
|
36
|
+
|
|
37
|
+
definition = ForemanDeployments::StackDefinition.new(
|
|
38
|
+
'task1' => task1,
|
|
39
|
+
'task2' => task2,
|
|
40
|
+
'task3' => task3
|
|
41
|
+
)
|
|
42
|
+
definition.accept(@visitor)
|
|
43
|
+
|
|
44
|
+
assert_equal({}, task3.parameters)
|
|
45
|
+
assert_equal({ 'param1' => 2, 'param2' => 789 }, task2.parameters)
|
|
46
|
+
assert_equal({ 'param1' => 1, 'param2' => 123, 'param3' => 456 }, task1.parameters)
|
|
47
|
+
end
|
|
48
|
+
end
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
require 'test_helper'
|
|
2
|
+
|
|
3
|
+
class RemoveIdsVisitorTest < ActiveSupport::TestCase
|
|
4
|
+
class TestTask < ForemanDeployments::Tasks::CreationTaskDefinition
|
|
5
|
+
def validate
|
|
6
|
+
ForemanDeployments::Validation::ValidationResult.new
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def preliminary_output
|
|
10
|
+
{}
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
setup do
|
|
15
|
+
@visitor = ForemanDeployments::Validation::RemoveIdsVisitor.new
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
test 'it turns id reference into object reference in parameters' do
|
|
19
|
+
task2 = TestTask.new
|
|
20
|
+
|
|
21
|
+
task2_ref = ForemanDeployments::TaskReference.new('task2', 'resource.id')
|
|
22
|
+
task2_ref.task = task2
|
|
23
|
+
|
|
24
|
+
task1 = TestTask.new(
|
|
25
|
+
:test_resource_id => task2_ref
|
|
26
|
+
)
|
|
27
|
+
|
|
28
|
+
definition = ForemanDeployments::StackDefinition.new(
|
|
29
|
+
'task1' => task1,
|
|
30
|
+
'task2' => task2
|
|
31
|
+
)
|
|
32
|
+
definition.accept(@visitor)
|
|
33
|
+
|
|
34
|
+
assert_equal('resource', task1.parameters['test_resource'].output_key)
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
test 'it turns single reference to multiple ids into an object reference' do
|
|
38
|
+
task2 = TestTask.new
|
|
39
|
+
|
|
40
|
+
task2_ref = ForemanDeployments::TaskReference.new('task2', 'resource.ids')
|
|
41
|
+
task2_ref.task = task2
|
|
42
|
+
|
|
43
|
+
task1 = TestTask.new(
|
|
44
|
+
:test_resource_ids => task2_ref
|
|
45
|
+
)
|
|
46
|
+
|
|
47
|
+
definition = ForemanDeployments::StackDefinition.new(
|
|
48
|
+
'task1' => task1,
|
|
49
|
+
'task2' => task2
|
|
50
|
+
)
|
|
51
|
+
definition.accept(@visitor)
|
|
52
|
+
|
|
53
|
+
assert_equal('resources', task1.parameters['test_resources'].output_key)
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
test 'it turns array of id references into array of object references in parameters' do
|
|
57
|
+
task2 = TestTask.new
|
|
58
|
+
|
|
59
|
+
task2_ref = ForemanDeployments::TaskReference.new('task2', 'resource.id')
|
|
60
|
+
task2_ref.task = task2
|
|
61
|
+
|
|
62
|
+
task1 = TestTask.new(
|
|
63
|
+
:test_resource_ids => [task2_ref]
|
|
64
|
+
)
|
|
65
|
+
|
|
66
|
+
definition = ForemanDeployments::StackDefinition.new(
|
|
67
|
+
'task1' => task1,
|
|
68
|
+
'task2' => task2
|
|
69
|
+
)
|
|
70
|
+
definition.accept(@visitor)
|
|
71
|
+
|
|
72
|
+
assert_equal(1, task1.parameters['test_resources'].size)
|
|
73
|
+
assert_equal('resource', task1.parameters['test_resources'][0].output_key)
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
test 'it does not change parameters that are not references' do
|
|
77
|
+
params = {
|
|
78
|
+
'test_resource_id' => 1,
|
|
79
|
+
'test_resource_ids' => [1, 2]
|
|
80
|
+
}
|
|
81
|
+
task1 = TestTask.new(params)
|
|
82
|
+
|
|
83
|
+
definition = ForemanDeployments::StackDefinition.new(
|
|
84
|
+
'task1' => task1
|
|
85
|
+
)
|
|
86
|
+
definition.accept(@visitor)
|
|
87
|
+
|
|
88
|
+
assert_equal(params, task1.parameters)
|
|
89
|
+
end
|
|
90
|
+
end
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
require 'test_helper'
|
|
2
|
+
|
|
3
|
+
class ValidationResultTest < ActiveSupport::TestCase
|
|
4
|
+
describe 'valid?' do
|
|
5
|
+
test 'returns true when there are no messages' do
|
|
6
|
+
result = ForemanDeployments::Validation::ValidationResult.new
|
|
7
|
+
assert result.valid?
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
test 'returns false when there are some messages' do
|
|
11
|
+
result = ForemanDeployments::Validation::ValidationResult.new([
|
|
12
|
+
'Some error message'
|
|
13
|
+
])
|
|
14
|
+
refute result.valid?
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
describe 'to_s' do
|
|
19
|
+
test 'is empty for valid results' do
|
|
20
|
+
result = ForemanDeployments::Validation::ValidationResult.new
|
|
21
|
+
assert_equal('', result.to_s)
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
test 'contains messages for the invalid results' do
|
|
25
|
+
result = ForemanDeployments::Validation::ValidationResult.new([
|
|
26
|
+
'Some error',
|
|
27
|
+
'Another error'
|
|
28
|
+
])
|
|
29
|
+
assert_equal("Some error\nAnother error", result.to_s)
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
test 'contains messages for the invalid results stored in hashes' do
|
|
33
|
+
result = ForemanDeployments::Validation::ValidationResult.new(
|
|
34
|
+
'e1' => 'Some error',
|
|
35
|
+
'e2' => 'Another error'
|
|
36
|
+
)
|
|
37
|
+
assert_equal("e1: Some error\ne2: Another error", result.to_s)
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|