hybrid_platforms_conductor 33.2.2 → 33.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (58) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +49 -0
  3. data/README.md +29 -2
  4. data/docs/config_dsl.md +45 -0
  5. data/docs/plugins.md +1 -0
  6. data/docs/plugins/secrets_reader/keepass.md +62 -0
  7. data/lib/hybrid_platforms_conductor/bitbucket.rb +134 -90
  8. data/lib/hybrid_platforms_conductor/cmd_runner.rb +4 -4
  9. data/lib/hybrid_platforms_conductor/common_config_dsl/bitbucket.rb +12 -44
  10. data/lib/hybrid_platforms_conductor/common_config_dsl/github.rb +9 -31
  11. data/lib/hybrid_platforms_conductor/config.rb +0 -35
  12. data/lib/hybrid_platforms_conductor/confluence.rb +93 -88
  13. data/lib/hybrid_platforms_conductor/connector.rb +1 -1
  14. data/lib/hybrid_platforms_conductor/core_extensions/bundler/without_bundled_env.rb +18 -1
  15. data/lib/hybrid_platforms_conductor/credentials.rb +122 -97
  16. data/lib/hybrid_platforms_conductor/deployer.rb +37 -30
  17. data/lib/hybrid_platforms_conductor/github.rb +39 -0
  18. data/lib/hybrid_platforms_conductor/hpc_plugins/action/bash.rb +1 -1
  19. data/lib/hybrid_platforms_conductor/hpc_plugins/action/remote_bash.rb +27 -17
  20. data/lib/hybrid_platforms_conductor/hpc_plugins/connector/local.rb +4 -2
  21. data/lib/hybrid_platforms_conductor/hpc_plugins/connector/my_connector.rb.sample +1 -1
  22. data/lib/hybrid_platforms_conductor/hpc_plugins/connector/ssh.rb +29 -20
  23. data/lib/hybrid_platforms_conductor/hpc_plugins/platform_handler/serverless_chef.rb +1 -1
  24. data/lib/hybrid_platforms_conductor/hpc_plugins/provisioner/proxmox.rb +5 -3
  25. data/lib/hybrid_platforms_conductor/hpc_plugins/provisioner/proxmox/reserve_proxmox_container +1 -0
  26. data/lib/hybrid_platforms_conductor/hpc_plugins/report/confluence.rb +3 -1
  27. data/lib/hybrid_platforms_conductor/hpc_plugins/secrets_reader/keepass.rb +174 -0
  28. data/lib/hybrid_platforms_conductor/hpc_plugins/secrets_reader/thycotic.rb +3 -1
  29. data/lib/hybrid_platforms_conductor/hpc_plugins/test/bitbucket_conf.rb +4 -1
  30. data/lib/hybrid_platforms_conductor/hpc_plugins/test/github_ci.rb +4 -1
  31. data/lib/hybrid_platforms_conductor/hpc_plugins/test/jenkins_ci_conf.rb +7 -3
  32. data/lib/hybrid_platforms_conductor/hpc_plugins/test/jenkins_ci_masters_ok.rb +8 -4
  33. data/lib/hybrid_platforms_conductor/hpc_plugins/test_report/confluence.rb +3 -1
  34. data/lib/hybrid_platforms_conductor/logger_helpers.rb +24 -1
  35. data/lib/hybrid_platforms_conductor/plugins.rb +1 -0
  36. data/lib/hybrid_platforms_conductor/safe_merge.rb +37 -0
  37. data/lib/hybrid_platforms_conductor/thycotic.rb +80 -75
  38. data/lib/hybrid_platforms_conductor/topographer/plugins/graphviz.rb +5 -3
  39. data/lib/hybrid_platforms_conductor/version.rb +1 -1
  40. data/spec/hybrid_platforms_conductor_test.rb +10 -0
  41. data/spec/hybrid_platforms_conductor_test/api/actions_executor/actions/bash_spec.rb +15 -0
  42. data/spec/hybrid_platforms_conductor_test/api/actions_executor/actions/remote_bash_spec.rb +32 -0
  43. data/spec/hybrid_platforms_conductor_test/api/actions_executor/connectors/local/remote_actions_spec.rb +9 -0
  44. data/spec/hybrid_platforms_conductor_test/api/actions_executor/connectors/ssh/config_dsl_spec.rb +8 -6
  45. data/spec/hybrid_platforms_conductor_test/api/actions_executor/connectors/ssh/remote_actions_spec.rb +38 -0
  46. data/spec/hybrid_platforms_conductor_test/api/cmd_runner_spec.rb +21 -1
  47. data/spec/hybrid_platforms_conductor_test/api/config_spec.rb +48 -72
  48. data/spec/hybrid_platforms_conductor_test/api/credentials_spec.rb +251 -0
  49. data/spec/hybrid_platforms_conductor_test/api/deployer/config_dsl_spec.rb +36 -0
  50. data/spec/hybrid_platforms_conductor_test/api/deployer/secrets_reader_plugins/keepass_spec.rb +680 -0
  51. data/spec/hybrid_platforms_conductor_test/api/deployer/secrets_reader_plugins/thycotic_spec.rb +2 -2
  52. data/spec/hybrid_platforms_conductor_test/api/nodes_handler/cmdbs_plugins_api_spec.rb +2 -2
  53. data/spec/hybrid_platforms_conductor_test/api/platform_handlers/serverless_chef/services_deployment_spec.rb +1 -1
  54. data/spec/hybrid_platforms_conductor_test/api/tests_runner/test_plugins/bitbucket_conf_spec.rb +49 -69
  55. data/spec/hybrid_platforms_conductor_test/api/tests_runner/test_plugins/github_ci_spec.rb +29 -39
  56. data/spec/hybrid_platforms_conductor_test/executables/nodes_to_deploy_spec.rb +21 -15
  57. data/spec/hybrid_platforms_conductor_test/test_connector.rb +2 -2
  58. metadata +188 -139
@@ -39,9 +39,9 @@ describe HybridPlatformsConductor::Deployer do
39
39
  if user.nil?
40
40
  user = 'thycotic_user_from_netrc'
41
41
  password = 'thycotic_password_from_netrc'
42
- expect(HybridPlatformsConductor::Credentials).to receive(:with_credentials_for) do |id, _logger, _logger_stderr, url: nil, &client_code|
42
+ expect(test_deployer.instance_variable_get(:@secrets_readers)[:thycotic]).to receive(:with_credentials_for) do |id, resource: nil, &client_code|
43
43
  expect(id).to eq :thycotic
44
- expect(url).to eq thycotic_url
44
+ expect(resource).to eq thycotic_url
45
45
  client_code.call user, password
46
46
  end
47
47
  end
@@ -255,12 +255,12 @@ describe HybridPlatformsConductor::NodesHandler do
255
255
  it 'can configure different priority rules for different properties' do
256
256
  with_cmdb_test_platform(
257
257
  cmdbs: %i[test_cmdb test_cmdb_2],
258
- additional_config: '
258
+ additional_config: <<~EO_CONFIG
259
259
  master_cmdbs(
260
260
  test_cmdb: :different_comment_2,
261
261
  test_cmdb_2: :different_comment
262
262
  )
263
- '
263
+ EO_CONFIG
264
264
  ) do
265
265
  expect(test_nodes_handler.get_different_comment_of('node1')).to eq 'Comment from test_cmdb_2'
266
266
  expect(test_nodes_handler.get_different_comment_2_of('node1')).to eq 'Comment2 from test_cmdb'
@@ -35,7 +35,7 @@ describe HybridPlatformsConductor::HpcPlugins::PlatformHandler::ServerlessChef d
35
35
  def expected_actions_to_deploy_chef(
36
36
  repository,
37
37
  check_mode: false,
38
- sudo: 'sudo -u root ',
38
+ sudo: 'sudo -u root -E ',
39
39
  env: 'prod',
40
40
  policy: 'test_policy',
41
41
  node: 'node',
@@ -5,8 +5,9 @@ describe HybridPlatformsConductor::TestsRunner do
5
5
  context 'with bitbucket_conf' do
6
6
 
7
7
  it 'iterates over defined Bitbucket repos' do
8
- with_repository do
9
- platforms = <<~EO_CONFIG
8
+ with_test_platform(
9
+ { nodes: { 'node' => {} } },
10
+ additional_config: <<~EO_CONFIG
10
11
  bitbucket_repos(
11
12
  url: 'https://my_bb1.my_domain.com',
12
13
  project: 'PR1',
@@ -34,73 +35,52 @@ describe HybridPlatformsConductor::TestsRunner do
34
35
  }
35
36
  )
36
37
  EO_CONFIG
37
- with_platforms platforms do
38
- repos = []
39
- test_config.for_each_bitbucket_repo do |bitbucket, repo_info|
40
- repos << {
41
- bitbucket_url: bitbucket.bitbucket_url,
42
- repo_info: repo_info
43
- }
44
- end
45
- expect(repos).to eq [
46
- {
47
- bitbucket_url: 'https://my_bb1.my_domain.com',
48
- repo_info: {
49
- name: 'repo1',
50
- project: 'PR1',
51
- url: 'https://my_bb1.my_domain.com/scm/pr1/repo1.git',
52
- jenkins_ci_url: nil,
53
- checks: {}
54
- }
55
- },
56
- {
57
- bitbucket_url: 'https://my_bb1.my_domain.com',
58
- repo_info: {
59
- name: 'repo2',
60
- project: 'PR1',
61
- url: 'https://my_bb1.my_domain.com/scm/pr1/repo2.git',
62
- jenkins_ci_url: nil,
63
- checks: {}
64
- }
65
- },
66
- {
67
- bitbucket_url: 'https://my_bb2.my_domain.com',
68
- repo_info: {
69
- name: 'repo3',
70
- project: 'PR2',
71
- url: 'https://my_bb2.my_domain.com/scm/pr2/repo3.git',
72
- jenkins_ci_url: 'https://my_jenkins.com/job/repo3',
73
- checks: {
74
- branch_permissions: [
75
- {
76
- type: 'fast-forward-only',
77
- branch: 'master',
78
- exempted_users: ['toto']
79
- }
80
- ]
81
- }
82
- }
83
- },
84
- {
85
- bitbucket_url: 'https://my_bb2.my_domain.com',
86
- repo_info: {
87
- name: 'repo4',
88
- project: 'PR2',
89
- url: 'https://my_bb2.my_domain.com/scm/pr2/repo4.git',
90
- jenkins_ci_url: 'https://my_jenkins.com/job/repo4',
91
- checks: {
92
- branch_permissions: [
93
- {
94
- type: 'fast-forward-only',
95
- branch: 'master',
96
- exempted_users: ['toto']
97
- }
98
- ]
99
- }
100
- }
101
- }
102
- ]
103
- end
38
+ ) do
39
+ test_tests_runner.tests = [:bitbucket_conf]
40
+ WebMock.disable_net_connect!
41
+ stub_request(:get, 'https://my_bb1.my_domain.com/rest/api/1.0/projects/PR1/repos/repo1/settings/pull-requests').to_return(body: {}.to_json)
42
+ stub_request(:get, 'https://my_bb1.my_domain.com/rest/default-reviewers/1.0/projects/PR1/repos/repo1/conditions').to_return(body: {}.to_json)
43
+ expect(Git).to receive(:ls_remote).with('https://my_bb1.my_domain.com/scm/pr1/repo1.git').and_return(
44
+ 'branches' => { 'master' => { sha: '12345' } },
45
+ 'tags' => { 'v1.0.0' => { sha: '12345' } }
46
+ )
47
+ stub_request(:get, 'https://my_bb1.my_domain.com/rest/api/1.0/projects/PR1/repos/repo2/settings/pull-requests').to_return(body: {}.to_json)
48
+ stub_request(:get, 'https://my_bb1.my_domain.com/rest/default-reviewers/1.0/projects/PR1/repos/repo2/conditions').to_return(body: {}.to_json)
49
+ expect(Git).to receive(:ls_remote).with('https://my_bb1.my_domain.com/scm/pr1/repo2.git').and_return(
50
+ 'branches' => { 'master' => { sha: '12345' } },
51
+ 'tags' => { 'v1.0.0' => { sha: '12345' } }
52
+ )
53
+ stub_request(:get, 'https://my_bb2.my_domain.com/rest/api/1.0/projects/PR2/repos/repo3/settings/pull-requests').to_return(body: {}.to_json)
54
+ stub_request(:get, 'https://my_bb2.my_domain.com/rest/default-reviewers/1.0/projects/PR2/repos/repo3/conditions').to_return(body: {}.to_json)
55
+ stub_request(:get, 'https://my_bb2.my_domain.com/rest/branch-permissions/2.0/projects/PR2/repos/repo3/restrictions').to_return(body: {
56
+ 'values' => [{
57
+ 'type' => 'fast-forward-only',
58
+ 'matcher' => { 'id' => 'refs/heads/master' },
59
+ 'users' => [{ 'name' => 'toto' }],
60
+ 'groups' => [],
61
+ 'accessKeys' => []
62
+ }]
63
+ }.to_json)
64
+ expect(Git).to receive(:ls_remote).with('https://my_bb2.my_domain.com/scm/pr2/repo3.git').and_return(
65
+ 'branches' => { 'master' => { sha: '12345' } },
66
+ 'tags' => { 'v1.0.0' => { sha: '12345' } }
67
+ )
68
+ stub_request(:get, 'https://my_bb2.my_domain.com/rest/api/1.0/projects/PR2/repos/repo4/settings/pull-requests').to_return(body: {}.to_json)
69
+ stub_request(:get, 'https://my_bb2.my_domain.com/rest/default-reviewers/1.0/projects/PR2/repos/repo4/conditions').to_return(body: {}.to_json)
70
+ stub_request(:get, 'https://my_bb2.my_domain.com/rest/branch-permissions/2.0/projects/PR2/repos/repo4/restrictions').to_return(body: {
71
+ 'values' => [{
72
+ 'type' => 'fast-forward-only',
73
+ 'matcher' => { 'id' => 'refs/heads/master' },
74
+ 'users' => [{ 'name' => 'toto' }],
75
+ 'groups' => [],
76
+ 'accessKeys' => []
77
+ }]
78
+ }.to_json)
79
+ expect(Git).to receive(:ls_remote).with('https://my_bb2.my_domain.com/scm/pr2/repo4.git').and_return(
80
+ 'branches' => { 'master' => { sha: '12345' } },
81
+ 'tags' => { 'v1.0.0' => { sha: '12345' } }
82
+ )
83
+ expect(test_tests_runner.run_tests(%w[node])).to eq 0
104
84
  end
105
85
  end
106
86
 
@@ -1,3 +1,5 @@
1
+ require 'octokit'
2
+
1
3
  describe HybridPlatformsConductor::TestsRunner do
2
4
 
3
5
  context 'when checking test plugins' do
@@ -5,8 +7,9 @@ describe HybridPlatformsConductor::TestsRunner do
5
7
  context 'with github_ci' do
6
8
 
7
9
  it 'iterates over defined Github repos' do
8
- with_repository do
9
- platforms = <<~EO_CONFIG
10
+ with_test_platform(
11
+ { nodes: { 'node' => {} } },
12
+ additional_config: <<~EO_CONFIG
10
13
  github_repos(
11
14
  url: 'https://my_gh.my_domain.com',
12
15
  user: 'GH-User1',
@@ -23,45 +26,32 @@ describe HybridPlatformsConductor::TestsRunner do
23
26
  ]
24
27
  )
25
28
  EO_CONFIG
26
- with_platforms platforms do
27
- repos = []
28
- test_config.for_each_github_repo do |github, repo_info|
29
- repos << {
30
- github_url: github.api_endpoint,
31
- repo_info: repo_info
32
- }
29
+ ) do
30
+ ENV['hpc_user_for_github'] = 'test-github-user'
31
+ ENV['hpc_password_for_github'] = 'GHTestToken'
32
+ test_tests_runner.tests = [:github_ci]
33
+ first_time = true
34
+ expect(Octokit::Client).to receive(:new).with(access_token: 'GHTestToken').twice do
35
+ mocked_client = instance_double(Octokit::Client)
36
+ if first_time
37
+ expect(mocked_client).to receive(:repository_workflow_runs).with('GH-User1/repo1').and_return(
38
+ workflow_runs: [{ head_branch: 'master', created_at: '2021-12-01 12:45:11', conclusion: 'success' }]
39
+ )
40
+ expect(mocked_client).to receive(:repository_workflow_runs).with('GH-User1/repo2').and_return(
41
+ workflow_runs: [{ head_branch: 'master', created_at: '2021-12-01 12:45:11', conclusion: 'success' }]
42
+ )
43
+ first_time = false
44
+ else
45
+ expect(mocked_client).to receive(:repository_workflow_runs).with('GH-User2/repo3').and_return(
46
+ workflow_runs: [{ head_branch: 'master', created_at: '2021-12-01 12:45:11', conclusion: 'success' }]
47
+ )
48
+ expect(mocked_client).to receive(:repository_workflow_runs).with('GH-User2/repo4').and_return(
49
+ workflow_runs: [{ head_branch: 'master', created_at: '2021-12-01 12:45:11', conclusion: 'success' }]
50
+ )
33
51
  end
34
- expect(repos).to eq [
35
- {
36
- github_url: 'https://my_gh.my_domain.com/',
37
- repo_info: {
38
- name: 'repo1',
39
- slug: 'GH-User1/repo1'
40
- }
41
- },
42
- {
43
- github_url: 'https://my_gh.my_domain.com/',
44
- repo_info: {
45
- name: 'repo2',
46
- slug: 'GH-User1/repo2'
47
- }
48
- },
49
- {
50
- github_url: 'https://api.github.com/',
51
- repo_info: {
52
- name: 'repo3',
53
- slug: 'GH-User2/repo3'
54
- }
55
- },
56
- {
57
- github_url: 'https://api.github.com/',
58
- repo_info: {
59
- name: 'repo4',
60
- slug: 'GH-User2/repo4'
61
- }
62
- }
63
- ]
52
+ mocked_client
64
53
  end
54
+ expect(test_tests_runner.run_tests(%w[node])).to eq 0
65
55
  end
66
56
  end
67
57
 
@@ -3,14 +3,14 @@ describe 'nodes_to_deploy executable' do
3
3
  # Setup a platform for nodes_to_deploy tests
4
4
  #
5
5
  # Parameters::
6
- # * *additional_platforms_content* (String): Additional platforms content to be added [default = '']
6
+ # * *additional_config* (String): Additional platforms content to be added [default: '']
7
7
  # * *block* (Proc): Code called when the platform is setup
8
8
  # * Parameters::
9
9
  # * *repository* (String): Platform's repository
10
- def with_test_platform_for_nodes_to_deploy(additional_platforms_content: '', &block)
10
+ def with_test_platform_for_nodes_to_deploy(additional_config: '', &block)
11
11
  with_test_platform(
12
12
  { nodes: { 'node1' => {}, 'node2' => {} } },
13
- additional_config: "#{additional_platforms_content}\nsend_logs_to :test_log",
13
+ additional_config: "#{additional_config}\nsend_logs_to :test_log",
14
14
  &block
15
15
  )
16
16
  end
@@ -203,10 +203,12 @@ describe 'nodes_to_deploy executable' do
203
203
  end
204
204
 
205
205
  it 'does not return nodes that are outside the schedule' do
206
- with_test_platform_for_nodes_to_deploy(additional_platforms_content: '
207
- for_nodes(\'node1\') { deployment_schedule(IceCube::Schedule.new(Time.now.utc - 120, duration: 60)) }
208
- for_nodes(\'node2\') { deployment_schedule(IceCube::Schedule.new(Time.now.utc - 60, duration: 120)) }
209
- ') do
206
+ with_test_platform_for_nodes_to_deploy(
207
+ additional_config: <<~EO_CONFIG
208
+ for_nodes('node1') { deployment_schedule(IceCube::Schedule.new(Time.now.utc - 120, duration: 60)) }
209
+ for_nodes('node2') { deployment_schedule(IceCube::Schedule.new(Time.now.utc - 60, duration: 120)) }
210
+ EO_CONFIG
211
+ ) do
210
212
  expect(test_deployer).to receive(:deployment_info_from).with(%w[node2]).and_return(
211
213
  'node2' => {
212
214
  services: %w[service2],
@@ -232,10 +234,12 @@ describe 'nodes_to_deploy executable' do
232
234
  end
233
235
 
234
236
  it 'does not return nodes that are outside the schedule when using a different deployment time' do
235
- with_test_platform_for_nodes_to_deploy(additional_platforms_content: '
236
- for_nodes(\'node1\') { deployment_schedule(IceCube::Schedule.new(Time.now.utc - 120, duration: 60)) }
237
- for_nodes(\'node2\') { deployment_schedule(IceCube::Schedule.new(Time.now.utc - 60, duration: 120)) }
238
- ') do
237
+ with_test_platform_for_nodes_to_deploy(
238
+ additional_config: <<~EO_CONFIG
239
+ for_nodes('node1') { deployment_schedule(IceCube::Schedule.new(Time.now.utc - 120, duration: 60)) }
240
+ for_nodes('node2') { deployment_schedule(IceCube::Schedule.new(Time.now.utc - 60, duration: 120)) }
241
+ EO_CONFIG
242
+ ) do
239
243
  expect(test_deployer).to receive(:deployment_info_from).with(%w[node1]).and_return(
240
244
  'node1' => {
241
245
  services: %w[service1],
@@ -262,10 +266,12 @@ describe 'nodes_to_deploy executable' do
262
266
  end
263
267
 
264
268
  it 'returns nodes that are outside the schedule when ignoring the schedule' do
265
- with_test_platform_for_nodes_to_deploy(additional_platforms_content: '
266
- for_nodes(\'node1\') { deployment_schedule(IceCube::Schedule.new(Time.now.utc - 120, duration: 60)) }
267
- for_nodes(\'node2\') { deployment_schedule(IceCube::Schedule.new(Time.now.utc - 60, duration: 120)) }
268
- ') do
269
+ with_test_platform_for_nodes_to_deploy(
270
+ additional_config: <<~EO_CONFIG
271
+ for_nodes('node1') { deployment_schedule(IceCube::Schedule.new(Time.now.utc - 120, duration: 60)) }
272
+ for_nodes('node2') { deployment_schedule(IceCube::Schedule.new(Time.now.utc - 60, duration: 120)) }
273
+ EO_CONFIG
274
+ ) do
269
275
  expect(test_deployer).to receive(:deployment_info_from).with(%w[node1 node2]).and_return(
270
276
  'node1' => {
271
277
  services: %w[service1],
@@ -100,9 +100,9 @@ module HybridPlatformsConductorTest
100
100
  # [API] - @stderr_io can be used to send stderr output
101
101
  #
102
102
  # Parameters::
103
- # * *bash_cmds* (String): Bash commands to execute
103
+ # * *bash_cmds* (String or SecretString): Bash commands to execute. Use #to_unprotected to access the real content (otherwise secrets are obfuscated).
104
104
  def remote_bash(bash_cmds)
105
- @calls << [:remote_bash, bash_cmds]
105
+ @calls << [:remote_bash, bash_cmds.to_unprotected.clone]
106
106
  @remote_bash_code&.call(@stdout_io, @stderr_io, self)
107
107
  end
108
108
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hybrid_platforms_conductor
3
3
  version: !ruby/object:Gem::Version
4
- version: 33.2.2
4
+ version: 33.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Muriel Salvan
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-06-21 00:00:00.000000000 Z
11
+ date: 2021-07-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: range_operators
@@ -262,6 +262,34 @@ dependencies:
262
262
  - - "~>"
263
263
  - !ruby/object:Gem::Version
264
264
  version: '4.21'
265
+ - !ruby/object:Gem::Dependency
266
+ name: keepass_kpscript
267
+ requirement: !ruby/object:Gem::Requirement
268
+ requirements:
269
+ - - "~>"
270
+ - !ruby/object:Gem::Version
271
+ version: '1.0'
272
+ type: :runtime
273
+ prerelease: false
274
+ version_requirements: !ruby/object:Gem::Requirement
275
+ requirements:
276
+ - - "~>"
277
+ - !ruby/object:Gem::Version
278
+ version: '1.0'
279
+ - !ruby/object:Gem::Dependency
280
+ name: secret_string
281
+ requirement: !ruby/object:Gem::Requirement
282
+ requirements:
283
+ - - "~>"
284
+ - !ruby/object:Gem::Version
285
+ version: '1.1'
286
+ type: :runtime
287
+ prerelease: false
288
+ version_requirements: !ruby/object:Gem::Requirement
289
+ requirements:
290
+ - - "~>"
291
+ - !ruby/object:Gem::Version
292
+ version: '1.1'
265
293
  - !ruby/object:Gem::Dependency
266
294
  name: rspec
267
295
  requirement: !ruby/object:Gem::Requirement
@@ -318,191 +346,206 @@ dependencies:
318
346
  - - "~>"
319
347
  - !ruby/object:Gem::Version
320
348
  version: '2.4'
349
+ - !ruby/object:Gem::Dependency
350
+ name: webmock
351
+ requirement: !ruby/object:Gem::Requirement
352
+ requirements:
353
+ - - "~>"
354
+ - !ruby/object:Gem::Version
355
+ version: '3.11'
356
+ type: :development
357
+ prerelease: false
358
+ version_requirements: !ruby/object:Gem::Requirement
359
+ requirements:
360
+ - - "~>"
361
+ - !ruby/object:Gem::Version
362
+ version: '3.11'
321
363
  description: Provides a complete toolset to help DevOps maintain, deploy, monitor
322
364
  and test multiple platforms using various technologies
323
365
  email:
324
366
  - muriel@x-aeon.com
325
367
  executables:
326
- - free_ips
327
- - setup
328
- - check-node
329
- - deploy
330
368
  - dump_nodes_json
331
- - topograph
332
- - run
333
- - report
334
- - free_veids
335
- - get_impacted_nodes
369
+ - setup
336
370
  - ssh_config
371
+ - report
337
372
  - last_deploys
338
373
  - nodes_to_deploy
374
+ - topograph
375
+ - run
376
+ - get_impacted_nodes
377
+ - check-node
378
+ - free_veids
379
+ - deploy
339
380
  - test
381
+ - free_ips
340
382
  extensions: []
341
383
  extra_rdoc_files:
342
- - CHANGELOG.md
343
- - LICENSE.md
344
384
  - README.md
385
+ - LICENSE.md
386
+ - CHANGELOG.md
387
+ - docs/tutorial.md
388
+ - docs/plugins.md
345
389
  - docs/install.md
346
- - docs/plugins/cmdb/platform_handlers.md
347
- - docs/plugins/cmdb/config.md
390
+ - docs/tutorial/01_installation.md
391
+ - docs/tutorial/03_scale.md
392
+ - docs/tutorial/02_first_node.md
393
+ - docs/tutorial/04_test.md
394
+ - docs/tutorial/05_extend_with_plugins.md
395
+ - docs/executables/deploy.md
396
+ - docs/executables/get_impacted_nodes.md
397
+ - docs/executables/ssh_config.md
398
+ - docs/executables/last_deploys.md
399
+ - docs/executables/setup.md
400
+ - docs/executables/check-node.md
401
+ - docs/executables/report.md
402
+ - docs/executables/run.md
403
+ - docs/executables/topograph.md
404
+ - docs/executables/free_ips.md
405
+ - docs/executables/test.md
406
+ - docs/executables/dump_nodes_json.md
407
+ - docs/executables/free_veids.md
408
+ - docs/executables/nodes_to_deploy.md
409
+ - docs/api.md
410
+ - docs/plugins_create.md
348
411
  - docs/plugins/cmdb/host_ip.md
349
412
  - docs/plugins/cmdb/host_keys.md
350
- - docs/plugins/log/remote_fs.md
351
- - docs/plugins/provisioner/docker.md
352
- - docs/plugins/provisioner/podman.md
353
- - docs/plugins/provisioner/proxmox.md
354
- - docs/plugins/action/bash.md
355
- - docs/plugins/action/scp.md
356
- - docs/plugins/action/remote_bash.md
357
- - docs/plugins/action/interactive.md
358
- - docs/plugins/action/ruby.md
359
- - docs/plugins/connector/ssh.md
360
- - docs/plugins/connector/local.md
413
+ - docs/plugins/cmdb/config.md
414
+ - docs/plugins/cmdb/platform_handlers.md
361
415
  - docs/plugins/report/confluence.md
362
416
  - docs/plugins/report/mediawiki.md
363
417
  - docs/plugins/report/stdout.md
364
418
  - docs/plugins/secrets_reader/thycotic.md
365
419
  - docs/plugins/secrets_reader/cli.md
366
- - docs/plugins/test/file_system_hdfs.md
420
+ - docs/plugins/secrets_reader/keepass.md
421
+ - docs/plugins/provisioner/docker.md
422
+ - docs/plugins/provisioner/podman.md
423
+ - docs/plugins/provisioner/proxmox.md
424
+ - docs/plugins/action/ruby.md
425
+ - docs/plugins/action/interactive.md
426
+ - docs/plugins/action/remote_bash.md
427
+ - docs/plugins/action/bash.md
428
+ - docs/plugins/action/scp.md
429
+ - docs/plugins/log/remote_fs.md
430
+ - docs/plugins/platform_handler/serverless_chef.md
431
+ - docs/plugins/platform_handler/yaml_inventory.md
367
432
  - docs/plugins/test/mounts.md
368
- - docs/plugins/test/idempotence.md
369
- - docs/plugins/test/orphan_files.md
370
- - docs/plugins/test/github_ci.md
371
- - docs/plugins/test/veids.md
433
+ - docs/plugins/test/file_system.md
434
+ - docs/plugins/test/jenkins_ci_masters_ok.md
435
+ - docs/plugins/test/check_from_scratch.md
436
+ - docs/plugins/test/connection.md
437
+ - docs/plugins/test/local_users.md
372
438
  - docs/plugins/test/check_deploy_and_idempotence.md
373
- - docs/plugins/test/hostname.md
439
+ - docs/plugins/test/ip.md
440
+ - docs/plugins/test/public_ips.md
441
+ - docs/plugins/test/can_be_checked.md
442
+ - docs/plugins/test/file_system_hdfs.md
443
+ - docs/plugins/test/private_ips.md
444
+ - docs/plugins/test/deploy_removes_root_access.md
374
445
  - docs/plugins/test/bitbucket_conf.md
446
+ - docs/plugins/test/deploy_freshness.md
447
+ - docs/plugins/test/vulnerabilities.md
448
+ - docs/plugins/test/hostname.md
449
+ - docs/plugins/test/orphan_files.md
375
450
  - docs/plugins/test/deploy_from_scratch.md
376
- - docs/plugins/test/divergence.md
377
- - docs/plugins/test/check_from_scratch.md
378
- - docs/plugins/test/deploy_removes_root_access.md
379
- - docs/plugins/test/file_system.md
451
+ - docs/plugins/test/jenkins_ci_conf.md
380
452
  - docs/plugins/test/spectre.md
381
- - docs/plugins/test/vulnerabilities.md
453
+ - docs/plugins/test/github_ci.md
454
+ - docs/plugins/test/divergence.md
455
+ - docs/plugins/test/idempotence.md
456
+ - docs/plugins/test/veids.md
382
457
  - docs/plugins/test/ports.md
383
- - docs/plugins/test/linear_strategy.md
384
- - docs/plugins/test/jenkins_ci_conf.md
385
- - docs/plugins/test/can_be_checked.md
386
- - docs/plugins/test/public_ips.md
387
- - docs/plugins/test/connection.md
388
- - docs/plugins/test/jenkins_ci_masters_ok.md
389
- - docs/plugins/test/deploy_freshness.md
390
458
  - docs/plugins/test/executables.md
391
- - docs/plugins/test/private_ips.md
392
- - docs/plugins/test/ip.md
393
- - docs/plugins/test/local_users.md
394
- - docs/plugins/platform_handler/serverless_chef.md
395
- - docs/plugins/platform_handler/yaml_inventory.md
459
+ - docs/plugins/test/linear_strategy.md
460
+ - docs/plugins/connector/local.md
461
+ - docs/plugins/connector/ssh.md
396
462
  - docs/plugins/test_report/confluence.md
397
463
  - docs/plugins/test_report/stdout.md
398
- - docs/config_dsl.md
399
- - docs/executables/free_veids.md
400
- - docs/executables/last_deploys.md
401
- - docs/executables/nodes_to_deploy.md
402
- - docs/executables/topograph.md
403
- - docs/executables/report.md
404
- - docs/executables/get_impacted_nodes.md
405
- - docs/executables/run.md
406
- - docs/executables/deploy.md
407
- - docs/executables/dump_nodes_json.md
408
- - docs/executables/ssh_config.md
409
- - docs/executables/test.md
410
- - docs/executables/setup.md
411
- - docs/executables/free_ips.md
412
- - docs/executables/check-node.md
413
- - docs/plugins_create.md
414
- - docs/tutorial/01_installation.md
415
- - docs/tutorial/04_test.md
416
- - docs/tutorial/03_scale.md
417
- - docs/tutorial/02_first_node.md
418
- - docs/tutorial/05_extend_with_plugins.md
419
- - docs/tutorial.md
420
- - docs/api.md
421
- - docs/executables.md
422
464
  - docs/gen/mermaid/README.md-0.png
423
- - docs/gen/mermaid/docs/executables/test.md-0.png
424
- - docs/gen/mermaid/docs/executables/last_deploys.md-0.png
425
- - docs/gen/mermaid/docs/executables/free_ips.md-0.png
426
- - docs/gen/mermaid/docs/executables/deploy.md-0.png
465
+ - docs/gen/mermaid/docs/executables/run.md-0.png
466
+ - docs/gen/mermaid/docs/executables/free_veids.md-0.png
467
+ - docs/gen/mermaid/docs/executables/ssh_config.md-0.png
427
468
  - docs/gen/mermaid/docs/executables/check-node.md-0.png
428
469
  - docs/gen/mermaid/docs/executables/get_impacted_nodes.md-0.png
470
+ - docs/gen/mermaid/docs/executables/last_deploys.md-0.png
429
471
  - docs/gen/mermaid/docs/executables/setup.md-0.png
430
- - docs/gen/mermaid/docs/executables/report.md-0.png
431
- - docs/gen/mermaid/docs/executables/free_veids.md-0.png
432
- - docs/gen/mermaid/docs/executables/ssh_config.md-0.png
433
472
  - docs/gen/mermaid/docs/executables/nodes_to_deploy.md-0.png
434
- - docs/gen/mermaid/docs/executables/run.md-0.png
435
- - docs/plugins.md
436
- - examples/tutorial/04_test/my-service-conf-repo/service_web-hello.rb
437
- - examples/tutorial/04_test/my-service-conf-repo/service_my-service.rb
438
- - examples/tutorial/04_test/my-service-conf-repo/my-service.conf.erb
439
- - examples/tutorial/04_test/my-service-conf-repo/inventory.yaml
440
- - examples/tutorial/04_test/my-platforms/hpc_config.rb
441
- - examples/tutorial/04_test/my-platforms/Gemfile
442
- - examples/tutorial/04_test/my-platforms/images/debian_10/Dockerfile
443
- - examples/tutorial/04_test/my-platforms/my_commands.bash
444
- - examples/tutorial/04_test/web_docker_image/hello_world.txt
445
- - examples/tutorial/04_test/web_docker_image/test.bash
446
- - examples/tutorial/04_test/web_docker_image/hpc_root.key.pub
447
- - examples/tutorial/04_test/web_docker_image/Dockerfile
448
- - examples/tutorial/04_test/web_docker_image/hpc_root.key
449
- - examples/tutorial/04_test/web_docker_image/start.sh
450
- - examples/tutorial/04_test/web_docker_image/main.go
451
- - examples/tutorial/04_test/node/my-service.conf
452
- - examples/tutorial/03_scale/my-service-conf-repo/service_web-hello.rb
453
- - examples/tutorial/03_scale/my-service-conf-repo/service_my-service.rb
454
- - examples/tutorial/03_scale/my-service-conf-repo/my-service.conf.erb
455
- - examples/tutorial/03_scale/my-service-conf-repo/inventory.yaml
456
- - examples/tutorial/03_scale/my-platforms/hpc_config.rb
457
- - examples/tutorial/03_scale/my-platforms/Gemfile
458
- - examples/tutorial/03_scale/my-platforms/my_commands.bash
459
- - examples/tutorial/03_scale/web_docker_image/hello_world.txt
460
- - examples/tutorial/03_scale/web_docker_image/test.bash
461
- - examples/tutorial/03_scale/web_docker_image/hpc_root.key.pub
462
- - examples/tutorial/03_scale/web_docker_image/Dockerfile
463
- - examples/tutorial/03_scale/web_docker_image/hpc_root.key
464
- - examples/tutorial/03_scale/web_docker_image/start.sh
465
- - examples/tutorial/03_scale/web_docker_image/main.go
466
- - examples/tutorial/03_scale/node/my-service.conf
467
- - examples/tutorial/05_extend_with_plugins/my-service-conf-repo/service_web-hello.rb
468
- - examples/tutorial/05_extend_with_plugins/my-service-conf-repo/service_my-service.rb
469
- - examples/tutorial/05_extend_with_plugins/my-service-conf-repo/my-service.conf.erb
470
- - examples/tutorial/05_extend_with_plugins/my-service-conf-repo/inventory.yaml
471
- - examples/tutorial/05_extend_with_plugins/my-platforms/hpc_config.rb
472
- - examples/tutorial/05_extend_with_plugins/my-platforms/Gemfile
473
- - examples/tutorial/05_extend_with_plugins/my-platforms/images/debian_10/Dockerfile
474
- - examples/tutorial/05_extend_with_plugins/my-platforms/my_commands.bash
473
+ - docs/gen/mermaid/docs/executables/deploy.md-0.png
474
+ - docs/gen/mermaid/docs/executables/report.md-0.png
475
+ - docs/gen/mermaid/docs/executables/test.md-0.png
476
+ - docs/gen/mermaid/docs/executables/free_ips.md-0.png
477
+ - docs/config_dsl.md
478
+ - docs/executables.md
479
+ - examples/bare/hpc_config.rb
480
+ - examples/bare/Gemfile
481
+ - examples/tutorial/02_first_node/node/my-service.conf
482
+ - examples/tutorial/02_first_node/my-service-conf-repo/service_my-service.rb
483
+ - examples/tutorial/02_first_node/my-service-conf-repo/my-service.conf.erb
484
+ - examples/tutorial/02_first_node/my-service-conf-repo/inventory.yaml
485
+ - examples/tutorial/02_first_node/my-platforms/hpc_config.rb
486
+ - examples/tutorial/02_first_node/my-platforms/Gemfile
487
+ - examples/tutorial/05_extend_with_plugins/dev-servers-conf-repo/hosts.json
488
+ - examples/tutorial/05_extend_with_plugins/dev-servers-conf-repo/install-gcc.bash
489
+ - examples/tutorial/05_extend_with_plugins/dev-servers-conf-repo/install-python.bash
475
490
  - examples/tutorial/05_extend_with_plugins/dev_docker_image/hpc_root.key.pub
476
491
  - examples/tutorial/05_extend_with_plugins/dev_docker_image/Dockerfile
477
492
  - examples/tutorial/05_extend_with_plugins/dev_docker_image/hpc_root.key
493
+ - examples/tutorial/05_extend_with_plugins/node/my-service.conf
478
494
  - examples/tutorial/05_extend_with_plugins/web_docker_image/hello_world.txt
479
- - examples/tutorial/05_extend_with_plugins/web_docker_image/test.bash
495
+ - examples/tutorial/05_extend_with_plugins/web_docker_image/start.sh
480
496
  - examples/tutorial/05_extend_with_plugins/web_docker_image/hpc_root.key.pub
497
+ - examples/tutorial/05_extend_with_plugins/web_docker_image/main.go
498
+ - examples/tutorial/05_extend_with_plugins/web_docker_image/test.bash
481
499
  - examples/tutorial/05_extend_with_plugins/web_docker_image/Dockerfile
482
500
  - examples/tutorial/05_extend_with_plugins/web_docker_image/hpc_root.key
483
- - examples/tutorial/05_extend_with_plugins/web_docker_image/start.sh
484
- - examples/tutorial/05_extend_with_plugins/web_docker_image/main.go
485
- - examples/tutorial/05_extend_with_plugins/dev-servers-conf-repo/hosts.json
486
- - examples/tutorial/05_extend_with_plugins/dev-servers-conf-repo/install-gcc.bash
487
- - examples/tutorial/05_extend_with_plugins/dev-servers-conf-repo/install-python.bash
501
+ - examples/tutorial/05_extend_with_plugins/my-service-conf-repo/service_my-service.rb
502
+ - examples/tutorial/05_extend_with_plugins/my-service-conf-repo/my-service.conf.erb
503
+ - examples/tutorial/05_extend_with_plugins/my-service-conf-repo/inventory.yaml
504
+ - examples/tutorial/05_extend_with_plugins/my-service-conf-repo/service_web-hello.rb
505
+ - examples/tutorial/05_extend_with_plugins/my_hpc_plugins/my_hpc_plugins.gemspec
488
506
  - examples/tutorial/05_extend_with_plugins/my_hpc_plugins/lib/my_hpc_plugins/hpc_plugins/report/web_report.rb
489
- - examples/tutorial/05_extend_with_plugins/my_hpc_plugins/lib/my_hpc_plugins/hpc_plugins/test/root_space.rb
490
507
  - examples/tutorial/05_extend_with_plugins/my_hpc_plugins/lib/my_hpc_plugins/hpc_plugins/platform_handler/json_bash.rb
491
- - examples/tutorial/05_extend_with_plugins/my_hpc_plugins/my_hpc_plugins.gemspec
492
- - examples/tutorial/05_extend_with_plugins/node/my-service.conf
493
- - examples/tutorial/02_first_node/my-service-conf-repo/service_my-service.rb
494
- - examples/tutorial/02_first_node/my-service-conf-repo/my-service.conf.erb
495
- - examples/tutorial/02_first_node/my-service-conf-repo/inventory.yaml
496
- - examples/tutorial/02_first_node/my-platforms/hpc_config.rb
497
- - examples/tutorial/02_first_node/my-platforms/Gemfile
498
- - examples/tutorial/02_first_node/node/my-service.conf
508
+ - examples/tutorial/05_extend_with_plugins/my_hpc_plugins/lib/my_hpc_plugins/hpc_plugins/test/root_space.rb
509
+ - examples/tutorial/05_extend_with_plugins/my-platforms/hpc_config.rb
510
+ - examples/tutorial/05_extend_with_plugins/my-platforms/images/debian_10/Dockerfile
511
+ - examples/tutorial/05_extend_with_plugins/my-platforms/Gemfile
512
+ - examples/tutorial/05_extend_with_plugins/my-platforms/my_commands.bash
499
513
  - examples/tutorial/01_installation/my-platforms/hpc_config.rb
500
514
  - examples/tutorial/01_installation/my-platforms/Gemfile
515
+ - examples/tutorial/03_scale/node/my-service.conf
516
+ - examples/tutorial/03_scale/web_docker_image/hello_world.txt
517
+ - examples/tutorial/03_scale/web_docker_image/start.sh
518
+ - examples/tutorial/03_scale/web_docker_image/hpc_root.key.pub
519
+ - examples/tutorial/03_scale/web_docker_image/main.go
520
+ - examples/tutorial/03_scale/web_docker_image/test.bash
521
+ - examples/tutorial/03_scale/web_docker_image/Dockerfile
522
+ - examples/tutorial/03_scale/web_docker_image/hpc_root.key
523
+ - examples/tutorial/03_scale/my-service-conf-repo/service_my-service.rb
524
+ - examples/tutorial/03_scale/my-service-conf-repo/my-service.conf.erb
525
+ - examples/tutorial/03_scale/my-service-conf-repo/inventory.yaml
526
+ - examples/tutorial/03_scale/my-service-conf-repo/service_web-hello.rb
527
+ - examples/tutorial/03_scale/my-platforms/hpc_config.rb
528
+ - examples/tutorial/03_scale/my-platforms/Gemfile
529
+ - examples/tutorial/03_scale/my-platforms/my_commands.bash
530
+ - examples/tutorial/04_test/node/my-service.conf
531
+ - examples/tutorial/04_test/web_docker_image/hello_world.txt
532
+ - examples/tutorial/04_test/web_docker_image/start.sh
533
+ - examples/tutorial/04_test/web_docker_image/hpc_root.key.pub
534
+ - examples/tutorial/04_test/web_docker_image/main.go
535
+ - examples/tutorial/04_test/web_docker_image/test.bash
536
+ - examples/tutorial/04_test/web_docker_image/Dockerfile
537
+ - examples/tutorial/04_test/web_docker_image/hpc_root.key
538
+ - examples/tutorial/04_test/my-service-conf-repo/service_my-service.rb
539
+ - examples/tutorial/04_test/my-service-conf-repo/my-service.conf.erb
540
+ - examples/tutorial/04_test/my-service-conf-repo/inventory.yaml
541
+ - examples/tutorial/04_test/my-service-conf-repo/service_web-hello.rb
542
+ - examples/tutorial/04_test/my-platforms/hpc_config.rb
543
+ - examples/tutorial/04_test/my-platforms/images/debian_10/Dockerfile
544
+ - examples/tutorial/04_test/my-platforms/Gemfile
545
+ - examples/tutorial/04_test/my-platforms/my_commands.bash
501
546
  - examples/localhost/hpc_config.rb
502
- - examples/localhost/Gemfile
503
547
  - examples/localhost/inventory.yaml
504
- - examples/bare/hpc_config.rb
505
- - examples/bare/Gemfile
548
+ - examples/localhost/Gemfile
506
549
  files:
507
550
  - CHANGELOG.md
508
551
  - LICENSE.md
@@ -574,6 +617,7 @@ files:
574
617
  - docs/plugins/report/mediawiki.md
575
618
  - docs/plugins/report/stdout.md
576
619
  - docs/plugins/secrets_reader/cli.md
620
+ - docs/plugins/secrets_reader/keepass.md
577
621
  - docs/plugins/secrets_reader/thycotic.md
578
622
  - docs/plugins/test/bitbucket_conf.md
579
623
  - docs/plugins/test/can_be_checked.md
@@ -702,6 +746,7 @@ files:
702
746
  - lib/hybrid_platforms_conductor/current_dir_monitor.rb
703
747
  - lib/hybrid_platforms_conductor/deployer.rb
704
748
  - lib/hybrid_platforms_conductor/executable.rb
749
+ - lib/hybrid_platforms_conductor/github.rb
705
750
  - lib/hybrid_platforms_conductor/hpc_plugins/action/bash.rb
706
751
  - lib/hybrid_platforms_conductor/hpc_plugins/action/interactive.rb
707
752
  - lib/hybrid_platforms_conductor/hpc_plugins/action/my_action.rb.sample
@@ -735,6 +780,7 @@ files:
735
780
  - lib/hybrid_platforms_conductor/hpc_plugins/report/stdout.rb
736
781
  - lib/hybrid_platforms_conductor/hpc_plugins/report/templates/confluence_inventory.html.erb
737
782
  - lib/hybrid_platforms_conductor/hpc_plugins/secrets_reader/cli.rb
783
+ - lib/hybrid_platforms_conductor/hpc_plugins/secrets_reader/keepass.rb
738
784
  - lib/hybrid_platforms_conductor/hpc_plugins/secrets_reader/my_secrets_reader_plugin.rb.sample
739
785
  - lib/hybrid_platforms_conductor/hpc_plugins/secrets_reader/thycotic.rb
740
786
  - lib/hybrid_platforms_conductor/hpc_plugins/test/bitbucket_conf.rb
@@ -787,6 +833,7 @@ files:
787
833
  - lib/hybrid_platforms_conductor/provisioner.rb
788
834
  - lib/hybrid_platforms_conductor/report.rb
789
835
  - lib/hybrid_platforms_conductor/reports_handler.rb
836
+ - lib/hybrid_platforms_conductor/safe_merge.rb
790
837
  - lib/hybrid_platforms_conductor/secrets_reader.rb
791
838
  - lib/hybrid_platforms_conductor/services_handler.rb
792
839
  - lib/hybrid_platforms_conductor/test.rb
@@ -824,6 +871,7 @@ files:
824
871
  - spec/hybrid_platforms_conductor_test/api/actions_executor/timeout_spec.rb
825
872
  - spec/hybrid_platforms_conductor_test/api/cmd_runner_spec.rb
826
873
  - spec/hybrid_platforms_conductor_test/api/config_spec.rb
874
+ - spec/hybrid_platforms_conductor_test/api/credentials_spec.rb
827
875
  - spec/hybrid_platforms_conductor_test/api/deployer/check_spec.rb
828
876
  - spec/hybrid_platforms_conductor_test/api/deployer/config_dsl_spec.rb
829
877
  - spec/hybrid_platforms_conductor_test/api/deployer/deploy_spec.rb
@@ -849,6 +897,7 @@ files:
849
897
  - spec/hybrid_platforms_conductor_test/api/deployer/provisioners/proxmox/state_spec.rb
850
898
  - spec/hybrid_platforms_conductor_test/api/deployer/provisioners/proxmox/stop_spec.rb
851
899
  - spec/hybrid_platforms_conductor_test/api/deployer/secrets_reader_plugins/cli_spec.rb
900
+ - spec/hybrid_platforms_conductor_test/api/deployer/secrets_reader_plugins/keepass_spec.rb
852
901
  - spec/hybrid_platforms_conductor_test/api/deployer/secrets_reader_plugins/thycotic_spec.rb
853
902
  - spec/hybrid_platforms_conductor_test/api/nodes_handler/cmdbs/config_spec.rb
854
903
  - spec/hybrid_platforms_conductor_test/api/nodes_handler/cmdbs/host_ip_spec.rb