hybrid_platforms_conductor 33.3.0 → 33.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +41 -0
- data/README.md +31 -2
- data/docs/config_dsl.md +45 -0
- data/docs/plugins/cmdb/host_keys.md +3 -1
- data/docs/plugins/connector/ssh.md +1 -0
- data/lib/hybrid_platforms_conductor/actions_executor.rb +29 -1
- data/lib/hybrid_platforms_conductor/bitbucket.rb +134 -90
- data/lib/hybrid_platforms_conductor/cmd_runner.rb +4 -4
- data/lib/hybrid_platforms_conductor/common_config_dsl/bitbucket.rb +12 -44
- data/lib/hybrid_platforms_conductor/common_config_dsl/github.rb +9 -31
- data/lib/hybrid_platforms_conductor/config.rb +2 -0
- data/lib/hybrid_platforms_conductor/confluence.rb +93 -88
- data/lib/hybrid_platforms_conductor/connector.rb +5 -2
- data/lib/hybrid_platforms_conductor/credentials.rb +122 -97
- data/lib/hybrid_platforms_conductor/deployer.rb +7 -9
- data/lib/hybrid_platforms_conductor/github.rb +39 -0
- data/lib/hybrid_platforms_conductor/hpc_plugins/action/bash.rb +1 -1
- data/lib/hybrid_platforms_conductor/hpc_plugins/action/remote_bash.rb +27 -17
- data/lib/hybrid_platforms_conductor/hpc_plugins/cmdb/host_keys.rb +13 -12
- data/lib/hybrid_platforms_conductor/hpc_plugins/connector/local.rb +6 -4
- data/lib/hybrid_platforms_conductor/hpc_plugins/connector/my_connector.rb.sample +1 -1
- data/lib/hybrid_platforms_conductor/hpc_plugins/connector/ssh.rb +37 -25
- data/lib/hybrid_platforms_conductor/hpc_plugins/log/remote_fs.rb +5 -6
- data/lib/hybrid_platforms_conductor/hpc_plugins/platform_handler/serverless_chef.rb +1 -1
- data/lib/hybrid_platforms_conductor/hpc_plugins/provisioner/docker.rb +1 -1
- data/lib/hybrid_platforms_conductor/hpc_plugins/provisioner/proxmox.rb +7 -4
- data/lib/hybrid_platforms_conductor/hpc_plugins/report/confluence.rb +3 -1
- data/lib/hybrid_platforms_conductor/hpc_plugins/secrets_reader/keepass.rb +3 -2
- data/lib/hybrid_platforms_conductor/hpc_plugins/secrets_reader/thycotic.rb +3 -1
- data/lib/hybrid_platforms_conductor/hpc_plugins/test/bitbucket_conf.rb +4 -1
- data/lib/hybrid_platforms_conductor/hpc_plugins/test/check_deploy_and_idempotence.rb +17 -3
- data/lib/hybrid_platforms_conductor/hpc_plugins/test/deploy_removes_root_access.rb +30 -10
- data/lib/hybrid_platforms_conductor/hpc_plugins/test/file_system.rb +1 -1
- data/lib/hybrid_platforms_conductor/hpc_plugins/test/github_ci.rb +4 -1
- data/lib/hybrid_platforms_conductor/hpc_plugins/test/hostname.rb +1 -2
- data/lib/hybrid_platforms_conductor/hpc_plugins/test/idempotence.rb +1 -1
- data/lib/hybrid_platforms_conductor/hpc_plugins/test/ip.rb +1 -2
- data/lib/hybrid_platforms_conductor/hpc_plugins/test/jenkins_ci_conf.rb +7 -3
- data/lib/hybrid_platforms_conductor/hpc_plugins/test/jenkins_ci_masters_ok.rb +8 -4
- data/lib/hybrid_platforms_conductor/hpc_plugins/test/local_users.rb +1 -2
- data/lib/hybrid_platforms_conductor/hpc_plugins/test/mounts.rb +1 -2
- data/lib/hybrid_platforms_conductor/hpc_plugins/test/orphan_files.rb +1 -2
- data/lib/hybrid_platforms_conductor/hpc_plugins/test/spectre.rb +1 -1
- data/lib/hybrid_platforms_conductor/hpc_plugins/test/vulnerabilities.rb +1 -2
- data/lib/hybrid_platforms_conductor/hpc_plugins/test_report/confluence.rb +3 -1
- data/lib/hybrid_platforms_conductor/logger_helpers.rb +24 -1
- data/lib/hybrid_platforms_conductor/test.rb +21 -7
- data/lib/hybrid_platforms_conductor/tests_runner.rb +7 -6
- data/lib/hybrid_platforms_conductor/thycotic.rb +80 -75
- data/lib/hybrid_platforms_conductor/version.rb +1 -1
- data/spec/hybrid_platforms_conductor_test.rb +6 -0
- data/spec/hybrid_platforms_conductor_test/api/actions_executor/actions/bash_spec.rb +15 -0
- data/spec/hybrid_platforms_conductor_test/api/actions_executor/actions/remote_bash_spec.rb +32 -0
- data/spec/hybrid_platforms_conductor_test/api/actions_executor/connectors/local/remote_actions_spec.rb +87 -0
- data/spec/hybrid_platforms_conductor_test/api/actions_executor/connectors/ssh/connections_spec.rb +30 -0
- data/spec/hybrid_platforms_conductor_test/api/actions_executor/connectors/ssh/global_helpers_spec.rb +10 -0
- data/spec/hybrid_platforms_conductor_test/api/actions_executor/connectors/ssh/remote_actions_spec.rb +38 -0
- data/spec/hybrid_platforms_conductor_test/api/actions_executor/helpers_spec.rb +195 -0
- data/spec/hybrid_platforms_conductor_test/api/cmd_runner_spec.rb +14 -0
- data/spec/hybrid_platforms_conductor_test/api/config_spec.rb +11 -0
- data/spec/hybrid_platforms_conductor_test/api/credentials_spec.rb +251 -0
- data/spec/hybrid_platforms_conductor_test/api/deployer/log_plugins/remote_fs_spec.rb +215 -0
- data/spec/hybrid_platforms_conductor_test/api/deployer/secrets_reader_plugins/keepass_spec.rb +280 -319
- data/spec/hybrid_platforms_conductor_test/api/deployer/secrets_reader_plugins/thycotic_spec.rb +2 -2
- data/spec/hybrid_platforms_conductor_test/api/nodes_handler/cmdbs/host_keys_spec.rb +49 -10
- data/spec/hybrid_platforms_conductor_test/api/platform_handlers/serverless_chef/services_deployment_spec.rb +38 -0
- data/spec/hybrid_platforms_conductor_test/api/tests_runner/test_plugins/bitbucket_conf_spec.rb +49 -69
- data/spec/hybrid_platforms_conductor_test/api/tests_runner/test_plugins/github_ci_spec.rb +29 -39
- data/spec/hybrid_platforms_conductor_test/helpers/connector_ssh_helpers.rb +5 -3
- data/spec/hybrid_platforms_conductor_test/serverless_chef_repositories/1_local_node/chef_versions.yml +3 -0
- data/spec/hybrid_platforms_conductor_test/serverless_chef_repositories/1_local_node/nodes/node.json +15 -0
- data/spec/hybrid_platforms_conductor_test/serverless_chef_repositories/1_local_node/policyfiles/test_policy.rb +3 -0
- data/spec/hybrid_platforms_conductor_test/shared_examples/deployer.rb +134 -0
- data/spec/hybrid_platforms_conductor_test/test_connector.rb +2 -2
- metadata +36 -2
data/spec/hybrid_platforms_conductor_test/api/deployer/secrets_reader_plugins/thycotic_spec.rb
CHANGED
|
@@ -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(
|
|
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(
|
|
44
|
+
expect(resource).to eq thycotic_url
|
|
45
45
|
client_code.call user, password
|
|
46
46
|
end
|
|
47
47
|
end
|
|
@@ -4,7 +4,7 @@ describe HybridPlatformsConductor::NodesHandler do
|
|
|
4
4
|
|
|
5
5
|
it 'makes sure to have hostname or host_ip set to compute host_keys' do
|
|
6
6
|
with_test_platform({}) do
|
|
7
|
-
expect(cmdb(:host_keys).property_dependencies[:host_keys].sort).to eq %i[hostname host_ip].sort
|
|
7
|
+
expect(cmdb(:host_keys).property_dependencies[:host_keys].sort).to eq %i[hostname host_ip ssh_port].sort
|
|
8
8
|
end
|
|
9
9
|
end
|
|
10
10
|
|
|
@@ -17,17 +17,27 @@ describe HybridPlatformsConductor::NodesHandler do
|
|
|
17
17
|
it 'returns host keys when hostname is set' do
|
|
18
18
|
with_test_platform({ nodes: { 'test_node' => {} } }) do
|
|
19
19
|
with_cmd_runner_mocked [
|
|
20
|
-
['ssh-keyscan my_host.my_domain', proc { [0, "my_host.my_domain ssh-rsa fake_host_key\n", ''] }]
|
|
20
|
+
['ssh-keyscan -p 22 my_host.my_domain', proc { [0, "my_host.my_domain ssh-rsa fake_host_key\n", ''] }]
|
|
21
21
|
] do
|
|
22
22
|
expect(cmdb(:host_keys).get_host_keys(['test_node'], { 'test_node' => { hostname: 'my_host.my_domain' } })).to eq('test_node' => ['ssh-rsa fake_host_key'])
|
|
23
23
|
end
|
|
24
24
|
end
|
|
25
25
|
end
|
|
26
26
|
|
|
27
|
+
it 'returns host keys for the correct ssh port' do
|
|
28
|
+
with_test_platform({ nodes: { 'test_node' => {} } }) do
|
|
29
|
+
with_cmd_runner_mocked [
|
|
30
|
+
['ssh-keyscan -p 666 my_host.my_domain', proc { [0, "my_host.my_domain ssh-rsa fake_host_key\n", ''] }]
|
|
31
|
+
] do
|
|
32
|
+
expect(cmdb(:host_keys).get_host_keys(['test_node'], { 'test_node' => { hostname: 'my_host.my_domain', ssh_port: 666 } })).to eq('test_node' => ['ssh-rsa fake_host_key'])
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
|
|
27
37
|
it 'returns host keys when host_ip is set' do
|
|
28
38
|
with_test_platform({ nodes: { 'test_node' => {} } }) do
|
|
29
39
|
with_cmd_runner_mocked [
|
|
30
|
-
['ssh-keyscan 192.168.42.42', proc { [0, "192.168.42.42 ssh-rsa fake_host_key\n", ''] }]
|
|
40
|
+
['ssh-keyscan -p 22 192.168.42.42', proc { [0, "192.168.42.42 ssh-rsa fake_host_key\n", ''] }]
|
|
31
41
|
] do
|
|
32
42
|
expect(cmdb(:host_keys).get_host_keys(['test_node'], { 'test_node' => { host_ip: '192.168.42.42' } })).to eq('test_node' => ['ssh-rsa fake_host_key'])
|
|
33
43
|
end
|
|
@@ -37,7 +47,7 @@ describe HybridPlatformsConductor::NodesHandler do
|
|
|
37
47
|
it 'returns several host keys' do
|
|
38
48
|
with_test_platform({ nodes: { 'test_node' => {} } }) do
|
|
39
49
|
with_cmd_runner_mocked [
|
|
40
|
-
['ssh-keyscan 192.168.42.42', proc do
|
|
50
|
+
['ssh-keyscan -p 22 192.168.42.42', proc do
|
|
41
51
|
[0, <<~EO_STDOUT, '']
|
|
42
52
|
192.168.42.42 ssh-rsa fake_host_key_rsa
|
|
43
53
|
192.168.42.42 ssh-ed25519 fake_host_key_ed25519
|
|
@@ -55,7 +65,7 @@ describe HybridPlatformsConductor::NodesHandler do
|
|
|
55
65
|
it 'returns several host keys and ignores comments from ssh-keyscan' do
|
|
56
66
|
with_test_platform({ nodes: { 'test_node' => {} } }) do
|
|
57
67
|
with_cmd_runner_mocked [
|
|
58
|
-
['ssh-keyscan 192.168.42.42', proc do
|
|
68
|
+
['ssh-keyscan -p 22 192.168.42.42', proc do
|
|
59
69
|
[0, <<~EO_STDOUT, '']
|
|
60
70
|
# That's a comment
|
|
61
71
|
192.168.42.42 ssh-rsa fake_host_key_rsa
|
|
@@ -78,7 +88,7 @@ describe HybridPlatformsConductor::NodesHandler do
|
|
|
78
88
|
it 'returns host keys sorted' do
|
|
79
89
|
with_test_platform({ nodes: { 'test_node' => {} } }) do
|
|
80
90
|
with_cmd_runner_mocked [
|
|
81
|
-
['ssh-keyscan 192.168.42.42', proc do
|
|
91
|
+
['ssh-keyscan -p 22 192.168.42.42', proc do
|
|
82
92
|
[0, <<~EO_STDOUT, '']
|
|
83
93
|
192.168.42.42 ssh-dsa fake_host_key_dsa
|
|
84
94
|
192.168.42.42 ssh-rsa fake_host_key_rsa
|
|
@@ -100,7 +110,7 @@ describe HybridPlatformsConductor::NodesHandler do
|
|
|
100
110
|
it 'does not return host keys when ssh-keyscan can\'t retrieve them' do
|
|
101
111
|
with_test_platform({ nodes: { 'test_node' => {} } }) do
|
|
102
112
|
with_cmd_runner_mocked [
|
|
103
|
-
['ssh-keyscan 192.168.42.42', proc { [0, '', ''] }]
|
|
113
|
+
['ssh-keyscan -p 22 192.168.42.42', proc { [0, '', ''] }]
|
|
104
114
|
] do
|
|
105
115
|
expect(cmdb(:host_keys).get_host_keys(['test_node'], { 'test_node' => { host_ip: '192.168.42.42' } })).to eq({})
|
|
106
116
|
end
|
|
@@ -119,9 +129,9 @@ describe HybridPlatformsConductor::NodesHandler do
|
|
|
119
129
|
}
|
|
120
130
|
) do
|
|
121
131
|
with_cmd_runner_mocked [
|
|
122
|
-
['ssh-keyscan 192.168.42.1', proc { [0, "192.168.42.1 ssh-rsa fake_host_key_1\n", ''] }],
|
|
123
|
-
['ssh-keyscan 192.168.42.2', proc { [0, '', ''] }],
|
|
124
|
-
['ssh-keyscan my_host_4.my_domain', proc { [0, "my_host_4.my_domain ssh-rsa fake_host_key_4\n", ''] }]
|
|
132
|
+
['ssh-keyscan -p 22 192.168.42.1', proc { [0, "192.168.42.1 ssh-rsa fake_host_key_1\n", ''] }],
|
|
133
|
+
['ssh-keyscan -p 22 192.168.42.2', proc { [0, '', ''] }],
|
|
134
|
+
['ssh-keyscan -p 22 my_host_4.my_domain', proc { [0, "my_host_4.my_domain ssh-rsa fake_host_key_4\n", ''] }]
|
|
125
135
|
] do
|
|
126
136
|
expect(
|
|
127
137
|
cmdb(:host_keys).get_host_keys(
|
|
@@ -141,6 +151,35 @@ describe HybridPlatformsConductor::NodesHandler do
|
|
|
141
151
|
end
|
|
142
152
|
end
|
|
143
153
|
|
|
154
|
+
it 'returns different host keys for hosts having the same IPs but different SSH ports' do
|
|
155
|
+
with_test_platform(
|
|
156
|
+
{
|
|
157
|
+
nodes: {
|
|
158
|
+
'test_node1' => {},
|
|
159
|
+
'test_node2' => {}
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
) do
|
|
163
|
+
with_cmd_runner_mocked [
|
|
164
|
+
['ssh-keyscan -p 6661 192.168.42.1', proc { [0, "192.168.42.1 ssh-rsa fake_host_key_1\n", ''] }],
|
|
165
|
+
['ssh-keyscan -p 6662 192.168.42.1', proc { [0, "192.168.42.1 ssh-rsa fake_host_key_2\n", ''] }]
|
|
166
|
+
] do
|
|
167
|
+
expect(
|
|
168
|
+
cmdb(:host_keys).get_host_keys(
|
|
169
|
+
['test_node'],
|
|
170
|
+
{
|
|
171
|
+
'test_node1' => { host_ip: '192.168.42.1', ssh_port: 6661 },
|
|
172
|
+
'test_node2' => { host_ip: '192.168.42.1', ssh_port: 6662 }
|
|
173
|
+
}
|
|
174
|
+
)
|
|
175
|
+
).to eq(
|
|
176
|
+
'test_node1' => ['ssh-rsa fake_host_key_1'],
|
|
177
|
+
'test_node2' => ['ssh-rsa fake_host_key_2']
|
|
178
|
+
)
|
|
179
|
+
end
|
|
180
|
+
end
|
|
181
|
+
end
|
|
182
|
+
|
|
144
183
|
end
|
|
145
184
|
|
|
146
185
|
end
|
|
@@ -256,6 +256,44 @@ describe HybridPlatformsConductor::HpcPlugins::PlatformHandler::ServerlessChef d
|
|
|
256
256
|
|
|
257
257
|
end
|
|
258
258
|
|
|
259
|
+
context 'with a platform having 1 local node' do
|
|
260
|
+
|
|
261
|
+
it 'returns actions to deploy on this node' do
|
|
262
|
+
with_serverless_chef_platforms('1_local_node') do |platform, repository|
|
|
263
|
+
mock_package(repository)
|
|
264
|
+
platform.prepare_for_deploy(
|
|
265
|
+
services: { 'node' => %w[test_policy] },
|
|
266
|
+
secrets: {},
|
|
267
|
+
local_environment: false,
|
|
268
|
+
why_run: false
|
|
269
|
+
)
|
|
270
|
+
with_cmd_runner_mocked [
|
|
271
|
+
['whoami', proc { [0, 'test_user', ''] }]
|
|
272
|
+
] do
|
|
273
|
+
expect(platform.actions_to_deploy_on('node', 'test_policy', use_why_run: false)).to eq expected_actions_to_deploy_chef(repository)
|
|
274
|
+
end
|
|
275
|
+
end
|
|
276
|
+
end
|
|
277
|
+
|
|
278
|
+
it 'returns actions to deploy on this node as root' do
|
|
279
|
+
with_serverless_chef_platforms('1_local_node') do |platform, repository|
|
|
280
|
+
mock_package(repository)
|
|
281
|
+
platform.prepare_for_deploy(
|
|
282
|
+
services: { 'node' => %w[test_policy] },
|
|
283
|
+
secrets: {},
|
|
284
|
+
local_environment: false,
|
|
285
|
+
why_run: false
|
|
286
|
+
)
|
|
287
|
+
with_cmd_runner_mocked [
|
|
288
|
+
['whoami', proc { [0, 'root', ''] }]
|
|
289
|
+
] do
|
|
290
|
+
expect(platform.actions_to_deploy_on('node', 'test_policy', use_why_run: false)).to eq expected_actions_to_deploy_chef(repository, sudo: '')
|
|
291
|
+
end
|
|
292
|
+
end
|
|
293
|
+
end
|
|
294
|
+
|
|
295
|
+
end
|
|
296
|
+
|
|
259
297
|
context 'with a platform having several nodes' do
|
|
260
298
|
|
|
261
299
|
it 'deploys services declared on 1 node on another node if asked' do
|
data/spec/hybrid_platforms_conductor_test/api/tests_runner/test_plugins/bitbucket_conf_spec.rb
CHANGED
|
@@ -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
|
-
|
|
9
|
-
|
|
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
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
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
|
-
|
|
9
|
-
|
|
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
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
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
|
-
|
|
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
|
|
|
@@ -11,6 +11,7 @@ module HybridPlatformsConductorTest
|
|
|
11
11
|
# * *nodes_connections* (Hash<String, Hash<Symbol,Object> >): Nodes' connections info, per node name:
|
|
12
12
|
# * *connection* (String): Connection string (fqdn, IP...) used by SSH
|
|
13
13
|
# * *ip* (String): IP used by SSH (can be different from connection in case of transformed SSH) [default: connection]
|
|
14
|
+
# * *port* (Integer): SSH port used [default: 22]
|
|
14
15
|
# * *user* (String): User used by SSH
|
|
15
16
|
# * *times* (Integer): Number of times this connection should be used [default: 1]
|
|
16
17
|
# * *control_master_create_error* (String or nil): Error to simulate during the SSH ControlMaster creation, or nil for none [default: nil]
|
|
@@ -37,6 +38,7 @@ module HybridPlatformsConductorTest
|
|
|
37
38
|
)
|
|
38
39
|
nodes_connections.map do |node, node_connection_info|
|
|
39
40
|
node_connection_info[:times] = 1 unless node_connection_info.key?(:times)
|
|
41
|
+
node_connection_info[:port] = 22 unless node_connection_info.key?(:port)
|
|
40
42
|
ssh_commands_once = []
|
|
41
43
|
ssh_commands_per_connection = []
|
|
42
44
|
if with_strict_host_key_checking
|
|
@@ -44,7 +46,7 @@ module HybridPlatformsConductorTest
|
|
|
44
46
|
ssh_commands_once.concat(
|
|
45
47
|
[
|
|
46
48
|
[
|
|
47
|
-
"ssh-keyscan #{ip}",
|
|
49
|
+
"ssh-keyscan -p #{node_connection_info[:port]} #{ip}",
|
|
48
50
|
proc { [0, "#{ip} ssh-rsa fake_host_key_for_#{ip}", ''] }
|
|
49
51
|
]
|
|
50
52
|
]
|
|
@@ -67,7 +69,7 @@ module HybridPlatformsConductorTest
|
|
|
67
69
|
%r{^xterm -e '.+/ssh -o ControlMaster=yes -o ControlPersist=yes hpc\.#{Regexp.escape(node)}'$}
|
|
68
70
|
end,
|
|
69
71
|
proc do
|
|
70
|
-
control_file = test_actions_executor.connector(:ssh).send(:control_master_file, node_connection_info[:connection],
|
|
72
|
+
control_file = test_actions_executor.connector(:ssh).send(:control_master_file, node_connection_info[:connection], node_connection_info[:port].to_s, node_connection_info[:user])
|
|
71
73
|
# Fail if the ControlMaster file already exists, as would SSH do if the file is stalled
|
|
72
74
|
if File.exist?(control_file)
|
|
73
75
|
[255, '', "Control file #{control_file} already exists"]
|
|
@@ -97,7 +99,7 @@ module HybridPlatformsConductorTest
|
|
|
97
99
|
%r{^.+/ssh -O exit hpc\.#{Regexp.escape(node)} 2>&1 \| grep -v 'Exit request sent\.'$},
|
|
98
100
|
proc do
|
|
99
101
|
# Really mock the control file deletion
|
|
100
|
-
File.unlink(test_actions_executor.connector(:ssh).send(:control_master_file, node_connection_info[:connection],
|
|
102
|
+
File.unlink(test_actions_executor.connector(:ssh).send(:control_master_file, node_connection_info[:connection], node_connection_info[:port].to_s, node_connection_info[:user]))
|
|
101
103
|
[1, '', '']
|
|
102
104
|
end,
|
|
103
105
|
{ optional: with_control_master_destroy_optional }
|
data/spec/hybrid_platforms_conductor_test/serverless_chef_repositories/1_local_node/nodes/node.json
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "node",
|
|
3
|
+
"normal": {
|
|
4
|
+
"description": "Single test node",
|
|
5
|
+
"image": "debian_9",
|
|
6
|
+
"private_ips": ["172.16.0.1"],
|
|
7
|
+
"local_node": true,
|
|
8
|
+
"property_1": {
|
|
9
|
+
"property_11": "value11"
|
|
10
|
+
},
|
|
11
|
+
"property_2": "value2"
|
|
12
|
+
},
|
|
13
|
+
"policy_name": "test_policy",
|
|
14
|
+
"policy_group": "test_group"
|
|
15
|
+
}
|