envoy-cli 1.0.0rc1
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 +7 -0
- data/.gitignore +3 -0
- data/.rspec +2 -0
- data/.rubocop.yml +95 -0
- data/.ruby-version +1 -0
- data/Gemfile +4 -0
- data/bin/envoy +12 -0
- data/bin/envoy.bak +485 -0
- data/bootstrap/base/.envoyrc +1 -0
- data/bootstrap/base/.jshintrc +91 -0
- data/bootstrap/base/.nvmrc +1 -0
- data/bootstrap/base/config/.gitkeep +0 -0
- data/bootstrap/base/docs/.gitkeep +0 -0
- data/bootstrap/base/gulpfile.js +0 -0
- data/bootstrap/base/i18n/.gitkeep +0 -0
- data/bootstrap/base/index.js +5 -0
- data/bootstrap/base/lib/.gitkeep +0 -0
- data/bootstrap/base/routes/.gitkeep +0 -0
- data/bootstrap/base/views/.gitkeep +0 -0
- data/bootstrap/base/workers/.gitkeep +0 -0
- data/bootstrap/events/generic.json +6 -0
- data/bootstrap/events/host_notification.json +27 -0
- data/bootstrap/events/route.json +6 -0
- data/bootstrap/events/sms_host_notification.json +158 -0
- data/bootstrap/templates/docs/about.md.erb +3 -0
- data/bootstrap/templates/gitignore.erb +8 -0
- data/bootstrap/templates/index.js.erb +5 -0
- data/bootstrap/templates/license.md.erb +1 -0
- data/bootstrap/templates/npmignore.erb +0 -0
- data/bootstrap/templates/package.json +24 -0
- data/bootstrap/templates/readme.md.erb +9 -0
- data/bootstrap/templates/routes/callback.js.erb +10 -0
- data/bootstrap/templates/routes/html.js.erb +9 -0
- data/bootstrap/templates/routes/json.js.erb +9 -0
- data/bootstrap/templates/routes/other.js.erb +9 -0
- data/bootstrap/templates/views/hello.html.erb +91 -0
- data/bootstrap/templates/views/starter.html.erb +10 -0
- data/bootstrap/templates/worker.js.erb +10 -0
- data/envoy-cli.gemspec +29 -0
- data/lib/envoy.rb +70 -0
- data/lib/envoy/version.rb +3 -0
- data/lib/inc/commands.rb +74 -0
- data/lib/inc/generator.rb +159 -0
- data/lib/inc/mixins.rb +347 -0
- data/lib/inc/runner.rb +21 -0
- data/lib/tasks/plugin.rb +181 -0
- data/lib/tasks/routes.rb +39 -0
- data/lib/tasks/test.rb +68 -0
- data/lib/tasks/workers.rb +39 -0
- data/readme.md +0 -0
- metadata +276 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: dec124e3b5fc290be2ef15c35db1efe32015c810
|
4
|
+
data.tar.gz: 3c60fd82c958edcec08994fc3b63a3ccc708ee23
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 556842fa3ea2aee9da0c13801b928ae013b9be5040b84ccd040ae24f978374767977066633d162ca12e83bbe268de2a7e775730852993b9722ae13fa684a2418
|
7
|
+
data.tar.gz: fccef4834dc086872214a57ad7f0a04035b032ecbcdc5fb6c83da5f20b7c603a5fa9cdef95f16d0c4d7adbea5bd16f5313f6fbc7da441b38a1388db4cc0a2b38
|
data/.gitignore
ADDED
data/.rspec
ADDED
data/.rubocop.yml
ADDED
@@ -0,0 +1,95 @@
|
|
1
|
+
require:
|
2
|
+
- rubocop-rspec
|
3
|
+
|
4
|
+
AllCops:
|
5
|
+
TargetRubyVersion: 2.3
|
6
|
+
Exclude:
|
7
|
+
- 'db/**/*'
|
8
|
+
- 'script/**/*'
|
9
|
+
- 'tmp/**/*'
|
10
|
+
- 'log/**/*'
|
11
|
+
- 'doc/**/*'
|
12
|
+
- 'vendor/**/*'
|
13
|
+
|
14
|
+
Rails:
|
15
|
+
Enabled: true
|
16
|
+
|
17
|
+
RSpec/DescribedClass:
|
18
|
+
Enabled: false
|
19
|
+
|
20
|
+
Style/FrozenStringLiteralComment:
|
21
|
+
Enabled: false
|
22
|
+
|
23
|
+
Style/AlignHash:
|
24
|
+
EnforcedColonStyle: table
|
25
|
+
EnforcedHashRocketStyle: table
|
26
|
+
|
27
|
+
Style/IndentArray:
|
28
|
+
EnforcedStyle: consistent
|
29
|
+
|
30
|
+
Style/IndentHash:
|
31
|
+
EnforcedStyle: consistent
|
32
|
+
|
33
|
+
# FIXME: We need to settle on something and stick to it
|
34
|
+
Style/StringLiterals:
|
35
|
+
# EnforcedStyle: double_quotes
|
36
|
+
Enabled: false
|
37
|
+
|
38
|
+
Style/RedundantParentheses:
|
39
|
+
Enabled: false
|
40
|
+
|
41
|
+
Style/Documentation:
|
42
|
+
Enabled: false
|
43
|
+
|
44
|
+
Style/GlobalVars:
|
45
|
+
Enabled: false
|
46
|
+
|
47
|
+
Style/BracesAroundHashParameters:
|
48
|
+
Enabled: false
|
49
|
+
|
50
|
+
Metrics/LineLength:
|
51
|
+
Max: 115
|
52
|
+
|
53
|
+
Style/ConditionalAssignment:
|
54
|
+
Enabled: false
|
55
|
+
|
56
|
+
Style/IfUnlessModifier:
|
57
|
+
Enabled: false
|
58
|
+
|
59
|
+
Metrics/PerceivedComplexity:
|
60
|
+
Enabled: false
|
61
|
+
Severity: warning
|
62
|
+
Max: 14
|
63
|
+
|
64
|
+
Metrics/CyclomaticComplexity:
|
65
|
+
Enabled: false
|
66
|
+
Severity: warning
|
67
|
+
Max: 12
|
68
|
+
|
69
|
+
Metrics/ClassLength:
|
70
|
+
Enabled: false
|
71
|
+
Severity: warning
|
72
|
+
Max: 200
|
73
|
+
|
74
|
+
Metrics/ModuleLength:
|
75
|
+
Enabled: false
|
76
|
+
Severity: warning
|
77
|
+
Max: 200
|
78
|
+
|
79
|
+
Metrics/MethodLength:
|
80
|
+
Enabled: false
|
81
|
+
Severity: warning
|
82
|
+
Max: 50
|
83
|
+
|
84
|
+
# @see http://c2.com/cgi/wiki?AbcMetric
|
85
|
+
Metrics/AbcSize:
|
86
|
+
Enabled: false
|
87
|
+
Severity: warning
|
88
|
+
Max: 30
|
89
|
+
|
90
|
+
Lint/AssignmentInCondition:
|
91
|
+
Enabled: true
|
92
|
+
AllowSafeAssignment: false
|
93
|
+
|
94
|
+
Rails/Delegate:
|
95
|
+
Enabled: false
|
data/.ruby-version
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
2.3.0
|
data/Gemfile
ADDED
data/bin/envoy
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
file = File.symlink?(__FILE__) ? File.readlink(__FILE__) : __FILE__
|
3
|
+
$LOAD_PATH.push File.expand_path("../../lib", file)
|
4
|
+
|
5
|
+
trap "SIGINT" do
|
6
|
+
puts "\n████████ Exited ████████".red
|
7
|
+
exit 130
|
8
|
+
end
|
9
|
+
|
10
|
+
$thor_runner = true
|
11
|
+
|
12
|
+
require "envoy"
|
data/bin/envoy.bak
ADDED
@@ -0,0 +1,485 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'rubygems'
|
4
|
+
require 'commander/import'
|
5
|
+
require 'terminal-table'
|
6
|
+
require 'colorize'
|
7
|
+
require 'unirest'
|
8
|
+
require 'parseconfig'
|
9
|
+
require 'net/http'
|
10
|
+
require 'json'
|
11
|
+
require 'archive/zip'
|
12
|
+
require 'coderay'
|
13
|
+
require File.join(File.dirname(__FILE__), "../", "lib", "envoy_support")
|
14
|
+
|
15
|
+
program :name, 'Envoy'
|
16
|
+
program :version, '0.0.1'
|
17
|
+
program :description, 'Envoy developer CLI'
|
18
|
+
program :help, 'Author', 'David Boskovic'
|
19
|
+
program :help_formatter, :compact
|
20
|
+
|
21
|
+
global_option(
|
22
|
+
'--profile PROFILE',
|
23
|
+
String,
|
24
|
+
"If you use multiple developer accounts, this is for specifying the one you want to use."
|
25
|
+
)
|
26
|
+
|
27
|
+
trap "SIGINT" do
|
28
|
+
puts "Exiting"
|
29
|
+
exit 130
|
30
|
+
end
|
31
|
+
|
32
|
+
# make sure we can get a
|
33
|
+
if !File.exist?(Dir.home + '/.envoy-cfg')
|
34
|
+
file = File.open(Dir.home + '/.envoy-cfg', 'w')
|
35
|
+
config = ParseConfig.new
|
36
|
+
config.groups = ['default']
|
37
|
+
config.params = { 'default' => { 'access_token' => '', 'email' => '' } }
|
38
|
+
config.write(file)
|
39
|
+
file.close
|
40
|
+
else
|
41
|
+
config = ParseConfig.new Dir.home + '/.envoy-cfg'
|
42
|
+
end
|
43
|
+
|
44
|
+
$config = config
|
45
|
+
|
46
|
+
command :login do |c|
|
47
|
+
c.syntax = 'envoy login'
|
48
|
+
c.summary = 'Login with your envoy developer account.'
|
49
|
+
c.option '--local', String, 'Login to local only.'
|
50
|
+
c.option '--path PATH', String, 'URL to API for deploy'
|
51
|
+
c.action do |_args, options|
|
52
|
+
email = ask "Email: "
|
53
|
+
password = password "Password: "
|
54
|
+
res = Unirest.post(base_url(options, 'oauth/token', true), parameters: {
|
55
|
+
grant_type: 'password',
|
56
|
+
username: email,
|
57
|
+
password: password
|
58
|
+
})
|
59
|
+
handle_errors(res) unless res.code.between?(200, 299)
|
60
|
+
|
61
|
+
Unirest.post(base_url(options, './platform/developers', true), parameters: {
|
62
|
+
access_token: res.body['access_token']
|
63
|
+
})
|
64
|
+
# save user to config
|
65
|
+
if options.profile && !config.groups.include?(options.profile)
|
66
|
+
config.groups.push options.profile
|
67
|
+
end
|
68
|
+
conf = {
|
69
|
+
'email' => email,
|
70
|
+
'access_token' => res.body['access_token'],
|
71
|
+
}
|
72
|
+
if options.local
|
73
|
+
conf['local'] = true
|
74
|
+
end
|
75
|
+
if options.path
|
76
|
+
conf['api_path'] = options.path
|
77
|
+
end
|
78
|
+
config.params[profile(options)] = conf
|
79
|
+
file = File.open(Dir.home + '/.envoy-cfg', 'w')
|
80
|
+
config.write(file)
|
81
|
+
file.close
|
82
|
+
|
83
|
+
puts "You are now logged in.".green
|
84
|
+
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
# command :foo do |c|
|
89
|
+
# c.syntax = 'envoy foo'
|
90
|
+
# c.summary = 'Misc stuff'
|
91
|
+
# c.action do |args, options|
|
92
|
+
# if args[0]
|
93
|
+
# # @create dir if it doesn't already exist
|
94
|
+
# Dir.chdir args[0]
|
95
|
+
# end
|
96
|
+
# name = ask 'Plugin Name: '
|
97
|
+
|
98
|
+
# manifest = JSON.parse File.read(Dir.pwd+'/envoy-manifest.json')
|
99
|
+
# manifest['name'] = name
|
100
|
+
# file = File.open(Dir.pwd+'/envoy-manifest.json','w')
|
101
|
+
# file.write JSON.pretty_generate manifest
|
102
|
+
# file.close
|
103
|
+
# end
|
104
|
+
# end
|
105
|
+
|
106
|
+
command :'list plugins' do |c|
|
107
|
+
c.syntax = 'envoy list [options]'
|
108
|
+
c.summary = ''
|
109
|
+
c.action do |_args, options|
|
110
|
+
res = Unirest.get(base_url(options, './platform/plugins'), parameters: {
|
111
|
+
access_token: config[profile(options)]['access_token']
|
112
|
+
})
|
113
|
+
rows = []
|
114
|
+
res.body['data'].each do |plugin|
|
115
|
+
rows.push [plugin['attributes']['name'], plugin['attributes']['key'], plugin['attributes']['updated-at']]
|
116
|
+
end
|
117
|
+
puts Terminal::Table.new rows: rows, headings: ['Name', 'Key', 'Last Updated']
|
118
|
+
if res.body['data'].empty?
|
119
|
+
say_warning 'No plugins created for developer account: ' + config[profile(options)]['email']
|
120
|
+
end
|
121
|
+
end
|
122
|
+
end
|
123
|
+
|
124
|
+
command :'tail events' do |c|
|
125
|
+
c.syntax = 'envoy tail events [options]'
|
126
|
+
c.summary = ''
|
127
|
+
c.action do |_args, options|
|
128
|
+
l_config = local_config
|
129
|
+
token = plugin_uuid options
|
130
|
+
since = nil
|
131
|
+
entries = false
|
132
|
+
loop do
|
133
|
+
res = Unirest.get(base_url(options, './platform/events'), parameters: {
|
134
|
+
access_token: config[profile(options)]['access_token'],
|
135
|
+
plugin_id: token,
|
136
|
+
'filter[since]': since
|
137
|
+
})
|
138
|
+
unless res.body['data'].empty?
|
139
|
+
since = res.body['data'][0]['attributes']['created-at']
|
140
|
+
end
|
141
|
+
res.body['data'].reverse.each do |event|
|
142
|
+
if entries
|
143
|
+
puts "\n\n\n\n"
|
144
|
+
end
|
145
|
+
entries = true
|
146
|
+
print_event event
|
147
|
+
end
|
148
|
+
sleep(2)
|
149
|
+
end
|
150
|
+
end
|
151
|
+
end
|
152
|
+
|
153
|
+
command :release do |c|
|
154
|
+
c.syntax = 'envoy release <type> <base> [options]'
|
155
|
+
c.summary = 'This will release your plugin.'
|
156
|
+
c.option '--local', String, 'Deploys to local only.'
|
157
|
+
c.option '--retry', String, 'Deploys to local only.'
|
158
|
+
c.action do |args, options|
|
159
|
+
unless %w(patch minor major).include? args[0]
|
160
|
+
say_error("<#{args[0]}> is an invalid release type. Must be one of " \
|
161
|
+
"patch|minor|major.\nUse format: envoy release <type>")
|
162
|
+
exit
|
163
|
+
end
|
164
|
+
release_type = args[0]
|
165
|
+
token = plugin_uuid options
|
166
|
+
parsed = JSON.parse File.read(manifest_file(options))
|
167
|
+
manifest = parsed['manifest'] || {}
|
168
|
+
unless options.local
|
169
|
+
notes = ask "Release Notes:"
|
170
|
+
if !notes || notes.length < 10
|
171
|
+
say_error "Please provide at least a couple words about what this release is for."
|
172
|
+
exit
|
173
|
+
end
|
174
|
+
end
|
175
|
+
|
176
|
+
say 'Requesting deploy permissions...'
|
177
|
+
|
178
|
+
headers = {
|
179
|
+
'Content-Type': 'application/json',
|
180
|
+
'Authorization': "Bearer #{config[profile(options)]['access_token']}"
|
181
|
+
}
|
182
|
+
params = {
|
183
|
+
type: 'platform-releases',
|
184
|
+
attributes: {
|
185
|
+
manifest: manifest,
|
186
|
+
notes: notes || '',
|
187
|
+
provider: options.local && 'local' || 'lambda',
|
188
|
+
version_type: release_type,
|
189
|
+
version_base: args[1] || nil
|
190
|
+
},
|
191
|
+
relationships: {
|
192
|
+
plugin: {
|
193
|
+
data: {
|
194
|
+
type: 'platform-plugins',
|
195
|
+
id: token
|
196
|
+
}
|
197
|
+
}
|
198
|
+
}
|
199
|
+
}
|
200
|
+
if options.local
|
201
|
+
params[:attributes][:path] = Dir.pwd
|
202
|
+
end
|
203
|
+
res = Unirest.post(base_url(options, './platform/releases'), headers: headers, parameters: {data: params}.to_json)
|
204
|
+
handle_errors(res) unless res.code.between?(200, 299)
|
205
|
+
say_ok '✔ Received deploy permission.'
|
206
|
+
unless options.local
|
207
|
+
unless options.retry
|
208
|
+
say 'Packing your plugin...'
|
209
|
+
`grunt lambda_package`
|
210
|
+
say_ok '✔ Plugin has been packaged.'
|
211
|
+
else
|
212
|
+
say 'Using previously packaged plugin...'
|
213
|
+
end
|
214
|
+
files = Dir.glob("#{Dir.pwd}/dist/*_latest.zip")
|
215
|
+
uri = URI.parse(res.body['data']['attributes']['upload-to'])
|
216
|
+
request = Net::HTTP::Put.new(uri.request_uri)
|
217
|
+
request.body = File.open(files.first, 'rb', &:read)
|
218
|
+
|
219
|
+
http = Net::HTTP.new(uri.host, uri.port)
|
220
|
+
http.use_ssl = true
|
221
|
+
say 'Uploading...'
|
222
|
+
http.request(request)
|
223
|
+
say_ok '✔ Successfully uploaded your plugin package.'
|
224
|
+
end
|
225
|
+
say 'Deploying...'
|
226
|
+
release_id = res.body['data']['id']
|
227
|
+
ares = Unirest.post(
|
228
|
+
base_url(options, "./platform/releases/#{release_id.to_s}/complete"),
|
229
|
+
headers: headers
|
230
|
+
)
|
231
|
+
handle_errors(ares) unless ares.code.between?(200, 299)
|
232
|
+
say_ok '✔ Successfully deployed your plugin package.'
|
233
|
+
say 'Check out your new plugin at ' \
|
234
|
+
"\e[4m"+base_url(options, "/platform/#{res.body['data']['attributes']['plugin-key']}/welcome")+"\e[0m"
|
235
|
+
end
|
236
|
+
end
|
237
|
+
|
238
|
+
command :init do |c|
|
239
|
+
c.syntax = 'envoy init'
|
240
|
+
c.summary = 'Bootstrap a new plugin'
|
241
|
+
c.option '--bootstrap', String, 'Adds a prefix to bar'
|
242
|
+
c.action do |args, options|
|
243
|
+
options.default bootstrap: false
|
244
|
+
if args[0]
|
245
|
+
# @TODO create dir if it doesn't already exist
|
246
|
+
Dir.chdir args[0]
|
247
|
+
end
|
248
|
+
|
249
|
+
if File.exist?(Dir.pwd + '/envoy-manifest.json') || File.exist?(Dir.pwd + '/envoy-manifest-' + profile(options).downcase + '.json')
|
250
|
+
agree("It looks you've already created a plugin here. Would you like to register it? (y/n)") || exit
|
251
|
+
manifest = JSON.parse File.read(manifest_file(options))
|
252
|
+
name = manifest['name']
|
253
|
+
key = manifest['key']
|
254
|
+
else
|
255
|
+
agree("Are you sure you want to initialize a new plugin at #{Dir.pwd}? (y/n)") || exit
|
256
|
+
name = ask 'Plugin Name: '
|
257
|
+
key = ask 'Unique Key (lowercase [a-z0-9] only): '
|
258
|
+
end
|
259
|
+
|
260
|
+
if name.empty?
|
261
|
+
say_error("Invalid plugin name.") && exit
|
262
|
+
end
|
263
|
+
|
264
|
+
if key.empty?
|
265
|
+
say_error("Invalid plugin key.") && exit
|
266
|
+
end
|
267
|
+
|
268
|
+
res = Unirest.post(base_url(options, './platform/plugins'), parameters: {
|
269
|
+
access_token: config[profile(options)]['access_token'],
|
270
|
+
data: { type: 'platform-plugins', attributes: { name: name, key: key } }
|
271
|
+
})
|
272
|
+
|
273
|
+
if !res.code.between?(200, 299)
|
274
|
+
handle_errors res
|
275
|
+
else
|
276
|
+
if options.bootstrap
|
277
|
+
Archive::Zip.extract("#{Dir.home}/.envoy/packages/envoy-lambda-sandbox-master.zip", Dir.pwd)
|
278
|
+
FileUtils.cp_r "#{Dir.pwd}/envoy-lambda-sandbox-master/.", Dir.pwd
|
279
|
+
FileUtils.rm_r "#{Dir.pwd}/envoy-lambda-sandbox-master"
|
280
|
+
end
|
281
|
+
|
282
|
+
cf = !File.exist?(Dir.pwd + '/.env') ? ParseConfig.new : ParseConfig.new(Dir.pwd + '/.env')
|
283
|
+
cf.add "ENVOY_#{profile(options).upcase}_PLUGIN_UUID", res.body['data']['id'], true
|
284
|
+
file = File.open(Dir.pwd + '/.env', 'w')
|
285
|
+
cf.write(file, false)
|
286
|
+
file.close
|
287
|
+
|
288
|
+
manifest = JSON.parse File.read(manifest_file(options))
|
289
|
+
manifest['name'] = name
|
290
|
+
manifest['key'] = key
|
291
|
+
|
292
|
+
file = File.open(manifest_file(options), 'w')
|
293
|
+
file.write JSON.pretty_generate manifest
|
294
|
+
file.close
|
295
|
+
|
296
|
+
say_ok "✔ Your plugin is ready for development."
|
297
|
+
say "ℹ Run `npm install --global-style` before continuing." if options.bootstrap
|
298
|
+
end
|
299
|
+
end
|
300
|
+
end
|
301
|
+
|
302
|
+
command :sync do |c|
|
303
|
+
c.syntax = 'envoy sync [options]'
|
304
|
+
c.summary = 'Synchronize your manifest file with the server so that it can parse routes and trigger events.'
|
305
|
+
c.action do |_args, options|
|
306
|
+
l_config = local_config
|
307
|
+
token = plugin_uuid options
|
308
|
+
if !File.exist? Dir.pwd + '/envoy-manifest.json'
|
309
|
+
say_warning 'No envoy-manifest.json'
|
310
|
+
manifest = {}
|
311
|
+
else
|
312
|
+
manifest = JSON.parse File.read(Dir.pwd + '/envoy-manifest.json')
|
313
|
+
end
|
314
|
+
payload = { data: { type: 'platform-plugins', attributes: manifest } }
|
315
|
+
res = Unirest.put(
|
316
|
+
base_url(options, "./platform/plugins/#{token}"),
|
317
|
+
parameters: payload.to_json,
|
318
|
+
headers: {
|
319
|
+
'Content-Type': 'application/json',
|
320
|
+
Authorization: 'Bearer ' + (config[profile(options)]['access_token'])
|
321
|
+
}
|
322
|
+
)
|
323
|
+
if !res.code.between?(200, 299)
|
324
|
+
puts res.body
|
325
|
+
say_error 'Error syncing. Make sure you are logged in as the right user.'
|
326
|
+
else
|
327
|
+
say_ok 'Synced successfully'
|
328
|
+
end
|
329
|
+
end
|
330
|
+
end
|
331
|
+
|
332
|
+
command :rollback do |c|
|
333
|
+
c.syntax = 'envoy rollback [options]'
|
334
|
+
c.summary = ''
|
335
|
+
c.action do |args, options|
|
336
|
+
# @TODO: list 5 versions and allow selection of version
|
337
|
+
# @TODO: rollback last deploy (or rollback to specific version)
|
338
|
+
end
|
339
|
+
end
|
340
|
+
|
341
|
+
command :'list releases' do |c|
|
342
|
+
c.syntax = 'envoy list releases [options]'
|
343
|
+
c.summary = ''
|
344
|
+
c.action do |args, options|
|
345
|
+
# @TODO: list plugin releases
|
346
|
+
end
|
347
|
+
end
|
348
|
+
|
349
|
+
def handle_errors(res)
|
350
|
+
if res.body.instance_of?(Hash) && (res.body['errors'].nil? || res.body['errors'].empty?)
|
351
|
+
if res.body.dig('meta', 'message')
|
352
|
+
say_error res.body.dig('meta', 'message')
|
353
|
+
else
|
354
|
+
say_error 'Unkown error occured'
|
355
|
+
puts CodeRay.scan(JSON.pretty_generate(res.body), :json).terminal
|
356
|
+
end
|
357
|
+
elsif res.body.instance_of? String
|
358
|
+
say_error 'Unkown error occured'
|
359
|
+
if agree("View full response body? (y/n)")
|
360
|
+
ask_editor res.body
|
361
|
+
end
|
362
|
+
elsif res.body.instance_of?(Hash)
|
363
|
+
res.body['errors'].each do |err|
|
364
|
+
say_error err['detail']
|
365
|
+
end
|
366
|
+
else
|
367
|
+
say_error 'Unkown error occured'
|
368
|
+
puts res.body
|
369
|
+
end
|
370
|
+
exit
|
371
|
+
end
|
372
|
+
|
373
|
+
def base_url(options, path, ignore_profile = false)
|
374
|
+
local = false
|
375
|
+
profile = $config[profile(options)]
|
376
|
+
debug_val(options, ignore_profile, 'Ignore Profile?')
|
377
|
+
if !ignore_profile && profile['local']
|
378
|
+
local = true
|
379
|
+
end
|
380
|
+
if options.local
|
381
|
+
local = true
|
382
|
+
end
|
383
|
+
if local
|
384
|
+
if profile && profile['api_path_local']
|
385
|
+
base = profile['api_path_local']
|
386
|
+
else
|
387
|
+
base = 'http://localhost:3000'
|
388
|
+
end
|
389
|
+
else
|
390
|
+
if ignore_profile && options.path
|
391
|
+
base = options.path
|
392
|
+
elsif profile && profile['api_path']
|
393
|
+
base = profile['api_path']
|
394
|
+
else
|
395
|
+
base = 'https://app.envoy.com'
|
396
|
+
end
|
397
|
+
end
|
398
|
+
if path.start_with?('./')
|
399
|
+
path = 'api/v2/'+path[2..-1]
|
400
|
+
end
|
401
|
+
if path.start_with?('/')
|
402
|
+
path = path[1..-1]
|
403
|
+
end
|
404
|
+
if options.trace
|
405
|
+
debug options, 'URL', "#{base}/#{path}"
|
406
|
+
end
|
407
|
+
return "#{base}/#{path}"
|
408
|
+
end
|
409
|
+
|
410
|
+
def debug(options, df, text, extra = false)
|
411
|
+
if options.trace || options.debug
|
412
|
+
puts "#{df} -> #{text}"
|
413
|
+
end
|
414
|
+
end
|
415
|
+
|
416
|
+
def plugin_uuid(options)
|
417
|
+
uuid = local_config["ENVOY_#{profile(options).upcase}_PLUGIN_UUID"]
|
418
|
+
if !uuid
|
419
|
+
say_error 'No ENVOY_PLUGIN_UUID configuration.'
|
420
|
+
exit
|
421
|
+
end
|
422
|
+
uuid
|
423
|
+
end
|
424
|
+
|
425
|
+
def profile(options)
|
426
|
+
return debug_val(options, options.profile, 'Using Profile') if options.profile
|
427
|
+
cf = local_config
|
428
|
+
return debug_val(options, cf['ENVOY_PROFILE'], 'Using Profile') if cf['ENVOY_PROFILE']
|
429
|
+
return debug_val(options, 'default', 'Using Profile')
|
430
|
+
end
|
431
|
+
|
432
|
+
def manifest_file(options)
|
433
|
+
file = Dir.pwd + '/envoy-manifest-' + profile(options).downcase + '.json'
|
434
|
+
unless File.exist? file
|
435
|
+
file = Dir.pwd + '/envoy-manifest.json'
|
436
|
+
unless File.exist? file
|
437
|
+
say_error "Must have envoy-manifest.json or envoy-manifest-" + profile(options).downcase + '.json'
|
438
|
+
exit
|
439
|
+
end
|
440
|
+
end
|
441
|
+
debug_val options, file, 'Using Manifest File'
|
442
|
+
end
|
443
|
+
|
444
|
+
def local_config
|
445
|
+
return @local_config if @local_config
|
446
|
+
if !File.exist? Dir.pwd + '/.env'
|
447
|
+
say_error '.env configuration does not exist in this directory'
|
448
|
+
exit
|
449
|
+
end
|
450
|
+
@local_config = ParseConfig.new Dir.pwd + '/.env'
|
451
|
+
end
|
452
|
+
|
453
|
+
def debug_val(options, val, label)
|
454
|
+
debug options, label, val
|
455
|
+
val
|
456
|
+
end
|
457
|
+
|
458
|
+
def print_event(event)
|
459
|
+
puts "------------------------------------------------------------------------"
|
460
|
+
data = event['attributes']
|
461
|
+
puts "Event UUID => #{event['id']}".green
|
462
|
+
puts "Timestamp =>".yellow + " #{data['created-at']}"
|
463
|
+
puts "Task Time =>".yellow + " #{data['task-time']}ms"
|
464
|
+
puts "Execution Time =>".yellow + " #{data['process-time']}ms"
|
465
|
+
puts "\n"
|
466
|
+
puts "REQUEST META"
|
467
|
+
req_h = JSON.pretty_generate Envoy.min_json(data['request-meta'] || {})
|
468
|
+
puts CodeRay.scan(req_h, :json).terminal(line_numbers: :table)
|
469
|
+
puts "\n"
|
470
|
+
puts "REQUEST BODY"
|
471
|
+
req_h = JSON.pretty_generate Envoy.min_json(data['request-body'] || {})
|
472
|
+
puts CodeRay.scan(req_h, :json).terminal(line_numbers: :table)
|
473
|
+
puts "\n"
|
474
|
+
puts "REPONSE META"
|
475
|
+
req_h = JSON.pretty_generate Envoy.min_json(data['response-meta'] || {})
|
476
|
+
puts CodeRay.scan(req_h, :json).terminal(line_numbers: :table)
|
477
|
+
puts "\n"
|
478
|
+
puts "RESPONSE BODY"
|
479
|
+
req_h = JSON.pretty_generate Envoy.min_json(data['response-body'] || {})
|
480
|
+
puts CodeRay.scan(req_h, :json).terminal(line_numbers: :table)
|
481
|
+
puts "\n"
|
482
|
+
puts "LOG ENTRIES"
|
483
|
+
puts data['tail']
|
484
|
+
# puts data
|
485
|
+
end
|