gaptool-server 0.7.4 → 0.8.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/Rakefile +19 -21
- data/VERSION +1 -1
- data/bin/gaptool-server +2 -2
- data/bin/gaptool-shell +2 -2
- data/config.ru +3 -4
- data/lib/app.rb +76 -66
- data/lib/exceptions.rb +4 -4
- data/lib/routes.rb +212 -203
- data/tasks/app.rb +12 -12
- data/tasks/config.rb +8 -8
- data/tasks/docker.rb +19 -19
- data/tasks/ec2.rb +14 -16
- data/tasks/gem.rb +7 -8
- data/tasks/role.rb +19 -19
- data/tasks/server.rb +7 -7
- data/tasks/user.rb +9 -9
- data/test/api_test.rb +212 -146
- data/test/base_test.rb +5 -5
- data/test/data_test.rb +56 -75
- data/test/test_helper.rb +11 -9
- metadata +3 -3
data/test/api_test.rb
CHANGED
@@ -2,13 +2,12 @@ require_relative 'test_helper'
|
|
2
2
|
require 'json'
|
3
3
|
require 'set'
|
4
4
|
|
5
|
-
|
5
|
+
redis = Gaptool.redis
|
6
|
+
|
7
|
+
describe 'Test API' do
|
6
8
|
before(:all) do
|
7
9
|
ENV['DRYRUN'] = 'true'
|
8
|
-
ENV['GAPTOOL_CHECK_CLIENT_VERSION'] =
|
9
|
-
@version = File.read(File.realpath(
|
10
|
-
File.join(File.dirname(__FILE__), "..", 'VERSION')
|
11
|
-
)).strip.split(".")[0..1].join(".")
|
10
|
+
ENV['GAPTOOL_CHECK_CLIENT_VERSION'] = nil
|
12
11
|
end
|
13
12
|
|
14
13
|
after(:all) do
|
@@ -19,25 +18,24 @@ describe "Test API" do
|
|
19
18
|
before(:each) do
|
20
19
|
header 'X-GAPTOOL-USER', 'test'
|
21
20
|
header 'X-GAPTOOL-KEY', 'test'
|
22
|
-
header 'X-GAPTOOL-VERSION',
|
23
|
-
|
21
|
+
header 'X-GAPTOOL-VERSION', version
|
22
|
+
redis.flushall
|
24
23
|
DH.useradd('test', 'test')
|
25
24
|
$time = Time.now
|
26
25
|
end
|
27
26
|
|
28
|
-
def add_and_register_server
|
27
|
+
def add_and_register_server(data = nil)
|
29
28
|
data ||= host_data
|
30
29
|
post '/init', data.to_json
|
31
30
|
expect(last_response.status).to eq(200)
|
32
31
|
res = JSON.parse(last_response.body)
|
33
32
|
id = res['instance']
|
34
|
-
secret = res['secret']
|
35
33
|
# there is no API to get the secret, get it from the database.
|
36
|
-
secret = Gaptool::Data
|
37
|
-
put '/register', {'role' => data['role'],
|
38
|
-
|
39
|
-
|
40
|
-
|
34
|
+
secret = Gaptool::Data.get_server_data(id)['secret']
|
35
|
+
put '/register', { 'role' => data['role'],
|
36
|
+
'environment' => data['environment'],
|
37
|
+
'secret' => secret,
|
38
|
+
'zone' => data['zone'] }.to_json
|
41
39
|
expect(last_response.status).to eq(200)
|
42
40
|
res
|
43
41
|
end
|
@@ -52,8 +50,8 @@ describe "Test API" do
|
|
52
50
|
'terminable' => true,
|
53
51
|
'zone' => 'my-zone-1a',
|
54
52
|
'itype' => 'm1.type',
|
55
|
-
|
56
|
-
|
53
|
+
'hostname' => 'fake.hostname.gild.com',
|
54
|
+
'launch_time' => $time.to_i
|
57
55
|
}
|
58
56
|
end
|
59
57
|
|
@@ -61,7 +59,13 @@ describe "Test API" do
|
|
61
59
|
['recipe[init]', 'recipe[myrecipe]']
|
62
60
|
end
|
63
61
|
|
64
|
-
|
62
|
+
def version
|
63
|
+
@v ||= File.read(
|
64
|
+
File.realpath(File.join(File.dirname(__FILE__), '..', 'VERSION')
|
65
|
+
)).strip
|
66
|
+
end
|
67
|
+
|
68
|
+
it 'should return 200' do
|
65
69
|
get '/'
|
66
70
|
expect(last_response.status).to eq(200)
|
67
71
|
expect(last_response.content_type).to include('text/html')
|
@@ -72,48 +76,48 @@ describe "Test API" do
|
|
72
76
|
expect(last_response.content_type).to include('application/json')
|
73
77
|
end
|
74
78
|
|
75
|
-
it
|
79
|
+
it 'should create a instance' do
|
76
80
|
post '/init', host_data.to_json
|
77
81
|
expect(last_response.status).to eq(200)
|
78
|
-
expect(JSON.parse(last_response.body).keys).to eq(
|
79
|
-
|
82
|
+
expect(JSON.parse(last_response.body).keys).to eq(%w(instance ami role hostname launch_time
|
83
|
+
environment secret terminable security_group))
|
80
84
|
end
|
81
85
|
|
82
|
-
it
|
86
|
+
it 'should get the runlist from the role' do
|
83
87
|
DH.save_role_data(host_data['role'], chef_runlist: ['recipe[other]'].to_json)
|
84
|
-
id = add_and_register_server(host_data.reject{|k,
|
88
|
+
id = add_and_register_server(host_data.reject { |k, _v| k == 'chef_runlist' })['instance']
|
85
89
|
get "/host/testrole/testenv/#{id}"
|
86
90
|
resp = JSON.parse(last_response.body)
|
87
|
-
expect(resp.keys).to include(
|
91
|
+
expect(resp.keys).to include('chef_runlist')
|
88
92
|
expect(resp['chef_runlist']).to eq(['recipe[other]'])
|
89
93
|
end
|
90
94
|
|
91
|
-
it
|
92
|
-
DH.save_role_data(host_data['role'],
|
93
|
-
id = add_and_register_server(host_data.reject{|k,
|
95
|
+
it 'should get the security group from the role' do
|
96
|
+
DH.save_role_data(host_data['role'], 'sg' => { host_data['environment'] => 'mysg-in-role' })
|
97
|
+
id = add_and_register_server(host_data.reject { |k, _v| k == 'security_group' })['instance']
|
94
98
|
get "/host/testrole/testenv/#{id}"
|
95
99
|
resp = JSON.parse(last_response.body)
|
96
|
-
expect(resp.keys).to include(
|
97
|
-
expect(resp['security_group']).to eq(
|
100
|
+
expect(resp.keys).to include('security_group')
|
101
|
+
expect(resp['security_group']).to eq('mysg-in-role')
|
98
102
|
end
|
99
103
|
|
100
|
-
it
|
101
|
-
id = add_and_register_server(host_data.reject{|k,
|
104
|
+
it 'should get the default security group' do
|
105
|
+
id = add_and_register_server(host_data.reject { |k, _v| k == 'security_group' })['instance']
|
102
106
|
get "/host/testrole/testenv/#{id}"
|
103
107
|
resp = JSON.parse(last_response.body)
|
104
|
-
expect(resp.keys).to include(
|
108
|
+
expect(resp.keys).to include('security_group')
|
105
109
|
expect(resp['security_group']).to eq("#{host_data['role']}-#{host_data['environment']}")
|
106
110
|
end
|
107
111
|
|
108
|
-
it
|
109
|
-
id = add_and_register_server
|
112
|
+
it 'should set instance unterminable' do
|
113
|
+
id = add_and_register_server['instance']
|
110
114
|
|
111
115
|
get "/instance/#{id}"
|
112
116
|
expect(last_response.status).to eq(200)
|
113
117
|
resp = JSON.parse(last_response.body)
|
114
|
-
expect(resp.keys).not_to include(
|
118
|
+
expect(resp.keys).not_to include('terminable')
|
115
119
|
|
116
|
-
patch "/instance/#{id}", {terminable: false}.to_json
|
120
|
+
patch "/instance/#{id}", { terminable: false }.to_json
|
117
121
|
expect(last_response.status).to eq(200)
|
118
122
|
resp = JSON.parse(last_response.body)
|
119
123
|
expect(resp['terminable']).to eq(false)
|
@@ -123,37 +127,37 @@ describe "Test API" do
|
|
123
127
|
resp = JSON.parse(last_response.body)
|
124
128
|
expect(resp['terminable']).to eq(false)
|
125
129
|
|
126
|
-
post '/terminate', {'id' => id}.to_json
|
130
|
+
post '/terminate', { 'id' => id }.to_json
|
127
131
|
expect(last_response.status).to eq(409)
|
128
132
|
|
129
|
-
patch "/instance/#{id}", {terminable: true}.to_json
|
133
|
+
patch "/instance/#{id}", { terminable: true }.to_json
|
130
134
|
expect(last_response.status).to eq(200)
|
131
135
|
resp = JSON.parse(last_response.body)
|
132
136
|
expect(resp['terminable']).to eq(true)
|
133
137
|
|
134
|
-
post '/terminate', {'id' => id}.to_json
|
138
|
+
post '/terminate', { 'id' => id }.to_json
|
135
139
|
expect(last_response.status).to eq(200)
|
136
140
|
end
|
137
141
|
|
138
|
-
it
|
139
|
-
id = add_and_register_server
|
142
|
+
it 'should set an instance as hidden' do
|
143
|
+
id = add_and_register_server['instance']
|
140
144
|
|
141
145
|
get "/instance/#{id}"
|
142
146
|
expect(last_response.status).to eq(200)
|
143
147
|
resp = JSON.parse(last_response.body)
|
144
|
-
expect(resp.keys).not_to include(
|
148
|
+
expect(resp.keys).not_to include('hidden')
|
145
149
|
|
146
|
-
patch "/instance/#{id}", {hidden: false}.to_json
|
150
|
+
patch "/instance/#{id}", { hidden: false }.to_json
|
147
151
|
expect(last_response.status).to eq(200)
|
148
152
|
resp = JSON.parse(last_response.body)
|
149
|
-
expect(resp.keys).not_to include(
|
153
|
+
expect(resp.keys).not_to include('hidden')
|
150
154
|
|
151
155
|
get "/instance/#{id}"
|
152
156
|
expect(last_response.status).to eq(200)
|
153
157
|
resp = JSON.parse(last_response.body)
|
154
|
-
expect(resp.keys).not_to include(
|
158
|
+
expect(resp.keys).not_to include('hidden')
|
155
159
|
|
156
|
-
patch "/instance/#{id}", {hidden: true}.to_json
|
160
|
+
patch "/instance/#{id}", { hidden: true }.to_json
|
157
161
|
expect(last_response.status).to eq(200)
|
158
162
|
resp = JSON.parse(last_response.body)
|
159
163
|
expect(resp['hidden']).to eq(true)
|
@@ -168,7 +172,7 @@ describe "Test API" do
|
|
168
172
|
resp = JSON.parse(last_response.body)
|
169
173
|
expect(resp['hidden']).to eq(true)
|
170
174
|
|
171
|
-
get
|
175
|
+
get '/hosts'
|
172
176
|
expect(last_response.status).to eq(200)
|
173
177
|
expect(JSON.parse(last_response.body)).to eq([])
|
174
178
|
|
@@ -185,98 +189,98 @@ describe "Test API" do
|
|
185
189
|
expect(JSON.parse(last_response.body)).to eq([])
|
186
190
|
end
|
187
191
|
|
188
|
-
it
|
189
|
-
id = add_and_register_server(host_data.merge(
|
192
|
+
it 'should remove default runlist' do
|
193
|
+
id = add_and_register_server(host_data.merge('chef_runlist' => ['recipe[init]']))['instance']
|
190
194
|
get "/host/testrole/testenv/#{id}"
|
191
195
|
resp = JSON.parse(last_response.body)
|
192
|
-
expect(resp.keys).not_to include(
|
196
|
+
expect(resp.keys).not_to include('chef_runlist')
|
193
197
|
end
|
194
198
|
|
195
|
-
it
|
199
|
+
it 'should remove default runlist from role' do
|
196
200
|
DH.save_role_data(host_data['role'], chef_runlist: ['recipe[init]'].to_json)
|
197
|
-
id = add_and_register_server(host_data.reject{|k,
|
201
|
+
id = add_and_register_server(host_data.reject { |k, _v| k == 'chef_runlist' })['instance']
|
198
202
|
get "/host/testrole/testenv/#{id}"
|
199
203
|
resp = JSON.parse(last_response.body)
|
200
|
-
expect(resp.keys).not_to include(
|
204
|
+
expect(resp.keys).not_to include('chef_runlist')
|
201
205
|
expect(resp['chef_runlist']).to be(nil)
|
202
206
|
end
|
203
207
|
|
204
|
-
it
|
205
|
-
DH.save_role_data(host_data['role'], 'amis' => {'my-zone-1' => 'ami-other'})
|
206
|
-
res = add_and_register_server(host_data.reject{|k,
|
208
|
+
it 'should get the ami from the role' do
|
209
|
+
DH.save_role_data(host_data['role'], 'amis' => { 'my-zone-1' => 'ami-other' })
|
210
|
+
res = add_and_register_server(host_data.reject { |k, _v| k == 'ami' })
|
207
211
|
expect(res['ami']).to eq('ami-other')
|
208
212
|
get "/host/testrole/testenv/#{res['instance']}"
|
209
213
|
resp = JSON.parse(last_response.body)
|
210
|
-
expect(resp.keys).to_not include(
|
214
|
+
expect(resp.keys).to_not include('ami')
|
211
215
|
end
|
212
216
|
|
213
|
-
it
|
214
|
-
DH.
|
215
|
-
res = add_and_register_server(host_data.reject{|k,
|
217
|
+
it 'should get the ami from global conf' do
|
218
|
+
DH.amis('my-zone-1' => 'ami-default')
|
219
|
+
res = add_and_register_server(host_data.reject { |k, _v| k == 'ami' })
|
216
220
|
expect(res['ami']).to eq('ami-default')
|
217
221
|
get "/host/testrole/testenv/#{res['instance']}"
|
218
222
|
resp = JSON.parse(last_response.body)
|
219
|
-
expect(resp.keys).to_not include(
|
223
|
+
expect(resp.keys).to_not include('ami')
|
220
224
|
end
|
221
225
|
|
222
|
-
it
|
226
|
+
it 'should fail to parse client data' do
|
223
227
|
post '/init', host_data
|
224
228
|
expect(last_response.status).to eq(400)
|
225
229
|
end
|
226
230
|
|
227
|
-
it
|
231
|
+
it 'should fail to create a instance' do
|
228
232
|
%w(role environment zone itype).each do |req|
|
229
|
-
post '/init', host_data.reject{|k,
|
233
|
+
post '/init', host_data.reject { |k, _v| k == req }.to_json
|
230
234
|
expect(last_response.status).to eq(400)
|
231
235
|
expect(JSON.parse(last_response.body).keys).to eq(%w(result message))
|
232
236
|
end
|
233
237
|
end
|
234
238
|
|
235
|
-
it
|
239
|
+
it 'should fail for missing parameter to terminate' do
|
236
240
|
post '/terminate'
|
237
241
|
expect(last_response.status).to eq(400)
|
238
242
|
end
|
239
243
|
|
240
|
-
it
|
241
|
-
post '/terminate', {'id' => 'i-1234567'}.to_json
|
244
|
+
it 'should fail to terminate non-existing instance' do
|
245
|
+
post '/terminate', { 'id' => 'i-1234567' }.to_json
|
242
246
|
expect(last_response.status).to eq(404)
|
243
247
|
end
|
244
248
|
|
245
|
-
it
|
249
|
+
it 'should fail to terminate non-terminable instance' do
|
246
250
|
post '/init', host_data.merge('terminable' => false).to_json
|
247
251
|
expect(last_response.status).to eq(200)
|
248
252
|
id = JSON.parse(last_response.body)['instance']
|
249
|
-
post '/terminate', {'id' => id}.to_json
|
253
|
+
post '/terminate', { 'id' => id }.to_json
|
250
254
|
expect(last_response.status).to eq(409)
|
251
255
|
end
|
252
256
|
|
253
|
-
it
|
257
|
+
it 'should terminate instance' do
|
254
258
|
post '/init', host_data.to_json
|
255
259
|
expect(last_response.status).to eq(200)
|
256
260
|
id = JSON.parse(last_response.body)['instance']
|
257
|
-
post '/terminate', {'id' => id}.to_json
|
261
|
+
post '/terminate', { 'id' => id }.to_json
|
258
262
|
expect(last_response.status).to eq(200)
|
259
|
-
expect(JSON.parse(last_response.body)).to eq(
|
263
|
+
expect(JSON.parse(last_response.body)).to eq(id => { 'status' => 'terminated' })
|
260
264
|
end
|
261
265
|
|
262
|
-
it
|
266
|
+
it 'should fail to register a server' do
|
263
267
|
required_keys = %w(role zone environment secret)
|
264
|
-
hdata = host_data.select {|k,
|
268
|
+
hdata = host_data.select { |k, _v| required_keys.include?(k) }
|
265
269
|
hdata['secret'] = 'mysecret'
|
266
270
|
required_keys.each do |key|
|
267
|
-
put '/register', hdata.select {|k,
|
271
|
+
put '/register', hdata.select { |k, _v| k != key }.to_json
|
268
272
|
expect(last_response.status).to eq(400)
|
269
273
|
end
|
270
274
|
put '/register', hdata.to_json
|
271
275
|
expect(last_response.status).to eq(403)
|
272
276
|
end
|
273
277
|
|
274
|
-
it
|
278
|
+
it 'should register the server' do
|
275
279
|
add_and_register_server
|
276
280
|
expect(last_response.body).to include("-E #{host_data['environment']}")
|
277
281
|
end
|
278
282
|
|
279
|
-
it
|
283
|
+
it 'should not find any hosts' do
|
280
284
|
post '/init', host_data.to_json
|
281
285
|
expect(last_response.status).to eq(200)
|
282
286
|
|
@@ -289,147 +293,209 @@ describe "Test API" do
|
|
289
293
|
expect(JSON.parse(last_response.body)).to eq([])
|
290
294
|
end
|
291
295
|
|
292
|
-
it
|
293
|
-
id = add_and_register_server
|
296
|
+
it 'should find an host' do
|
297
|
+
id = add_and_register_server['instance']
|
294
298
|
get '/hosts'
|
295
299
|
expect(last_response.status).to eq(200)
|
296
|
-
exp_data = host_data.reject{|k,
|
297
|
-
|
300
|
+
exp_data = host_data.reject { |k, _v| k == 'terminable' }.merge('chef_runlist' => expanded_runlist,
|
301
|
+
'apps' => [])
|
298
302
|
exp_data['instance'] = id
|
299
303
|
expect(JSON.parse(last_response.body)).to eq([exp_data])
|
300
304
|
end
|
301
305
|
|
302
|
-
it
|
303
|
-
id1 = add_and_register_server
|
304
|
-
id2 = add_and_register_server
|
306
|
+
it 'should find two hosts' do
|
307
|
+
id1 = add_and_register_server['instance']
|
308
|
+
id2 = add_and_register_server['instance']
|
305
309
|
get '/hosts'
|
306
310
|
expect(last_response.status).to eq(200)
|
307
311
|
exp_data = [
|
308
|
-
host_data.reject{|k,
|
309
|
-
|
310
|
-
|
311
|
-
host_data.reject{|k,
|
312
|
-
|
313
|
-
|
312
|
+
host_data.reject { |k, _v| k == 'terminable' }.merge('instance' => id1,
|
313
|
+
'chef_runlist' => expanded_runlist,
|
314
|
+
'apps' => []),
|
315
|
+
host_data.reject { |k, _v| k == 'terminable' }.merge('instance' => id2,
|
316
|
+
'chef_runlist' => expanded_runlist,
|
317
|
+
'apps' => [])
|
314
318
|
].to_set
|
315
319
|
expect(JSON.parse(last_response.body).to_set).to eq(exp_data)
|
316
320
|
end
|
317
321
|
|
318
|
-
it
|
319
|
-
id1 = add_and_register_server
|
320
|
-
id2 = add_and_register_server
|
321
|
-
patch "/instance/#{id1}", {hidden: true}.to_json
|
322
|
+
it 'should find one hidden host' do
|
323
|
+
id1 = add_and_register_server['instance']
|
324
|
+
id2 = add_and_register_server['instance']
|
325
|
+
patch "/instance/#{id1}", { hidden: true }.to_json
|
322
326
|
%W(/hosts /hosts/#{host_data['role']} /hosts/#{host_data['role']}/#{host_data['environment']} /hosts/ALL/#{host_data['environment']}).each do |url|
|
323
327
|
get url
|
324
328
|
expect(last_response.status).to eq(200)
|
325
|
-
res = JSON.parse(last_response.body).map{|x| x.delete('apps'); x}.to_set
|
326
|
-
exp_data = [host_data.reject{|k,
|
327
|
-
|
329
|
+
res = JSON.parse(last_response.body).map { |x| x.delete('apps'); x }.to_set
|
330
|
+
exp_data = [host_data.reject { |k, _v| k == 'terminable' }.merge('instance' => id2,
|
331
|
+
'chef_runlist' => expanded_runlist)].to_set
|
328
332
|
expect(res).to eq(exp_data)
|
329
|
-
get url,
|
333
|
+
get url, hidden: true
|
330
334
|
expect(last_response.status).to eq(200)
|
331
335
|
exp_data = [
|
332
|
-
host_data.reject{|k,
|
333
|
-
|
334
|
-
|
335
|
-
host_data.reject{|k,
|
336
|
-
|
336
|
+
host_data.reject { |k, _v| k == 'terminable' }.merge('instance' => id1,
|
337
|
+
'chef_runlist' => expanded_runlist,
|
338
|
+
'hidden' => true),
|
339
|
+
host_data.reject { |k, _v| k == 'terminable' }.merge('instance' => id2,
|
340
|
+
'chef_runlist' => expanded_runlist)
|
337
341
|
].to_set
|
338
|
-
expect(JSON.parse(last_response.body).map{|x| x.delete('apps'); x}.to_set).to eq(exp_data)
|
342
|
+
expect(JSON.parse(last_response.body).map { |x| x.delete('apps'); x }.to_set).to eq(exp_data)
|
339
343
|
end
|
340
344
|
end
|
341
345
|
|
342
|
-
it
|
343
|
-
other = host_data.merge(
|
346
|
+
it 'should find an host by role' do
|
347
|
+
other = host_data.merge('role' => 'otherrole')
|
344
348
|
id1 = add_and_register_server(other)['instance']
|
345
|
-
add_and_register_server
|
349
|
+
add_and_register_server['instance']
|
346
350
|
|
347
351
|
get '/hosts/otherrole'
|
348
352
|
expect(last_response.status).to eq(200)
|
349
|
-
exp_data = [other.reject{|k,
|
350
|
-
|
351
|
-
|
353
|
+
exp_data = [other.reject { |k, _v| k == 'terminable' }.merge('instance' => id1,
|
354
|
+
'chef_runlist' => expanded_runlist,
|
355
|
+
'apps' => [])]
|
352
356
|
expect(JSON.parse(last_response.body)).to eq(exp_data)
|
353
357
|
end
|
354
358
|
|
355
|
-
it
|
356
|
-
id = add_and_register_server
|
359
|
+
it 'should find an host by id' do
|
360
|
+
id = add_and_register_server['instance']
|
361
|
+
["/instance/#{id}", "/host/testrole/testenv/#{id}", "/host/FAKE/FAKE/#{id}"].each do |url|
|
362
|
+
get url
|
363
|
+
expect(last_response.status).to eq(200)
|
364
|
+
exp_data = host_data.reject { |k, _v| k == 'terminable' }.merge('instance' => id,
|
365
|
+
'chef_runlist' => expanded_runlist,
|
366
|
+
'apps' => [])
|
367
|
+
expect(JSON.parse(last_response.body)).to eq(exp_data)
|
368
|
+
end
|
369
|
+
end
|
370
|
+
|
371
|
+
it 'should return the host attr json' do
|
372
|
+
DH.set_config('chef_repo', 'FAKECHEFREPO')
|
373
|
+
DH.set_config('chef_branch', 'chefbranch')
|
374
|
+
DH.set_config('url', 'localhost:666')
|
375
|
+
id = add_and_register_server['instance']
|
376
|
+
get "/instance/#{id}/attrs"
|
377
|
+
expect(last_response.status).to eq(200)
|
378
|
+
expect(JSON.parse(last_response.body)).to eq(
|
379
|
+
'apps' => [],
|
380
|
+
'branch' => 'master',
|
381
|
+
'chefbranch' => 'chefbranch',
|
382
|
+
'chefrepo' => 'FAKECHEFREPO',
|
383
|
+
'deploy_apps' => [],
|
384
|
+
'environment' => host_data['environment'],
|
385
|
+
'gaptool' => {
|
386
|
+
'user' => 'test',
|
387
|
+
'key' => 'test',
|
388
|
+
'url' => 'localhost:666'
|
389
|
+
},
|
390
|
+
'migrate' => false,
|
391
|
+
'role' => host_data['role'],
|
392
|
+
'rollback' => false,
|
393
|
+
'run_list' => ['recipe[init]', 'recipe[myrecipe]']
|
394
|
+
)
|
395
|
+
end
|
396
|
+
|
397
|
+
it 'old clients should receive apps as strings' do
|
398
|
+
header 'X-GAPTOOL-VERSION', '0.7.0'
|
399
|
+
id = add_and_register_server['instance']
|
400
|
+
["/instance/#{id}", "/host/testrole/testenv/#{id}", "/host/FAKE/FAKE/#{id}"].each do |url|
|
401
|
+
get url
|
402
|
+
expect(last_response.status).to eq(200)
|
403
|
+
exp_data = host_data.reject { |k, _v| k == 'terminable' }.merge('instance' => id,
|
404
|
+
'chef_runlist' => expanded_runlist,
|
405
|
+
'apps' => '[]')
|
406
|
+
expect(JSON.parse(last_response.body)).to eq(exp_data)
|
407
|
+
end
|
408
|
+
end
|
409
|
+
|
410
|
+
it 'clients with no version should be handled as old' do
|
411
|
+
header 'X-GAPTOOL-VERSION', nil
|
412
|
+
id = add_and_register_server['instance']
|
357
413
|
["/instance/#{id}", "/host/testrole/testenv/#{id}", "/host/FAKE/FAKE/#{id}"].each do |url|
|
358
414
|
get url
|
359
415
|
expect(last_response.status).to eq(200)
|
360
|
-
exp_data = host_data.reject{|k,
|
361
|
-
|
362
|
-
|
363
|
-
'apps' => "[]"})
|
416
|
+
exp_data = host_data.reject { |k, _v| k == 'terminable' }.merge('instance' => id,
|
417
|
+
'chef_runlist' => expanded_runlist,
|
418
|
+
'apps' => '[]')
|
364
419
|
expect(JSON.parse(last_response.body)).to eq(exp_data)
|
365
420
|
end
|
366
421
|
end
|
367
422
|
|
368
|
-
it
|
369
|
-
add_and_register_server
|
423
|
+
it 'should not find an host by id' do
|
424
|
+
add_and_register_server['instance']
|
370
425
|
get '/instance/other'
|
371
426
|
expect(last_response.status).to eq(404)
|
372
427
|
expect(JSON.parse(last_response.body)).to eq(
|
373
|
-
|
374
|
-
|
428
|
+
'result' => 'error',
|
429
|
+
'message' => "instance with id 'other' not found"
|
430
|
+
)
|
375
431
|
end
|
376
432
|
|
377
|
-
it
|
378
|
-
id1 = add_and_register_server
|
379
|
-
id2 = add_and_register_server
|
380
|
-
add_and_register_server(host_data.merge(
|
381
|
-
id4 = add_and_register_server(host_data.merge(
|
433
|
+
it 'should find all hosts by environment and role' do
|
434
|
+
id1 = add_and_register_server['instance']
|
435
|
+
id2 = add_and_register_server['instance']
|
436
|
+
add_and_register_server(host_data.merge('environment' => 'otherenv'))['instance']
|
437
|
+
id4 = add_and_register_server(host_data.merge('role' => 'otherrole'))['instance']
|
382
438
|
get '/hosts/testrole/testenv'
|
383
439
|
expect(last_response.status).to eq(200)
|
384
|
-
d = host_data.reject{|k,
|
440
|
+
d = host_data.reject { |k, _v| k == 'terminable' }.merge('chef_runlist' => expanded_runlist, 'apps' => [])
|
385
441
|
exp_data = [
|
386
|
-
d.merge(
|
387
|
-
d.merge(
|
442
|
+
d.merge('instance' => id1),
|
443
|
+
d.merge('instance' => id2)
|
388
444
|
].to_set
|
389
445
|
expect(JSON.parse(last_response.body).to_set).to eq(exp_data)
|
390
446
|
|
391
447
|
get '/hosts/ALL/testenv'
|
392
448
|
expect(last_response.status).to eq(200)
|
393
449
|
exp_data = [
|
394
|
-
d.merge(
|
395
|
-
d.merge(
|
396
|
-
d.merge(
|
450
|
+
d.merge('instance' => id1),
|
451
|
+
d.merge('instance' => id2),
|
452
|
+
d.merge('instance' => id4, 'role' => 'otherrole')
|
397
453
|
].to_set
|
398
454
|
expect(JSON.parse(last_response.body).to_set).to eq(exp_data)
|
399
455
|
end
|
400
456
|
|
401
|
-
it
|
402
|
-
version
|
403
|
-
File.join(File.dirname(__FILE__), "..", 'VERSION')
|
404
|
-
)).strip
|
405
|
-
get "/version"
|
457
|
+
it 'should return the server version' do
|
458
|
+
get '/version'
|
406
459
|
expect(last_response.status).to eq(200)
|
407
|
-
expect(JSON.parse(last_response.body)).to eq(
|
460
|
+
expect(JSON.parse(last_response.body)).to eq('server_version' => version, 'api' => { 'v0' => '/' })
|
408
461
|
end
|
409
462
|
|
410
|
-
it
|
411
|
-
DH.add_app(
|
412
|
-
DH.add_app(
|
413
|
-
apps_list = {
|
414
|
-
|
415
|
-
get
|
463
|
+
it 'should return the list of apps' do
|
464
|
+
DH.add_app('firstapp', 'testrole', 'testenv')
|
465
|
+
DH.add_app('secondapp', 'testrole', 'testenv')
|
466
|
+
apps_list = { 'app:firstapp' => { 'testenv' => 'testrole' },
|
467
|
+
'app:secondapp' => { 'testenv' => 'testrole' } }
|
468
|
+
get '/apps'
|
416
469
|
expect(last_response.status).to eq(200)
|
417
470
|
expect(JSON.parse(last_response.body)).to eq(apps_list)
|
418
471
|
end
|
419
472
|
|
420
|
-
it
|
473
|
+
it 'should fail as client did not send version' do
|
474
|
+
ENV['GAPTOOL_CHECK_CLIENT_VERSION'] = '1'
|
421
475
|
header 'X-GAPTOOL-VERSION', nil
|
422
|
-
get
|
476
|
+
get '/version'
|
423
477
|
expect(last_response.status).to eq(400)
|
424
478
|
resp = JSON.parse(last_response.body)
|
425
479
|
expect(resp['result']).to eq('error')
|
426
480
|
expect(resp['message']).to match(/^Invalid version/)
|
427
481
|
end
|
428
482
|
|
429
|
-
it
|
483
|
+
it 'should not check version for clients' do
|
430
484
|
ENV['GAPTOOL_CHECK_CLIENT_VERSION'] = nil
|
431
485
|
header 'X_GAPTOOL_VERSION', nil
|
432
|
-
get
|
486
|
+
get '/version'
|
433
487
|
expect(last_response.status).to eq(200)
|
434
488
|
end
|
489
|
+
|
490
|
+
it 'should reject old clients versions' do
|
491
|
+
ENV['GAPTOOL_CHECK_CLIENT_VERSION'] = '1'
|
492
|
+
srv = Versionomy.parse(version)
|
493
|
+
cl = Versionomy.create(major: srv.major, minor: srv.minor - 1, tiny: 0)
|
494
|
+
header 'X_GAPTOOL_VERSION', cl.to_s
|
495
|
+
get '/version'
|
496
|
+
expect(last_response.status).to eq(400)
|
497
|
+
resp = JSON.parse(last_response.body)
|
498
|
+
expect(resp['result']).to eq('error')
|
499
|
+
expect(resp['message']).to match(/^Invalid version/)
|
500
|
+
end
|
435
501
|
end
|
data/test/base_test.rb
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
require_relative 'test_helper'
|
2
2
|
|
3
|
-
describe
|
4
|
-
it
|
3
|
+
describe 'ping should work unauthenticated' do
|
4
|
+
it 'should return PONG' do
|
5
5
|
get '/ping'
|
6
6
|
expect(last_response.status).to eq(200)
|
7
|
-
expect(last_response.body).to eq(
|
7
|
+
expect(last_response.body).to eq('PONG')
|
8
8
|
end
|
9
9
|
end
|
10
10
|
|
11
|
-
describe
|
12
|
-
it
|
11
|
+
describe 'unauthenticated' do
|
12
|
+
it 'should return 401 error' do
|
13
13
|
get '/'
|
14
14
|
expect(last_response.status).to eq(401)
|
15
15
|
end
|