qtc-sdk 0.2.0 → 0.3.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.
Files changed (43) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +18 -18
  3. data/Changelog.md +14 -6
  4. data/Gemfile +4 -4
  5. data/LICENSE.txt +22 -22
  6. data/README.md +44 -44
  7. data/Rakefile +1 -1
  8. data/bin/qtc-cli +13 -13
  9. data/lib/qtc/cli/commands.rb +15 -15
  10. data/lib/qtc/cli/common.rb +146 -91
  11. data/lib/qtc/cli/eds/base.rb +27 -27
  12. data/lib/qtc/cli/eds/commands.rb +20 -20
  13. data/lib/qtc/cli/eds/instances.rb +30 -30
  14. data/lib/qtc/cli/mar/apps.rb +116 -125
  15. data/lib/qtc/cli/mar/base.rb +60 -60
  16. data/lib/qtc/cli/mar/commands.rb +221 -199
  17. data/lib/qtc/cli/mar/debug.rb +87 -86
  18. data/lib/qtc/cli/mar/domains.rb +35 -38
  19. data/lib/qtc/cli/mar/env.rb +38 -40
  20. data/lib/qtc/cli/mar/repository.rb +24 -26
  21. data/lib/qtc/cli/mar/ssl_certificates.rb +40 -42
  22. data/lib/qtc/cli/mar/stack.rb +29 -0
  23. data/lib/qtc/cli/mdb/base.rb +47 -43
  24. data/lib/qtc/cli/mdb/commands.rb +43 -31
  25. data/lib/qtc/cli/mdb/instances.rb +79 -60
  26. data/lib/qtc/cli/platform/clouds.rb +33 -15
  27. data/lib/qtc/cli/platform/commands.rb +132 -65
  28. data/lib/qtc/cli/platform/datacenters.rb +23 -21
  29. data/lib/qtc/cli/platform/ssh_keys.rb +41 -41
  30. data/lib/qtc/cli/platform/user.rb +25 -25
  31. data/lib/qtc/cli/platform/vpn.rb +93 -0
  32. data/lib/qtc/client.rb +170 -170
  33. data/lib/qtc/eds/client.rb +116 -116
  34. data/lib/qtc/eds/collection.rb +124 -124
  35. data/lib/qtc/eds/user_collection.rb +13 -13
  36. data/lib/qtc/eds/usergroup_collection.rb +41 -41
  37. data/lib/qtc/errors.rb +13 -11
  38. data/lib/qtc/version.rb +3 -3
  39. data/lib/qtc-sdk.rb +1 -1
  40. data/qtc-sdk.gemspec +28 -28
  41. data/spec/unit/qtc/client_spec.rb +147 -147
  42. metadata +20 -19
  43. data/lib/qtc/mws/client.rb +0 -89
@@ -1,199 +1,221 @@
1
- require_relative 'apps'
2
- require_relative 'domains'
3
- require_relative 'ssl_certificates'
4
- require_relative 'env'
5
- require_relative 'repository'
6
- require_relative 'debug'
7
-
8
- command 'mar list' do |c|
9
- c.syntax = 'qtc-cli mar list'
10
- c.description = 'List all apps'
11
- c.action do |args, options|
12
- Qtc::Cli::Mar::Apps.new.list
13
- end
14
- end
15
-
16
- command 'mar show' do |c|
17
- c.syntax = 'qtc-cli mar show'
18
- c.description = 'Show app details'
19
- c.example 'Show app details for app with instance id: mar-eu-1-example', 'qtc-cli mar show --app mar-eu-1-example'
20
- c.option '--app APP', String, 'App instance id'
21
- c.option '--remote REMOTE', String, 'Git remote to use, eg "staging"'
22
- c.action do |args, options|
23
- Qtc::Cli::Mar::Apps.new.show(options)
24
- end
25
- end
26
-
27
- command 'mar restart' do |c|
28
- c.syntax = 'qtc-cli mar restart'
29
- c.description = 'Restart app'
30
- c.option '--app APP', String, 'App instance id'
31
- c.option '--remote REMOTE', String, 'Git remote to use, eg "staging"'
32
- c.action do |args, options|
33
- Qtc::Cli::Mar::Apps.new.restart(options)
34
- end
35
- end
36
-
37
- command 'mar create' do |c|
38
- c.syntax = 'qtc-cli mar create CLOUD_ID NAME'
39
- c.description = 'Create a new app instance'
40
- c.option '--size SIZE', String, 'App runtime size'
41
- c.action do |args, options|
42
- raise ArgumentError.new('CLOUD_ID is required') if args[0].nil?
43
- raise ArgumentError.new('NAME is required') if args[1].nil?
44
- Qtc::Cli::Mar::Apps.new.create(args[0], args[1], options)
45
- end
46
- end
47
-
48
-
49
- command 'mar scale' do |c|
50
- c.syntax = 'qtc-cli mar scale KEY=VALUE'
51
- c.description = 'Scale app processes'
52
- c.option '--app APP', String, 'App instance id'
53
- c.option '--remote REMOTE', String, 'Git remote to use, eg "staging"'
54
- c.action do |args, options|
55
- Qtc::Cli::Mar::Apps.new.scale(args, options)
56
- end
57
- end
58
-
59
- command 'mar logs' do |c|
60
- c.syntax = 'qtc-cli mar logs'
61
- c.description = 'List app log entries'
62
- c.option '--app APP', String, 'App instance id'
63
- c.option '--remote REMOTE', String, 'Git remote to use, eg "staging"'
64
- c.option '--timestamp', String, 'Include timestamp'
65
- c.option '--stream', String, 'stdout or stderr'
66
- c.option '--limit LIMIT', Integer, 'Limit'
67
- c.option '--offset OFFSET', Integer, 'Offset'
68
- c.action do |args, options|
69
- Qtc::Cli::Mar::Apps.new.logs(options)
70
- end
71
- end
72
-
73
- command 'mar domains' do |c|
74
- c.syntax = 'qtc-cli mar domains'
75
- c.description = 'List app domains'
76
- c.option '--app APP', String, 'App instance id'
77
- c.option '--remote REMOTE', String, 'Git remote to use, eg "staging"'
78
- c.action do |args, options|
79
- Qtc::Cli::Mar::Domains.new.list(options)
80
- end
81
- end
82
-
83
- command 'mar domains:add' do |c|
84
- c.syntax = 'qtc-cli mar domains:add DOMAIN'
85
- c.description = 'Add custom domain to app'
86
- c.option '--app APP', String, 'App instance id'
87
- c.option '--remote REMOTE', String, 'Git remote to use, eg "staging"'
88
- c.action do |args, options|
89
- raise ArgumentError.new('DOMAIN is required') if args[0].nil?
90
- Qtc::Cli::Mar::Domains.new.create(args[0], options)
91
- end
92
- end
93
-
94
- command 'mar domains:remove' do |c|
95
- c.syntax = 'qtc-cli domains:remove DOMAIN'
96
- c.description = 'Remove custom domain from app'
97
- c.option '--app APP', String, 'App instance id'
98
- c.option '--remote REMOTE', String, 'Git remote to use, eg "staging"'
99
- c.action do |args, options|
100
- raise ArgumentError.new('DOMAIN is required') if args[0].nil?
101
- Qtc::Cli::Mar::Domains.new.destroy(args[0], options)
102
- end
103
- end
104
-
105
- command 'mar envs' do |c|
106
- c.syntax = 'qtc-cli mar envs'
107
- c.description = 'List app environment variables'
108
- c.option '--app APP', String, 'App instance id'
109
- c.option '--remote REMOTE', String, 'Git remote to use, eg "staging"'
110
- c.action do |args, options|
111
- Qtc::Cli::Mar::Env.new.show(options)
112
- end
113
- end
114
-
115
- command 'mar envs:set' do |c|
116
- c.syntax = 'qtc-cli mar envs:set KEY=value'
117
- c.description = 'Set app environment variable'
118
- c.option '--app APP', String, 'App instance id'
119
- c.option '--remote REMOTE', String, 'Git remote to use, eg "staging"'
120
- c.action do |args, options|
121
- raise ArgumentError.new("You didn't specify any values") if args[0].nil?
122
- Qtc::Cli::Mar::Env.new.set(args, options)
123
- end
124
- end
125
-
126
- command 'mar ssl:add' do |c|
127
- c.syntax = 'qtc-cli mar ssl:add --key=<path_to_pem> --cert=<path_to_crt>'
128
- c.description = 'Add SSL certificate to app'
129
- c.option '--app APP', String, 'App instance id'
130
- c.option '--remote REMOTE', String, 'Git remote to use, eg "staging"'
131
- c.option '--key PATH', String, 'Path to private key file'
132
- c.option '--cert PATH', String, 'Path to certificate file'
133
- c.option '--chain PATH', String, 'Path to certificate chain file'
134
- c.action do |args, options|
135
- raise ArgumentError.new("--key is required") unless options.key
136
- raise ArgumentError.new("--cert is required") unless options.cert
137
- Qtc::Cli::Mar::SslCertificates.new.create(options)
138
- end
139
- end
140
-
141
- command 'mar ssl:remove' do |c|
142
- c.syntax = 'qtc-cli mar remove-ssl-cert'
143
- c.description = 'Remove SSL certificate from app'
144
- c.option '--app APP', String, 'App instance id'
145
- c.option '--remote REMOTE', String, 'Git remote to use, eg "staging"'
146
- c.action do |args, options|
147
- Qtc::Cli::Mar::SslCertificates.new.destroy(options)
148
- end
149
- end
150
-
151
- command 'mar repo:purge_cache' do |c|
152
- c.syntax = 'qtc-cli mar repo:purge_cache'
153
- c.description = 'Delete remote repository build cache contents'
154
- c.option '--app APP', String, 'App instance id'
155
- c.option '--remote REMOTE', String, 'Git remote to use, eg "staging"'
156
- c.action do |args, options|
157
- Qtc::Cli::Mar::Repository.new.purge_cache(options)
158
- end
159
- end
160
-
161
- command 'mar repo:reset' do |c|
162
- c.syntax = 'qtc-cli mar repo:reset'
163
- c.description = 'Reset remote git repository'
164
- c.option '--app APP', String, 'App instance id'
165
- c.option '--remote REMOTE', String, 'Git remote to use, eg "staging"'
166
- c.action do |args, options|
167
- Qtc::Cli::Mar::Repository.new.reset(options)
168
- end
169
- end
170
-
171
- command 'mar local:run' do |c|
172
- c.syntax = 'qtc-cli mar local:run'
173
- c.option '--clean', String, 'Force clean build'
174
- c.description = 'Debug mar app locally (requires docker)'
175
- c.action do |args, options|
176
- Qtc::Cli::Mar::Debug.new.local_debug(args, options)
177
- end
178
- end
179
-
180
- command 'mar local:build_slug' do |c|
181
- c.syntax = 'qtc-cli mar local:build_slug'
182
- c.description = 'Build mar app slug locally (requires docker)'
183
- c.action do |args, options|
184
- Qtc::Cli::Mar::Debug.new.local_build(options)
185
- end
186
- end
187
-
188
- command 'mar exec' do |c|
189
- c.syntax = 'qtc-cli mar exec <cmd>'
190
- c.description = 'Execute command inside app process'
191
- c.option '--process PROCESS_ID', String, 'App process id'
192
- c.option '--app APP', String, 'App instance id'
193
- c.option '--remote REMOTE', String, 'Git remote to use, eg "staging"'
194
- c.action do |args, options|
195
- raise ArgumentError.new("command required") if args.size == 0
196
- raise ArgumentError.new("--process is required") unless options.process
197
- Qtc::Cli::Mar::Apps.new.exec(args.join(" "), options)
198
- end
199
- end
1
+ require_relative 'apps'
2
+ require_relative 'domains'
3
+ require_relative 'ssl_certificates'
4
+ require_relative 'env'
5
+ require_relative 'repository'
6
+ require_relative 'debug'
7
+ require_relative 'stack'
8
+
9
+ command 'mar list' do |c|
10
+ c.syntax = 'qtc-cli mar list'
11
+ c.description = 'List all apps'
12
+ c.action do |args, options|
13
+ Qtc::Cli::Mar::Apps.new.list
14
+ end
15
+ end
16
+
17
+ command 'mar show' do |c|
18
+ c.syntax = 'qtc-cli mar show'
19
+ c.description = 'Show app details'
20
+ c.example 'Show app details for app with instance id: mar-eu-1-example', 'qtc-cli mar show --app mar-eu-1-example'
21
+ c.option '--app APP', String, 'App instance id'
22
+ c.option '--remote REMOTE', String, 'Git remote to use, eg "staging"'
23
+ c.action do |args, options|
24
+ Qtc::Cli::Mar::Apps.new.show(options)
25
+ end
26
+ end
27
+
28
+ command 'mar restart' do |c|
29
+ c.syntax = 'qtc-cli mar restart'
30
+ c.description = 'Restart app'
31
+ c.option '--app APP', String, 'App instance id'
32
+ c.option '--remote REMOTE', String, 'Git remote to use, eg "staging"'
33
+ c.action do |args, options|
34
+ Qtc::Cli::Mar::Apps.new.restart(options)
35
+ end
36
+ end
37
+
38
+ command 'mar create' do |c|
39
+ c.syntax = 'qtc-cli mar create NAME'
40
+ c.description = 'Create a new app instance'
41
+ c.option '--size SIZE', String, 'App runtime size'
42
+ c.action do |args, options|
43
+ raise ArgumentError.new('NAME is required') if args[0].nil?
44
+ Qtc::Cli::Mar::Apps.new.create(args[0], options)
45
+ end
46
+ end
47
+
48
+ command 'mar stack' do |c|
49
+ c.syntax = 'qtc-cli mar stack'
50
+ c.description = 'Get app stack'
51
+ c.option '--app APP', String, 'App instance id'
52
+ c.option '--remote REMOTE', String, 'Git remote to use, eg "staging"'
53
+ c.action do |args, options|
54
+ Qtc::Cli::Mar::Stack.new.show(args[0], options)
55
+ end
56
+ end
57
+
58
+ command 'mar stack:set' do |c|
59
+ c.syntax = 'qtc-cli mar stack:set STACK'
60
+ c.description = 'Set app stack'
61
+ c.option '--app APP', String, 'App instance id'
62
+ c.option '--remote REMOTE', String, 'Git remote to use, eg "staging"'
63
+ c.action do |args, options|
64
+ raise ArgumentError.new('STACK is required') if args[0].nil?
65
+ Qtc::Cli::Mar::Stack.new.update(args[0], options)
66
+ end
67
+ end
68
+
69
+ command 'mar scale' do |c|
70
+ c.syntax = 'qtc-cli mar scale KEY=VALUE'
71
+ c.description = 'Scale app processes'
72
+ c.option '--app APP', String, 'App instance id'
73
+ c.option '--remote REMOTE', String, 'Git remote to use, eg "staging"'
74
+ c.action do |args, options|
75
+ Qtc::Cli::Mar::Apps.new.scale(args, options)
76
+ end
77
+ end
78
+
79
+ command 'mar logs' do |c|
80
+ c.syntax = 'qtc-cli mar logs'
81
+ c.description = 'List app log entries'
82
+ c.option '--app APP', String, 'App instance id'
83
+ c.option '--remote REMOTE', String, 'Git remote to use, eg "staging"'
84
+ c.option '--timestamp', String, 'Include timestamp'
85
+ c.option '--stream', String, 'stdout or stderr'
86
+ c.option '--limit LIMIT', Integer, 'Limit'
87
+ c.option '--offset OFFSET', Integer, 'Offset'
88
+ c.action do |args, options|
89
+ Qtc::Cli::Mar::Apps.new.logs(options)
90
+ end
91
+ end
92
+
93
+ command 'mar domains' do |c|
94
+ c.syntax = 'qtc-cli mar domains'
95
+ c.description = 'List app domains'
96
+ c.option '--app APP', String, 'App instance id'
97
+ c.option '--remote REMOTE', String, 'Git remote to use, eg "staging"'
98
+ c.action do |args, options|
99
+ Qtc::Cli::Mar::Domains.new.list(options)
100
+ end
101
+ end
102
+
103
+ command 'mar domains:add' do |c|
104
+ c.syntax = 'qtc-cli mar domains:add DOMAIN'
105
+ c.description = 'Add custom domain to app'
106
+ c.option '--app APP', String, 'App instance id'
107
+ c.option '--remote REMOTE', String, 'Git remote to use, eg "staging"'
108
+ c.action do |args, options|
109
+ raise ArgumentError.new('DOMAIN is required') if args[0].nil?
110
+ Qtc::Cli::Mar::Domains.new.create(args[0], options)
111
+ end
112
+ end
113
+
114
+ command 'mar domains:remove' do |c|
115
+ c.syntax = 'qtc-cli domains:remove DOMAIN'
116
+ c.description = 'Remove custom domain from app'
117
+ c.option '--app APP', String, 'App instance id'
118
+ c.option '--remote REMOTE', String, 'Git remote to use, eg "staging"'
119
+ c.action do |args, options|
120
+ raise ArgumentError.new('DOMAIN is required') if args[0].nil?
121
+ Qtc::Cli::Mar::Domains.new.destroy(args[0], options)
122
+ end
123
+ end
124
+
125
+ command 'mar envs' do |c|
126
+ c.syntax = 'qtc-cli mar envs'
127
+ c.description = 'List app environment variables'
128
+ c.option '--app APP', String, 'App instance id'
129
+ c.option '--remote REMOTE', String, 'Git remote to use, eg "staging"'
130
+ c.action do |args, options|
131
+ Qtc::Cli::Mar::Env.new.show(options)
132
+ end
133
+ end
134
+
135
+ command 'mar envs:set' do |c|
136
+ c.syntax = 'qtc-cli mar envs:set KEY=value'
137
+ c.description = 'Set app environment variable'
138
+ c.option '--app APP', String, 'App instance id'
139
+ c.option '--remote REMOTE', String, 'Git remote to use, eg "staging"'
140
+ c.action do |args, options|
141
+ raise ArgumentError.new("You didn't specify any values") if args[0].nil?
142
+ Qtc::Cli::Mar::Env.new.set(args, options)
143
+ end
144
+ end
145
+
146
+ command 'mar ssl:add' do |c|
147
+ c.syntax = 'qtc-cli mar ssl:add --key=<path_to_pem> --cert=<path_to_crt>'
148
+ c.description = 'Add SSL certificate to app'
149
+ c.option '--app APP', String, 'App instance id'
150
+ c.option '--remote REMOTE', String, 'Git remote to use, eg "staging"'
151
+ c.option '--key PATH', String, 'Path to private key file'
152
+ c.option '--cert PATH', String, 'Path to certificate file'
153
+ c.option '--chain PATH', String, 'Path to certificate chain file'
154
+ c.action do |args, options|
155
+ raise ArgumentError.new("--key is required") unless options.key
156
+ raise ArgumentError.new("--cert is required") unless options.cert
157
+ Qtc::Cli::Mar::SslCertificates.new.create(options)
158
+ end
159
+ end
160
+
161
+ command 'mar ssl:remove' do |c|
162
+ c.syntax = 'qtc-cli mar remove-ssl-cert'
163
+ c.description = 'Remove SSL certificate from app'
164
+ c.option '--app APP', String, 'App instance id'
165
+ c.option '--remote REMOTE', String, 'Git remote to use, eg "staging"'
166
+ c.action do |args, options|
167
+ Qtc::Cli::Mar::SslCertificates.new.destroy(options)
168
+ end
169
+ end
170
+
171
+ command 'mar repo:purge_cache' do |c|
172
+ c.syntax = 'qtc-cli mar repo:purge_cache'
173
+ c.description = 'Delete remote repository build cache contents'
174
+ c.option '--app APP', String, 'App instance id'
175
+ c.option '--remote REMOTE', String, 'Git remote to use, eg "staging"'
176
+ c.action do |args, options|
177
+ Qtc::Cli::Mar::Repository.new.purge_cache(options)
178
+ end
179
+ end
180
+
181
+ command 'mar repo:reset' do |c|
182
+ c.syntax = 'qtc-cli mar repo:reset'
183
+ c.description = 'Reset remote git repository'
184
+ c.option '--app APP', String, 'App instance id'
185
+ c.option '--remote REMOTE', String, 'Git remote to use, eg "staging"'
186
+ c.action do |args, options|
187
+ Qtc::Cli::Mar::Repository.new.reset(options)
188
+ end
189
+ end
190
+
191
+ command 'mar local:run' do |c|
192
+ c.syntax = 'qtc-cli mar local:run'
193
+ c.option '--clean', String, 'Force clean build'
194
+ c.option '--stack STRING', String, 'Define used stack (default: cedar-14)'
195
+ c.description = 'Debug mar app locally (requires docker)'
196
+ c.action do |args, options|
197
+ Qtc::Cli::Mar::Debug.new.local_debug(args, options)
198
+ end
199
+ end
200
+
201
+ command 'mar local:build_slug' do |c|
202
+ c.syntax = 'qtc-cli mar local:build_slug'
203
+ c.option '--stack STRING', String, 'Define used stack (default: cedar-14)'
204
+ c.description = 'Build mar app slug locally (requires docker)'
205
+ c.action do |args, options|
206
+ Qtc::Cli::Mar::Debug.new.local_build(options)
207
+ end
208
+ end
209
+
210
+ command 'mar exec' do |c|
211
+ c.syntax = 'qtc-cli mar exec <cmd>'
212
+ c.description = 'Execute command inside app process'
213
+ c.option '--process PROCESS_ID', String, 'App process id'
214
+ c.option '--app APP', String, 'App instance id'
215
+ c.option '--remote REMOTE', String, 'Git remote to use, eg "staging"'
216
+ c.action do |args, options|
217
+ raise ArgumentError.new("command required") if args.size == 0
218
+ raise ArgumentError.new("--process is required") unless options.process
219
+ Qtc::Cli::Mar::Apps.new.exec(args.join(" "), options)
220
+ end
221
+ end
@@ -1,86 +1,87 @@
1
- require_relative 'base'
2
- require 'open3'
3
-
4
- module Qtc
5
- module Cli
6
- class Mar::Debug < Mar::Base
7
-
8
- def local_debug(commands, options)
9
- app_home = File.realpath('.')
10
- docker_id = nil
11
- puts "-----> Starting to build MAR app locally"
12
-
13
- if options.clean == true && File.exists?("#{app_home}/slug.tgz")
14
- File.delete("#{app_home}/slug.tgz")
15
- end
16
-
17
- unless File.exists?("#{app_home}/slug.tgz")
18
- docker_id = build_slug(app_home)
19
- else
20
- puts " Existing slug.tgz found, build not needed."
21
- end
22
- puts "-----> Starting app container"
23
- run_opts = [
24
- '-e PORT=5000',
25
- '-e STACK=cedar',
26
- '-e SLUG_URL=file:///tmp/fake_slug.tgz',
27
- '-p 5000',
28
- "-v #{app_home}/slug.tgz:/tmp/fake_slug.tgz"
29
- ]
30
- if File.exists?("#{app_home}/.env")
31
- run_opts << "--env-file=#{app_home}/.env"
32
- end
33
- if commands.size == 0
34
- cmd = 'start web'
35
- else
36
- cmd = commands.join(" ")
37
- end
38
-
39
- exec("docker run -it --rm #{run_opts.join(" ")} qtcs/slugrunner #{cmd}")
40
- end
41
-
42
- def local_build_slug(options)
43
- app_home = File.realpath('.')
44
- puts "-----> Starting to build MAR app locally"
45
- build_slug(app_home)
46
- end
47
-
48
- def build_slug(app_home)
49
- docker_id = nil
50
- run_opts = ''
51
- if File.exists?("#{app_home}/.env")
52
- run_opts << "--env-file=#{app_home}/.env"
53
- end
54
- Open3.popen3("docker run -d #{run_opts} -v #{app_home}:/tmp/gitrepo:r qtcs/slugbuilder") {|stdin, stdout, stderr, wait_thr|
55
- docker_id = stdout.gets
56
- if docker_id
57
- docker_id.strip!
58
- else
59
- puts stderr.gets
60
- end
61
- exit_status = wait_thr.value
62
- unless exit_status.success?
63
- raise "ERROR: build failed to start"
64
- end
65
- }
66
- Open3.popen3('docker', 'attach', docker_id){|stdin, stdout, stderr, wait_thr|
67
- stdin.close
68
- while line = stdout.gets
69
- puts line
70
- end
71
- exit_status = wait_thr.value
72
- unless exit_status.success?
73
- raise "ERROR: build failed to complete"
74
- end
75
- }
76
- puts "-----> Extracting slug from build image to ./slug.tgz"
77
- system("docker cp #{docker_id}:/tmp/slug.tgz . > /dev/null")
78
-
79
- docker_id
80
- rescue => exc
81
- system("docker rm -f #{docker_id}") if docker_id
82
- raise exc
83
- end
84
- end
85
- end
86
- end
1
+ require_relative 'base'
2
+ require 'open3'
3
+
4
+ module Qtc
5
+ module Cli
6
+ class Mar::Debug < Mar::Base
7
+
8
+ def local_debug(commands, options)
9
+ app_home = File.realpath('.')
10
+ docker_id = nil
11
+ stack = options.stack || 'cedar-14'
12
+ puts "-----> Starting to build MAR app locally"
13
+
14
+ if options.clean == true && File.exists?("#{app_home}/slug.tgz")
15
+ File.delete("#{app_home}/slug.tgz")
16
+ end
17
+
18
+ unless File.exists?("#{app_home}/slug.tgz")
19
+ docker_id = build_slug(app_home, stack)
20
+ else
21
+ puts " Existing slug.tgz found, build not needed."
22
+ end
23
+ puts "-----> Starting app container"
24
+ run_opts = [
25
+ '-e PORT=5000',
26
+ "-e STACK=#{stack}",
27
+ '-e SLUG_URL=file:///tmp/fake_slug.tgz',
28
+ '-p 5000',
29
+ "-v #{app_home}/slug.tgz:/tmp/fake_slug.tgz"
30
+ ]
31
+ if File.exists?("#{app_home}/.env")
32
+ run_opts << "--env-file=#{app_home}/.env"
33
+ end
34
+ if commands.size == 0
35
+ cmd = 'start web'
36
+ else
37
+ cmd = commands.join(" ")
38
+ end
39
+
40
+ exec("docker run -it #{run_opts.join(" ")} qtcs/slugrunner:#{stack} #{cmd}")
41
+ end
42
+
43
+ def local_build_slug(options)
44
+ app_home = File.realpath('.')
45
+ puts "-----> Starting to build MAR app locally"
46
+ build_slug(app_home)
47
+ end
48
+
49
+ def build_slug(app_home, stack)
50
+ docker_id = nil
51
+ run_opts = ''
52
+ if File.exists?("#{app_home}/.env")
53
+ run_opts << "--env-file=#{app_home}/.env"
54
+ end
55
+ Open3.popen3("docker run -d #{run_opts} -v #{app_home}:/tmp/gitrepo:r qtcs/slugbuilder:#{stack}") {|stdin, stdout, stderr, wait_thr|
56
+ docker_id = stdout.gets
57
+ if docker_id
58
+ docker_id.strip!
59
+ else
60
+ puts stderr.gets
61
+ end
62
+ exit_status = wait_thr.value
63
+ unless exit_status.success?
64
+ raise "ERROR: build failed to start"
65
+ end
66
+ }
67
+ Open3.popen2('docker', 'attach', docker_id){|stdin, stdout, wait_thr|
68
+ stdin.close
69
+ while line = stdout.gets
70
+ puts line
71
+ end
72
+ exit_status = wait_thr.value
73
+ unless exit_status.success?
74
+ raise "ERROR: build failed to complete"
75
+ end
76
+ }
77
+ puts "-----> Extracting slug from build image to ./slug.tgz"
78
+ system("docker cp #{docker_id}:/tmp/slug.tgz . > /dev/null")
79
+
80
+ docker_id
81
+ rescue => exc
82
+ system("docker rm -f #{docker_id}") if docker_id
83
+ raise exc
84
+ end
85
+ end
86
+ end
87
+ end