hybrid_platforms_conductor 32.13.4 → 32.16.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.
Files changed (66) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +60 -0
  3. data/bin/get_impacted_nodes +1 -1
  4. data/bin/setup +6 -1
  5. data/docs/plugins.md +1 -0
  6. data/docs/plugins/platform_handler/serverless_chef.md +111 -0
  7. data/lib/hybrid_platforms_conductor/cmd_runner.rb +13 -1
  8. data/lib/hybrid_platforms_conductor/connector.rb +4 -2
  9. data/lib/hybrid_platforms_conductor/deployer.rb +2 -1
  10. data/lib/hybrid_platforms_conductor/hpc_plugins/connector/local.rb +1 -1
  11. data/lib/hybrid_platforms_conductor/hpc_plugins/platform_handler/serverless_chef.rb +535 -0
  12. data/lib/hybrid_platforms_conductor/hpc_plugins/platform_handler/serverless_chef/dsl_parser.rb +51 -0
  13. data/lib/hybrid_platforms_conductor/hpc_plugins/platform_handler/serverless_chef/recipes_tree_builder.rb +232 -0
  14. data/lib/hybrid_platforms_conductor/hpc_plugins/provisioner/podman.rb +1 -1
  15. data/lib/hybrid_platforms_conductor/nodes_handler.rb +9 -5
  16. data/lib/hybrid_platforms_conductor/version.rb +1 -1
  17. data/spec/hybrid_platforms_conductor_test.rb +3 -0
  18. data/spec/hybrid_platforms_conductor_test/api/cmd_runner_spec.rb +7 -0
  19. data/spec/hybrid_platforms_conductor_test/api/deployer/provisioner_spec.rb +23 -0
  20. data/spec/hybrid_platforms_conductor_test/api/nodes_handler/cmdbs_plugins_api_spec.rb +11 -0
  21. data/spec/hybrid_platforms_conductor_test/api/platform_handlers/serverless_chef/config_dsl_spec.rb +17 -0
  22. data/spec/hybrid_platforms_conductor_test/api/platform_handlers/serverless_chef/deploy_output_parsing_spec.rb +94 -0
  23. data/spec/hybrid_platforms_conductor_test/api/platform_handlers/serverless_chef/diff_impacts_spec.rb +317 -0
  24. data/spec/hybrid_platforms_conductor_test/api/platform_handlers/serverless_chef/inventory_spec.rb +65 -0
  25. data/spec/hybrid_platforms_conductor_test/api/platform_handlers/serverless_chef/packaging_spec.rb +293 -0
  26. data/spec/hybrid_platforms_conductor_test/api/platform_handlers/serverless_chef/services_deployment_spec.rb +272 -0
  27. data/spec/hybrid_platforms_conductor_test/helpers/cmd_runner_helpers.rb +1 -1
  28. data/spec/hybrid_platforms_conductor_test/helpers/serverless_chef_helpers.rb +53 -0
  29. data/spec/hybrid_platforms_conductor_test/serverless_chef_repositories/1_node/chef_versions.yml +3 -0
  30. data/spec/hybrid_platforms_conductor_test/serverless_chef_repositories/1_node/nodes/node.json +14 -0
  31. data/spec/hybrid_platforms_conductor_test/serverless_chef_repositories/1_node/policyfiles/test_policy.rb +3 -0
  32. data/spec/hybrid_platforms_conductor_test/serverless_chef_repositories/data_bags/chef_versions.yml +3 -0
  33. data/spec/hybrid_platforms_conductor_test/serverless_chef_repositories/data_bags/data_bags/my_bag/my_item.json +4 -0
  34. data/spec/hybrid_platforms_conductor_test/serverless_chef_repositories/data_bags/nodes/node.json +14 -0
  35. data/spec/hybrid_platforms_conductor_test/serverless_chef_repositories/data_bags/policyfiles/test_policy.rb +3 -0
  36. data/spec/hybrid_platforms_conductor_test/serverless_chef_repositories/hpc_test/chef_versions.yml +3 -0
  37. data/spec/hybrid_platforms_conductor_test/serverless_chef_repositories/hpc_test/cookbooks/hpc_test/recipes/after_run.rb +1 -0
  38. data/spec/hybrid_platforms_conductor_test/serverless_chef_repositories/hpc_test/cookbooks/hpc_test/recipes/before_run.rb +1 -0
  39. data/spec/hybrid_platforms_conductor_test/serverless_chef_repositories/hpc_test/nodes/node.json +10 -0
  40. data/spec/hybrid_platforms_conductor_test/serverless_chef_repositories/hpc_test/policyfiles/test_policy.rb +3 -0
  41. data/spec/hybrid_platforms_conductor_test/serverless_chef_repositories/recipes/cookbooks/test_cookbook_1/recipes/default.rb +1 -0
  42. data/spec/hybrid_platforms_conductor_test/serverless_chef_repositories/recipes/cookbooks/test_cookbook_2/libraries/default.rb +4 -0
  43. data/spec/hybrid_platforms_conductor_test/serverless_chef_repositories/recipes/cookbooks/test_cookbook_2/recipes/default.rb +1 -0
  44. data/spec/hybrid_platforms_conductor_test/serverless_chef_repositories/recipes/cookbooks/test_cookbook_2/recipes/other_recipe.rb +1 -0
  45. data/spec/hybrid_platforms_conductor_test/serverless_chef_repositories/recipes/cookbooks/test_cookbook_2/resources/my_resource.rb +1 -0
  46. data/spec/hybrid_platforms_conductor_test/serverless_chef_repositories/recipes/nodes/node1.json +10 -0
  47. data/spec/hybrid_platforms_conductor_test/serverless_chef_repositories/recipes/nodes/node2.json +10 -0
  48. data/spec/hybrid_platforms_conductor_test/serverless_chef_repositories/recipes/policyfiles/test_policy_1.rb +4 -0
  49. data/spec/hybrid_platforms_conductor_test/serverless_chef_repositories/recipes/policyfiles/test_policy_2.rb +4 -0
  50. data/spec/hybrid_platforms_conductor_test/serverless_chef_repositories/several_cookbooks/config.rb +1 -0
  51. data/spec/hybrid_platforms_conductor_test/serverless_chef_repositories/several_cookbooks/cookbooks/test_cookbook_1/recipes/default.rb +1 -0
  52. data/spec/hybrid_platforms_conductor_test/serverless_chef_repositories/several_cookbooks/nodes/node1.json +10 -0
  53. data/spec/hybrid_platforms_conductor_test/serverless_chef_repositories/several_cookbooks/nodes/node2.json +10 -0
  54. data/spec/hybrid_platforms_conductor_test/serverless_chef_repositories/several_cookbooks/other_cookbooks/test_cookbook_2/libraries/default.rb +4 -0
  55. data/spec/hybrid_platforms_conductor_test/serverless_chef_repositories/several_cookbooks/other_cookbooks/test_cookbook_2/recipes/default.rb +1 -0
  56. data/spec/hybrid_platforms_conductor_test/serverless_chef_repositories/several_cookbooks/other_cookbooks/test_cookbook_2/recipes/other_recipe.rb +1 -0
  57. data/spec/hybrid_platforms_conductor_test/serverless_chef_repositories/several_cookbooks/other_cookbooks/test_cookbook_2/resources/my_resource.rb +1 -0
  58. data/spec/hybrid_platforms_conductor_test/serverless_chef_repositories/several_cookbooks/policyfiles/test_policy_1.rb +4 -0
  59. data/spec/hybrid_platforms_conductor_test/serverless_chef_repositories/several_cookbooks/policyfiles/test_policy_2.rb +4 -0
  60. data/spec/hybrid_platforms_conductor_test/serverless_chef_repositories/several_nodes/chef_versions.yml +3 -0
  61. data/spec/hybrid_platforms_conductor_test/serverless_chef_repositories/several_nodes/nodes/local.json +10 -0
  62. data/spec/hybrid_platforms_conductor_test/serverless_chef_repositories/several_nodes/nodes/node1.json +10 -0
  63. data/spec/hybrid_platforms_conductor_test/serverless_chef_repositories/several_nodes/nodes/node2.json +10 -0
  64. data/spec/hybrid_platforms_conductor_test/serverless_chef_repositories/several_nodes/policyfiles/test_policy_1.rb +3 -0
  65. data/spec/hybrid_platforms_conductor_test/serverless_chef_repositories/several_nodes/policyfiles/test_policy_2.rb +3 -0
  66. metadata +192 -143
@@ -0,0 +1,272 @@
1
+ describe HybridPlatformsConductor::HpcPlugins::PlatformHandler::ServerlessChef do
2
+
3
+ context 'checking services deployment' do
4
+
5
+ # Simulate a packaging of a given repository
6
+ #
7
+ # Parameters::
8
+ # * *repository* (String): The repository we package
9
+ # * *service* (String): The service being packaged in this repository [default: 'test_policy']
10
+ def mock_package(repository, service: 'test_policy')
11
+ FileUtils.mkdir_p "#{repository}/dist/prod/#{service}"
12
+ end
13
+
14
+ # Get expected actions to deploy a service on a given node
15
+ #
16
+ # Parameters::
17
+ # * *repository* (String): Platform repository
18
+ # * *check_mode* (Boolean): Are we expected check-mode? [default: false]
19
+ # * *sudo* (String): sudo prefix command [default: 'sudo -u root ']
20
+ # * *env* (String): Environment expected to be packaged [default: 'prod']
21
+ # * *policy* (String): Expected policy to be packaged [default: 'test_policy']
22
+ # * *node* (String): Expected node to be deployed [default: 'node']
23
+ # Result::
24
+ # * Array: Expected actions
25
+ def expected_actions_to_deploy_chef(
26
+ repository,
27
+ check_mode: false,
28
+ sudo: 'sudo -u root ',
29
+ env: 'prod',
30
+ policy: 'test_policy',
31
+ node: 'node'
32
+ )
33
+ [
34
+ {
35
+ remote_bash: [
36
+ 'set -e',
37
+ 'set -o pipefail',
38
+ "if [ -n \"$(command -v apt)\" ]; then #{sudo}apt update && #{sudo}apt install -y curl build-essential ; else #{sudo}yum groupinstall 'Development Tools' && #{sudo}yum install -y curl ; fi",
39
+ 'mkdir -p ./hpc_deploy',
40
+ 'rm -rf ./hpc_deploy/tmp',
41
+ 'mkdir -p ./hpc_deploy/tmp',
42
+ 'curl --location https://omnitruck.chef.io/install.sh --output ./hpc_deploy/install.sh',
43
+ 'chmod a+x ./hpc_deploy/install.sh',
44
+ "#{sudo}TMPDIR=./hpc_deploy/tmp ./hpc_deploy/install.sh -d /opt/artefacts -v 17.0 -s once"
45
+ ]
46
+ },
47
+ {
48
+ scp: { "#{repository}/dist/#{env}/#{policy}" => './hpc_deploy' },
49
+ remote_bash: [
50
+ 'set -e',
51
+ "cd ./hpc_deploy/#{policy}",
52
+ "#{sudo}SSL_CERT_DIR=/etc/ssl/certs /opt/chef/bin/chef-client --local-mode --chef-license accept --json-attributes nodes/#{node}.json#{check_mode ? ' --why-run' : ''}",
53
+ 'cd ..',
54
+ "#{sudo}rm -rf ./hpc_deploy/#{policy}"
55
+ ]
56
+ }
57
+ ]
58
+ end
59
+
60
+ context 'with an empty platform' do
61
+
62
+ it 'prepares for deploy' do
63
+ with_serverless_chef_platforms('empty') do |platform, repository|
64
+ platform.prepare_for_deploy(
65
+ services: {},
66
+ secrets: {},
67
+ local_environment: false,
68
+ why_run: false
69
+ )
70
+ end
71
+ end
72
+
73
+ it 'prepares for deploy in why-run mode' do
74
+ with_serverless_chef_platforms('empty') do |platform, repository|
75
+ platform.prepare_for_deploy(
76
+ services: {},
77
+ secrets: {},
78
+ local_environment: false,
79
+ why_run: true
80
+ )
81
+ end
82
+ end
83
+
84
+ it 'prepares for deploy in local mode' do
85
+ with_serverless_chef_platforms('empty') do |platform, repository|
86
+ platform.prepare_for_deploy(
87
+ services: {},
88
+ secrets: {},
89
+ local_environment: true,
90
+ why_run: false
91
+ )
92
+ end
93
+ end
94
+
95
+ end
96
+
97
+ context 'with a platform having 1 node' do
98
+
99
+ it 'returns actions to deploy on this node' do
100
+ with_serverless_chef_platforms('1_node') do |platform, repository|
101
+ mock_package(repository)
102
+ platform.prepare_for_deploy(
103
+ services: { 'node' => %w[test_policy] },
104
+ secrets: {},
105
+ local_environment: false,
106
+ why_run: false
107
+ )
108
+ expect(platform.actions_to_deploy_on('node', 'test_policy', use_why_run: false)).to eq expected_actions_to_deploy_chef(repository)
109
+ end
110
+ end
111
+
112
+ it 'returns actions to deploy on this node with node attributes setup from metadata' do
113
+ with_serverless_chef_platforms('1_node') do |platform, repository|
114
+ test_nodes_handler.override_metadata_of 'node', :new_metadata, 'new_value'
115
+ mock_package(repository)
116
+ platform.prepare_for_deploy(
117
+ services: { 'node' => %w[test_policy] },
118
+ secrets: {},
119
+ local_environment: false,
120
+ why_run: false
121
+ )
122
+ expect(platform.actions_to_deploy_on('node', 'test_policy', use_why_run: false)).to eq expected_actions_to_deploy_chef(repository)
123
+ attributes_file = "#{repository}/dist/prod/test_policy/nodes/node.json"
124
+ expect(File.exist?(attributes_file)).to eq true
125
+ expect(JSON.parse(File.read(attributes_file))).to eq(
126
+ 'description' => 'Single test node',
127
+ 'image' => 'debian_9',
128
+ 'new_metadata' => 'new_value',
129
+ 'private_ips' => ['172.16.0.1'],
130
+ 'property1' => { 'property11' => 'value11' },
131
+ 'property2' => 'value2',
132
+ )
133
+ end
134
+ end
135
+
136
+ it 'returns actions to deploy on this node with secrets' do
137
+ with_serverless_chef_platforms('1_node') do |platform, repository|
138
+ mock_package(repository)
139
+ platform.prepare_for_deploy(
140
+ services: { 'node' => %w[test_policy] },
141
+ secrets: { 'my_secret' => 'secret_value' },
142
+ local_environment: false,
143
+ why_run: false
144
+ )
145
+ expect(platform.actions_to_deploy_on('node', 'test_policy', use_why_run: false)).to eq expected_actions_to_deploy_chef(repository)
146
+ end
147
+ end
148
+
149
+ it 'returns actions to deploy on this node in why-run mode' do
150
+ with_serverless_chef_platforms('1_node') do |platform, repository|
151
+ mock_package(repository)
152
+ platform.prepare_for_deploy(
153
+ services: { 'node' => %w[test_policy] },
154
+ secrets: {},
155
+ local_environment: false,
156
+ why_run: true
157
+ )
158
+ expect(platform.actions_to_deploy_on('node', 'test_policy', use_why_run: true)).to eq expected_actions_to_deploy_chef(repository, check_mode: true)
159
+ end
160
+ end
161
+
162
+ it 'returns actions to deploy on this node using local mode' do
163
+ with_serverless_chef_platforms('1_node') do |platform, repository|
164
+ mock_package(repository)
165
+ platform.prepare_for_deploy(
166
+ services: { 'node' => %w[test_policy] },
167
+ secrets: {},
168
+ local_environment: true,
169
+ why_run: false
170
+ )
171
+ expect(platform.actions_to_deploy_on('node', 'test_policy', use_why_run: false)).to eq expected_actions_to_deploy_chef(repository, env: 'local')
172
+ end
173
+ end
174
+
175
+ it 'returns actions to deploy on this node in why-run mode and local mode' do
176
+ with_serverless_chef_platforms('1_node') do |platform, repository|
177
+ mock_package(repository)
178
+ platform.prepare_for_deploy(
179
+ services: { 'node' => %w[test_policy] },
180
+ secrets: {},
181
+ local_environment: true,
182
+ why_run: true
183
+ )
184
+ expect(platform.actions_to_deploy_on('node', 'test_policy', use_why_run: true)).to eq expected_actions_to_deploy_chef(repository, env: 'local', check_mode: true)
185
+ end
186
+ end
187
+
188
+ it 'returns actions to deploy on this node using root user' do
189
+ with_serverless_chef_platforms('1_node') do |platform, repository|
190
+ test_actions_executor.connector(:ssh).ssh_user = 'root'
191
+ mock_package(repository)
192
+ platform.prepare_for_deploy(
193
+ services: { 'node' => %w[test_policy] },
194
+ secrets: {},
195
+ local_environment: false,
196
+ why_run: false
197
+ )
198
+ expect(platform.actions_to_deploy_on('node', 'test_policy', use_why_run: false)).to eq expected_actions_to_deploy_chef(repository, sudo: '')
199
+ end
200
+ end
201
+
202
+ it 'fails with a nice message when chef_versions.yml is missing' do
203
+ with_serverless_chef_platforms('1_node') do |platform, repository|
204
+ mock_package(repository)
205
+ platform.prepare_for_deploy(
206
+ services: { 'node' => %w[test_policy] },
207
+ secrets: {},
208
+ local_environment: false,
209
+ why_run: false
210
+ )
211
+ File.unlink("#{repository}/chef_versions.yml")
212
+ expect { platform.actions_to_deploy_on('node', 'test_policy', use_why_run: false) }.to raise_error "Missing file #{repository}/chef_versions.yml specifying the Chef Infra Client version to be deployed"
213
+ end
214
+ end
215
+
216
+ end
217
+
218
+ context 'with a platform having several nodes' do
219
+
220
+ it 'deploys services declared on 1 node on another node if asked' do
221
+ with_serverless_chef_platforms('several_nodes') do |platform, repository|
222
+ mock_package(repository)
223
+ platform.prepare_for_deploy(
224
+ services: { 'node2' => %w[test_policy_1] },
225
+ secrets: {},
226
+ local_environment: false,
227
+ why_run: false
228
+ )
229
+ expect(platform.actions_to_deploy_on('node2', 'test_policy_1', use_why_run: false)).to eq expected_actions_to_deploy_chef(repository, policy: 'test_policy_1', node: 'node2')
230
+ end
231
+ end
232
+
233
+ it 'deploys local nodes' do
234
+ with_serverless_chef_platforms('several_nodes') do |platform, repository|
235
+ mock_package(repository)
236
+ platform.prepare_for_deploy(
237
+ services: { 'local' => %w[test_policy_1] },
238
+ secrets: {},
239
+ local_environment: false,
240
+ why_run: false
241
+ )
242
+ expect(platform.actions_to_deploy_on('local', 'test_policy_1', use_why_run: false)).to eq [
243
+ {
244
+ bash: "cd #{repository}/dist/prod/test_policy_1 && sudo SSL_CERT_DIR=/etc/ssl/certs /opt/chef-workstation/bin/chef-client --local-mode --chef-license accept --json-attributes nodes/local.json"
245
+ }
246
+ ]
247
+ end
248
+ end
249
+
250
+ end
251
+
252
+ context 'with 2 platforms' do
253
+
254
+ it 'deploys a service on a node belonging to another platform' do
255
+ with_serverless_chef_platforms({ 'p1' => '1_node', 'p2' => 'several_nodes' }) do |repositories|
256
+ platform_p1, repository_p1 = repositories.find { |platform, _repository| platform.name == 'p1' }
257
+ mock_package(repository_p1)
258
+ platform_p1.prepare_for_deploy(
259
+ services: { 'node2' => %w[test_policy_1] },
260
+ secrets: {},
261
+ local_environment: false,
262
+ why_run: false
263
+ )
264
+ expect(platform_p1.actions_to_deploy_on('node2', 'test_policy_1', use_why_run: false)).to eq expected_actions_to_deploy_chef(repository_p1, policy: 'test_policy_1', node: 'node2')
265
+ end
266
+ end
267
+
268
+ end
269
+
270
+ end
271
+
272
+ end
@@ -31,7 +31,7 @@ module HybridPlatformsConductorTest
31
31
  end
32
32
  # We need to protect the access to this array as the mocked commands can be called by competing threads
33
33
  remaining_expected_commands_mutex = Mutex.new
34
- allow(cmd_runner).to receive(:run_cmd) do |cmd, log_to_file: nil, log_to_stdout: true, log_stdout_to_io: nil, log_stderr_to_io: nil, expected_code: 0, timeout: nil, no_exception: false|
34
+ allow(cmd_runner).to receive(:run_cmd) do |cmd, log_to_file: nil, log_to_stdout: true, log_stdout_to_io: nil, log_stderr_to_io: nil, expected_code: 0, timeout: nil, no_exception: false, force_bash: false|
35
35
  # Check the remaining expected commands
36
36
  found_command = nil
37
37
  found_command_code = nil
@@ -0,0 +1,53 @@
1
+ require 'hybrid_platforms_conductor/hpc_plugins/platform_handler/serverless_chef'
2
+
3
+ module HybridPlatformsConductorTest
4
+
5
+ module Helpers
6
+
7
+ module ServerlessChefHelpers
8
+
9
+ # Setup a platforms config using test repository names
10
+ #
11
+ # Parameters::
12
+ # * *names* (String or Hash<String, String>): The test repository name (taken from the repositories/ folder), or a Hash of names and their corresponding test repository source name
13
+ # * *additional_config* (String): Additional config to append after the platform declaration [default: '']
14
+ # * *as_git* (Boolean): Should we initialize the repository as a git repo? [default: false]
15
+ # * Proc: Code called when repository is setup
16
+ # * Parameters::
17
+ # If there was only 1 repository:
18
+ # * *platform* (PlatformHandler): The platform handler to be tested
19
+ # * *repository* (String): Repository path
20
+ # If there was multiple repositories:
21
+ # * *repositories* (Hash<PlatformHandler,String>): Set of repositories, per platform handler
22
+ def with_serverless_chef_platforms(names, additional_config: '', as_git: false)
23
+ names = { names => names } unless names.is_a?(Hash)
24
+ with_repositories(names.keys, as_git: as_git) do |repositories|
25
+ repositories.each do |name, repository|
26
+ # Copy the content of the test repository in the temporary one
27
+ FileUtils.cp_r "#{__dir__}/../serverless_chef_repositories/#{names[name]}/.", repository
28
+ end
29
+ with_platforms(repositories.values.map { |repository| "serverless_chef_platform path: '#{repository}'\n" }.join + additional_config) do
30
+ repositories = Hash[names.keys.map do |name|
31
+ [
32
+ test_platforms_handler.platform(name),
33
+ repositories[name]
34
+ ]
35
+ end]
36
+ test_platforms_handler.inject_dependencies(
37
+ nodes_handler: test_nodes_handler,
38
+ actions_executor: test_actions_executor
39
+ )
40
+ if repositories.size == 1
41
+ yield *repositories.first
42
+ else
43
+ yield repositories
44
+ end
45
+ end
46
+ end
47
+ end
48
+
49
+ end
50
+
51
+ end
52
+
53
+ end
@@ -0,0 +1,3 @@
1
+ ---
2
+ workstation: '21.5'
3
+ client: '17.0'
@@ -0,0 +1,14 @@
1
+ {
2
+ "name": "node",
3
+ "normal": {
4
+ "description": "Single test node",
5
+ "image": "debian_9",
6
+ "private_ips": ["172.16.0.1"],
7
+ "property1": {
8
+ "property11": "value11"
9
+ },
10
+ "property2": "value2"
11
+ },
12
+ "policy_name": "test_policy",
13
+ "policy_group": "test_group"
14
+ }
@@ -0,0 +1,3 @@
1
+ name File.basename(__FILE__, '.rb')
2
+ default_source :supermarket
3
+ run_list 'recipe[test_cookbook]'
@@ -0,0 +1,3 @@
1
+ ---
2
+ workstation: '21.5'
3
+ client: '17.0'
@@ -0,0 +1,14 @@
1
+ {
2
+ "name": "node",
3
+ "normal": {
4
+ "description": "Single test node",
5
+ "image": "debian_9",
6
+ "private_ips": ["172.16.0.1"],
7
+ "property1": {
8
+ "property11": "value11"
9
+ },
10
+ "property2": "value2"
11
+ },
12
+ "policy_name": "test_policy",
13
+ "policy_group": "test_group"
14
+ }
@@ -0,0 +1,3 @@
1
+ name File.basename(__FILE__, '.rb')
2
+ default_source :supermarket
3
+ run_list 'recipe[test_cookbook]'
@@ -0,0 +1,3 @@
1
+ ---
2
+ workstation: '21.5'
3
+ client: '17.0'
@@ -0,0 +1,10 @@
1
+ {
2
+ "name": "node",
3
+ "normal": {
4
+ "description": "Single test node",
5
+ "image": "debian_9",
6
+ "private_ips": ["172.16.0.1"]
7
+ },
8
+ "policy_name": "test_policy",
9
+ "policy_group": "test_group"
10
+ }
@@ -0,0 +1,3 @@
1
+ name File.basename(__FILE__, '.rb')
2
+ default_source :supermarket
3
+ run_list 'recipe[test_cookbook]'
@@ -0,0 +1,10 @@
1
+ {
2
+ "name": "node1",
3
+ "normal": {
4
+ "description": "Node 1",
5
+ "image": "debian_9",
6
+ "private_ips": ["172.16.0.1"]
7
+ },
8
+ "policy_name": "test_policy_1",
9
+ "policy_group": "test_group"
10
+ }