nex_client 0.17.0 → 0.18.0.pre1
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/lib/nex_client.rb +6 -0
- data/lib/nex_client/addon.rb +15 -0
- data/lib/nex_client/app.rb +4 -0
- data/lib/nex_client/base_resource.rb +15 -0
- data/lib/nex_client/cli.rb +35 -124
- data/lib/nex_client/commands.rb +5 -0
- data/lib/nex_client/commands/addons.rb +11 -31
- data/lib/nex_client/commands/apps.rb +8 -44
- data/lib/nex_client/commands/cube_instances.rb +0 -21
- data/lib/nex_client/commands/events.rb +60 -0
- data/lib/nex_client/commands/helpers.rb +0 -50
- data/lib/nex_client/commands/ip_whitelisting.rb +124 -0
- data/lib/nex_client/commands/logs.rb +58 -0
- data/lib/nex_client/commands/policies.rb +184 -0
- data/lib/nex_client/commands/waf.rb +134 -0
- data/lib/nex_client/cube_instance.rb +9 -0
- data/lib/nex_client/exec_cmd.rb +17 -0
- data/lib/nex_client/faraday_middleware.rb +8 -0
- data/lib/nex_client/faraday_middleware/handle_nex_api_errors.rb +39 -0
- data/lib/nex_client/version.rb +1 -1
- data/spec/nex_client/app_spec.rb +2 -0
- data/spec/nex_client/cube_instance_spec.rb +2 -0
- data/spec/nex_client/exec_cmd_spec.rb +14 -0
- data/spec/shared/base_resource.rb +38 -0
- data/spec/spec_helper.rb +8 -53
- data/spec/support/is_expected_block.rb +5 -0
- metadata +19 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 66bd6974504b943354286cb011099b8253e2556b
|
4
|
+
data.tar.gz: 35dccc4896e4a3b77903803fcde4f828b4254d88
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: cec6f39591d8d9fcdc00b5f5c6c263c488daefa1cd537a15f7cefbaac547fd9e0c617f77e7a460c4eab26c7f755e7ba2062742b25903ce340eb38f18fbb52e61
|
7
|
+
data.tar.gz: 41b075642837ce12f28bb4da41695b327fe68c6e02429cd29cc9401d9486c01ee91db32a051ccb65d8a31ff2a259e794e6b7ae23802b750cbd8e0bfd0b9414d4
|
data/lib/nex_client.rb
CHANGED
@@ -2,6 +2,7 @@
|
|
2
2
|
require 'json_api_client'
|
3
3
|
require 'active_support/all'
|
4
4
|
require 'nex_client/version'
|
5
|
+
require 'nex_client/faraday_middleware'
|
5
6
|
require 'launchy'
|
6
7
|
|
7
8
|
module NexClient
|
@@ -13,6 +14,7 @@ module NexClient
|
|
13
14
|
autoload :CubeTemplate, 'nex_client/cube_template'
|
14
15
|
autoload :Domain, 'nex_client/domain'
|
15
16
|
autoload :Event, 'nex_client/event'
|
17
|
+
autoload :ExecCmd, 'nex_client/exec_cmd'
|
16
18
|
autoload :ExecTask, 'nex_client/exec_task'
|
17
19
|
autoload :GatewayRack, 'nex_client/gateway_rack'
|
18
20
|
autoload :Me, 'nex_client/me'
|
@@ -21,4 +23,8 @@ module NexClient
|
|
21
23
|
autoload :SslCertificate, 'nex_client/ssl_certificate'
|
22
24
|
autoload :StorageRack, 'nex_client/storage_rack'
|
23
25
|
autoload :User, 'nex_client/user'
|
26
|
+
|
27
|
+
def self.interactive?
|
28
|
+
defined?(NexClient::Cli) && ENV['NEX_ENV'] != 'test'
|
29
|
+
end
|
24
30
|
end
|
data/lib/nex_client/addon.rb
CHANGED
@@ -15,5 +15,20 @@ module NexClient
|
|
15
15
|
|
16
16
|
# PATCH <api_root>/addons/:id/scale_down
|
17
17
|
custom_endpoint :scale_down, on: :member, request_method: :patch
|
18
|
+
|
19
|
+
def self.main_key
|
20
|
+
:name
|
21
|
+
end
|
22
|
+
|
23
|
+
def preferred_region
|
24
|
+
super
|
25
|
+
rescue
|
26
|
+
NexClient::Addon.includes(:app)
|
27
|
+
.with_params(fields: { apps: :preferred_region })
|
28
|
+
.find(id)
|
29
|
+
.first
|
30
|
+
.app
|
31
|
+
.preferred_region
|
32
|
+
end
|
18
33
|
end
|
19
34
|
end
|
data/lib/nex_client/app.rb
CHANGED
@@ -24,6 +24,10 @@ module NexClient
|
|
24
24
|
# GET <api_root>/apps/:id/logs
|
25
25
|
custom_endpoint :logs, on: :member, request_method: :get
|
26
26
|
|
27
|
+
def self.main_key
|
28
|
+
:name
|
29
|
+
end
|
30
|
+
|
27
31
|
def preferred_url
|
28
32
|
domain = self.domains.first rescue NexClient::Domain.find('origin.name' => self.name).first
|
29
33
|
if domain
|
@@ -12,10 +12,25 @@ module NexClient
|
|
12
12
|
API_HOST = ENV['NEX_ENDPOINT'] || HOST_MAPPING[ENVIRONMENT]
|
13
13
|
|
14
14
|
self.site = "#{API_HOST}#{API_ROOT_PATH}"
|
15
|
+
|
16
|
+
def self.entities_name
|
17
|
+
entity_name.pluralize
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.entity_name
|
21
|
+
to_s.split('::').last.parameterize
|
22
|
+
end
|
23
|
+
|
24
|
+
def self.main_key
|
25
|
+
:id
|
26
|
+
end
|
15
27
|
end
|
16
28
|
end
|
17
29
|
|
18
30
|
NexClient::BaseResource.connection do |connection|
|
19
31
|
# Set Auth
|
20
32
|
connection.use Faraday::Request::BasicAuthentication, ENV['NEX_API_KEY'], ''
|
33
|
+
|
34
|
+
# Handle Response Errors including MFA authentication errors
|
35
|
+
connection.use NexClient::FaradayMiddleware::HandleNexApiErrors
|
21
36
|
end
|
data/lib/nex_client/cli.rb
CHANGED
@@ -38,7 +38,6 @@ module NexClient
|
|
38
38
|
c.example 'create redis addon for myapp', 'nex-cli addons:create redis myapp'
|
39
39
|
c.option '--size SIZE', Integer, 'specify container size (default: 2, min: 1, max: 20). Container will have N shares of CPU and N*128M of memory.'
|
40
40
|
c.option '--http-log-drain DRAIN_URL', String, 'specify the URL of a remote log drain'
|
41
|
-
c.option '--region-balancing REGIONS', String, 'specify how the addon should be proportionally distributed geographically. E.g. "all" or "ap-southeast-1,us-west-2" or "ap-southeast-1=1,us-west-2=2".'
|
42
41
|
c.action do |args, options|
|
43
42
|
NexClient::Commands::Addons.create(args,options)
|
44
43
|
end
|
@@ -68,16 +67,7 @@ module NexClient
|
|
68
67
|
end
|
69
68
|
|
70
69
|
command :'addons:events' do |c|
|
71
|
-
c
|
72
|
-
c.summary = 'Gather system events'
|
73
|
-
c.description = 'Gather system events for a given addon'
|
74
|
-
c.example 'display events for myaddon', 'nex-cli addons:events myaddon'
|
75
|
-
c.example 'display 100 events for myaddon', 'nex-cli addons:events --tail 100 myaddon'
|
76
|
-
c.option '--tail NUMBER', String, 'number of events to retrieve (default: 50)'
|
77
|
-
c.option '--type TYPE', String, 'filter events on type (e.g. status, container)'
|
78
|
-
c.action do |args, options|
|
79
|
-
NexClient::Commands::Addons.events(args,options)
|
80
|
-
end
|
70
|
+
NexClient::Commands::Events.configure(c, NexClient::Addon)
|
81
71
|
end
|
82
72
|
|
83
73
|
command :'addons:info' do |c|
|
@@ -92,15 +82,7 @@ module NexClient
|
|
92
82
|
end
|
93
83
|
|
94
84
|
command :'addons:logs' do |c|
|
95
|
-
c
|
96
|
-
c.summary = 'Gather addon logs'
|
97
|
-
c.description = 'Gather container logs for a given addon'
|
98
|
-
c.example 'gather logs for myaddon', 'nex-cli addons:logs myaddon'
|
99
|
-
c.example 'gather logs for myapp with a tail of 50', 'nex-cli addons:logs --tail 50 myaddon'
|
100
|
-
c.option '--tail NUMBER', String, 'number of lines to retrieve for each container'
|
101
|
-
c.action do |args, options|
|
102
|
-
NexClient::Commands::Addons.logs(args,options)
|
103
|
-
end
|
85
|
+
NexClient::Commands::Logs.configure(c, NexClient::Addon)
|
104
86
|
end
|
105
87
|
|
106
88
|
command :'addons:restart' do |c|
|
@@ -136,17 +118,17 @@ module NexClient
|
|
136
118
|
end
|
137
119
|
end
|
138
120
|
|
121
|
+
command :'addons:policies' do |c|
|
122
|
+
NexClient::Commands::Policies.configure(c, NexClient::Addon)
|
123
|
+
end
|
124
|
+
|
139
125
|
command :'addons:update' do |c|
|
140
126
|
c.syntax = 'nex-cli addons:update ADDON_NAME [options]'
|
141
127
|
c.summary = 'Update addon settings'
|
142
128
|
c.description = 'Update addon settings'
|
143
129
|
c.example 'change container size to 4', 'nex-cli addons:update myaddon --size 4'
|
144
|
-
c.example 'balance containers equally between regions', 'nex-cli apps:update myapp --region-balancing="ap-southeast-1,us-west-2"'
|
145
|
-
c.example 'deploy more containers in one region', 'nex-cli apps:update myapp --region-balancing="ap-southeast-1=1,us-west-2=2"'
|
146
|
-
c.example 'scale containers across all regions', 'nex-cli apps:update myapp --region-balancing=all'
|
147
130
|
c.option '--size SIZE', Integer, 'change container size (default: 2, min: 1, max: 20). Container will have N shares of CPU and N*128M of memory. [restart required]'
|
148
131
|
c.option '--http-log-drain DRAIN_URL', String, 'specify the URL of a remote log drain. [restart required]'
|
149
|
-
c.option '--region-balancing REGIONS', String, 'specify how scalability should be handled per region. E.g. "all" or "ap-southeast-1,us-west-2" or "ap-southeast-1=1,us-west-2=2".'
|
150
132
|
c.action do |args, options|
|
151
133
|
NexClient::Commands::Addons.update(args,options)
|
152
134
|
end
|
@@ -189,7 +171,6 @@ module NexClient
|
|
189
171
|
c.option '--desc DESCRIPTION', String, 'description for this application (140 characters max)'
|
190
172
|
c.option '--tags TAG_LIST', Array, 'comma separated list of tags describing this app'
|
191
173
|
c.option '--region REGION', String, 'default region to use deploy/scale this application'
|
192
|
-
c.option '--region-balancing REGIONS', String, 'specify how scalability should be handled per region. E.g. "all" or "ap-southeast-1,us-west-2" or "ap-southeast-1=1,us-west-2=2".'
|
193
174
|
c.action do |args, options|
|
194
175
|
NexClient::Commands::Apps.create(args,options)
|
195
176
|
end
|
@@ -219,16 +200,7 @@ module NexClient
|
|
219
200
|
end
|
220
201
|
|
221
202
|
command :'apps:events' do |c|
|
222
|
-
c
|
223
|
-
c.summary = 'Gather system events'
|
224
|
-
c.description = 'Gather system events for a given app'
|
225
|
-
c.example 'display events for myapp', 'nex-cli apps:events myapp'
|
226
|
-
c.example 'display 100 events for myapp', 'nex-cli apps:events --tail 100 myapp'
|
227
|
-
c.option '--tail NUMBER', String, 'number of events to retrieve (default: 50)'
|
228
|
-
c.option '--type TYPE', String, 'filter events on type (e.g. status, container)'
|
229
|
-
c.action do |args, options|
|
230
|
-
NexClient::Commands::Apps.events(args,options)
|
231
|
-
end
|
203
|
+
NexClient::Commands::Events.configure(c, NexClient::App)
|
232
204
|
end
|
233
205
|
|
234
206
|
command :'apps:info' do |c|
|
@@ -242,16 +214,12 @@ module NexClient
|
|
242
214
|
end
|
243
215
|
end
|
244
216
|
|
217
|
+
command :'apps:ip-rules' do |c|
|
218
|
+
NexClient::Commands::IpWhitelisting.configure(c)
|
219
|
+
end
|
220
|
+
|
245
221
|
command :'apps:logs' do |c|
|
246
|
-
c
|
247
|
-
c.summary = 'Gather app logs'
|
248
|
-
c.description = 'Gather container logs for a given app'
|
249
|
-
c.example 'gather logs for myapp', 'nex-cli apps:logs myapp'
|
250
|
-
c.example 'gather logs for myapp with a tail of 50', 'nex-cli apps:logs --tail 50 myapp'
|
251
|
-
c.option '--tail NUMBER', String, 'number of lines to retrieve for each container'
|
252
|
-
c.action do |args, options|
|
253
|
-
NexClient::Commands::Apps.logs(args,options)
|
254
|
-
end
|
222
|
+
NexClient::Commands::Logs.configure(c, NexClient::App)
|
255
223
|
end
|
256
224
|
|
257
225
|
command :'apps:restart' do |c|
|
@@ -316,6 +284,20 @@ module NexClient
|
|
316
284
|
end
|
317
285
|
end
|
318
286
|
|
287
|
+
command :'apps:open' do |c|
|
288
|
+
c.syntax = 'nex-cli apps:open APP_NAME'
|
289
|
+
c.summary = 'Open app url'
|
290
|
+
c.description = 'Open app in your browser'
|
291
|
+
c.example 'open app for myapp', 'nex-cli apps:open myapp'
|
292
|
+
c.action do |args, options|
|
293
|
+
NexClient::Commands::Apps.open(args,options)
|
294
|
+
end
|
295
|
+
end
|
296
|
+
|
297
|
+
command :'apps:policies' do |c|
|
298
|
+
NexClient::Commands::Policies.configure(c, NexClient::App)
|
299
|
+
end
|
300
|
+
|
319
301
|
command :'apps:up' do |c|
|
320
302
|
c.syntax = 'nex-cli apps:up APP_NAME [options]'
|
321
303
|
c.summary = 'Scale applications up'
|
@@ -337,71 +319,23 @@ module NexClient
|
|
337
319
|
|
338
320
|
Log drain:
|
339
321
|
----------
|
340
|
-
|
341
|
-
|
322
|
+
Use: --http-log-drain DRAIN_URL
|
323
|
+
The log drain is a HTTP(s) URL where application logs will be POSTed.
|
342
324
|
|
343
325
|
Default region:
|
344
326
|
---------------
|
345
|
-
|
346
|
-
|
347
|
-
|
348
|
-
|
349
|
-
Geo-Balancing:
|
350
|
-
---------------
|
351
|
-
Use: --region-balancing REGIONS
|
352
|
-
Specify how your containers should be distributed across the available Nex!™ regions. This is only relevant when the Nex!™ platform has been deployed
|
353
|
-
in multiple regions.
|
354
|
-
|
355
|
-
Options are the following:
|
356
|
-
- evenly distribute across all regions: --region-balancing=all
|
357
|
-
- eventy distribute across specified regions: --region-balancing="ap-southeast-1,us-west-2"
|
358
|
-
- distribute with relative weights: --region-balancing="ap-southeast-1=1,us-west-2=2"
|
359
|
-
|
360
|
-
Web Application Firewall (WAF)
|
361
|
-
------------------------------
|
362
|
-
Use: --waf-rules [PATH]
|
363
|
-
Specify a JSON (.json) or YAML (.yml) file describing the security rules to apply/ignore. If no files are specified you will be prompted to
|
364
|
-
paste rules in JSON format in the terminal.
|
365
|
-
The WAF always runs in SIMULATE mode by default - this means security events will be logged but no requests will be blocked.
|
366
|
-
|
367
|
-
The list of base rules applied by default is available here: https://github.com/p0pr0ck5/lua-resty-waf/tree/master/rules
|
368
|
-
|
369
|
-
The base WAF behaviour can be extended by passing a JSON (or YAML) manifest to '--waf-rules' with the following format:
|
370
|
-
{
|
371
|
-
// Whether the WAF should be enabled, disabled or do log-only
|
372
|
-
// 'ACTIVE', 'INACTIVE' or 'SIMULATE'
|
373
|
-
"mode": "SIMULATE",
|
374
|
-
|
375
|
-
// Array of rule IDs to ignore
|
376
|
-
"ignore_rule": [],
|
377
|
-
|
378
|
-
// Array of rulesets to ignore
|
379
|
-
"ignore_ruleset": [],
|
380
|
-
|
381
|
-
// Array of ['rulename','rule'] objects
|
382
|
-
"add_ruleset_string": [],
|
383
|
-
|
384
|
-
// Rules sieves allow you to apply/ignore rules based on a
|
385
|
-
// specific context such as request parameters
|
386
|
-
// Array of ['rule_id', [{ sieve_cond }, { sieve_cond }] ] objects
|
387
|
-
"sieve_rule": []
|
388
|
-
}
|
389
|
-
See this for more info: https://github.com/p0pr0ck5/lua-resty-waf
|
390
|
-
See this for rule sieves: https://github.com/p0pr0ck5/lua-resty-waf/wiki/Rule-Sieves
|
327
|
+
Use: --region REGION
|
328
|
+
Containers will be deployed in the specified region by default if no region-balancing
|
329
|
+
policies have been specified. This is only relevant when the Nex!™ platform has been deployed in multiple regions.
|
391
330
|
|
392
331
|
HEREDOC
|
393
332
|
c.example 'change container size to 4', 'nex-cli apps:update myapp --size 4'
|
394
|
-
c.example 'balance containers equally between regions', 'nex-cli apps:update myapp --region-balancing="ap-southeast-1,us-west-2"'
|
395
|
-
c.example 'deploy more containers in one region', 'nex-cli apps:update myapp --region-balancing="ap-southeast-1=1,us-west-2=2"'
|
396
|
-
c.example 'scale containers across all regions', 'nex-cli apps:update myapp --region-balancing=all'
|
397
333
|
c.option '--desc DESCRIPTION', String, 'update the application description'
|
398
334
|
c.option '--http-log-drain DRAIN_URL', String, 'specify the URL of a remote log drain. [restart required]'
|
399
335
|
c.option '--image-tag IMAGE_TAG', String, 'update the docker image tag [restart required]'
|
400
336
|
c.option '--size SIZE', Integer, 'change container size (default: 2, min: 1, max: 20). Container will have N shares of CPU and N*128M of memory. [restart required]'
|
401
337
|
c.option '--tags TAG_LIST', String, 'comma separated list of tags to use to describe the app'
|
402
338
|
c.option '--region REGION', String, 'default region to use deploy/scale this application'
|
403
|
-
c.option '--region-balancing REGIONS', String, 'specify how the app should be proportionally distributed geographically. E.g. "all" or "ap-southeast-1,us-west-2" or "ap-southeast-1=1,us-west-2=2". [restart required]'
|
404
|
-
c.option '--waf-rules [PATH]', String, 'specify web application firewall rules using JSON or YAML file (prompt will appear otherwise). [restart required]'
|
405
339
|
c.action do |args, options|
|
406
340
|
NexClient::Commands::Apps.update(args,options)
|
407
341
|
end
|
@@ -429,14 +363,8 @@ module NexClient
|
|
429
363
|
end
|
430
364
|
end
|
431
365
|
|
432
|
-
command :'apps:
|
433
|
-
c
|
434
|
-
c.summary = 'Open app url'
|
435
|
-
c.description = 'Open app in your browser'
|
436
|
-
c.example 'open app for myapp', 'nex-cli apps:open myapp'
|
437
|
-
c.action do |args, options|
|
438
|
-
NexClient::Commands::Apps.open(args,options)
|
439
|
-
end
|
366
|
+
command :'apps:waf' do |c|
|
367
|
+
NexClient::Commands::Waf.configure(c)
|
440
368
|
end
|
441
369
|
|
442
370
|
command :certs do |c|
|
@@ -509,16 +437,7 @@ module NexClient
|
|
509
437
|
end
|
510
438
|
|
511
439
|
command :'cubes:events' do |c|
|
512
|
-
c
|
513
|
-
c.summary = 'Gather system events'
|
514
|
-
c.description = 'Gather system events for a given cube'
|
515
|
-
c.example 'display events for mycube', 'nex-cli cubes:events mycube'
|
516
|
-
c.example 'display 100 events for mycube', 'nex-cli cubes:events --tail 100 mycube'
|
517
|
-
c.option '--tail NUMBER', String, 'number of events to retrieve (default: 50)'
|
518
|
-
c.option '--type TYPE', String, 'filter events on type (e.g. status, container)'
|
519
|
-
c.action do |args, options|
|
520
|
-
NexClient::Commands::CubeInstances.events(args,options)
|
521
|
-
end
|
440
|
+
NexClient::Commands::Events.configure(c, NexClient::CubeInstance)
|
522
441
|
end
|
523
442
|
|
524
443
|
command :'cubes:info' do |c|
|
@@ -532,15 +451,7 @@ module NexClient
|
|
532
451
|
end
|
533
452
|
|
534
453
|
command :'cubes:logs' do |c|
|
535
|
-
c
|
536
|
-
c.summary = 'Gather cube logs'
|
537
|
-
c.description = 'Gather container logs for a given cube'
|
538
|
-
c.example 'gather logs for mycube', 'nex-cli cubes:logs mycube'
|
539
|
-
c.example 'gather logs for mycube with a tail of 50', 'nex-cli cubes:logs --tail 50 mycube'
|
540
|
-
c.option '--tail NUMBER', String, 'number of lines to retrieve (default: 30)'
|
541
|
-
c.action do |args, options|
|
542
|
-
NexClient::Commands::CubeInstances.logs(args,options)
|
543
|
-
end
|
454
|
+
NexClient::Commands::Logs.configure(c, NexClient::CubeInstance)
|
544
455
|
end
|
545
456
|
|
546
457
|
command :'cubes:restart' do |c|
|
data/lib/nex_client/commands.rb
CHANGED
@@ -8,11 +8,16 @@ module NexClient
|
|
8
8
|
autoload :CubeInstances, 'nex_client/commands/cube_instances'
|
9
9
|
autoload :CubeTemplates, 'nex_client/commands/cube_templates'
|
10
10
|
autoload :Domains, 'nex_client/commands/domains'
|
11
|
+
autoload :Events, 'nex_client/commands/events'
|
11
12
|
autoload :ExecTasks, 'nex_client/commands/exec_tasks'
|
12
13
|
autoload :Helpers, 'nex_client/commands/helpers'
|
14
|
+
autoload :IpWhitelisting, 'nex_client/commands/ip_whitelisting'
|
15
|
+
autoload :Logs, 'nex_client/commands/logs'
|
13
16
|
autoload :Organizations, 'nex_client/commands/organizations'
|
17
|
+
autoload :Policies, 'nex_client/commands/policies'
|
14
18
|
autoload :Racks, 'nex_client/commands/racks'
|
15
19
|
autoload :SslCertificates, 'nex_client/commands/ssl_certificates'
|
16
20
|
autoload :Users, 'nex_client/commands/users'
|
21
|
+
autoload :Waf, 'nex_client/commands/waf'
|
17
22
|
end
|
18
23
|
end
|
@@ -60,21 +60,6 @@ module NexClient
|
|
60
60
|
Apps.display_apps(e.app)
|
61
61
|
end
|
62
62
|
|
63
|
-
def self.logs(args,opts)
|
64
|
-
name = args.first
|
65
|
-
e = NexClient::Addon.find(name: name).first
|
66
|
-
|
67
|
-
# Display error
|
68
|
-
unless e
|
69
|
-
error("Error! Could not find addon: #{name}")
|
70
|
-
return false
|
71
|
-
end
|
72
|
-
|
73
|
-
# Retrieve logs and display them
|
74
|
-
logs = e.logs(tail: opts.tail).first
|
75
|
-
self.display_logs(logs.log_ret)
|
76
|
-
end
|
77
|
-
|
78
63
|
# SSH to the addon
|
79
64
|
def self.ssh(args,opts)
|
80
65
|
name = args.first
|
@@ -105,8 +90,8 @@ module NexClient
|
|
105
90
|
attrs[:service] = svc_name
|
106
91
|
attrs[:container_size] = opts.size if opts.size.present?
|
107
92
|
|
108
|
-
#
|
109
|
-
attrs[:opts] =
|
93
|
+
# Option: http_log_drain
|
94
|
+
attrs[:opts] = { 'http_log_drain' => opts.http_log_drain } if opts.http_log_drain.present?
|
110
95
|
|
111
96
|
addon = NexClient::Addon.new(attrs)
|
112
97
|
addon.relationships.attributes = { app: { data: { type: 'apps', id: app.id } } }
|
@@ -136,9 +121,11 @@ module NexClient
|
|
136
121
|
attrs = {}
|
137
122
|
attrs[:container_size] = opts.size if opts.size.present?
|
138
123
|
|
139
|
-
#
|
140
|
-
|
141
|
-
|
124
|
+
# Option: http_log_drain
|
125
|
+
if opts.http_log_drain.present?
|
126
|
+
attrs[:opts] = (e.opts || {}).dup
|
127
|
+
attrs[:opts]['http_log_drain'] = opts.http_log_drain
|
128
|
+
end
|
142
129
|
|
143
130
|
# Update
|
144
131
|
e.update_attributes(attrs)
|
@@ -240,7 +227,10 @@ module NexClient
|
|
240
227
|
def self.display_options(list)
|
241
228
|
table = Terminal::Table.new title: OPTS_TITLE, headings: OPTS_HEADERS do |t|
|
242
229
|
[list].flatten.compact.each do |e|
|
243
|
-
e.each
|
230
|
+
e.each do |k,v|
|
231
|
+
val = v.is_a?(Hash) || v.is_a?(Array) ? JSON.pretty_generate(v) : v
|
232
|
+
t.add_row([k,val])
|
233
|
+
end
|
244
234
|
end
|
245
235
|
end
|
246
236
|
puts table
|
@@ -269,16 +259,6 @@ module NexClient
|
|
269
259
|
return '-' unless record.node_count && record.max_node_count
|
270
260
|
"#{record.node_count}/#{record.max_node_count}"
|
271
261
|
end
|
272
|
-
|
273
|
-
def self.extract_config_options(cli_opts)
|
274
|
-
hash = {}
|
275
|
-
%w(http_log_drain region_balancing).each do |opt_name|
|
276
|
-
if cli_opts.method_missing(opt_name.to_sym).present?
|
277
|
-
hash[opt_name.to_s] = cli_opts.method_missing(opt_name.to_sym)
|
278
|
-
end
|
279
|
-
end
|
280
|
-
return hash
|
281
|
-
end
|
282
262
|
end
|
283
263
|
end
|
284
264
|
end
|
@@ -92,22 +92,6 @@ module NexClient
|
|
92
92
|
Launchy.open(url)
|
93
93
|
end
|
94
94
|
|
95
|
-
# Retrieve application logs from all containers
|
96
|
-
def self.logs(args,opts)
|
97
|
-
name = args.first
|
98
|
-
e = NexClient::App.find(name: name).first
|
99
|
-
|
100
|
-
# Display error
|
101
|
-
unless e
|
102
|
-
error("Error! Could not find app: #{name}")
|
103
|
-
return false
|
104
|
-
end
|
105
|
-
|
106
|
-
# Retrieve logs and display them
|
107
|
-
logs = e.logs(tail: opts.tail).first
|
108
|
-
self.display_logs(logs.log_ret)
|
109
|
-
end
|
110
|
-
|
111
95
|
# SSH to the app
|
112
96
|
def self.ssh(args,opts)
|
113
97
|
name = args.first
|
@@ -135,8 +119,8 @@ module NexClient
|
|
135
119
|
attrs[:tag_list] = opts.tags if opts.tags.present?
|
136
120
|
attrs[:preferred_region] = opts.region if opts.region.present?
|
137
121
|
|
138
|
-
#
|
139
|
-
attrs[:opts] =
|
122
|
+
# Option: http_log_drain
|
123
|
+
attrs[:opts] = { 'http_log_drain' => opts.http_log_drain } if opts.http_log_drain.present?
|
140
124
|
|
141
125
|
# Env variables via command line
|
142
126
|
if opts.env.present?
|
@@ -199,20 +183,10 @@ module NexClient
|
|
199
183
|
attrs[:image_tag] = opts.image_tag if opts.image_tag.present?
|
200
184
|
attrs[:preferred_region] = opts.region if opts.region.present?
|
201
185
|
|
202
|
-
#
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
if opts.waf_rules
|
207
|
-
waf_rules = begin
|
208
|
-
if opts.waf_rules.is_a?(String)
|
209
|
-
hash_from_file(opts.waf_rules)
|
210
|
-
else
|
211
|
-
val = ask("Copy/paste your WAF configuration below in JSON format:") { |q| q.gather = "" }
|
212
|
-
JSON.parse(val.join(""))
|
213
|
-
end
|
214
|
-
end
|
215
|
-
attrs[:opts]['waf_rules'] = waf_rules
|
186
|
+
# Option: http_log_drain
|
187
|
+
if opts.http_log_drain.present?
|
188
|
+
attrs[:opts] = (e.opts || {}).dup
|
189
|
+
attrs[:opts]['http_log_drain'] = opts.http_log_drain
|
216
190
|
end
|
217
191
|
|
218
192
|
# Update
|
@@ -445,7 +419,7 @@ module NexClient
|
|
445
419
|
table = Terminal::Table.new title: OPTS_TITLE, headings: OPTS_HEADERS, style: { all_separators: true} do |t|
|
446
420
|
[list].flatten.compact.each do |e|
|
447
421
|
e.each do |k,v|
|
448
|
-
val = v.is_a?(Hash) ? JSON.pretty_generate(v) : v
|
422
|
+
val = v.is_a?(Hash) || v.is_a?(Array) ? JSON.pretty_generate(v) : v
|
449
423
|
t.add_row([k,val])
|
450
424
|
end
|
451
425
|
end
|
@@ -453,7 +427,7 @@ module NexClient
|
|
453
427
|
puts table
|
454
428
|
puts "\n"
|
455
429
|
end
|
456
|
-
|
430
|
+
|
457
431
|
def self.display_scm(list)
|
458
432
|
table = Terminal::Table.new title: SCM_TITLE, headings: SCM_HEADERS do |t|
|
459
433
|
[list].flatten.compact.each do |e|
|
@@ -495,16 +469,6 @@ module NexClient
|
|
495
469
|
return '-' unless record.node_count && record.max_node_count
|
496
470
|
"#{record.node_count}/#{record.max_node_count}"
|
497
471
|
end
|
498
|
-
|
499
|
-
def self.extract_config_options(cli_opts)
|
500
|
-
hash = {}
|
501
|
-
%w(http_log_drain region_balancing).each do |opt_name|
|
502
|
-
if cli_opts.method_missing(opt_name.to_sym).present?
|
503
|
-
hash[opt_name.to_s] = cli_opts.method_missing(opt_name.to_sym)
|
504
|
-
end
|
505
|
-
end
|
506
|
-
return hash
|
507
|
-
end
|
508
472
|
end
|
509
473
|
end
|
510
474
|
end
|