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/lib/routes.rb
CHANGED
@@ -3,236 +3,245 @@ require 'securerandom'
|
|
3
3
|
require 'set'
|
4
4
|
require_relative 'exceptions'
|
5
5
|
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
6
|
+
module Gaptool
|
7
|
+
class Server < Sinatra::Application
|
8
|
+
def require_parameters(required_keys, data)
|
9
|
+
data = data.delete_if { |_, v| v.nil? }
|
10
|
+
required_keys = [*required_keys].to_set unless required_keys.is_a? Set
|
11
|
+
keys = data.keys.to_set
|
12
|
+
fail(BadRequest, "Missing required_parameters: #{(required_keys - keys).to_a.join(' ')}") \
|
13
|
+
unless keys >= required_keys
|
14
|
+
data
|
14
15
|
end
|
15
|
-
data
|
16
|
-
end
|
17
16
|
|
18
|
-
|
19
|
-
|
20
|
-
|
17
|
+
get '/' do
|
18
|
+
'You must be lost. Read the instructions.'
|
19
|
+
end
|
21
20
|
|
22
|
-
|
23
|
-
|
24
|
-
|
21
|
+
get '/ping' do
|
22
|
+
'PONG'
|
23
|
+
end
|
25
24
|
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
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
|
-
|
25
|
+
post '/init' do
|
26
|
+
data = require_parameters(%w(role environment zone itype),
|
27
|
+
JSON.parse(request.body.read))
|
28
|
+
|
29
|
+
secret = SecureRandom.hex(12)
|
30
|
+
data['security_group'] = data['security_group'] || Gaptool::Data.get_sg_for_role(data['role'], data['environment'])
|
31
|
+
sgid = Gaptool::EC2.get_or_create_securitygroup(data['role'], data['environment'], data['zone'], data['security_group'])
|
32
|
+
image_id = data['ami'] || Gaptool::Data.get_ami_for_role(data['role'], data['zone'].chop)
|
33
|
+
data['terminable'] = data['terminable'].nil? ? true : !!data['terminable']
|
34
|
+
data['secret'] = secret
|
35
|
+
|
36
|
+
instance = Gaptool::EC2.create_ec2_instance(
|
37
|
+
{
|
38
|
+
image_id: image_id,
|
39
|
+
availability_zone: data['zone'],
|
40
|
+
instance_type: data['itype'],
|
41
|
+
key_name: 'gaptool',
|
42
|
+
security_group_ids: sgid,
|
43
|
+
user_data: "#!/bin/bash\ncurl --silent -H 'X-GAPTOOL-USER: #{env['HTTP_X_GAPTOOL_USER']}' -H 'X-GAPTOOL-KEY: #{env['HTTP_X_GAPTOOL_KEY']}' #{Gaptool::Data.get_config('url')}/register -X PUT --data '#{data.to_json}' | bash"
|
44
|
+
},
|
45
|
+
role: data['role'],
|
46
|
+
env: data['environment'],
|
47
|
+
zone: data['zone']
|
48
|
+
)
|
49
|
+
|
50
|
+
# Tag instance
|
51
|
+
role = data['role']
|
52
|
+
env = data['environment']
|
53
|
+
name = "#{role}-#{env}-#{instance[:id]}"
|
54
|
+
{ 'Name' => name, 'gaptool' => 'yes', 'role' => role, 'environment' => env }.each do |tag, value|
|
55
|
+
begin
|
56
|
+
Gaptool::EC2.tag_ec2_instance(instance[:instance], tag, value)
|
57
|
+
rescue => e
|
58
|
+
logger.error("Error while tagging: #{e}. Skipping tag")
|
59
|
+
Airbrake.notify_or_ignore(
|
60
|
+
e,
|
61
|
+
error_class: 'EC2 Tag failed',
|
62
|
+
parameters: { instance: instance[:id], name: name, role: role, environment: env }
|
63
|
+
)
|
64
|
+
end
|
66
65
|
end
|
66
|
+
|
67
|
+
# Add host tag
|
68
|
+
data.merge!(Hash[instance.reject { |k, _| [:id, :instance].include?(k) }.map { |k, v| [k.to_s, v] }])
|
69
|
+
Gaptool::Data.addserver(instance[:id], data, secret)
|
70
|
+
json(
|
71
|
+
instance: instance[:id],
|
72
|
+
ami: image_id,
|
73
|
+
role: data['role'],
|
74
|
+
hostname: instance[:hostname],
|
75
|
+
launch_time: instance[:launch_time],
|
76
|
+
environment: data['environment'],
|
77
|
+
secret: secret,
|
78
|
+
terminable: data['terminable'],
|
79
|
+
security_group: sgid
|
80
|
+
)
|
67
81
|
end
|
68
82
|
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
hostname: instance[:hostname],
|
76
|
-
launch_time: instance[:launch_time],
|
77
|
-
environment: data['environment'],
|
78
|
-
secret: secret,
|
79
|
-
terminable: data['terminable'],
|
80
|
-
security_group: sgid})
|
81
|
-
end
|
83
|
+
post '/terminate' do
|
84
|
+
data = require_parameters('id',
|
85
|
+
JSON.parse(request.body.read))
|
86
|
+
host_data = Gaptool::Data.get_server_data data['id']
|
87
|
+
fail NotFound, "No such instance: #{data['id']}" if host_data.nil?
|
88
|
+
fail Conflict, "Instance #{data['id']} cannot be terminated" if host_data['terminable'] == false
|
82
89
|
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
raise NotFound, "No such instance: #{data['id']}" if host_data.nil?
|
88
|
-
raise Conflict, "Instance #{data['id']} cannot be terminated" if host_data['terminable'] == false
|
90
|
+
Gaptool::EC2.terminate_ec2_instance(data['zone'], data['id'])
|
91
|
+
Gaptool::Data.rmserver(data['id'])
|
92
|
+
json data['id'] => { 'status' => 'terminated' }
|
93
|
+
end
|
89
94
|
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
95
|
+
put '/register' do
|
96
|
+
data = JSON.parse request.body.read
|
97
|
+
data = require_parameters(%w(role zone environment secret), data)
|
98
|
+
instance_id = Gaptool::Data.register_server data['role'], data['environment'], data['secret']
|
99
|
+
|
100
|
+
fail Forbidden, "Can't register instance: wrong secret or missing role/environment" unless instance_id
|
101
|
+
|
102
|
+
hostname = Gaptool::EC2.get_ec2_instance_data(data['zone'].chop, instance_id)[:hostname]
|
103
|
+
Gaptool::Data.set_server_data_attr(instance_id, 'hostname', hostname)
|
104
|
+
initkey = Gaptool::Data.get_config('initkey')
|
105
|
+
jdata = Gaptool::Data.server_chef_json(instance_id, env,
|
106
|
+
'identity': initkey)
|
107
|
+
|
108
|
+
erb :init, locals: {
|
109
|
+
initkey: initkey,
|
110
|
+
chef_branch: jdata['chefbranch'],
|
111
|
+
chef_repo: jdata['chefrepo'],
|
112
|
+
chef_environment: jdata['environment'],
|
113
|
+
chef_version: Gaptool::Data.ensure_config('chef_version', '11.16.4'),
|
114
|
+
json: jdata.to_json
|
115
|
+
}
|
116
|
+
end
|
94
117
|
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
chef_repo = host_data['chef_repo']
|
107
|
-
chef_branch = host_data['chef_branch']
|
108
|
-
chef_environment = host_data['environment']
|
109
|
-
# FIXME: remove init key from redis
|
110
|
-
initkey = Gaptool::Data::get_config("initkey")
|
111
|
-
run_list = host_data['chef_runlist']
|
112
|
-
|
113
|
-
jdata = {
|
114
|
-
'hostname' => hostname,
|
115
|
-
'recipe' => 'init',
|
116
|
-
'number' => instance_id,
|
117
|
-
'instance' => instance_id,
|
118
|
-
'run_list' => run_list,
|
119
|
-
'role' => data['role'],
|
120
|
-
'environment' => data['environment'],
|
121
|
-
'chefrepo' => chef_repo,
|
122
|
-
'chefbranch' => chef_branch,
|
123
|
-
'identity' => initkey,
|
124
|
-
'appuser' => Gaptool::Data::get_config('appuser'),
|
125
|
-
'apps' => host_data['apps']
|
126
|
-
}.to_json
|
127
|
-
|
128
|
-
erb :init, locals: {
|
129
|
-
initkey: initkey,
|
130
|
-
chef_branch: chef_branch,
|
131
|
-
chef_repo: chef_repo,
|
132
|
-
chef_environment: chef_environment,
|
133
|
-
chef_version: Gaptool::Data::ensure_config("chef_version", "11.16.4"),
|
134
|
-
json: jdata
|
135
|
-
}
|
136
|
-
end
|
118
|
+
get '/hosts' do
|
119
|
+
filter = if params['hidden']
|
120
|
+
proc { |s| !s['registered'] }
|
121
|
+
else
|
122
|
+
proc { |s| !s['registered'] && !s['hidden'] == true }
|
123
|
+
end
|
124
|
+
json(Gaptool::Data.servers.map do |inst|
|
125
|
+
Gaptool::Data.get_server_data inst
|
126
|
+
end.select(&filter))
|
127
|
+
end
|
137
128
|
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
Gaptool::Data::get_server_data inst
|
142
|
-
end.select(&filter))
|
143
|
-
end
|
129
|
+
get '/apps' do
|
130
|
+
json(Hash[Gaptool::Data.apps.map { |a| ["app:#{a}", Gaptool::Data.get_app_data(a)] }])
|
131
|
+
end
|
144
132
|
|
145
|
-
|
146
|
-
|
147
|
-
|
133
|
+
get '/app/:app/:environment/hosts' do
|
134
|
+
app_data = Gaptool::Data.get_app_data(params[:app])
|
135
|
+
unless app_data
|
136
|
+
status 404
|
137
|
+
error_response "app '#{params[:apps]}' not found"
|
138
|
+
end
|
148
139
|
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
140
|
+
role = app_data[params[:environment]]
|
141
|
+
list = Gaptool::Data.servers_in_role_env role, params[:environment]
|
142
|
+
filter = if params['hidden']
|
143
|
+
proc { |_| false }
|
144
|
+
else
|
145
|
+
proc { |s| s['hidden'] }
|
146
|
+
end
|
147
|
+
json(list.map do |inst|
|
148
|
+
data = Gaptool::Data.get_server_data(inst)
|
149
|
+
Gaptool::Data.stringify_apps(data, client_version)
|
150
|
+
end.delete_if(&filter))
|
154
151
|
end
|
155
152
|
|
156
|
-
role
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
servers = Gaptool::Data::servers_in_role(params[:role]).map do |inst|
|
168
|
-
Gaptool::Data::get_server_data(inst)
|
169
|
-
end.select(&filter)
|
170
|
-
json servers
|
171
|
-
end
|
153
|
+
get '/hosts/:role' do
|
154
|
+
filter = if params['hidden']
|
155
|
+
proc { |s| !s['registered'] }
|
156
|
+
else
|
157
|
+
proc { |s| !s['registered'] && !s['hidden'] == true }
|
158
|
+
end
|
159
|
+
servers = Gaptool::Data.servers_in_role(params[:role]).map do |inst|
|
160
|
+
Gaptool::Data.get_server_data(inst)
|
161
|
+
end.select(&filter)
|
162
|
+
json servers
|
163
|
+
end
|
172
164
|
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
165
|
+
get '/instance/:id' do
|
166
|
+
rs = Gaptool::Data.get_server_data(params[:id])
|
167
|
+
if rs.nil?
|
168
|
+
status 404
|
169
|
+
error_response "instance with id '#{params[:id]}' not found"
|
170
|
+
else
|
171
|
+
json Gaptool::Data.stringify_apps(rs, client_version)
|
172
|
+
end
|
180
173
|
end
|
181
|
-
end
|
182
174
|
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
else
|
189
|
-
data = JSON.parse(request.body.read)
|
190
|
-
if !data['hidden'].nil?
|
191
|
-
hidden = !!data['hidden']
|
192
|
-
rs["hidden"] = hidden if hidden == true
|
193
|
-
rs.delete("hidden") if hidden == false
|
175
|
+
get '/instance/:id/attrs' do
|
176
|
+
begin
|
177
|
+
data = JSON.parse(request.body.read.to_s)
|
178
|
+
rescue
|
179
|
+
data = {}
|
194
180
|
end
|
195
|
-
|
196
|
-
|
181
|
+
rs = Gaptool::Data.server_chef_json(params[:id], env, data)
|
182
|
+
if rs.nil?
|
183
|
+
status 404
|
184
|
+
error_response "instance with id '#{params[:id]}' not found"
|
185
|
+
else
|
186
|
+
json rs
|
197
187
|
end
|
198
|
-
Gaptool::Data::save_server_data params[:id], rs
|
199
|
-
json Gaptool::Data::stringify_apps(rs)
|
200
188
|
end
|
201
|
-
end
|
202
189
|
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
190
|
+
patch '/instance/:id' do
|
191
|
+
rs = Gaptool::Data.get_server_data(params[:id])
|
192
|
+
if rs.nil?
|
193
|
+
status 404
|
194
|
+
error_response "instance with id '#{params[:id]}' not found"
|
195
|
+
else
|
196
|
+
data = JSON.parse(request.body.read)
|
197
|
+
unless data['hidden'].nil?
|
198
|
+
hidden = !!data['hidden']
|
199
|
+
rs['hidden'] = hidden if hidden == true
|
200
|
+
rs.delete('hidden') if hidden == false
|
201
|
+
end
|
202
|
+
rs['terminable'] = !!data['terminable'] unless data['terminable'].nil?
|
203
|
+
Gaptool::Data.save_server_data params[:id], rs
|
204
|
+
json Gaptool::Data.stringify_apps(rs, client_version)
|
205
|
+
end
|
208
206
|
end
|
209
|
-
filter = !!params['hidden'] ? Proc.new {|s| false } : Proc.new { |s| s['hidden']}
|
210
|
-
servers = list.map do |inst|
|
211
|
-
data = Gaptool::Data::get_server_data(inst)
|
212
|
-
Gaptool::Data::stringify_apps(data)
|
213
|
-
end.delete_if(&filter)
|
214
207
|
|
215
|
-
|
216
|
-
|
208
|
+
get '/hosts/:role/:environment' do
|
209
|
+
if params[:role] == 'ALL'
|
210
|
+
list = Gaptool::Data.servers_in_env params[:environment]
|
211
|
+
else
|
212
|
+
list = Gaptool::Data.servers_in_role_env params[:role], params[:environment]
|
213
|
+
end
|
214
|
+
filter = if params['hidden']
|
215
|
+
proc { |_| false }
|
216
|
+
else
|
217
|
+
proc { |s| s['hidden'] }
|
218
|
+
end
|
219
|
+
servers = list.map do |inst|
|
220
|
+
data = Gaptool::Data.get_server_data(inst)
|
221
|
+
Gaptool::Data.stringify_apps(data, client_version)
|
222
|
+
end.delete_if(&filter)
|
223
|
+
|
224
|
+
json servers
|
225
|
+
end
|
217
226
|
|
218
|
-
|
219
|
-
|
220
|
-
|
227
|
+
get '/host/:role/:environment/:instance' do
|
228
|
+
json Gaptool::Data.stringify_apps(Gaptool::Data.get_server_data(params[:instance]), client_version)
|
229
|
+
end
|
221
230
|
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
231
|
+
get '/ssh/:role/:environment/:instance' do
|
232
|
+
data = Gaptool::Data.get_server_data params[:instance]
|
233
|
+
host = data['hostname']
|
234
|
+
key, pubkey = Gaptool::EC2.putkey(host)
|
235
|
+
json hostname: host, key: key, pubkey: pubkey
|
236
|
+
end
|
228
237
|
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
238
|
+
get '/version' do
|
239
|
+
version = settings.version
|
240
|
+
json server_version: version, api: { v0: '/' }
|
241
|
+
end
|
233
242
|
|
234
|
-
|
235
|
-
|
243
|
+
post '/rehash' do
|
244
|
+
json Gaptool::EC2.rehash
|
245
|
+
end
|
236
246
|
end
|
237
|
-
|
238
247
|
end
|
data/tasks/app.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
namespace :app do
|
2
|
-
desc
|
3
|
-
task :add, [:app, :role, :environment] do |
|
2
|
+
desc 'Add an application'
|
3
|
+
task :add, [:app, :role, :environment] do |_t, args|
|
4
4
|
[:app, :role, :environment].each do |arg|
|
5
5
|
abort("Missing parameter #{arg}") if args[arg].nil? || args[arg].empty?
|
6
6
|
end
|
@@ -17,26 +17,26 @@ namespace :app do
|
|
17
17
|
puts "Added app #{args[:app]}, role #{args[:role]}, environment: #{args[:environment]}"
|
18
18
|
end
|
19
19
|
|
20
|
-
desc
|
21
|
-
task :del, [:app] do |
|
20
|
+
desc 'Remove an application'
|
21
|
+
task :del, [:app] do |_t, args|
|
22
22
|
unless args[:app].nil? || args[:app].empty?
|
23
23
|
DH.remove_app(args[:app])
|
24
24
|
puts "Removed app #{args[:app]}"
|
25
25
|
end
|
26
26
|
end
|
27
27
|
|
28
|
-
desc
|
29
|
-
task :info, [:app] do |
|
28
|
+
desc 'Print app info'
|
29
|
+
task :info, [:app] do |_t, args|
|
30
30
|
info = DH.get_app_data(args[:app])
|
31
31
|
if info.nil? || info.empty?
|
32
32
|
puts "No such app #{args[:app]}"
|
33
33
|
else
|
34
|
-
puts " * #{app} #{info.map {|k,v| "#{k}: #{v}"}.join(
|
34
|
+
puts " * #{app} #{info.map { |k, v| "#{k}: #{v}" }.join(', ')}"
|
35
35
|
end
|
36
36
|
end
|
37
37
|
|
38
|
-
desc
|
39
|
-
task :newenv, [:role, :oldenv, :newenv, :newrole] do |
|
38
|
+
desc 'Copy all apps for a role to a new env'
|
39
|
+
task :newenv, [:role, :oldenv, :newenv, :newrole] do |_t, args|
|
40
40
|
[:role, :oldenv, :newenv].each do |k|
|
41
41
|
abort "Missing parameter #{k}" if args[k].nil?
|
42
42
|
end
|
@@ -48,11 +48,11 @@ namespace :app do
|
|
48
48
|
end
|
49
49
|
end
|
50
50
|
|
51
|
-
desc
|
51
|
+
desc 'List apps'
|
52
52
|
task :app do
|
53
|
-
puts
|
53
|
+
puts 'Apps:'
|
54
54
|
DH.apps.each do |app|
|
55
55
|
info = DH.get_app_data(app)
|
56
|
-
puts " * #{app} #{info.map {|k,v| "#{k}: #{v}"}.join(
|
56
|
+
puts " * #{app} #{info.map { |k, v| "#{k}: #{v}" }.join(', ')}"
|
57
57
|
end
|
58
58
|
end
|
data/tasks/config.rb
CHANGED
@@ -1,24 +1,24 @@
|
|
1
1
|
namespace :config do
|
2
|
-
desc
|
3
|
-
task :set, [:key
|
2
|
+
desc 'Add or update a new config key'
|
3
|
+
task :set, [:key, :value] do |_t, args|
|
4
4
|
DH.set_config(args[:key], args[:value])
|
5
5
|
end
|
6
6
|
|
7
|
-
desc
|
8
|
-
task :del, [:key] do |
|
7
|
+
desc 'Delete a key if set'
|
8
|
+
task :del, [:key] do |_t, args|
|
9
9
|
DH.del_config(args[:key])
|
10
10
|
end
|
11
11
|
|
12
|
-
desc
|
13
|
-
task :get, [:key] do |
|
12
|
+
desc 'Get a config'
|
13
|
+
task :get, [:key] do |_t, args|
|
14
14
|
DH.get_config(args[:key])
|
15
15
|
end
|
16
16
|
end
|
17
17
|
|
18
|
-
desc
|
18
|
+
desc 'List config'
|
19
19
|
task :config do
|
20
20
|
puts 'Config:'
|
21
|
-
DH.
|
21
|
+
DH.configs.keys.each do |k|
|
22
22
|
puts " - #{k}"
|
23
23
|
end
|
24
24
|
end
|
data/tasks/docker.rb
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
def printimages
|
2
|
-
puts
|
2
|
+
puts `docker images | grep '^gild/gaptool'`
|
3
3
|
end
|
4
4
|
|
5
|
-
unless File.
|
5
|
+
unless File.exist?('/.dockerenv')
|
6
6
|
namespace :docker do
|
7
7
|
namespace :build do
|
8
8
|
task :image do
|
@@ -10,53 +10,53 @@ unless File.exists?('/.dockerenv')
|
|
10
10
|
printimages
|
11
11
|
end
|
12
12
|
|
13
|
-
task :
|
13
|
+
task all: [:image]
|
14
14
|
end
|
15
15
|
|
16
16
|
desc 'Build the docker image'
|
17
|
-
task :
|
17
|
+
task build: 'build:image'
|
18
18
|
|
19
|
-
desc
|
20
|
-
task :
|
19
|
+
desc 'Push the release image to the Docker Hub'
|
20
|
+
task push: 'push:release'
|
21
21
|
|
22
|
-
task :
|
22
|
+
task up: [:build, :recreate]
|
23
23
|
|
24
|
-
desc
|
25
|
-
task :
|
24
|
+
desc 'Run tests w/ docker'
|
25
|
+
task test: :build do
|
26
26
|
sys(%w(docker-compose run --rm gaptool bundle exec rake test))
|
27
27
|
end
|
28
28
|
|
29
|
-
desc
|
29
|
+
desc 'Stop docker containers'
|
30
30
|
task :stop do
|
31
31
|
sys(%w(docker-compose stop))
|
32
32
|
end
|
33
33
|
|
34
|
-
desc
|
34
|
+
desc 'Start docker containers'
|
35
35
|
task :start do
|
36
36
|
sys(%w(docker-compose start))
|
37
37
|
end
|
38
38
|
|
39
|
-
desc
|
40
|
-
task :
|
39
|
+
desc 'Restart docker containers'
|
40
|
+
task restart: [:stop, :start]
|
41
41
|
|
42
42
|
desc "Stop and remove docker containers (alias 'rm')"
|
43
|
-
task :
|
43
|
+
task remove: :stop do
|
44
44
|
sys(%w(docker-compose rm --force))
|
45
45
|
end
|
46
46
|
|
47
|
-
task :
|
47
|
+
task rm: :remove
|
48
48
|
|
49
|
-
desc
|
49
|
+
desc 'Recreate docker containers without building'
|
50
50
|
task :recreate do
|
51
51
|
sys(%w(docker-compose up -d))
|
52
52
|
end
|
53
53
|
|
54
|
-
desc
|
54
|
+
desc 'Run a command in the docker container'
|
55
55
|
task :run do
|
56
56
|
exit sys(%W(docker-compose run --rm gaptool #{ARGV[1..-1].shelljoin}))
|
57
57
|
end
|
58
58
|
end
|
59
59
|
|
60
|
-
desc
|
61
|
-
task :
|
60
|
+
desc 'Bring up docker containers'
|
61
|
+
task docker: 'docker:up'
|
62
62
|
end
|