nex_client 0.16.0.pre1 → 0.16.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/nex_client/cli.rb +63 -6
- data/lib/nex_client/commands/addons.rb +37 -10
- data/lib/nex_client/commands/apps.rb +48 -15
- data/lib/nex_client/commands/cube_instances.rb +32 -0
- data/lib/nex_client/commands/helpers.rb +5 -0
- data/lib/nex_client/commands/racks.rb +49 -5
- data/lib/nex_client/cube_instance.rb +3 -0
- data/lib/nex_client/version.rb +1 -1
- metadata +4 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 727229b96317d3a2a14803712ad8bc5cc3df368b
|
4
|
+
data.tar.gz: db3eee696bbee741e2dcb307b4217c033b549c09
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: da2bf4d72a045db4bbb98d6b42c890ad6f767530f562c8a4ee3869e852c5b407f38290be1f55f9a8891318e52de63a62bbfc515aa407d4d30eb0ffc120740008
|
7
|
+
data.tar.gz: f6baf5690f4d3c8a6dcaecbc706d0fe757cf190052ca5ff585a87654240ebd86b69b01dfe16ad241bb7d73083a6a37a5af5b80e1efac5c58ecba5bd152f5be6e
|
data/lib/nex_client/cli.rb
CHANGED
@@ -38,6 +38,7 @@ 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".'
|
41
42
|
c.action do |args, options|
|
42
43
|
NexClient::Commands::Addons.create(args,options)
|
43
44
|
end
|
@@ -60,6 +61,7 @@ module NexClient
|
|
60
61
|
c.example 'scale myaddon down by removing one node', 'nex-cli addons:down myaddon'
|
61
62
|
c.example 'scale myaddon down by removing two nodes', 'nex-cli addons:down myaddon --count 2'
|
62
63
|
c.option '--count NUMBER', String, 'number of nodes to bring down'
|
64
|
+
c.option '--region REGION', String, 'region to scale down'
|
63
65
|
c.action do |args, options|
|
64
66
|
NexClient::Commands::Addons.scale(:down,args,options)
|
65
67
|
end
|
@@ -101,6 +103,16 @@ module NexClient
|
|
101
103
|
end
|
102
104
|
end
|
103
105
|
|
106
|
+
command :'addons:restart' do |c|
|
107
|
+
c.syntax = 'nex-cli addons:restart APP_NAME'
|
108
|
+
c.summary = 'Restart an addon'
|
109
|
+
c.description = 'Initiate a phased restart of an addon'
|
110
|
+
c.example 'phase-restart my-awesome-app', 'nex-cli addons:restart my-awesome-app'
|
111
|
+
c.action do |args, options|
|
112
|
+
NexClient::Commands::Addons.restart(args,options)
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
104
116
|
command :'addons:ssh' do |c|
|
105
117
|
c.syntax = 'nex-cli addons:ssh ADDON_NAME [options]'
|
106
118
|
c.summary = 'SSH to an addon container [platform admin]'
|
@@ -118,6 +130,7 @@ module NexClient
|
|
118
130
|
c.example 'scale myaddon up by adding one node', 'nex-cli addons:up myaddon'
|
119
131
|
c.example 'scale myaddon up by adding two nodes', 'nex-cli addons:up myaddon --count 2'
|
120
132
|
c.option '--count NUMBER', String, 'number of nodes to bring up'
|
133
|
+
c.option '--region REGION', String, 'region to scale up'
|
121
134
|
c.action do |args, options|
|
122
135
|
NexClient::Commands::Addons.scale(:up,args,options)
|
123
136
|
end
|
@@ -128,8 +141,12 @@ module NexClient
|
|
128
141
|
c.summary = 'Update addon settings'
|
129
142
|
c.description = 'Update addon settings'
|
130
143
|
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'
|
131
147
|
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]'
|
132
148
|
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".'
|
133
150
|
c.action do |args, options|
|
134
151
|
NexClient::Commands::Addons.update(args,options)
|
135
152
|
end
|
@@ -171,6 +188,8 @@ module NexClient
|
|
171
188
|
c.option '--owner ORGANIZATION_HANDLE', 'specify an organisation as owner (organization admin only)'
|
172
189
|
c.option '--desc DESCRIPTION', String, 'description for this application (140 characters max)'
|
173
190
|
c.option '--tags TAG_LIST', Array, 'comma separated list of tags describing this app'
|
191
|
+
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".'
|
174
193
|
c.action do |args, options|
|
175
194
|
NexClient::Commands::Apps.create(args,options)
|
176
195
|
end
|
@@ -193,6 +212,7 @@ module NexClient
|
|
193
212
|
c.example 'scale myapp down by removing one node', 'nex-cli apps:down myapp'
|
194
213
|
c.example 'scale myapp down by removing two nodes', 'nex-cli apps:down myapp --count 2'
|
195
214
|
c.option '--count NUMBER', String, 'number of nodes to bring down'
|
215
|
+
c.option '--region REGION', String, 'region to scale down'
|
196
216
|
c.action do |args, options|
|
197
217
|
NexClient::Commands::Apps.scale(:down,args,options)
|
198
218
|
end
|
@@ -246,11 +266,30 @@ module NexClient
|
|
246
266
|
|
247
267
|
command :'apps:scm' do |c|
|
248
268
|
c.syntax = 'nex-cli apps:scm APP_NAME [options]'
|
249
|
-
c.summary = 'Manage
|
250
|
-
c.description =
|
269
|
+
c.summary = 'Manage source control for your apps'
|
270
|
+
c.description = <<~HEREDOC
|
271
|
+
Link/unlink an SCM (e.g. github, s3) to your applications
|
272
|
+
|
273
|
+
Github:
|
274
|
+
-------
|
275
|
+
Use: --link github:repo[:branch] (--credentials GITHUB_OAUTH_TOKEN)
|
276
|
+
The branch will be defaulted to your default repository branch if unspecified.
|
277
|
+
Specifying 'credentials'is optional if your account on Nex!™ has been created through github or
|
278
|
+
if the repository is public.
|
279
|
+
|
280
|
+
S3:
|
281
|
+
---
|
282
|
+
Use: --link s3:bucket/folder[:tar_package] --credentials AWS_KEY:AWS_SECRET
|
283
|
+
The branch must be the name of an actual file. It will be defaulted to 'latest.tar.gz'. This filename will
|
284
|
+
be overriden if you specify a different filename when sending deployment webhooks ('after' attribute).
|
285
|
+
Specifying credentials is only required if the S3 bucket is private.
|
286
|
+
HEREDOC
|
251
287
|
c.example 'link myapp to github using some/repo on branch master', 'nex-cli apps:scm myapp --link github:some/repo'
|
252
288
|
c.example 'link myapp to github using some/repo on branch develop', 'nex-cli apps:scm myapp --link github:some/repo:develop'
|
253
|
-
c.
|
289
|
+
c.example 'link myapp to s3 using a bucket, path and filename', 'nex-cli apps:scm myapp --link s3:bucket/folder:somefile.tar.gz --credentials AWS_KEY:AWS_SECRET'
|
290
|
+
c.example 'link myapp to s3 to the latest.tar.gz file in folder', 'nex-cli apps:scm myapp --link s3:bucket/folder --credentials AWS_KEY:AWS_SECRET'
|
291
|
+
c.option '--credentials api_key[:api_secret]', String, 'colon separated key/secret pair to use with the provider'
|
292
|
+
c.option '--link <provider>:<repo>[:branch]', String, 'link your SCM repo to this application (github and s3 supported)'
|
254
293
|
c.option '--unlink', 'unlink your SCM from the application'
|
255
294
|
c.action do |args, options|
|
256
295
|
NexClient::Commands::Apps.manage_scm(args,options)
|
@@ -284,6 +323,7 @@ module NexClient
|
|
284
323
|
c.example 'scale myapp up by adding one node', 'nex-cli apps:up myapp'
|
285
324
|
c.example 'scale myapp up by adding two nodes', 'nex-cli apps:up myapp --count 2'
|
286
325
|
c.option '--count NUMBER', String, 'number of nodes to bring up'
|
326
|
+
c.option '--region REGION', String, 'region to scale up'
|
287
327
|
c.action do |args, options|
|
288
328
|
NexClient::Commands::Apps.scale(:up,args,options)
|
289
329
|
end
|
@@ -294,11 +334,16 @@ module NexClient
|
|
294
334
|
c.summary = 'Update apps settings'
|
295
335
|
c.description = 'Update application settings'
|
296
336
|
c.example 'change container size to 4', 'nex-cli apps:update myapp --size 4'
|
337
|
+
c.example 'balance containers equally between regions', 'nex-cli apps:update myapp --region-balancing="ap-southeast-1,us-west-2"'
|
338
|
+
c.example 'deploy more containers in one region', 'nex-cli apps:update myapp --region-balancing="ap-southeast-1=1,us-west-2=2"'
|
339
|
+
c.example 'scale containers across all regions', 'nex-cli apps:update myapp --region-balancing=all'
|
297
340
|
c.option '--desc DESCRIPTION', String, 'update the application description'
|
298
341
|
c.option '--http-log-drain DRAIN_URL', String, 'specify the URL of a remote log drain. [restart required]'
|
299
342
|
c.option '--image-tag IMAGE_TAG', String, 'update the docker image tag [restart required]'
|
300
343
|
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]'
|
301
344
|
c.option '--tags TAG_LIST', String, 'comma separated list of tags to use to describe the app'
|
345
|
+
c.option '--region REGION', String, 'default region to use deploy/scale this application'
|
346
|
+
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]'
|
302
347
|
c.action do |args, options|
|
303
348
|
NexClient::Commands::Apps.update(args,options)
|
304
349
|
end
|
@@ -315,10 +360,12 @@ module NexClient
|
|
315
360
|
c.example 'Add env variables to myapp from file and prefix all vars with foo (foo_myvar)', 'nex-cli apps:vars myapp --env-file ~/myenvfile --env-prefix foo'
|
316
361
|
c.option '--add MYVAR=value,MYVAR2=value,...', Array, 'comma separated list of env variables'
|
317
362
|
c.option '--delete MYVAR,MYVAR2,...', Array, 'comma separated list of env variables'
|
363
|
+
c.option '--delete-all', 'delete all vars'
|
318
364
|
c.option '--full-vars', 'do not truncate environment variables'
|
319
365
|
c.option '--env-file FILE', String, 'newline separated list of env variables (MYVAR=1) or YAML file. Note that YAML parsing is recursive.'
|
320
366
|
c.option '--env-prefix PREFIX', String, 'prefix all variables contained in the env file with the specified prefix (PREFIX_MYVAR)'
|
321
367
|
c.option '--raw', 'vars are returned in a environment file format (key=value)'
|
368
|
+
c.option '--yaml', 'vars are returned in a yaml file format'
|
322
369
|
c.action do |args, options|
|
323
370
|
NexClient::Commands::Apps.manage_vars(args,options)
|
324
371
|
end
|
@@ -404,7 +451,7 @@ module NexClient
|
|
404
451
|
end
|
405
452
|
|
406
453
|
command :'cubes:events' do |c|
|
407
|
-
c.syntax = 'nex-cli cubes:events
|
454
|
+
c.syntax = 'nex-cli cubes:events CUBE_ID [options]'
|
408
455
|
c.summary = 'Gather system events'
|
409
456
|
c.description = 'Gather system events for a given cube'
|
410
457
|
c.example 'display events for mycube', 'nex-cli cubes:events mycube'
|
@@ -417,7 +464,7 @@ module NexClient
|
|
417
464
|
end
|
418
465
|
|
419
466
|
command :'cubes:info' do |c|
|
420
|
-
c.syntax = 'nex-cli cubes:info
|
467
|
+
c.syntax = 'nex-cli cubes:info CUBE_ID [options]'
|
421
468
|
c.summary = 'Display information on a cube'
|
422
469
|
c.description = 'Display information about a given cube'
|
423
470
|
c.example 'display info for mycube', 'nex-cli cubes:info mycube'
|
@@ -427,7 +474,7 @@ module NexClient
|
|
427
474
|
end
|
428
475
|
|
429
476
|
command :'cubes:logs' do |c|
|
430
|
-
c.syntax = 'nex-cli cubes:logs
|
477
|
+
c.syntax = 'nex-cli cubes:logs CUBE_ID [options]'
|
431
478
|
c.summary = 'Gather cube logs'
|
432
479
|
c.description = 'Gather container logs for a given cube'
|
433
480
|
c.example 'gather logs for mycube', 'nex-cli cubes:logs mycube'
|
@@ -448,6 +495,16 @@ module NexClient
|
|
448
495
|
end
|
449
496
|
end
|
450
497
|
|
498
|
+
command :'cubes:snapshots' do |c|
|
499
|
+
c.syntax = 'nex-cli cubes:snapshots CUBE_ID'
|
500
|
+
c.summary = 'List cube snapshots'
|
501
|
+
c.description = 'List all snapshots created for a given cube. This command is only effective for cubes with a backup strategy (e.g. addons)'
|
502
|
+
c.example 'gather snapshots created for mycube', 'nex-cli cubes:snapshots mycube'
|
503
|
+
c.action do |args, options|
|
504
|
+
NexClient::Commands::CubeInstances.snapshots(args,options)
|
505
|
+
end
|
506
|
+
end
|
507
|
+
|
451
508
|
command :'cubes:start' do |c|
|
452
509
|
c.syntax = 'nex-cli cubes:start CUBE_ID'
|
453
510
|
c.summary = 'Start a cube'
|
@@ -105,11 +105,8 @@ module NexClient
|
|
105
105
|
attrs[:service] = svc_name
|
106
106
|
attrs[:container_size] = opts.size if opts.size.present?
|
107
107
|
|
108
|
-
#
|
109
|
-
|
110
|
-
attrs[:opts] ||= {}
|
111
|
-
attrs[:opts][:http_log_drain] = opts.http_log_drain
|
112
|
-
end
|
108
|
+
# Additional options (log drain, region balancing)
|
109
|
+
attrs[:opts] = self.extract_config_options(opts)
|
113
110
|
|
114
111
|
addon = NexClient::Addon.new(attrs)
|
115
112
|
addon.relationships.attributes = { app: { data: { type: 'apps', id: app.id } } }
|
@@ -139,11 +136,9 @@ module NexClient
|
|
139
136
|
attrs = {}
|
140
137
|
attrs[:container_size] = opts.size if opts.size.present?
|
141
138
|
|
142
|
-
#
|
143
|
-
|
144
|
-
|
145
|
-
attrs[:opts]['http_log_drain'] = opts.http_log_drain
|
146
|
-
end
|
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))
|
147
142
|
|
148
143
|
# Update
|
149
144
|
e.update_attributes(attrs)
|
@@ -202,6 +197,28 @@ module NexClient
|
|
202
197
|
success("Successfully requested to scale #{name} #{direction} by #{count} #{'node'.pluralize(count)}...")
|
203
198
|
end
|
204
199
|
|
200
|
+
def self.restart(args,opts)
|
201
|
+
name = args.first
|
202
|
+
e = NexClient::Addon.find(name: name).first
|
203
|
+
|
204
|
+
# Display error
|
205
|
+
unless e
|
206
|
+
error("Error! Could not find addon: #{name}")
|
207
|
+
return false
|
208
|
+
end
|
209
|
+
|
210
|
+
# Perform
|
211
|
+
e.restart
|
212
|
+
|
213
|
+
# Display errors if any
|
214
|
+
if e.errors.any?
|
215
|
+
display_record_errors(e)
|
216
|
+
return false
|
217
|
+
end
|
218
|
+
|
219
|
+
success("Initiated phased restart for addon: #{name}...")
|
220
|
+
end
|
221
|
+
|
205
222
|
def self.display_addons(list)
|
206
223
|
table = Terminal::Table.new title: ADDONS_TITLE, headings: ADDONS_HEADERS do |t|
|
207
224
|
[list].flatten.compact.each do |e|
|
@@ -252,6 +269,16 @@ module NexClient
|
|
252
269
|
return '-' unless record.node_count && record.max_node_count
|
253
270
|
"#{record.node_count}/#{record.max_node_count}"
|
254
271
|
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
|
255
282
|
end
|
256
283
|
end
|
257
284
|
end
|
@@ -14,7 +14,7 @@ module NexClient
|
|
14
14
|
OPTS_HEADERS = ['key','value'].map(&:upcase)
|
15
15
|
|
16
16
|
SCM_TITLE = "Source Control Management".colorize(:yellow)
|
17
|
-
SCM_HEADERS = ['provider','repo','branch','last commit'].map(&:upcase)
|
17
|
+
SCM_HEADERS = ['provider','repo','branch','last commit','webhook'].map(&:upcase)
|
18
18
|
|
19
19
|
def self.list(args,opts)
|
20
20
|
filters = {}
|
@@ -133,12 +133,10 @@ module NexClient
|
|
133
133
|
attrs[:container_size] = opts.size if opts.size.present?
|
134
134
|
attrs[:description] = opts.desc if opts.desc.present?
|
135
135
|
attrs[:tag_list] = opts.tags if opts.tags.present?
|
136
|
+
attrs[:preferred_region] = opts.region if opts.region.present?
|
136
137
|
|
137
|
-
#
|
138
|
-
|
139
|
-
attrs[:opts] ||= {}
|
140
|
-
attrs[:opts]['http_log_drain'] = opts.http_log_drain
|
141
|
-
end
|
138
|
+
# Additional options (log drain, region balancing)
|
139
|
+
attrs[:opts] = self.extract_config_options(opts)
|
142
140
|
|
143
141
|
# Env variables via command line
|
144
142
|
if opts.env.present?
|
@@ -199,12 +197,11 @@ module NexClient
|
|
199
197
|
attrs[:description] = opts.desc if opts.desc.present?
|
200
198
|
attrs[:tag_list] = opts.tags if opts.tags.present?
|
201
199
|
attrs[:image_tag] = opts.image_tag if opts.image_tag.present?
|
200
|
+
attrs[:preferred_region] = opts.region if opts.region.present?
|
202
201
|
|
203
|
-
#
|
204
|
-
|
205
|
-
|
206
|
-
attrs[:opts]['http_log_drain'] = opts.http_log_drain
|
207
|
-
end
|
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))
|
208
205
|
|
209
206
|
# Update
|
210
207
|
e.update_attributes(attrs)
|
@@ -348,6 +345,16 @@ module NexClient
|
|
348
345
|
|
349
346
|
# Delete vars
|
350
347
|
(opts.delete || []).each { |k| vars.delete(k) }
|
348
|
+
# Delete all vars
|
349
|
+
if opts.delete_all
|
350
|
+
# Ask confirmation
|
351
|
+
answer = ask('Enter the name of this app to confirm: ')
|
352
|
+
unless answer == e.name
|
353
|
+
error('Aborting vars deletion')
|
354
|
+
return false
|
355
|
+
end
|
356
|
+
vars = {}
|
357
|
+
end
|
351
358
|
|
352
359
|
# Update and reload the resource
|
353
360
|
e.update_attributes(vars: vars)
|
@@ -356,7 +363,9 @@ module NexClient
|
|
356
363
|
end
|
357
364
|
|
358
365
|
# Display all vars
|
359
|
-
if opts.
|
366
|
+
if opts.yaml
|
367
|
+
self.display_yaml_vars(e.all_vars)
|
368
|
+
elsif opts.raw
|
360
369
|
self.display_raw_vars(e.all_vars)
|
361
370
|
else
|
362
371
|
self.display_vars(e.all_vars,!opts.full_vars)
|
@@ -376,7 +385,15 @@ module NexClient
|
|
376
385
|
# Link SCM
|
377
386
|
if opts.link
|
378
387
|
provider,repo,branch = opts.link.split(':')
|
379
|
-
|
388
|
+
credentials = opts.credentials
|
389
|
+
attrs = {
|
390
|
+
provider: provider,
|
391
|
+
config: {
|
392
|
+
repo: repo,
|
393
|
+
branch: branch,
|
394
|
+
credentials: credentials
|
395
|
+
}
|
396
|
+
}
|
380
397
|
|
381
398
|
# Update and reload the resource
|
382
399
|
e.link_scm({data: { attributes: attrs } })
|
@@ -390,7 +407,7 @@ module NexClient
|
|
390
407
|
e = NexClient::App.find(e.id).first
|
391
408
|
end
|
392
409
|
|
393
|
-
# Display
|
410
|
+
# Display SCM
|
394
411
|
self.display_scm(e.scm)
|
395
412
|
end
|
396
413
|
|
@@ -425,7 +442,13 @@ module NexClient
|
|
425
442
|
def self.display_scm(list)
|
426
443
|
table = Terminal::Table.new title: SCM_TITLE, headings: SCM_HEADERS do |t|
|
427
444
|
[list].flatten.compact.each do |e|
|
428
|
-
t.add_row([
|
445
|
+
t.add_row([
|
446
|
+
e['provider'],
|
447
|
+
e['repo'],
|
448
|
+
e['branch'],
|
449
|
+
e['last_commit'] || '- nothing pushed yet -',
|
450
|
+
e['webhook_enabled'].to_s == 'true' ? e['webhook_url'] : '- Not enabled -'
|
451
|
+
])
|
429
452
|
end
|
430
453
|
end
|
431
454
|
puts table
|
@@ -459,6 +482,16 @@ module NexClient
|
|
459
482
|
return '-' unless record.node_count && record.max_node_count
|
460
483
|
"#{record.node_count}/#{record.max_node_count}"
|
461
484
|
end
|
485
|
+
|
486
|
+
def self.extract_config_options(cli_opts)
|
487
|
+
hash = {}
|
488
|
+
%w(http_log_drain region_balancing).each do |opt_name|
|
489
|
+
if cli_opts.method_missing(opt_name.to_sym).present?
|
490
|
+
hash[opt_name.to_s] = cli_opts.method_missing(opt_name.to_sym)
|
491
|
+
end
|
492
|
+
end
|
493
|
+
return hash
|
494
|
+
end
|
462
495
|
end
|
463
496
|
end
|
464
497
|
end
|
@@ -7,6 +7,9 @@ module NexClient
|
|
7
7
|
CUBES_TITLE = "Cube Instances".colorize(:blue)
|
8
8
|
CUBES_HEADERS = ['id','status','container','region','storage','ip','port','cluster'].map(&:upcase)
|
9
9
|
|
10
|
+
SNAPSHOTS_TITLE = "Snapshots".colorize(:magenta)
|
11
|
+
SNAPSHOTS_HEADERS = ['created_at','rack ip','path'].map(&:upcase)
|
12
|
+
|
10
13
|
def self.list(args,opts)
|
11
14
|
filters = {}
|
12
15
|
filters[:status] = opts.status if opts.status.present?
|
@@ -55,6 +58,21 @@ module NexClient
|
|
55
58
|
self.display_logs(logs.log_ret)
|
56
59
|
end
|
57
60
|
|
61
|
+
def self.snapshots(args,opts)
|
62
|
+
name = args.first
|
63
|
+
e = NexClient::CubeInstance.find(uuid: name).first
|
64
|
+
|
65
|
+
# Display error
|
66
|
+
unless e
|
67
|
+
error("Error! Could not find cube: #{name}")
|
68
|
+
return false
|
69
|
+
end
|
70
|
+
|
71
|
+
# Retrieve snapshots and display them
|
72
|
+
snapshots = e.snapshots.first['snapshots']
|
73
|
+
self.display_snapshots(snapshots)
|
74
|
+
end
|
75
|
+
|
58
76
|
def self.trigger_action(action,args,opts)
|
59
77
|
id = args.first
|
60
78
|
e = NexClient::CubeInstance.find(uuid: id).first
|
@@ -218,6 +236,20 @@ module NexClient
|
|
218
236
|
puts logs
|
219
237
|
puts "\n"
|
220
238
|
end
|
239
|
+
|
240
|
+
def self.display_snapshots(snapshots)
|
241
|
+
table = Terminal::Table.new title: SNAPSHOTS_TITLE, headings: SNAPSHOTS_HEADERS do |t|
|
242
|
+
[snapshots].flatten.compact.each do |e|
|
243
|
+
t.add_row([
|
244
|
+
e['created_at'],
|
245
|
+
e['ip_address'],
|
246
|
+
e['path']
|
247
|
+
])
|
248
|
+
end
|
249
|
+
end
|
250
|
+
puts table
|
251
|
+
puts "\n"
|
252
|
+
end
|
221
253
|
end
|
222
254
|
end
|
223
255
|
end
|
@@ -167,6 +167,11 @@ module NexClient
|
|
167
167
|
puts "\n"
|
168
168
|
end
|
169
169
|
|
170
|
+
def display_yaml_vars(vars)
|
171
|
+
puts vars.to_yaml
|
172
|
+
puts "\n"
|
173
|
+
end
|
174
|
+
|
170
175
|
def display_vars(list,truncate = true)
|
171
176
|
table = Terminal::Table.new title: VARS_TITLE, headings: VARS_HEADERS do |t|
|
172
177
|
[list].flatten.compact.each do |e|
|
@@ -10,7 +10,7 @@ module NexClient
|
|
10
10
|
STORAGE_RACKS_TITLE = "Storage Racks".colorize(:blue)
|
11
11
|
ROUTING_RACKS_TITLE = "Routing Racks".colorize(:green)
|
12
12
|
GATEWAY_RACKS_TITLE = "Gateway Racks".colorize(:yellow)
|
13
|
-
RACKS_HEADERS = ['type','id','region','stack','status','iip','eip','capacity'].map(&:upcase)
|
13
|
+
RACKS_HEADERS = ['type','id','region','stack','status','iip','eip','capacity','machine size','machine id'].map(&:upcase)
|
14
14
|
|
15
15
|
def self.list(args,opts)
|
16
16
|
filters = {}
|
@@ -172,7 +172,18 @@ module NexClient
|
|
172
172
|
def self.display_compute_racks(list)
|
173
173
|
table = Terminal::Table.new title: COMPUTE_RACKS_TITLE, headings: RACKS_HEADERS do |t|
|
174
174
|
[list].flatten.compact.each do |e|
|
175
|
-
t.add_row([
|
175
|
+
t.add_row([
|
176
|
+
'compute',
|
177
|
+
e.id,
|
178
|
+
e.vpc_region,
|
179
|
+
e.stack,
|
180
|
+
e.status,
|
181
|
+
e.private_ip_address,
|
182
|
+
'-',
|
183
|
+
"#{e.used_pu}/#{e.total_pu}",
|
184
|
+
e.machine_type,
|
185
|
+
e.machine_id
|
186
|
+
])
|
176
187
|
end
|
177
188
|
end
|
178
189
|
puts table
|
@@ -182,7 +193,18 @@ module NexClient
|
|
182
193
|
def self.display_storage_racks(list)
|
183
194
|
table = Terminal::Table.new title: STORAGE_RACKS_TITLE, headings: RACKS_HEADERS do |t|
|
184
195
|
[list].flatten.compact.each do |e|
|
185
|
-
t.add_row([
|
196
|
+
t.add_row([
|
197
|
+
'storage',
|
198
|
+
e.id,
|
199
|
+
e.vpc_region,
|
200
|
+
'-',
|
201
|
+
e.status,
|
202
|
+
e.private_ip_address,
|
203
|
+
'-',
|
204
|
+
"#{e.used_su}/#{e.total_su}",
|
205
|
+
e.machine_type,
|
206
|
+
e.machine_id
|
207
|
+
])
|
186
208
|
end
|
187
209
|
end
|
188
210
|
puts table
|
@@ -192,7 +214,18 @@ module NexClient
|
|
192
214
|
def self.display_routing_racks(list)
|
193
215
|
table = Terminal::Table.new title: ROUTING_RACKS_TITLE, headings: RACKS_HEADERS do |t|
|
194
216
|
[list].flatten.compact.each do |e|
|
195
|
-
t.add_row([
|
217
|
+
t.add_row([
|
218
|
+
'routing',
|
219
|
+
e.id,
|
220
|
+
e.vpc_region,
|
221
|
+
'-',
|
222
|
+
e.status,
|
223
|
+
e.private_ip_address,
|
224
|
+
'-',
|
225
|
+
'-',
|
226
|
+
e.machine_type,
|
227
|
+
e.machine_id
|
228
|
+
])
|
196
229
|
end
|
197
230
|
end
|
198
231
|
puts table
|
@@ -202,7 +235,18 @@ module NexClient
|
|
202
235
|
def self.display_gateway_racks(list)
|
203
236
|
table = Terminal::Table.new title: GATEWAY_RACKS_TITLE, headings: RACKS_HEADERS do |t|
|
204
237
|
[list].flatten.compact.each do |e|
|
205
|
-
t.add_row([
|
238
|
+
t.add_row([
|
239
|
+
'gateway',
|
240
|
+
e.id,
|
241
|
+
e.vpc_region,
|
242
|
+
'-',
|
243
|
+
e.status,
|
244
|
+
e.private_ip_address,
|
245
|
+
e.ip_address,
|
246
|
+
'-',
|
247
|
+
e.machine_type,
|
248
|
+
e.machine_id
|
249
|
+
])
|
206
250
|
end
|
207
251
|
end
|
208
252
|
puts table
|
@@ -15,6 +15,9 @@ module NexClient
|
|
15
15
|
# PATCH <api_root>/cube_instances/:id/restart
|
16
16
|
custom_endpoint :restart, on: :member, request_method: :patch
|
17
17
|
|
18
|
+
# GET <api_root>/cube_instances/:id/snapshots
|
19
|
+
custom_endpoint :snapshots, on: :member, request_method: :get
|
20
|
+
|
18
21
|
# PATCH <api_root>/cube_instances/:id/start
|
19
22
|
custom_endpoint :start, on: :member, request_method: :patch
|
20
23
|
|
data/lib/nex_client/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: nex_client
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.16.0
|
4
|
+
version: 0.16.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Arnaud Lachaume
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-05-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: json_api_client
|
@@ -181,9 +181,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
181
181
|
version: '0'
|
182
182
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
183
183
|
requirements:
|
184
|
-
- - "
|
184
|
+
- - ">="
|
185
185
|
- !ruby/object:Gem::Version
|
186
|
-
version:
|
186
|
+
version: '0'
|
187
187
|
requirements: []
|
188
188
|
rubyforge_project:
|
189
189
|
rubygems_version: 2.6.8
|