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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 08b088941d2119c0e8b7e1e61bdcf74dd622ba60
4
- data.tar.gz: acf4d046a21edeb0e95873c7dfbeda06e25df751
3
+ metadata.gz: 66bd6974504b943354286cb011099b8253e2556b
4
+ data.tar.gz: 35dccc4896e4a3b77903803fcde4f828b4254d88
5
5
  SHA512:
6
- metadata.gz: e39b32c047894a572757b5b90317ad1d0dfc9f78f27a4ffe3db123266539ae0924ee5632b0a88c223f778fd4b0c8e97efcf6a64abedd40a3f8434f9982cddcf6
7
- data.tar.gz: bad64e27e601910f2445c6247f63aa7bddd669bb5409fbc592262e901908dc71030b313c613ad10047d2b1d5e523ddf5f679aee67a9c1c3d22e8300a630aa208
6
+ metadata.gz: cec6f39591d8d9fcdc00b5f5c6c263c488daefa1cd537a15f7cefbaac547fd9e0c617f77e7a460c4eab26c7f755e7ba2062742b25903ce340eb38f18fbb52e61
7
+ data.tar.gz: 41b075642837ce12f28bb4da41695b327fe68c6e02429cd29cc9401d9486c01ee91db32a051ccb65d8a31ff2a259e794e6b7ae23802b750cbd8e0bfd0b9414d4
@@ -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
@@ -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
@@ -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
@@ -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.syntax = 'nex-cli addons:events APP_NAME [options]'
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.syntax = 'nex-cli addons:logs ADDON_NAME [options]'
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.syntax = 'nex-cli apps:events APP_NAME [options]'
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.syntax = 'nex-cli apps:logs APP_NAME [options]'
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
- Use: --http-log-drain DRAIN_URL
341
- The log drain is a HTTP(s) URL where application logs will be POSTed.
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
- Use: --region REGION
346
- Containers will be deployed in the specified region by default if no region-balancing
347
- policies have been specified. This is only relevant when the Nex!™ platform has been deployed in multiple regions.
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:open' do |c|
433
- c.syntax = 'nex-cli apps:open APP_NAME'
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.syntax = 'nex-cli cubes:events CUBE_ID [options]'
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.syntax = 'nex-cli cubes:logs CUBE_ID [options]'
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|
@@ -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
- # Additional options (log drain, region balancing)
109
- attrs[:opts] = self.extract_config_options(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
- # Additional options (log drain, region balancing)
140
- # Hash#dup is required for the resource to detect changes
141
- attrs[:opts] = (e.opts || {}).dup.merge(self.extract_config_options(opts))
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 { |k,v| t.add_row([k,v]) }
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
- # Additional options (log drain, region balancing)
139
- attrs[:opts] = self.extract_config_options(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
- # Additional options (log drain, region balancing)
203
- # Hash#dup is required for the resource to detect changes
204
- attrs[:opts] = (e.opts || {}).dup.merge(self.extract_config_options(opts))
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