ovh-provisioner 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +9 -0
- data/.gitlab-ci.yml +23 -0
- data/.rspec +2 -0
- data/.ruby-version +1 -0
- data/CHANGELOG +7 -0
- data/CONTRIBUTING.md +62 -0
- data/Gemfile +6 -0
- data/LICENSE +202 -0
- data/README.md +107 -0
- data/Rakefile +24 -0
- data/bin/console +32 -0
- data/bin/ovh_provisioner +27 -0
- data/bin/setup +23 -0
- data/lib/ovh/provisioner.rb +43 -0
- data/lib/ovh/provisioner/api_list.rb +158 -0
- data/lib/ovh/provisioner/api_object/api_object.rb +125 -0
- data/lib/ovh/provisioner/api_object/dedicated_server.rb +225 -0
- data/lib/ovh/provisioner/api_object/domain_zone.rb +115 -0
- data/lib/ovh/provisioner/api_object/ip.rb +83 -0
- data/lib/ovh/provisioner/api_object/record.rb +48 -0
- data/lib/ovh/provisioner/api_object/vrack.rb +92 -0
- data/lib/ovh/provisioner/cli.rb +173 -0
- data/lib/ovh/provisioner/cli_domain.rb +138 -0
- data/lib/ovh/provisioner/cli_ip.rb +64 -0
- data/lib/ovh/provisioner/cli_vrack.rb +71 -0
- data/lib/ovh/provisioner/init.rb +77 -0
- data/lib/ovh/provisioner/self_cli.rb +81 -0
- data/lib/ovh/provisioner/spawner.rb +63 -0
- data/lib/ovh/provisioner/version.rb +24 -0
- data/ovh-provisioner.gemspec +53 -0
- data/spec/config.yml +53 -0
- data/spec/helpers/highline_helper.rb +36 -0
- data/spec/ovh/provisioner/cli_domain_spec.rb +140 -0
- data/spec/ovh/provisioner/cli_ip_spec.rb +90 -0
- data/spec/ovh/provisioner/cli_spec.rb +186 -0
- data/spec/ovh/provisioner/cli_vrack_spec.rb +83 -0
- data/spec/ovh/provisioner/stubs/domain_stubs.rb +204 -0
- data/spec/ovh/provisioner/stubs/ip_stubs.rb +152 -0
- data/spec/ovh/provisioner/stubs/server_stubs.rb +146 -0
- data/spec/ovh/provisioner/stubs/vrack_stubs.rb +87 -0
- data/spec/ovh/provisioner_spec.rb +25 -0
- data/spec/spec_helper.rb +47 -0
- metadata +350 -0
@@ -0,0 +1,83 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
#
|
4
|
+
# Copyright (c) 2015-2016 Sam4Mobile, 2017-2018 Make.org
|
5
|
+
#
|
6
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
7
|
+
# you may not use this file except in compliance with the License.
|
8
|
+
# You may obtain a copy of the License at
|
9
|
+
#
|
10
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
11
|
+
#
|
12
|
+
# Unless required by applicable law or agreed to in writing, software
|
13
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
14
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
15
|
+
# See the License for the specific language governing permissions and
|
16
|
+
# limitations under the License.
|
17
|
+
#
|
18
|
+
|
19
|
+
require 'spec_helper'
|
20
|
+
|
21
|
+
# rubocop:disable Metrics/BlockLength
|
22
|
+
describe 'ovh-provisioner vrack', :highline do
|
23
|
+
context 'list' do
|
24
|
+
it 'should output the list of vracks' do
|
25
|
+
out = <<-OUTPUT.gsub(/^ /, '')
|
26
|
+
vrack:
|
27
|
+
avrack: pn-1111
|
28
|
+
dedicated_servers:
|
29
|
+
test-server-01
|
30
|
+
bvrack: pn-2222 - Vrack n°2
|
31
|
+
dedicated_servers:
|
32
|
+
test-server-02
|
33
|
+
tasks:
|
34
|
+
init pn-2222.add(test-server-03)
|
35
|
+
init pn-2222.remove(test-server-02)
|
36
|
+
OUTPUT
|
37
|
+
expect { start(self, 'vrack') }.to output(out).to_stdout
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
context 'rm pn-2222 server-02' do
|
42
|
+
it 'should ask, then remove test-server-02 from vrack pn-2222' do
|
43
|
+
ask = <<-OUTPUT.gsub(/^ /, '')
|
44
|
+
You are going to remove those servers from vrack pn-2222(bvrack):
|
45
|
+
dedicated_server:
|
46
|
+
bvrack:
|
47
|
+
test-server-02.afirsttest.com[test-server-02/2]
|
48
|
+
test - storage_2016 - bvrack:2.2.2.2 - rescue:centos7_64 - ok
|
49
|
+
Rebooting
|
50
|
+
Do you want to proceed?
|
51
|
+
OUTPUT
|
52
|
+
out = <<-OUTPUT.gsub(/^ /, '')
|
53
|
+
test-server-02: ok
|
54
|
+
init pn-2222.remove(test-server-02)
|
55
|
+
OUTPUT
|
56
|
+
provide_input('yes')
|
57
|
+
expect { start(self, 'vrack') }.to output(out).to_stdout
|
58
|
+
expect(consume_output).to eq(ask)
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
context 'add pn-2222 03' do
|
63
|
+
it 'should ask, then add test-server-03 in vrack pn-2222' do
|
64
|
+
ask = <<-OUTPUT.gsub(/^ /, '')
|
65
|
+
You are going to add those servers to vrack pn-2222(bvrack):
|
66
|
+
dedicated_server:
|
67
|
+
none:
|
68
|
+
test-server-03.afirsttest.com[test-server-03/3]
|
69
|
+
test - undefined - none:3.3.3.3 - pxe:centos7_64 - ok
|
70
|
+
Server is not being installed or reinstalled at the moment
|
71
|
+
Do you want to proceed?
|
72
|
+
OUTPUT
|
73
|
+
out = <<-OUTPUT.gsub(/^ /, '')
|
74
|
+
test-server-03: ok
|
75
|
+
init pn-2222.add(test-server-03)
|
76
|
+
OUTPUT
|
77
|
+
provide_input('yes')
|
78
|
+
expect { start(self, 'vrack') }.to output(out).to_stdout
|
79
|
+
expect(consume_output).to eq(ask)
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
# rubocop:enable Metrics/BlockLength
|
@@ -0,0 +1,204 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
#
|
4
|
+
# Copyright (c) 2015-2016 Sam4Mobile, 2017-2018 Make.org
|
5
|
+
#
|
6
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
7
|
+
# you may not use this file except in compliance with the License.
|
8
|
+
# You may obtain a copy of the License at
|
9
|
+
#
|
10
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
11
|
+
#
|
12
|
+
# Unless required by applicable law or agreed to in writing, software
|
13
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
14
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
15
|
+
# See the License for the specific language governing permissions and
|
16
|
+
# limitations under the License.
|
17
|
+
#
|
18
|
+
|
19
|
+
domains = {
|
20
|
+
'afirsttest.com' => {
|
21
|
+
'lastUpdate' => now,
|
22
|
+
'hasDnsAnycast' => false,
|
23
|
+
'nameServers' => ['somedns.ovh.net', 'somens.ovh.net'],
|
24
|
+
'dnssecSupported' => true
|
25
|
+
},
|
26
|
+
'anothertest.com' => {
|
27
|
+
'lastUpdate' => now,
|
28
|
+
'hasDnsAnycast' => false,
|
29
|
+
'nameServers' => ['somedns.ovh.net', 'somens.ovh.net'],
|
30
|
+
'dnssecSupported' => true
|
31
|
+
},
|
32
|
+
'sotested.net' => {
|
33
|
+
'lastUpdate' => now,
|
34
|
+
'hasDnsAnycast' => false,
|
35
|
+
'nameServers' => ['somedns.ovh.net', 'somens.ovh.net'],
|
36
|
+
'dnssecSupported' => false
|
37
|
+
}
|
38
|
+
}
|
39
|
+
|
40
|
+
dnssecs = {
|
41
|
+
'afirsttest.com' => { 'status' => 'enabled' },
|
42
|
+
'anothertest.com' => { 'status' => 'disabled' },
|
43
|
+
'sotested.net' => { 'status' => 'disabled' }
|
44
|
+
}
|
45
|
+
|
46
|
+
records = {
|
47
|
+
'afirsttest.com' => [1, 2, 4, 7, 9, 10],
|
48
|
+
'anothertest.com' => [3, 5],
|
49
|
+
'sotested.net' => []
|
50
|
+
}
|
51
|
+
|
52
|
+
infos = {
|
53
|
+
1 => {
|
54
|
+
'target' => 'somedns.ovh.net',
|
55
|
+
'ttl' => 0,
|
56
|
+
'zone' => 'afirsttest.com',
|
57
|
+
'fieldType' => 'NS',
|
58
|
+
'id' => 1,
|
59
|
+
'subDomain' => ''
|
60
|
+
},
|
61
|
+
2 => {
|
62
|
+
'target' => '1.2.4.5',
|
63
|
+
'ttl' => 1,
|
64
|
+
'zone' => 'afirsttest.com',
|
65
|
+
'fieldType' => 'A',
|
66
|
+
'id' => 2,
|
67
|
+
'subDomain' => 'foo'
|
68
|
+
},
|
69
|
+
4 => {
|
70
|
+
'target' => 'some.cname.com.',
|
71
|
+
'ttl' => 2,
|
72
|
+
'zone' => 'afirsttest.com',
|
73
|
+
'fieldType' => 'CNAME',
|
74
|
+
'id' => 4,
|
75
|
+
'subDomain' => 'sub.www'
|
76
|
+
},
|
77
|
+
3 => {
|
78
|
+
'target' => 'redirect.something.net',
|
79
|
+
'ttl' => 3,
|
80
|
+
'zone' => 'anothertest.com',
|
81
|
+
'fieldType' => 'MX',
|
82
|
+
'id' => 3,
|
83
|
+
'subDomain' => ''
|
84
|
+
},
|
85
|
+
5 => {
|
86
|
+
'target' => '0 0 993 ssl.something.net',
|
87
|
+
'ttl' => 0,
|
88
|
+
'zone' => 'anothertest.com',
|
89
|
+
'fieldType' => 'SRV',
|
90
|
+
'id' => 5,
|
91
|
+
'subDomain' => '_imaps._tcp'
|
92
|
+
},
|
93
|
+
7 => {
|
94
|
+
'target' => '7.7.7.7',
|
95
|
+
'ttl' => 2,
|
96
|
+
'zone' => 'afirsttest.com',
|
97
|
+
'fieldType' => 'A',
|
98
|
+
'id' => 7,
|
99
|
+
'subDomain' => 'some.sub'
|
100
|
+
},
|
101
|
+
9 => { # Will be deleted by rename
|
102
|
+
'target' => '1.1.1.1',
|
103
|
+
'ttl' => 2,
|
104
|
+
'zone' => 'afirsttest.com',
|
105
|
+
'fieldType' => 'A',
|
106
|
+
'id' => 9,
|
107
|
+
'subDomain' => 'test-server-01'
|
108
|
+
},
|
109
|
+
10 => { # use by rename, refuse 03 renaming
|
110
|
+
'target' => 'test-server-03',
|
111
|
+
'ttl' => 0,
|
112
|
+
'zone' => 'afirsttest.com',
|
113
|
+
'fieldType' => 'CNAME',
|
114
|
+
'id' => 10,
|
115
|
+
'subDomain' => 'test-undef-3'
|
116
|
+
}
|
117
|
+
}
|
118
|
+
|
119
|
+
body_add_cname = {
|
120
|
+
'fieldType' => 'CNAME',
|
121
|
+
'target' => 'serv.dom.io.',
|
122
|
+
'ttl' => 0,
|
123
|
+
'subDomain' => 'test'
|
124
|
+
}
|
125
|
+
|
126
|
+
body_add_a = body_add_cname.dup
|
127
|
+
body_add_a['fieldType'] = 'A'
|
128
|
+
|
129
|
+
result_add_cname = body_add_cname.dup.merge(
|
130
|
+
'zone' => 'afirsttest.com',
|
131
|
+
'id' => 6
|
132
|
+
)
|
133
|
+
|
134
|
+
result_add_a = {
|
135
|
+
'message' => "Invalid IPv4 #{body_add_a['target']} for "\
|
136
|
+
"#{body_add_a['fieldType']} record of "\
|
137
|
+
"#{body_add_a['subDomain']}.#{result_add_cname['zone']}"
|
138
|
+
}
|
139
|
+
|
140
|
+
def rename_body(xxx)
|
141
|
+
{
|
142
|
+
'fieldType' => 'A',
|
143
|
+
'target' => "#{xxx}.#{xxx}.#{xxx}.#{xxx}",
|
144
|
+
'ttl' => 0,
|
145
|
+
'subDomain' => "test-#{xxx == 1 ? 'comp' : 'sto'}16-#{xxx}"
|
146
|
+
}
|
147
|
+
end
|
148
|
+
|
149
|
+
def rename_result(xxx)
|
150
|
+
rename_body(xxx).dup.merge(
|
151
|
+
'zone' => 'afirsttest.com',
|
152
|
+
'id' => 8
|
153
|
+
)
|
154
|
+
end
|
155
|
+
|
156
|
+
# Stubs
|
157
|
+
# rubocop:disable Metrics/BlockLength
|
158
|
+
RSpec.configure do |config|
|
159
|
+
config.before(:each) do
|
160
|
+
url = 'https://api.test.com/1.0/domain/zone'
|
161
|
+
|
162
|
+
stub_request(:get, "#{url}/")
|
163
|
+
.to_return(status: 200, body: domains.keys.to_json, headers: {})
|
164
|
+
|
165
|
+
domains.each_pair do |domain, general|
|
166
|
+
stub_request(:get, "#{url}/#{domain}/")
|
167
|
+
.to_return(status: 200, body: general.to_json, headers: {})
|
168
|
+
|
169
|
+
stub_request(:get, "#{url}/#{domain}/dnssec")
|
170
|
+
.to_return(status: 200, body: dnssecs[domain].to_json, headers: {})
|
171
|
+
|
172
|
+
stub_request(:get, "#{url}/#{domain}/record/")
|
173
|
+
.to_return(status: 200, body: records[domain].to_json, headers: {})
|
174
|
+
|
175
|
+
records[domain].each do |record|
|
176
|
+
stub_request(:get, "#{url}/#{domain}/record/#{record}/")
|
177
|
+
.to_return(status: 200, body: infos[record].to_json, headers: {})
|
178
|
+
end
|
179
|
+
end
|
180
|
+
|
181
|
+
stub_request(:post, "#{url}/afirsttest.com/record")
|
182
|
+
.with(body: body_add_cname.to_json)
|
183
|
+
.to_return(status: 200, body: result_add_cname.to_json, headers: {})
|
184
|
+
|
185
|
+
stub_request(:post, "#{url}/afirsttest.com/record")
|
186
|
+
.with(body: body_add_a.to_json)
|
187
|
+
.to_return(status: 400, body: result_add_a.to_json, headers: {})
|
188
|
+
|
189
|
+
stub_request(:post, "#{url}/afirsttest.com/refresh")
|
190
|
+
.to_return(status: 200, body: 'null', headers: {})
|
191
|
+
|
192
|
+
%w[4 7 9].each do |id|
|
193
|
+
stub_request(:delete, "#{url}/afirsttest.com/record/#{id}")
|
194
|
+
.to_return(status: 200, body: 'null', headers: {})
|
195
|
+
end
|
196
|
+
|
197
|
+
(1..2).each do |x|
|
198
|
+
stub_request(:post, "#{url}/afirsttest.com/record")
|
199
|
+
.with(body: rename_body(x).to_json)
|
200
|
+
.to_return(status: 200, body: rename_result(x).to_json, headers: {})
|
201
|
+
end
|
202
|
+
end
|
203
|
+
end
|
204
|
+
# rubocop:enable Metrics/BlockLength
|
@@ -0,0 +1,152 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
#
|
4
|
+
# Copyright (c) 2015-2016 Sam4Mobile, 2017-2018 Make.org
|
5
|
+
#
|
6
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
7
|
+
# you may not use this file except in compliance with the License.
|
8
|
+
# You may obtain a copy of the License at
|
9
|
+
#
|
10
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
11
|
+
#
|
12
|
+
# Unless required by applicable law or agreed to in writing, software
|
13
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
14
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
15
|
+
# See the License for the specific language governing permissions and
|
16
|
+
# limitations under the License.
|
17
|
+
#
|
18
|
+
|
19
|
+
ips = (1..3).map do |i|
|
20
|
+
{
|
21
|
+
"#{i}.#{i}.#{i}.#{i}" => {
|
22
|
+
'organisationId' => i == 3 ? 'test' : nil,
|
23
|
+
'country' => i == 3 ? 'some' : nil,
|
24
|
+
'routedTo' => {
|
25
|
+
'serviceName' => "test-server-0#{i}"
|
26
|
+
},
|
27
|
+
'ip' => "#{i}.#{i}.#{i}.#{i}/32",
|
28
|
+
'canBeTerminated' => i == 2,
|
29
|
+
'type' => 'dedicated',
|
30
|
+
'description' => i == 1 ? 'First server' : nil
|
31
|
+
}
|
32
|
+
}
|
33
|
+
end.inject(:merge)
|
34
|
+
|
35
|
+
reverse = {
|
36
|
+
'1.1.1.1' => [
|
37
|
+
200,
|
38
|
+
{
|
39
|
+
'ipReverse' => '1.1.1.1',
|
40
|
+
'reverse' => 'test-server-01.test.com.'
|
41
|
+
}
|
42
|
+
],
|
43
|
+
'2.2.2.2' => [
|
44
|
+
404,
|
45
|
+
{
|
46
|
+
'message' => 'The requested object (ipReverse = 2.2.2.2) does not exist'
|
47
|
+
}
|
48
|
+
],
|
49
|
+
'3.3.3.3' => [
|
50
|
+
404,
|
51
|
+
{
|
52
|
+
'message' => 'The requested object (ipReverse = 3.3.3.3) does not exist'
|
53
|
+
}
|
54
|
+
]
|
55
|
+
}
|
56
|
+
|
57
|
+
set2 = {
|
58
|
+
'ipReverse' => '2.2.2.2',
|
59
|
+
'reverse' => 'test-server-02.test.com'
|
60
|
+
}
|
61
|
+
|
62
|
+
ret2 = set2.dup
|
63
|
+
ret2[reverse] = "#{ret2[reverse]}."
|
64
|
+
|
65
|
+
set1 = {
|
66
|
+
'ipReverse' => '1.1.1.1',
|
67
|
+
'reverse' => 'test-comp16-1.afirsttest.com'
|
68
|
+
}
|
69
|
+
|
70
|
+
fail1 = {
|
71
|
+
'message' =>
|
72
|
+
'Cannot check if test-comp16-1.afirsttest.com. resolves to 1.1.1.1'
|
73
|
+
}
|
74
|
+
|
75
|
+
set22 = {
|
76
|
+
'ipReverse' => '2.2.2.2',
|
77
|
+
'reverse' => 'test-sto16-2.afirsttest.com'
|
78
|
+
}
|
79
|
+
|
80
|
+
fail22 = {
|
81
|
+
'message' =>
|
82
|
+
'Cannot check if test-sto16-2.afirsttest.com. resolves to 2.2.2.2'
|
83
|
+
}
|
84
|
+
|
85
|
+
set3 = {
|
86
|
+
'ipReverse' => '3.3.3.3',
|
87
|
+
'reverse' => 'invalid-test-03'
|
88
|
+
}
|
89
|
+
|
90
|
+
fail3 = {
|
91
|
+
'message' => 'Cannot check if invalid-test-03. resolves to 3.3.3.3'
|
92
|
+
}
|
93
|
+
|
94
|
+
set32 = {
|
95
|
+
'ipReverse' => '3.3.3.3',
|
96
|
+
'reverse' => 'test-undef-3.afirsttest.com'
|
97
|
+
}
|
98
|
+
|
99
|
+
fail32 = {
|
100
|
+
'message' => "Cannot check if #{set32['reverse']}. resolves to 3.3.3.3"
|
101
|
+
}
|
102
|
+
|
103
|
+
ret32 = set32.dup.merge('reverse' => "#{set32['reverse']}.")
|
104
|
+
|
105
|
+
# Stubs
|
106
|
+
# rubocop:disable Metrics/BlockLength
|
107
|
+
RSpec.configure do |config|
|
108
|
+
config.before(:each) do
|
109
|
+
url = 'https://api.test.com/1.0/ip'
|
110
|
+
|
111
|
+
stub_request(:get, "#{url}/")
|
112
|
+
.to_return(status: 200,
|
113
|
+
body: ips.keys.map { |ip| ips[ip]['ip'] }.to_json,
|
114
|
+
headers: {})
|
115
|
+
|
116
|
+
ips.each_pair do |ip, general|
|
117
|
+
ip_url = "#{ip}%2F32"
|
118
|
+
stub_request(:get, "#{url}/#{ip_url}/")
|
119
|
+
.to_return(status: 200, body: general.to_json, headers: {})
|
120
|
+
|
121
|
+
stub_request(:get, "#{url}/#{ip_url}/reverse/#{ip}")
|
122
|
+
.to_return(status: reverse[ip].first,
|
123
|
+
body: reverse[ip][-1].to_json,
|
124
|
+
headers: {})
|
125
|
+
end
|
126
|
+
|
127
|
+
stub_request(:post, "#{url}/2.2.2.2%2F32/reverse")
|
128
|
+
.with(body: set2.to_json)
|
129
|
+
.to_return(status: 200, body: ret2.to_json, headers: {})
|
130
|
+
|
131
|
+
stub_request(:post, "#{url}/1.1.1.1%2F32/reverse")
|
132
|
+
.with(body: set1.to_json)
|
133
|
+
.to_return(status: 400, body: fail1.to_json, headers: {})
|
134
|
+
|
135
|
+
stub_request(:post, "#{url}/2.2.2.2%2F32/reverse")
|
136
|
+
.with(body: set22.to_json)
|
137
|
+
.to_return(status: 400, body: fail22.to_json, headers: {})
|
138
|
+
|
139
|
+
stub_request(:post, "#{url}/3.3.3.3%2F32/reverse")
|
140
|
+
.with(body: set3.to_json)
|
141
|
+
.to_return(status: 400, body: fail3.to_json, headers: {})
|
142
|
+
|
143
|
+
stub_request(:delete, "#{url}/1.1.1.1%2F32/reverse/1.1.1.1")
|
144
|
+
.to_return(status: 200, body: nil.to_json, headers: {})
|
145
|
+
|
146
|
+
stub_request(:post, "#{url}/3.3.3.3%2F32/reverse")
|
147
|
+
.with(body: set32.to_json)
|
148
|
+
.to_return(status: 400, body: fail32.to_json, headers: {})
|
149
|
+
.to_return(status: 200, body: ret32.to_json, headers: {})
|
150
|
+
end
|
151
|
+
end
|
152
|
+
# rubocop:enable Metrics/BlockLength
|
@@ -0,0 +1,146 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
#
|
4
|
+
# Copyright (c) 2015-2016 Sam4Mobile, 2017-2018 Make.org
|
5
|
+
#
|
6
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
7
|
+
# you may not use this file except in compliance with the License.
|
8
|
+
# You may obtain a copy of the License at
|
9
|
+
#
|
10
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
11
|
+
#
|
12
|
+
# Unless required by applicable law or agreed to in writing, software
|
13
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
14
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
15
|
+
# See the License for the specific language governing permissions and
|
16
|
+
# limitations under the License.
|
17
|
+
#
|
18
|
+
|
19
|
+
# General config of servers
|
20
|
+
servers = (1..3).map do |i|
|
21
|
+
{
|
22
|
+
"test-server-0#{i}" => {
|
23
|
+
'datacenter' => "test#{i}",
|
24
|
+
'ip' => "#{i}.#{i}.#{i}.#{i}",
|
25
|
+
'os' => 'centos7_64',
|
26
|
+
'state' => 'ok',
|
27
|
+
'serverId' => i,
|
28
|
+
'bootId' => i,
|
29
|
+
'name' => "test-server-0#{i}",
|
30
|
+
'reverse' => "test-server-0#{i}.afirsttest.com."
|
31
|
+
}
|
32
|
+
}
|
33
|
+
end.inject(:merge)
|
34
|
+
|
35
|
+
# BootId config
|
36
|
+
boots = {
|
37
|
+
1 => { 'bootType' => 'harddisk' },
|
38
|
+
2 => { 'bootType' => 'rescue' },
|
39
|
+
3 => { 'bootType' => 'pxe' }
|
40
|
+
}
|
41
|
+
|
42
|
+
# Hardware profil and flavors
|
43
|
+
hardwares = {}
|
44
|
+
%w[compute_2016 storage_2016 compute_2016].each_with_index do |flavor, i|
|
45
|
+
config = YAML.load_file('spec/config.yml')
|
46
|
+
hardwares["test-server-0#{i + 1}"] = config['flavors'][flavor]['hardware']
|
47
|
+
end
|
48
|
+
# We can get more info, it won't affect the flavor
|
49
|
+
hardwares['test-server-02']['motherboard'] = 'X10DRH-iT'
|
50
|
+
# If a value is different, it is a different flavor
|
51
|
+
hardwares['test-server-03']['memorySize']['value'] = 262_144
|
52
|
+
|
53
|
+
# Vracks
|
54
|
+
vracks = {
|
55
|
+
'test-server-01' => ['pn-1111'],
|
56
|
+
'test-server-02' => ['pn-2222'],
|
57
|
+
'test-server-03' => []
|
58
|
+
}
|
59
|
+
|
60
|
+
# Install status
|
61
|
+
idle = OVH::Provisioner::APIObject::DedicatedServer::IDLE
|
62
|
+
install_status = {
|
63
|
+
'test-server-01' => [
|
64
|
+
200,
|
65
|
+
'{ "progress": [
|
66
|
+
{"status": "doing", "comment": "Setting things up"},
|
67
|
+
{"status": "to do", "comment": "Rebooting on fresh system"}
|
68
|
+
]
|
69
|
+
}'
|
70
|
+
],
|
71
|
+
'test-server-02' => [
|
72
|
+
200,
|
73
|
+
'{ "progress": [
|
74
|
+
{"status": "done", "comment": "Preparing installation"},
|
75
|
+
{"status": "doing", "comment": "Rebooting"}
|
76
|
+
]
|
77
|
+
}'
|
78
|
+
],
|
79
|
+
'test-server-03' => [
|
80
|
+
404, "{\"message\": \"#{idle}\"}"
|
81
|
+
]
|
82
|
+
}
|
83
|
+
|
84
|
+
def install_body(server, distrib = nil, ssh = 'testKey')
|
85
|
+
details = { 'customHostname' => "#{server}.afirsttest.com" }
|
86
|
+
details['useDistribKernel'] = distrib unless distrib.nil?
|
87
|
+
details['sshKeyName'] = ssh unless ssh.nil?
|
88
|
+
{
|
89
|
+
'templateName' => 'test-template',
|
90
|
+
'details' => details
|
91
|
+
}
|
92
|
+
end
|
93
|
+
|
94
|
+
reinstall_answer = <<-JSON.gsub(/^ /, '')
|
95
|
+
{
|
96
|
+
"taskId": 123,
|
97
|
+
"function": "reinstallServer",
|
98
|
+
"lastUpdate": "#{now}",
|
99
|
+
"comment": "Start dedicated server installation",
|
100
|
+
"status": "init",
|
101
|
+
"startDate": "#{now}",
|
102
|
+
"doneDate": null
|
103
|
+
}
|
104
|
+
JSON
|
105
|
+
|
106
|
+
# Stubs
|
107
|
+
# rubocop:disable Metrics/BlockLength
|
108
|
+
RSpec.configure do |config|
|
109
|
+
config.before(:each) do
|
110
|
+
url = 'https://api.test.com/1.0/dedicated/server'
|
111
|
+
|
112
|
+
stub_request(:get, "#{url}/")
|
113
|
+
.to_return(status: 200, body: servers.keys.to_json, headers: {})
|
114
|
+
|
115
|
+
servers.each_pair do |server, general|
|
116
|
+
stub_request(:get, "#{url}/#{server}/")
|
117
|
+
.to_return(status: 200, body: general.to_json, headers: {})
|
118
|
+
|
119
|
+
boot_id = general['bootId']
|
120
|
+
boot = boots[boot_id].to_json
|
121
|
+
stub_request(:get, "#{url}/#{server}/boot/#{boot_id}")
|
122
|
+
.to_return(status: 200, body: boot, headers: {})
|
123
|
+
|
124
|
+
hardware = hardwares[server].to_json
|
125
|
+
stub_request(:get, "#{url}/#{server}/specifications/hardware")
|
126
|
+
.to_return(status: 200, body: hardware, headers: {})
|
127
|
+
|
128
|
+
vrack = vracks[server].to_json
|
129
|
+
stub_request(:get, "#{url}/#{server}/vrack")
|
130
|
+
.to_return(status: 200, body: vrack, headers: {})
|
131
|
+
|
132
|
+
status, body = install_status[server]
|
133
|
+
stub_request(:get, "#{url}/#{server}/install/status")
|
134
|
+
.to_return(status: status, body: body, headers: {})
|
135
|
+
|
136
|
+
stub_request(:post, "#{url}/#{server}/install/start")
|
137
|
+
.with(body: install_body(server, false).to_json)
|
138
|
+
.to_return(status: 200, body: reinstall_answer, headers: {})
|
139
|
+
|
140
|
+
stub_request(:post, "#{url}/#{server}/install/start")
|
141
|
+
.with(body: install_body(server, true).to_json)
|
142
|
+
.to_return(status: 200, body: reinstall_answer, headers: {})
|
143
|
+
end
|
144
|
+
end
|
145
|
+
end
|
146
|
+
# rubocop:enable Metrics/BlockLength
|