qtc-sdk 0.1.0 → 0.2.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/Changelog.md +6 -0
- data/lib/qtc/cli/commands.rb +1 -0
- data/lib/qtc/cli/mar/apps.rb +14 -0
- data/lib/qtc/cli/mar/commands.rb +31 -0
- data/lib/qtc/cli/mar/debug.rb +86 -0
- data/lib/qtc/cli/mdb/base.rb +43 -0
- data/lib/qtc/cli/mdb/commands.rb +31 -0
- data/lib/qtc/cli/mdb/instances.rb +60 -0
- data/lib/qtc/version.rb +1 -1
- data/qtc-sdk.gemspec +0 -3
- metadata +7 -45
- data/lib/qtc_cli.rb +0 -12
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7e04ff804e0c81442a6ba99cc7179825b7cd24fe
|
4
|
+
data.tar.gz: d3b0706e21e291fb8cbb5656d685098bef4961c4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2dca7fa4e70ad77280f2ab1b1d25b0a762bcbf2dd42dee0d9aa83183486247d96e72197d0e37ff57d5e89fe1c04e40e0012a30114073307141b905135d5dd94f
|
7
|
+
data.tar.gz: 316383e9626b39b9982338812c72d01cfe7e1ed01c360069ce5e0fedf7d068f7176fb4331abd9fbe6033b99c3144a0164715957df8fdcd38de4751e834d73a55
|
data/Changelog.md
ADDED
data/lib/qtc/cli/commands.rb
CHANGED
data/lib/qtc/cli/mar/apps.rb
CHANGED
@@ -98,6 +98,20 @@ module Qtc
|
|
98
98
|
end
|
99
99
|
end
|
100
100
|
|
101
|
+
def exec(command, options)
|
102
|
+
instance_id = resolve_instance_id(options)
|
103
|
+
instance_data = instance_info(instance_id)
|
104
|
+
if instance_data
|
105
|
+
token = instance_data['authorizations'][0]['access_token']
|
106
|
+
data = {
|
107
|
+
cmd: command,
|
108
|
+
processId: options.process
|
109
|
+
}
|
110
|
+
result = client.post("/apps/#{instance_id}/exec", data, {}, {'Authorization' => "Bearer #{token}"})
|
111
|
+
puts result['stdout']
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
101
115
|
def size_mapping
|
102
116
|
{
|
103
117
|
'1' => 'mini',
|
data/lib/qtc/cli/mar/commands.rb
CHANGED
@@ -3,6 +3,7 @@ require_relative 'domains'
|
|
3
3
|
require_relative 'ssl_certificates'
|
4
4
|
require_relative 'env'
|
5
5
|
require_relative 'repository'
|
6
|
+
require_relative 'debug'
|
6
7
|
|
7
8
|
command 'mar list' do |c|
|
8
9
|
c.syntax = 'qtc-cli mar list'
|
@@ -165,4 +166,34 @@ command 'mar repo:reset' do |c|
|
|
165
166
|
c.action do |args, options|
|
166
167
|
Qtc::Cli::Mar::Repository.new.reset(options)
|
167
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
|
168
199
|
end
|
@@ -0,0 +1,86 @@
|
|
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
|
@@ -0,0 +1,43 @@
|
|
1
|
+
require_relative '../../client'
|
2
|
+
require_relative '../common'
|
3
|
+
|
4
|
+
module Qtc
|
5
|
+
module Cli
|
6
|
+
module Mdb
|
7
|
+
class Base
|
8
|
+
include Cli::Common
|
9
|
+
|
10
|
+
protected
|
11
|
+
|
12
|
+
##
|
13
|
+
# @param [String] instance_id
|
14
|
+
# @return [String,NilClass]
|
15
|
+
def resolve_datacenter_id(instance_id)
|
16
|
+
match = instance_id.to_s.match(/^(mdb-\w+-\w+)-\w+/)
|
17
|
+
if match[1]
|
18
|
+
match[1]
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
##
|
23
|
+
# @return [Qtc::Client]
|
24
|
+
def client
|
25
|
+
if @client.nil?
|
26
|
+
@client = Qtc::Client.new(base_url)
|
27
|
+
end
|
28
|
+
|
29
|
+
@client
|
30
|
+
end
|
31
|
+
|
32
|
+
def base_url
|
33
|
+
datacenters = inifile['datacenters'] || {}
|
34
|
+
if !self.datacenter_id.nil? && datacenters.has_key?(self.datacenter_id)
|
35
|
+
"#{datacenters[self.datacenter_id]}/v1"
|
36
|
+
else
|
37
|
+
raise ArgumentError.new('Unknown datacenter. Please run qtc-cli datacenters to get latest list of your datacenters')
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require_relative 'instances'
|
2
|
+
|
3
|
+
command 'mdb list' do |c|
|
4
|
+
c.syntax = 'qtc-cli mdb list'
|
5
|
+
c.description = 'List all MDB instances'
|
6
|
+
c.action do |args, options|
|
7
|
+
Qtc::Cli::Mdb::Instances.new.list
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
command 'mdb show' do |c|
|
12
|
+
c.syntax = 'qtc-cli mdb show'
|
13
|
+
c.description = 'Show MDB instance info'
|
14
|
+
c.option '--id ID', String, 'MDB instance id'
|
15
|
+
c.action do |args, options|
|
16
|
+
Qtc::Cli::Mdb::Instances.new.show(options)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
command 'mdb logs' do |c|
|
21
|
+
c.syntax = 'qtc-cli mdb logs'
|
22
|
+
c.description = 'Show MDB logs'
|
23
|
+
c.option '--id ID', String, 'MDB instance id'
|
24
|
+
c.option '--timestamp', String, 'Include timestamp'
|
25
|
+
c.option '--stream', String, 'stdout or stderr'
|
26
|
+
c.option '--limit LIMIT', Integer, 'Limit'
|
27
|
+
c.option '--offset OFFSET', Integer, 'Offset'
|
28
|
+
c.action do |args, options|
|
29
|
+
Qtc::Cli::Mdb::Instances.new.logs(options)
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
require_relative 'base'
|
2
|
+
|
3
|
+
module Qtc
|
4
|
+
module Cli
|
5
|
+
class Mdb::Instances < Mdb::Base
|
6
|
+
include Qtc::Cli::Common
|
7
|
+
|
8
|
+
def list
|
9
|
+
accounts = platform_client.get('/user/accounts')
|
10
|
+
accounts['results'].each do |account|
|
11
|
+
print color("== #{account['name']}: #{account['id']}")
|
12
|
+
instances = platform_client.get("/accounts/#{account['id']}/instances", {provider: 'mdb'})
|
13
|
+
instances['results'].each do |instance|
|
14
|
+
say(" ~ <%= color('#{instance['id']}', :green) %> #{instance['name']} <%= color('#{instance['tags'].join(', ')}', :yellow) %>")
|
15
|
+
end
|
16
|
+
puts ''
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def show(options)
|
21
|
+
raise ArgumentError.new('--id is required') if options.id.nil?
|
22
|
+
|
23
|
+
self.datacenter_id = self.resolve_datacenter_id(options.id)
|
24
|
+
instance_id = options.id
|
25
|
+
instance_data = instance_info(instance_id)
|
26
|
+
if instance_data
|
27
|
+
token = instance_data['authorizations'][0]['access_token']
|
28
|
+
result = client.get("/services/#{instance_id}", nil, {'Authorization' => "Bearer #{token}"})
|
29
|
+
puts "Id: #{result['id']}"
|
30
|
+
puts "Name: #{result['name']}"
|
31
|
+
puts "Type: #{result['image']['name']}"
|
32
|
+
puts "Size: #{result['size'].to_i * 256}MB"
|
33
|
+
puts "State: #{result['state']}"
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def logs(options)
|
38
|
+
raise ArgumentError.new('--id is required') if options.id.nil?
|
39
|
+
|
40
|
+
self.datacenter_id = self.resolve_datacenter_id(options.id)
|
41
|
+
offset = options.offset || 0
|
42
|
+
limit = options.limit || 100
|
43
|
+
stream = options.stream || nil
|
44
|
+
|
45
|
+
instance_id = options.id
|
46
|
+
instance_data = instance_info(instance_id)
|
47
|
+
if instance_data
|
48
|
+
token = instance_data['authorizations'][0]['access_token']
|
49
|
+
result = client.get("/services/#{instance_id}/logs", {offset: offset, limit: limit}, {'Authorization' => "Bearer #{token}"})
|
50
|
+
result['results'].each do |r|
|
51
|
+
line = ''
|
52
|
+
line << "[#{r['time']}] " if options.timestamp == true
|
53
|
+
line << r['log']
|
54
|
+
puts line
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
data/lib/qtc/version.rb
CHANGED
data/qtc-sdk.gemspec
CHANGED
@@ -22,10 +22,7 @@ Gem::Specification.new do |spec|
|
|
22
22
|
spec.add_development_dependency 'bundler', '~> 1.5'
|
23
23
|
spec.add_development_dependency 'rake'
|
24
24
|
spec.add_development_dependency 'rspec', '~> 2.14.0'
|
25
|
-
spec.add_development_dependency 'webmock'
|
26
|
-
spec.add_development_dependency 'vcr'
|
27
25
|
spec.add_runtime_dependency 'httpclient', '~> 2.3'
|
28
|
-
spec.add_runtime_dependency 'faye-websocket'
|
29
26
|
spec.add_runtime_dependency 'commander'
|
30
27
|
spec.add_runtime_dependency 'inifile'
|
31
28
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: qtc-sdk
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jari Kolehmainen
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2015-02-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -52,34 +52,6 @@ dependencies:
|
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: 2.14.0
|
55
|
-
- !ruby/object:Gem::Dependency
|
56
|
-
name: webmock
|
57
|
-
requirement: !ruby/object:Gem::Requirement
|
58
|
-
requirements:
|
59
|
-
- - ">="
|
60
|
-
- !ruby/object:Gem::Version
|
61
|
-
version: '0'
|
62
|
-
type: :development
|
63
|
-
prerelease: false
|
64
|
-
version_requirements: !ruby/object:Gem::Requirement
|
65
|
-
requirements:
|
66
|
-
- - ">="
|
67
|
-
- !ruby/object:Gem::Version
|
68
|
-
version: '0'
|
69
|
-
- !ruby/object:Gem::Dependency
|
70
|
-
name: vcr
|
71
|
-
requirement: !ruby/object:Gem::Requirement
|
72
|
-
requirements:
|
73
|
-
- - ">="
|
74
|
-
- !ruby/object:Gem::Version
|
75
|
-
version: '0'
|
76
|
-
type: :development
|
77
|
-
prerelease: false
|
78
|
-
version_requirements: !ruby/object:Gem::Requirement
|
79
|
-
requirements:
|
80
|
-
- - ">="
|
81
|
-
- !ruby/object:Gem::Version
|
82
|
-
version: '0'
|
83
55
|
- !ruby/object:Gem::Dependency
|
84
56
|
name: httpclient
|
85
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -94,20 +66,6 @@ dependencies:
|
|
94
66
|
- - "~>"
|
95
67
|
- !ruby/object:Gem::Version
|
96
68
|
version: '2.3'
|
97
|
-
- !ruby/object:Gem::Dependency
|
98
|
-
name: faye-websocket
|
99
|
-
requirement: !ruby/object:Gem::Requirement
|
100
|
-
requirements:
|
101
|
-
- - ">="
|
102
|
-
- !ruby/object:Gem::Version
|
103
|
-
version: '0'
|
104
|
-
type: :runtime
|
105
|
-
prerelease: false
|
106
|
-
version_requirements: !ruby/object:Gem::Requirement
|
107
|
-
requirements:
|
108
|
-
- - ">="
|
109
|
-
- !ruby/object:Gem::Version
|
110
|
-
version: '0'
|
111
69
|
- !ruby/object:Gem::Dependency
|
112
70
|
name: commander
|
113
71
|
requirement: !ruby/object:Gem::Requirement
|
@@ -145,6 +103,7 @@ extensions: []
|
|
145
103
|
extra_rdoc_files: []
|
146
104
|
files:
|
147
105
|
- ".gitignore"
|
106
|
+
- Changelog.md
|
148
107
|
- Gemfile
|
149
108
|
- LICENSE.txt
|
150
109
|
- README.md
|
@@ -159,10 +118,14 @@ files:
|
|
159
118
|
- lib/qtc/cli/mar/apps.rb
|
160
119
|
- lib/qtc/cli/mar/base.rb
|
161
120
|
- lib/qtc/cli/mar/commands.rb
|
121
|
+
- lib/qtc/cli/mar/debug.rb
|
162
122
|
- lib/qtc/cli/mar/domains.rb
|
163
123
|
- lib/qtc/cli/mar/env.rb
|
164
124
|
- lib/qtc/cli/mar/repository.rb
|
165
125
|
- lib/qtc/cli/mar/ssl_certificates.rb
|
126
|
+
- lib/qtc/cli/mdb/base.rb
|
127
|
+
- lib/qtc/cli/mdb/commands.rb
|
128
|
+
- lib/qtc/cli/mdb/instances.rb
|
166
129
|
- lib/qtc/cli/platform/clouds.rb
|
167
130
|
- lib/qtc/cli/platform/commands.rb
|
168
131
|
- lib/qtc/cli/platform/datacenters.rb
|
@@ -176,7 +139,6 @@ files:
|
|
176
139
|
- lib/qtc/errors.rb
|
177
140
|
- lib/qtc/mws/client.rb
|
178
141
|
- lib/qtc/version.rb
|
179
|
-
- lib/qtc_cli.rb
|
180
142
|
- qtc-sdk.gemspec
|
181
143
|
- spec/spec_helper.rb
|
182
144
|
- spec/unit/qtc/client_spec.rb
|
data/lib/qtc_cli.rb
DELETED
@@ -1,12 +0,0 @@
|
|
1
|
-
require 'thor'
|
2
|
-
require 'qtc/client'
|
3
|
-
require 'qtc/cli/instances'
|
4
|
-
require 'qtc/cli/mar'
|
5
|
-
|
6
|
-
class QtcCli < Thor
|
7
|
-
desc 'mar', 'Managed application runtime commands'
|
8
|
-
subcommand 'mar', Qtc::Cli::Mar
|
9
|
-
|
10
|
-
desc 'instances', 'Instances commands'
|
11
|
-
subcommand 'instances', Qtc::Cli::Instances
|
12
|
-
end
|