nex_client 0.17.0 → 0.18.0.pre1

Sign up to get free protection for your applications and to get access to all the features.
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