gaptool-server 0.5.19 → 0.6.0.beta1
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/Gemfile +3 -0
- data/Rakefile +43 -0
- data/VERSION +1 -1
- data/bin/gaptool-server +7 -29
- data/bin/gaptool-shell +12 -0
- data/bin/gaptool_server_migrate_0.5-0.6 +96 -0
- data/config.ru +3 -12
- data/lib/app.rb +27 -10
- data/lib/exceptions.rb +35 -0
- data/lib/helpers/data.rb +257 -0
- data/lib/helpers/ec2.rb +80 -0
- data/lib/helpers/init.rb +2 -4
- data/lib/helpers/redis.rb +19 -0
- data/lib/helpers/rehash.rb +31 -56
- data/lib/routes.rb +172 -0
- data/lib/views/init.erb +6 -8
- data/tasks/app.rb +28 -0
- data/tasks/docker.rb +84 -0
- data/tasks/gem.rb +27 -0
- data/tasks/user.rb +32 -0
- data/test/api_test.rb +256 -0
- data/test/base_test.rb +16 -0
- data/test/data_test.rb +118 -0
- data/test/test_helper.rb +25 -0
- metadata +127 -14
- data/lib/helpers/gaptool-base.rb +0 -38
- data/lib/public/css/common.css +0 -4
- data/lib/routes/init.rb +0 -3
- data/lib/routes/main.rb +0 -206
- data/lib/routes/rehash.rb +0 -6
data/test/api_test.rb
ADDED
@@ -0,0 +1,256 @@
|
|
1
|
+
require_relative 'test_helper'
|
2
|
+
require 'json'
|
3
|
+
require 'set'
|
4
|
+
|
5
|
+
describe "Test API" do
|
6
|
+
before(:all) do
|
7
|
+
ENV['DRYRUN'] = 'true'
|
8
|
+
end
|
9
|
+
|
10
|
+
after(:all) do
|
11
|
+
ENV['DRYRUN'] = nil
|
12
|
+
end
|
13
|
+
|
14
|
+
before(:each) do
|
15
|
+
header 'X_GAPTOOL_USER', 'test'
|
16
|
+
header 'X_GAPTOOL_KEY', 'test'
|
17
|
+
$redis.flushall
|
18
|
+
DH.useradd('test', 'test')
|
19
|
+
end
|
20
|
+
|
21
|
+
def add_and_register_server data=nil
|
22
|
+
data ||= host_data
|
23
|
+
post '/init', data.to_json
|
24
|
+
expect(last_response.status).to eq(200)
|
25
|
+
res = JSON.parse(last_response.body)
|
26
|
+
id = res['instance']
|
27
|
+
secret = res['secret']
|
28
|
+
# there is no API to get the secret, get it from the database.
|
29
|
+
secret = Gaptool::Data::get_server_data(id)['secret']
|
30
|
+
put '/register', {'role' => data['role'],
|
31
|
+
'environment' => data['environment'],
|
32
|
+
'secret'=> secret,
|
33
|
+
'zone'=> data['zone']}.to_json
|
34
|
+
expect(last_response.status).to eq(200)
|
35
|
+
res
|
36
|
+
end
|
37
|
+
|
38
|
+
def host_data
|
39
|
+
{
|
40
|
+
'security_group' => 'mysg',
|
41
|
+
'role' => 'testrole',
|
42
|
+
'environment' => 'testenv',
|
43
|
+
'ami' => 'ami-1234567',
|
44
|
+
'chef_runlist' => ['recipe[myrecipe]'],
|
45
|
+
'terminable' => true,
|
46
|
+
'zone' => 'my-zone-1a',
|
47
|
+
'itype' => 'm1.type'
|
48
|
+
}
|
49
|
+
end
|
50
|
+
|
51
|
+
def expanded_runlist
|
52
|
+
['recipe[init]', 'recipe[myrecipe]']
|
53
|
+
end
|
54
|
+
|
55
|
+
it "should return 200" do
|
56
|
+
get '/'
|
57
|
+
expect(last_response.status).to eq(200)
|
58
|
+
end
|
59
|
+
|
60
|
+
it "should create a instance" do
|
61
|
+
post '/init', host_data.to_json
|
62
|
+
expect(last_response.status).to eq(200)
|
63
|
+
expect(last_response.content_type).to eq('application/json')
|
64
|
+
expect(JSON.parse(last_response.body).keys).to eq(["instance", "ami", "role", "environment", "secret", "terminable", "security_group"])
|
65
|
+
end
|
66
|
+
|
67
|
+
it "should get the runlist from the role" do
|
68
|
+
DH.save_role_data(host_data['role'], chef_runlist: ['recipe[other]'].to_json)
|
69
|
+
id = add_and_register_server(host_data.reject{|k,v| k == 'chef_runlist'})['instance']
|
70
|
+
get "/host/testrole/testenv/#{id}"
|
71
|
+
resp = JSON.parse(last_response.body)
|
72
|
+
expect(resp.keys).to include("chef_runlist")
|
73
|
+
expect(resp['chef_runlist']).to eq(['recipe[other]'])
|
74
|
+
end
|
75
|
+
|
76
|
+
it "should remove default runlist" do
|
77
|
+
id = add_and_register_server(host_data.merge("chef_runlist"=> ['recipe[init]']))['instance']
|
78
|
+
get "/host/testrole/testenv/#{id}"
|
79
|
+
resp = JSON.parse(last_response.body)
|
80
|
+
expect(resp.keys).not_to include("chef_runlist")
|
81
|
+
end
|
82
|
+
|
83
|
+
it "should remove default runlist from role" do
|
84
|
+
DH.save_role_data(host_data['role'], chef_runlist: ['recipe[init]'].to_json)
|
85
|
+
id = add_and_register_server(host_data.reject{|k,v| k == 'chef_runlist'})['instance']
|
86
|
+
get "/host/testrole/testenv/#{id}"
|
87
|
+
resp = JSON.parse(last_response.body)
|
88
|
+
expect(resp.keys).not_to include("chef_runlist")
|
89
|
+
expect(resp['chef_runlist']).to be(nil)
|
90
|
+
|
91
|
+
end
|
92
|
+
|
93
|
+
it "should get the ami from the role" do
|
94
|
+
DH.save_role_data(host_data['role'], 'amis' => {'my-zone-1' => 'ami-other'})
|
95
|
+
res = add_and_register_server(host_data.reject{|k,v| k == 'ami'})
|
96
|
+
expect(res['ami']).to eq('ami-other')
|
97
|
+
get "/host/testrole/testenv/#{res['instance']}"
|
98
|
+
resp = JSON.parse(last_response.body)
|
99
|
+
expect(resp.keys).to_not include("ami")
|
100
|
+
end
|
101
|
+
|
102
|
+
it "should get the ami from global conf" do
|
103
|
+
DH.set_amis({'my-zone-1' => 'ami-default'})
|
104
|
+
res = add_and_register_server(host_data.reject{|k,v| k == 'ami'})
|
105
|
+
expect(res['ami']).to eq('ami-default')
|
106
|
+
get "/host/testrole/testenv/#{res['instance']}"
|
107
|
+
resp = JSON.parse(last_response.body)
|
108
|
+
expect(resp.keys).to_not include("ami")
|
109
|
+
end
|
110
|
+
|
111
|
+
it "should fail to parse client data" do
|
112
|
+
post '/init', host_data
|
113
|
+
expect(last_response.status).to eq(400)
|
114
|
+
end
|
115
|
+
|
116
|
+
it "should fail to create a instance" do
|
117
|
+
%w(role environment zone itype).each do |req|
|
118
|
+
post '/init', host_data.reject{|k, v| k == req}.to_json
|
119
|
+
expect(last_response.status).to eq(400)
|
120
|
+
expect(JSON.parse(last_response.body).keys).to eq(%w(result message))
|
121
|
+
end
|
122
|
+
end
|
123
|
+
|
124
|
+
it "should fail for missing parameter to terminate" do
|
125
|
+
post '/terminate'
|
126
|
+
expect(last_response.status).to eq(400)
|
127
|
+
end
|
128
|
+
|
129
|
+
it "should fail to terminate non-existing instance" do
|
130
|
+
post '/terminate', {'id' => 'i-1234567'}.to_json
|
131
|
+
expect(last_response.status).to eq(404)
|
132
|
+
end
|
133
|
+
|
134
|
+
it "should fail to terminate non-terminable instance" do
|
135
|
+
post '/init', host_data.merge('terminable' => false).to_json
|
136
|
+
expect(last_response.status).to eq(200)
|
137
|
+
id = JSON.parse(last_response.body)['instance']
|
138
|
+
post '/terminate', {'id' => id}.to_json
|
139
|
+
expect(last_response.status).to eq(409)
|
140
|
+
end
|
141
|
+
|
142
|
+
it "should terminate instance" do
|
143
|
+
post '/init', host_data.to_json
|
144
|
+
expect(last_response.status).to eq(200)
|
145
|
+
id = JSON.parse(last_response.body)['instance']
|
146
|
+
post '/terminate', {'id' => id}.to_json
|
147
|
+
expect(last_response.status).to eq(200)
|
148
|
+
expect(JSON.parse(last_response.body)).to eq({id => {'status'=> 'terminated'}})
|
149
|
+
end
|
150
|
+
|
151
|
+
it "should fail to register a server" do
|
152
|
+
required_keys = %w(role zone environment secret)
|
153
|
+
hdata = host_data.select {|k, v| required_keys.include?(k)}
|
154
|
+
hdata['secret'] = 'mysecret'
|
155
|
+
required_keys.each do |key|
|
156
|
+
put '/register', hdata.select {|k,v| k != key}.to_json
|
157
|
+
expect(last_response.status).to eq(400)
|
158
|
+
end
|
159
|
+
put '/register', hdata.to_json
|
160
|
+
expect(last_response.status).to eq(403)
|
161
|
+
end
|
162
|
+
|
163
|
+
it "should register the server" do
|
164
|
+
add_and_register_server
|
165
|
+
end
|
166
|
+
|
167
|
+
it "should find an host" do
|
168
|
+
id = add_and_register_server()['instance']
|
169
|
+
get '/hosts'
|
170
|
+
expect(last_response.status).to eq(200)
|
171
|
+
exp_data = host_data.reject{|k,v| k == 'terminable'}.merge('chef_runlist' => expanded_runlist)
|
172
|
+
exp_data['instance'] = id
|
173
|
+
expect(JSON.parse(last_response.body)).to eq([exp_data])
|
174
|
+
end
|
175
|
+
|
176
|
+
it "should find two hosts" do
|
177
|
+
id1 = add_and_register_server()['instance']
|
178
|
+
id2 = add_and_register_server()['instance']
|
179
|
+
get '/hosts'
|
180
|
+
expect(last_response.status).to eq(200)
|
181
|
+
exp_data = [
|
182
|
+
host_data.reject{|k,v| k == 'terminable'}.merge({'instance' => id1,
|
183
|
+
'chef_runlist' => expanded_runlist}),
|
184
|
+
host_data.reject{|k,v| k == 'terminable'}.merge({'instance' => id2,
|
185
|
+
'chef_runlist' => expanded_runlist})
|
186
|
+
].to_set
|
187
|
+
expect(JSON.parse(last_response.body).to_set).to eq(exp_data)
|
188
|
+
end
|
189
|
+
|
190
|
+
it "should find an host by role" do
|
191
|
+
other = host_data.merge({'role' => 'otherrole'})
|
192
|
+
id1 = add_and_register_server(other)['instance']
|
193
|
+
id2 = add_and_register_server()['instance']
|
194
|
+
|
195
|
+
get '/hosts/otherrole'
|
196
|
+
expect(last_response.status).to eq(200)
|
197
|
+
exp_data = [other.reject{|k,v| k == 'terminable'}.merge({'instance'=> id1,
|
198
|
+
'chef_runlist' => expanded_runlist})]
|
199
|
+
expect(JSON.parse(last_response.body)).to eq(exp_data)
|
200
|
+
end
|
201
|
+
|
202
|
+
it "should find an host by id" do
|
203
|
+
id = add_and_register_server()['instance']
|
204
|
+
["/instance/#{id}", "/host/testrole/testenv/#{id}", "/host/FAKE/FAKE/#{id}"].each do |url|
|
205
|
+
get url
|
206
|
+
expect(last_response.status).to eq(200)
|
207
|
+
exp_data = host_data.reject{|k,v| k == 'terminable'}.merge({
|
208
|
+
'instance'=> id,
|
209
|
+
'chef_runlist' => expanded_runlist})
|
210
|
+
expect(JSON.parse(last_response.body)).to eq(exp_data)
|
211
|
+
end
|
212
|
+
end
|
213
|
+
|
214
|
+
it "should find all hosts by environment and role" do
|
215
|
+
id1 = add_and_register_server()['instance']
|
216
|
+
id2 = add_and_register_server()['instance']
|
217
|
+
id3 = add_and_register_server(host_data.merge({'environment' => 'otherenv'}))['instance']
|
218
|
+
id4 = add_and_register_server(host_data.merge({'role' => 'otherrole'}))['instance']
|
219
|
+
get '/hosts/testrole/testenv'
|
220
|
+
expect(last_response.status).to eq(200)
|
221
|
+
d = host_data.reject{|k,v| k == 'terminable'}.merge('chef_runlist' => expanded_runlist)
|
222
|
+
exp_data = [
|
223
|
+
d.merge({'instance' => id1}),
|
224
|
+
d.merge({'instance' => id2})
|
225
|
+
].to_set
|
226
|
+
expect(JSON.parse(last_response.body).to_set).to eq(exp_data)
|
227
|
+
|
228
|
+
get '/hosts/ALL/testenv'
|
229
|
+
expect(last_response.status).to eq(200)
|
230
|
+
exp_data = [
|
231
|
+
d.merge({'instance' => id1}),
|
232
|
+
d.merge({'instance' => id2}),
|
233
|
+
d.merge({'instance' => id4, 'role'=> 'otherrole'})
|
234
|
+
].to_set
|
235
|
+
expect(JSON.parse(last_response.body).to_set).to eq(exp_data)
|
236
|
+
end
|
237
|
+
|
238
|
+
it "should return the server version" do
|
239
|
+
version = File.read(File.realpath(
|
240
|
+
File.join(File.dirname(__FILE__), "..", 'VERSION')
|
241
|
+
)).strip
|
242
|
+
get "/version"
|
243
|
+
expect(last_response.status).to eq(200)
|
244
|
+
expect(JSON.parse(last_response.body)).to eq({"server_version" => version, "api" => {"v0" => "/"}})
|
245
|
+
end
|
246
|
+
|
247
|
+
it "should return the list of apps" do
|
248
|
+
DH.add_app("firstapp", "testrole")
|
249
|
+
DH.add_app("secondapp", "testrole")
|
250
|
+
apps_list = {"firstapp" => {"role" => "testrole"},
|
251
|
+
"secondapp" =>{"role" => "testrole"}}
|
252
|
+
get "/apps"
|
253
|
+
expect(last_response.status).to eq(200)
|
254
|
+
expect(JSON.parse(last_response.body)).to eq(apps_list)
|
255
|
+
end
|
256
|
+
end
|
data/test/base_test.rb
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
require_relative 'test_helper'
|
2
|
+
|
3
|
+
describe "ping should work unauthenticated" do
|
4
|
+
it "should return PONG" do
|
5
|
+
get '/ping'
|
6
|
+
expect(last_response.status).to eq(200)
|
7
|
+
expect(last_response.body).to eq("PONG")
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
describe "unauthenticated" do
|
12
|
+
it "should return 401 error" do
|
13
|
+
get '/'
|
14
|
+
expect(last_response.status).to eq(401)
|
15
|
+
end
|
16
|
+
end
|
data/test/data_test.rb
ADDED
@@ -0,0 +1,118 @@
|
|
1
|
+
require_relative 'test_helper'
|
2
|
+
require 'json'
|
3
|
+
|
4
|
+
describe "data helpers" do
|
5
|
+
|
6
|
+
before(:each) do
|
7
|
+
$redis.flushall
|
8
|
+
DH.set_config('chef_repo', 'myrepo')
|
9
|
+
DH.set_config('chef_branch', 'master')
|
10
|
+
end
|
11
|
+
|
12
|
+
def data
|
13
|
+
{
|
14
|
+
'role' => "role",
|
15
|
+
'environment' => "env"
|
16
|
+
}
|
17
|
+
end
|
18
|
+
|
19
|
+
def instid
|
20
|
+
'i-1234567'
|
21
|
+
end
|
22
|
+
|
23
|
+
it "should add a server" do
|
24
|
+
expect { DH.addserver("i-1234567", {}, "secret") }.to raise_error(ArgumentError)
|
25
|
+
expect { DH.addserver('', data, "secret") }.to raise_error(ArgumentError)
|
26
|
+
|
27
|
+
DH.addserver(instid, data, "secret")
|
28
|
+
server = DH.get_server_data(instid)
|
29
|
+
expect(server).to eq(data.merge({
|
30
|
+
'instance' => instid,
|
31
|
+
'chef_repo' => 'myrepo',
|
32
|
+
'chef_branch' => 'master',
|
33
|
+
'registered' => 'false',
|
34
|
+
'secret' => 'secret'
|
35
|
+
}))
|
36
|
+
end
|
37
|
+
|
38
|
+
it "should add a registered server" do
|
39
|
+
DH.addserver(instid, data, nil)
|
40
|
+
server = DH.get_server_data(instid)
|
41
|
+
expect(server).to eq(data.merge({
|
42
|
+
'instance' => instid,
|
43
|
+
'chef_repo' => 'myrepo',
|
44
|
+
'chef_branch' => 'master'
|
45
|
+
}))
|
46
|
+
end
|
47
|
+
|
48
|
+
it "should register a server" do
|
49
|
+
DH.addserver(instid, data, "secret")
|
50
|
+
res = DH.register_server(data['role'], data['environment'], '')
|
51
|
+
expect(res).to be(nil)
|
52
|
+
|
53
|
+
res = DH.register_server(data['role'], data['environment'], 'secret')
|
54
|
+
expect(res).to eq(instid)
|
55
|
+
server = DH.get_server_data(instid)
|
56
|
+
expect(server).to eq(data.merge({
|
57
|
+
'instance' => instid,
|
58
|
+
'chef_repo' => 'myrepo',
|
59
|
+
'chef_branch' => 'master'
|
60
|
+
}))
|
61
|
+
end
|
62
|
+
|
63
|
+
it "should remove a server" do
|
64
|
+
DH.addserver(instid, data, 'secret')
|
65
|
+
res = DH.register_server(data['role'], data['environment'], 'secret')
|
66
|
+
res = DH.rmserver(instid)
|
67
|
+
expect(res).to eq(instid)
|
68
|
+
server = DH.get_server_data(instid)
|
69
|
+
expect(server).to be(nil)
|
70
|
+
|
71
|
+
res = DH.rmserver(instid)
|
72
|
+
expect(res).to be(nil)
|
73
|
+
end
|
74
|
+
|
75
|
+
it "should set a config" do
|
76
|
+
c = DH.get_config('fakekey')
|
77
|
+
expect(c).to be(nil)
|
78
|
+
|
79
|
+
DH.set_config('fakekey', 'value')
|
80
|
+
c = DH.get_config('fakekey')
|
81
|
+
expect(c).to eq('value')
|
82
|
+
end
|
83
|
+
|
84
|
+
it "should return the initkey" do
|
85
|
+
DH.set_config('initkey', 'FAKEKEY')
|
86
|
+
DH.addserver(instid, data, nil)
|
87
|
+
server = DH.get_server_data(instid, initkey: true)
|
88
|
+
expect(server).to eq(data.merge({
|
89
|
+
'instance' => instid,
|
90
|
+
'chef_repo' => 'myrepo',
|
91
|
+
'chef_branch' => 'master',
|
92
|
+
'initkey' => 'FAKEKEY'
|
93
|
+
}))
|
94
|
+
end
|
95
|
+
|
96
|
+
it "should get the runlist for a node from the role" do
|
97
|
+
DH.save_role_data("role", chef_runlist: ["recipe[myrecipe]"].to_json)
|
98
|
+
DH.addserver(instid, data, nil)
|
99
|
+
role = DH.get_role_data("role")
|
100
|
+
expect(role).to eq({"chef_runlist"=> ["recipe[myrecipe]"].to_json,
|
101
|
+
"apps" => [],
|
102
|
+
"amis" => {}})
|
103
|
+
server = DH.get_server_data(instid)
|
104
|
+
expect(server).to eq(data.merge("instance" => instid,
|
105
|
+
"chef_runlist" => ["recipe[myrecipe]"],
|
106
|
+
"chef_repo" => "myrepo",
|
107
|
+
"chef_branch" => "master" ))
|
108
|
+
end
|
109
|
+
|
110
|
+
it "shoud get the ami for a node from the role" do
|
111
|
+
DH.save_role_data("role", ami: 'ami-1234567')
|
112
|
+
DH.addserver(instid, data, nil)
|
113
|
+
role = DH.get_role_data("role")
|
114
|
+
expect(role).to eq({'ami' => 'ami-1234567',
|
115
|
+
"apps" => [],
|
116
|
+
"amis" => {}})
|
117
|
+
end
|
118
|
+
end
|
data/test/test_helper.rb
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
ENV['RACK_ENV'] = 'test'
|
2
|
+
if ENV['COVERAGE']
|
3
|
+
require 'simplecov'
|
4
|
+
SimpleCov.start do
|
5
|
+
add_filter '/test/'
|
6
|
+
add_group 'helpers', 'lib/helpers'
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
libpath = File.realpath(File.join(File.dirname(__FILE__), "..", "lib"))
|
11
|
+
require 'rspec'
|
12
|
+
require 'rack/test'
|
13
|
+
require 'fakeredis/rspec'
|
14
|
+
require "#{libpath}/app.rb"
|
15
|
+
|
16
|
+
RSpec.configure do |conf|
|
17
|
+
conf.include Rack::Test::Methods
|
18
|
+
def app
|
19
|
+
GaptoolServer
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
DH = Gaptool::Data
|
24
|
+
|
25
|
+
$redis = Redis.new
|
metadata
CHANGED
@@ -1,15 +1,16 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: gaptool-server
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.6.0.beta1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Matt Bailey
|
8
8
|
- Francesco Laurita
|
9
|
+
- Giacomo Bagnoli
|
9
10
|
autorequire:
|
10
11
|
bindir: bin
|
11
12
|
cert_chain: []
|
12
|
-
date: 2014-
|
13
|
+
date: 2014-10-14 00:00:00.000000000 Z
|
13
14
|
dependencies:
|
14
15
|
- !ruby/object:Gem::Dependency
|
15
16
|
name: sinatra
|
@@ -26,19 +27,33 @@ dependencies:
|
|
26
27
|
- !ruby/object:Gem::Version
|
27
28
|
version: '1.4'
|
28
29
|
- !ruby/object:Gem::Dependency
|
29
|
-
name:
|
30
|
+
name: sinatra-contrib
|
30
31
|
requirement: !ruby/object:Gem::Requirement
|
31
32
|
requirements:
|
32
33
|
- - "~>"
|
33
34
|
- !ruby/object:Gem::Version
|
34
|
-
version: '1.
|
35
|
+
version: '1.4'
|
35
36
|
type: :runtime
|
36
37
|
prerelease: false
|
37
38
|
version_requirements: !ruby/object:Gem::Requirement
|
38
39
|
requirements:
|
39
40
|
- - "~>"
|
40
41
|
- !ruby/object:Gem::Version
|
41
|
-
version: '1.
|
42
|
+
version: '1.4'
|
43
|
+
- !ruby/object:Gem::Dependency
|
44
|
+
name: unicorn
|
45
|
+
requirement: !ruby/object:Gem::Requirement
|
46
|
+
requirements:
|
47
|
+
- - "~>"
|
48
|
+
- !ruby/object:Gem::Version
|
49
|
+
version: '4.8'
|
50
|
+
type: :runtime
|
51
|
+
prerelease: false
|
52
|
+
version_requirements: !ruby/object:Gem::Requirement
|
53
|
+
requirements:
|
54
|
+
- - "~>"
|
55
|
+
- !ruby/object:Gem::Version
|
56
|
+
version: '4.8'
|
42
57
|
- !ruby/object:Gem::Dependency
|
43
58
|
name: redis
|
44
59
|
requirement: !ruby/object:Gem::Requirement
|
@@ -109,31 +124,129 @@ dependencies:
|
|
109
124
|
- - "~>"
|
110
125
|
- !ruby/object:Gem::Version
|
111
126
|
version: '4.1'
|
127
|
+
- !ruby/object:Gem::Dependency
|
128
|
+
name: racksh
|
129
|
+
requirement: !ruby/object:Gem::Requirement
|
130
|
+
requirements:
|
131
|
+
- - "~>"
|
132
|
+
- !ruby/object:Gem::Version
|
133
|
+
version: '1.0'
|
134
|
+
type: :runtime
|
135
|
+
prerelease: false
|
136
|
+
version_requirements: !ruby/object:Gem::Requirement
|
137
|
+
requirements:
|
138
|
+
- - "~>"
|
139
|
+
- !ruby/object:Gem::Version
|
140
|
+
version: '1.0'
|
141
|
+
- !ruby/object:Gem::Dependency
|
142
|
+
name: pry
|
143
|
+
requirement: !ruby/object:Gem::Requirement
|
144
|
+
requirements:
|
145
|
+
- - "~>"
|
146
|
+
- !ruby/object:Gem::Version
|
147
|
+
version: '0.10'
|
148
|
+
type: :runtime
|
149
|
+
prerelease: false
|
150
|
+
version_requirements: !ruby/object:Gem::Requirement
|
151
|
+
requirements:
|
152
|
+
- - "~>"
|
153
|
+
- !ruby/object:Gem::Version
|
154
|
+
version: '0.10'
|
155
|
+
- !ruby/object:Gem::Dependency
|
156
|
+
name: rspec
|
157
|
+
requirement: !ruby/object:Gem::Requirement
|
158
|
+
requirements:
|
159
|
+
- - "~>"
|
160
|
+
- !ruby/object:Gem::Version
|
161
|
+
version: '3.1'
|
162
|
+
type: :development
|
163
|
+
prerelease: false
|
164
|
+
version_requirements: !ruby/object:Gem::Requirement
|
165
|
+
requirements:
|
166
|
+
- - "~>"
|
167
|
+
- !ruby/object:Gem::Version
|
168
|
+
version: '3.1'
|
169
|
+
- !ruby/object:Gem::Dependency
|
170
|
+
name: rspec-mocks
|
171
|
+
requirement: !ruby/object:Gem::Requirement
|
172
|
+
requirements:
|
173
|
+
- - "~>"
|
174
|
+
- !ruby/object:Gem::Version
|
175
|
+
version: '3.1'
|
176
|
+
type: :development
|
177
|
+
prerelease: false
|
178
|
+
version_requirements: !ruby/object:Gem::Requirement
|
179
|
+
requirements:
|
180
|
+
- - "~>"
|
181
|
+
- !ruby/object:Gem::Version
|
182
|
+
version: '3.1'
|
183
|
+
- !ruby/object:Gem::Dependency
|
184
|
+
name: fakeredis
|
185
|
+
requirement: !ruby/object:Gem::Requirement
|
186
|
+
requirements:
|
187
|
+
- - "~>"
|
188
|
+
- !ruby/object:Gem::Version
|
189
|
+
version: '0.5'
|
190
|
+
type: :development
|
191
|
+
prerelease: false
|
192
|
+
version_requirements: !ruby/object:Gem::Requirement
|
193
|
+
requirements:
|
194
|
+
- - "~>"
|
195
|
+
- !ruby/object:Gem::Version
|
196
|
+
version: '0.5'
|
197
|
+
- !ruby/object:Gem::Dependency
|
198
|
+
name: simplecov
|
199
|
+
requirement: !ruby/object:Gem::Requirement
|
200
|
+
requirements:
|
201
|
+
- - "~>"
|
202
|
+
- !ruby/object:Gem::Version
|
203
|
+
version: '0.9'
|
204
|
+
type: :development
|
205
|
+
prerelease: false
|
206
|
+
version_requirements: !ruby/object:Gem::Requirement
|
207
|
+
requirements:
|
208
|
+
- - "~>"
|
209
|
+
- !ruby/object:Gem::Version
|
210
|
+
version: '0.9'
|
112
211
|
description: gaptool-server for managing cloud resources
|
113
212
|
email: ops@gild.com
|
114
213
|
executables:
|
115
214
|
- gaptool-server
|
215
|
+
- gaptool-shell
|
216
|
+
- gaptool_server_migrate_0.5-0.6
|
116
217
|
extensions: []
|
117
218
|
extra_rdoc_files:
|
118
219
|
- LICENSE.txt
|
119
220
|
- README.rdoc
|
120
221
|
- VERSION
|
121
222
|
files:
|
223
|
+
- Gemfile
|
122
224
|
- LICENSE.txt
|
123
225
|
- README.rdoc
|
226
|
+
- Rakefile
|
124
227
|
- VERSION
|
125
228
|
- bin/gaptool-server
|
229
|
+
- bin/gaptool-shell
|
230
|
+
- bin/gaptool_server_migrate_0.5-0.6
|
126
231
|
- config.ru
|
127
232
|
- lib/app.rb
|
128
|
-
- lib/
|
233
|
+
- lib/exceptions.rb
|
234
|
+
- lib/helpers/data.rb
|
235
|
+
- lib/helpers/ec2.rb
|
129
236
|
- lib/helpers/init.rb
|
237
|
+
- lib/helpers/redis.rb
|
130
238
|
- lib/helpers/rehash.rb
|
131
|
-
- lib/
|
132
|
-
- lib/routes/init.rb
|
133
|
-
- lib/routes/main.rb
|
134
|
-
- lib/routes/rehash.rb
|
239
|
+
- lib/routes.rb
|
135
240
|
- lib/views/init.erb
|
136
|
-
|
241
|
+
- tasks/app.rb
|
242
|
+
- tasks/docker.rb
|
243
|
+
- tasks/gem.rb
|
244
|
+
- tasks/user.rb
|
245
|
+
- test/api_test.rb
|
246
|
+
- test/base_test.rb
|
247
|
+
- test/data_test.rb
|
248
|
+
- test/test_helper.rb
|
249
|
+
homepage: http://github.com/gild/gaptool-server
|
137
250
|
licenses:
|
138
251
|
- MIT
|
139
252
|
metadata: {}
|
@@ -143,9 +256,9 @@ require_paths:
|
|
143
256
|
- lib
|
144
257
|
required_ruby_version: !ruby/object:Gem::Requirement
|
145
258
|
requirements:
|
146
|
-
- - "
|
259
|
+
- - "~>"
|
147
260
|
- !ruby/object:Gem::Version
|
148
|
-
version: '
|
261
|
+
version: '2.1'
|
149
262
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
150
263
|
requirements:
|
151
264
|
- - ">="
|
@@ -153,7 +266,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
153
266
|
version: '0'
|
154
267
|
requirements: []
|
155
268
|
rubyforge_project:
|
156
|
-
rubygems_version: 2.
|
269
|
+
rubygems_version: 2.2.2
|
157
270
|
signing_key:
|
158
271
|
specification_version: 4
|
159
272
|
summary: gaptool-server for managing cloud resources
|
data/lib/helpers/gaptool-base.rb
DELETED
@@ -1,38 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
module GaptoolBaseHelpers
|
3
|
-
def hash2redis(key, hash)
|
4
|
-
hash.keys.each do |hkey|
|
5
|
-
$redis.hset key, hkey, hash[hkey]
|
6
|
-
end
|
7
|
-
end
|
8
|
-
|
9
|
-
def putkey(host)
|
10
|
-
@key = OpenSSL::PKey::RSA.new 2048
|
11
|
-
@pubkey = "#{@key.ssh_type} #{[@key.to_blob].pack('m0')} GAPTOOL_GENERATED_KEY"
|
12
|
-
ENV['SSH_AUTH_SOCK'] = ''
|
13
|
-
Net::SSH.start(host, 'admin', :key_data => [$redis.hget('config', 'gaptoolkey')], :config => false, :keys_only => true, :paranoid => false) do |ssh|
|
14
|
-
ssh.exec! "grep -v GAPTOOL_GENERATED_KEY ~/.ssh/authorized_keys > /tmp/pubkeys"
|
15
|
-
ssh.exec! "cat /tmp/pubkeys > ~/.ssh/authorized_keys"
|
16
|
-
ssh.exec! "rm /tmp/pubkeys"
|
17
|
-
ssh.exec! "echo #{@pubkey} >> ~/.ssh/authorized_keys"
|
18
|
-
end
|
19
|
-
return @key.to_pem
|
20
|
-
end
|
21
|
-
|
22
|
-
def gt_securitygroup(role, environment, zone, groupname=nil)
|
23
|
-
AWS.config(:access_key_id => $redis.hget('config', 'aws_id'), :secret_access_key => $redis.hget('config', 'aws_secret'), :ec2_endpoint => "ec2.#{zone.chop}.amazonaws.com")
|
24
|
-
@ec2 = AWS::EC2.new
|
25
|
-
groupname = groupname || "#{role}-#{environment}"
|
26
|
-
default_list = [ 22 ]
|
27
|
-
@ec2.security_groups.each do |group|
|
28
|
-
if group.name == groupname
|
29
|
-
return group.id
|
30
|
-
end
|
31
|
-
end
|
32
|
-
internet = ['0.0.0.0/0']
|
33
|
-
sg = @ec2.security_groups.create(groupname)
|
34
|
-
sg.authorize_ingress :tcp, 22, *internet
|
35
|
-
return sg.id
|
36
|
-
end
|
37
|
-
|
38
|
-
end
|
data/lib/public/css/common.css
DELETED
@@ -1,4 +0,0 @@
|
|
1
|
-
html, body { background:#eee; margin:0; padding:0; color:#000 }
|
2
|
-
h1,h2,h3,h4,h5,h6 { font-family:sans-serif; border-bottom:1px solid #aaa; margin:2em 0 0.5em 0 }
|
3
|
-
h1#title { background:#333; margin-top:0; color:#ccc; padding:0.1em 0.5em; font-size:105% }
|
4
|
-
#content { margin:1em 2em }
|
data/lib/routes/init.rb
DELETED