morpheus-cli 0.9.9 → 0.9.10

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.
Files changed (38) hide show
  1. checksums.yaml +4 -4
  2. data/lib/morpheus/api/api_client.rb +4 -0
  3. data/lib/morpheus/api/app_templates_interface.rb +74 -0
  4. data/lib/morpheus/api/instance_types_interface.rb +9 -0
  5. data/lib/morpheus/api/instances_interface.rb +16 -0
  6. data/lib/morpheus/api/roles_interface.rb +37 -1
  7. data/lib/morpheus/cli.rb +4 -1
  8. data/lib/morpheus/cli/accounts.rb +82 -58
  9. data/lib/morpheus/cli/app_templates.rb +908 -0
  10. data/lib/morpheus/cli/apps.rb +226 -187
  11. data/lib/morpheus/cli/cli_command.rb +57 -30
  12. data/lib/morpheus/cli/clouds.rb +50 -65
  13. data/lib/morpheus/cli/deployments.rb +18 -33
  14. data/lib/morpheus/cli/deploys.rb +1 -3
  15. data/lib/morpheus/cli/groups.rb +54 -38
  16. data/lib/morpheus/cli/hosts.rb +86 -80
  17. data/lib/morpheus/cli/instance_types.rb +42 -29
  18. data/lib/morpheus/cli/instances.rb +192 -69
  19. data/lib/morpheus/cli/key_pairs.rb +70 -87
  20. data/lib/morpheus/cli/license.rb +7 -9
  21. data/lib/morpheus/cli/load_balancers.rb +23 -53
  22. data/lib/morpheus/cli/mixins/accounts_helper.rb +7 -8
  23. data/lib/morpheus/cli/mixins/print_helper.rb +67 -0
  24. data/lib/morpheus/cli/mixins/provisioning_helper.rb +461 -0
  25. data/lib/morpheus/cli/option_types.rb +71 -18
  26. data/lib/morpheus/cli/roles.rb +725 -34
  27. data/lib/morpheus/cli/security_group_rules.rb +50 -70
  28. data/lib/morpheus/cli/security_groups.rb +61 -48
  29. data/lib/morpheus/cli/shell.rb +123 -14
  30. data/lib/morpheus/cli/tasks.rb +24 -59
  31. data/lib/morpheus/cli/users.rb +86 -71
  32. data/lib/morpheus/cli/version.rb +1 -1
  33. data/lib/morpheus/cli/virtual_images.rb +21 -51
  34. data/lib/morpheus/cli/workflows.rb +14 -29
  35. data/lib/morpheus/ext/nil_class.rb +5 -0
  36. data/lib/morpheus/formatters.rb +1 -0
  37. metadata +7 -3
  38. data/lib/morpheus/cli/error_handler.rb +0 -44
@@ -1,14 +1,11 @@
1
- # require 'yaml'
2
1
  require 'io/console'
3
- require 'rest_client'
4
- require 'term/ansicolor'
5
2
  require 'optparse'
6
3
  require 'filesize'
7
4
  require 'morpheus/cli/cli_command'
8
5
 
9
6
  class Morpheus::Cli::InstanceTypes
10
7
  include Morpheus::Cli::CliCommand
11
- include Term::ANSIColor
8
+
12
9
  def initialize()
13
10
  @appliance_name, @appliance_url = Morpheus::Cli::Remote.active_appliance
14
11
  @access_token = Morpheus::Cli::Credentials.new(@appliance_name,@appliance_url).request_credentials()
@@ -20,7 +17,7 @@ class Morpheus::Cli::InstanceTypes
20
17
 
21
18
  def handle(args)
22
19
  if @access_token.empty?
23
- print red,bold, "\nInvalid Credentials. Unable to acquire access token. Please verify your credentials and try again.\n\n",reset
20
+ print_red_alert "Invalid Credentials. Unable to acquire access token. Please verify your credentials and try again."
24
21
  return 1
25
22
  end
26
23
  if args.empty?
@@ -40,46 +37,62 @@ class Morpheus::Cli::InstanceTypes
40
37
 
41
38
 
42
39
  def details(args)
40
+ options = {}
41
+ optparse = OptionParser.new do|opts|
42
+ opts.banner = "Usage: morpheus instance-type details [name]"
43
+ build_common_options(opts, options, [:json])
44
+ end
45
+ optparse.parse(args)
43
46
  if args.count < 1
44
- puts "\nUsage: morpheus instances stats [name]\n\n"
47
+ puts "\n#{optparse.banner}\n\n"
45
48
  return
46
49
  end
50
+ name = args[0]
47
51
  begin
48
- instance_results = @instances_interface.get({name: args[0]})
49
- if instance_results['instances'].empty?
50
- puts "Instance not found by name #{args[0]}"
51
- return
52
+ json_response = @instance_types_interface.get({name: name})
53
+
54
+ if options[:json]
55
+ print JSON.pretty_generate(json_response), "\n" and return
52
56
  end
53
- instance = instance_results['instances'][0]
54
- instance_id = instance['id']
55
- stats = instance_results['stats'][instance_id.to_s]
56
- print "\n" ,cyan, bold, "#{instance['name']} (#{instance['instanceType']['name']})\n","==================", reset, "\n\n"
57
- print cyan, "Memory: \t#{Filesize.from("#{stats['usedMemory']} B").pretty} / #{Filesize.from("#{stats['maxMemory']} B").pretty}\n"
58
- print cyan, "Storage: \t#{Filesize.from("#{stats['usedStorage']} B").pretty} / #{Filesize.from("#{stats['maxStorage']} B").pretty}\n\n",reset
59
- puts instance
60
- rescue RestClient::Exception => e
61
- if e.response.code == 400
62
- error = JSON.parse(e.response.to_s)
63
- ::Morpheus::Cli::ErrorHandler.new.print_errors(error)
57
+
58
+ instance_type = json_response['instanceTypes'][0]
59
+
60
+ if instance_type.nil?
61
+ puts yellow,"No instance type found by name #{name}.",reset
64
62
  else
65
- puts "Error Communicating with the Appliance. Please try again later. #{e}"
63
+ print "\n" ,cyan, bold, "Instance Type Details\n","==================", reset, "\n\n"
64
+ versions = instance_type['versions'].join(', ')
65
+ print cyan, "= #{instance_type['name']} (#{instance_type['code']}) - #{versions}\n"
66
+ instance_type['instanceTypeLayouts'].each do |layout|
67
+ print green, " - #{layout['name']}\n",reset
68
+ end
69
+ print reset,"\n\n"
66
70
  end
67
- return nil
71
+
72
+ rescue RestClient::Exception => e
73
+ print_rest_exception(e, options)
74
+ exit 1
68
75
  end
69
76
  end
70
77
 
71
78
  def list(args)
72
79
  options = {}
73
80
  optparse = OptionParser.new do|opts|
74
- opts.on( '-g', '--group GROUP', "Group Name" ) do |group|
75
- options[:group] = group
76
- end
81
+ build_common_options(opts, options, [:list, :json])
77
82
  end
78
83
  optparse.parse(args)
79
84
  begin
80
85
  params = {}
86
+ [:phrase, :offset, :max, :sort, :direction].each do |k|
87
+ params[k] = options[k] unless options[k].nil?
88
+ end
81
89
 
82
90
  json_response = @instance_types_interface.get(params)
91
+
92
+ if options[:json]
93
+ print JSON.pretty_generate(json_response), "\n" and return
94
+ end
95
+
83
96
  instance_types = json_response['instanceTypes']
84
97
  print "\n" ,cyan, bold, "Morpheus Instance Types\n","==================", reset, "\n\n"
85
98
  if instance_types.empty?
@@ -95,9 +108,9 @@ class Morpheus::Cli::InstanceTypes
95
108
  end
96
109
  print reset,"\n\n"
97
110
 
98
- rescue => e
99
- puts "Error Communicating with the Appliance. Please try again later. #{e}"
100
- return nil
111
+ rescue RestClient::Exception => e
112
+ print_rest_exception(e, options)
113
+ exit 1
101
114
  end
102
115
  end
103
116
  end
@@ -1,15 +1,15 @@
1
- # require 'yaml'
2
1
  require 'io/console'
3
2
  require 'rest_client'
4
- require 'term/ansicolor'
5
3
  require 'optparse'
6
4
  require 'filesize'
7
5
  require 'table_print'
8
6
  require 'morpheus/cli/cli_command'
7
+ require 'morpheus/cli/mixins/provisioning_helper'
9
8
 
10
9
  class Morpheus::Cli::Instances
11
10
  include Morpheus::Cli::CliCommand
12
- include Term::ANSIColor
11
+ include Morpheus::Cli::ProvisioningHelper
12
+
13
13
  def initialize()
14
14
  @appliance_name, @appliance_url = Morpheus::Cli::Remote.active_appliance
15
15
 
@@ -34,15 +34,16 @@ class Morpheus::Cli::Instances
34
34
  @options_interface = Morpheus::APIClient.new(@access_token,nil,nil, @appliance_url).options
35
35
  @active_groups = ::Morpheus::Cli::Groups.load_group_file
36
36
  if @access_token.empty?
37
- print red,bold, "\nInvalid Credentials. Unable to acquire access token. Please verify your credentials and try again.\n\n",reset
37
+ print_red_alert "Invalid Credentials. Unable to acquire access token. Please verify your credentials and try again."
38
38
  exit 1
39
39
  end
40
40
  end
41
41
 
42
42
 
43
43
  def handle(args)
44
+ usage = "Usage: morpheus instances [list,add,remove,stop,start,restart,backup,run-workflow,stop-service,start-service,restart-service,resize,upgrade,clone,envs,setenv,delenv] [name]"
44
45
  if args.empty?
45
- puts "\nUsage: morpheus instances [list,add,remove,stop,start,restart,backup,run-workflow,resize,upgrade,clone,envs,setenv,delenv,firewall_disable,firewall_enable,security_groups,apply_security_groups] [name]\n\n"
46
+ puts "\n#{usage}\n\n"
46
47
  return
47
48
  end
48
49
 
@@ -65,6 +66,8 @@ class Morpheus::Cli::Instances
65
66
  start_service(args[1..-1])
66
67
  when 'restart-service'
67
68
  restart_service(args[1..-1])
69
+ when 'resize'
70
+ resize(args[1..-1])
68
71
  when 'run-workflow'
69
72
  run_workflow(args[1..-1])
70
73
  when 'stats'
@@ -90,7 +93,7 @@ class Morpheus::Cli::Instances
90
93
  when 'backup'
91
94
  backup(args[1..-1])
92
95
  else
93
- puts "\nUsage: morpheus instances [list,add,remove,stop,start,restart,backup,run-workflow,stop-service,start-service,restart-service,resize,upgrade,clone,envs,setenv,delenv] [name]\n\n"
96
+ puts "\n#{usage}\n\n"
94
97
  exit 127
95
98
  end
96
99
  end
@@ -105,7 +108,7 @@ class Morpheus::Cli::Instances
105
108
  opts.on( '-c', '--cloud CLOUD', "Cloud" ) do |val|
106
109
  options[:cloud] = val
107
110
  end
108
- Morpheus::Cli::CliCommand.genericOptions(opts,options)
111
+ build_common_options(opts, options, [:options, :json, :remote])
109
112
 
110
113
  end
111
114
 
@@ -171,6 +174,32 @@ class Morpheus::Cli::Instances
171
174
 
172
175
  payload[:instance][:layout] = {id: layout['id']}
173
176
 
177
+
178
+ begin
179
+ service_plan_options_json = @instance_types_interface.service_plan_options(plan_prompt['servicePlan'], {cloudId: cloud, zoneId: cloud, layoutId: layout_id})
180
+
181
+ # puts ""
182
+ # print JSON.pretty_generate(service_plan_options_json)
183
+
184
+ plan_options = service_plan_options_json['plan']
185
+ volumes = prompt_instance_volumes(plan_options, options, @api_client, {})
186
+
187
+ # puts "VOLUMES:"
188
+ # print JSON.pretty_generate(volumes)
189
+
190
+ if !volumes.empty?
191
+ payload[:volumes] = volumes
192
+ end
193
+
194
+ # puts "\nexiting early...\n"
195
+ # exit 1
196
+
197
+ rescue RestClient::Exception => e
198
+ print_red_alert "Unable to load options for selected plan."
199
+ print_rest_exception(e, options)
200
+ exit 1
201
+ end
202
+
174
203
  type_payload = {}
175
204
  if !layout['optionTypes'].nil? && !layout['optionTypes'].empty?
176
205
  type_payload = Morpheus::Cli::OptionTypes.prompt(layout['optionTypes'],options[:options],@api_client,{groupId: groupId, cloudId: cloud, zoneId: cloud, instanceTypeId: instance_type['id'], version: version_prompt['version']})
@@ -183,7 +212,7 @@ class Morpheus::Cli::Instances
183
212
 
184
213
  provision_payload = {}
185
214
  if !layout['provisionType'].nil? && !layout['provisionType']['optionTypes'].nil? && !layout['provisionType']['optionTypes'].empty?
186
- puts "Checking for option Types"
215
+ #puts "Checking for option Types"
187
216
  provision_payload = Morpheus::Cli::OptionTypes.prompt(layout['provisionType']['optionTypes'],options[:options],@api_client,{groupId: groupId, cloudId: cloud, zoneId: cloud, instanceTypeId: instance_type['id'], version: version_prompt['version']})
188
217
  end
189
218
 
@@ -194,20 +223,29 @@ class Morpheus::Cli::Instances
194
223
  payload[:server] = provision_payload['server']
195
224
  end
196
225
 
226
+ # avoid 500 error
227
+ payload[:servicePlanOptions] = {}
228
+
197
229
  begin
198
- @instances_interface.create(payload)
230
+ json_response = @instances_interface.create(payload)
231
+ if options[:json]
232
+ print JSON.pretty_generate(json_response)
233
+ print "\n"
234
+ else
235
+ print_green_success "Provisioning instance #{instance_name}"
236
+ list([])
237
+ end
199
238
  rescue RestClient::Exception => e
200
- ::Morpheus::Cli::ErrorHandler.new.print_rest_exception(e)
239
+ print_rest_exception(e, options)
201
240
  exit 1
202
241
  end
203
- list([])
204
242
  end
205
243
 
206
244
  def stats(args)
207
245
  options = {}
208
246
  optparse = OptionParser.new do|opts|
209
247
  opts.banner = "Usage: morpheus instances stats [name]"
210
- Morpheus::Cli::CliCommand.genericOptions(opts,options)
248
+ build_common_options(opts, options, [:json, :remote])
211
249
  end
212
250
  if args.count < 1
213
251
  puts "\n#{optparse.banner}\n\n"
@@ -237,7 +275,7 @@ class Morpheus::Cli::Instances
237
275
  print reset, "\n"
238
276
  end
239
277
  rescue RestClient::Exception => e
240
- ::Morpheus::Cli::ErrorHandler.new.print_rest_exception(e)
278
+ print_rest_exception(e, options)
241
279
  exit 1
242
280
  end
243
281
  end
@@ -246,10 +284,10 @@ class Morpheus::Cli::Instances
246
284
  options = {}
247
285
  optparse = OptionParser.new do|opts|
248
286
  opts.banner = "Usage: morpheus instances logs [name]"
249
- Morpheus::Cli::CliCommand.genericOptions(opts,options)
250
287
  opts.on( '-n', '--node NODE_ID', "Scope logs to specific Container or VM" ) do |node_id|
251
288
  options[:node_id] = node_id.to_i
252
289
  end
290
+ build_common_options(opts, options, [:list, :json, :remote])
253
291
  end
254
292
  if args.count < 1
255
293
  puts "\n#{optparse.banner}\n\n"
@@ -286,7 +324,7 @@ class Morpheus::Cli::Instances
286
324
  print reset,"\n"
287
325
  end
288
326
  rescue RestClient::Exception => e
289
- ::Morpheus::Cli::ErrorHandler.new.print_rest_exception(e)
327
+ print_rest_exception(e, options)
290
328
  exit 1
291
329
  end
292
330
  end
@@ -295,7 +333,7 @@ class Morpheus::Cli::Instances
295
333
  options = {}
296
334
  optparse = OptionParser.new do|opts|
297
335
  opts.banner = "Usage: morpheus instances details [name]"
298
- Morpheus::Cli::CliCommand.genericOptions(opts,options)
336
+ build_common_options(opts, options, [:json, :remote])
299
337
  end
300
338
  if args.count < 1
301
339
  puts "\n#{optparse.banner}\n\n"
@@ -317,7 +355,7 @@ class Morpheus::Cli::Instances
317
355
  print cyan, "Storage: \t#{Filesize.from("#{stats['usedStorage']} B").pretty} / #{Filesize.from("#{stats['maxStorage']} B").pretty}\n\n",reset
318
356
  puts instance
319
357
  rescue RestClient::Exception => e
320
- ::Morpheus::Cli::ErrorHandler.new.print_rest_exception(e)
358
+ print_rest_exception(e, options)
321
359
  exit 1
322
360
  end
323
361
  end
@@ -326,7 +364,7 @@ class Morpheus::Cli::Instances
326
364
  options = {}
327
365
  optparse = OptionParser.new do|opts|
328
366
  opts.banner = "Usage: morpheus instances envs [name]"
329
- Morpheus::Cli::CliCommand.genericOptions(opts,options)
367
+ build_common_options(opts, options, [:json, :remote])
330
368
  end
331
369
  if args.count < 1
332
370
  puts "\n#{optparse.banner}\n\n"
@@ -349,7 +387,7 @@ class Morpheus::Cli::Instances
349
387
  print reset, "\n"
350
388
 
351
389
  rescue RestClient::Exception => e
352
- ::Morpheus::Cli::ErrorHandler.new.print_rest_exception(e)
390
+ print_rest_exception(e, options)
353
391
  exit 1
354
392
  end
355
393
  end
@@ -365,7 +403,7 @@ class Morpheus::Cli::Instances
365
403
  opts.on( '-M', "Masked" ) do |masked|
366
404
  options[:masked] = masked
367
405
  end
368
- Morpheus::Cli::CliCommand.genericOptions(opts,options)
406
+ build_common_options(opts, options, [:json, :remote])
369
407
  end
370
408
  if args.count < 3
371
409
  puts "\n#{optparse.banner}\n\n"
@@ -380,7 +418,7 @@ class Morpheus::Cli::Instances
380
418
  @instances_interface.create_env(instance['id'], [evar])
381
419
  envs([args[0]])
382
420
  rescue RestClient::Exception => e
383
- ::Morpheus::Cli::ErrorHandler.new.print_rest_exception(e)
421
+ print_rest_exception(e, options)
384
422
  exit 1
385
423
  end
386
424
  end
@@ -389,7 +427,7 @@ class Morpheus::Cli::Instances
389
427
  options = {}
390
428
  optparse = OptionParser.new do|opts|
391
429
  opts.banner = "Usage: morpheus instances setenv INSTANCE NAME"
392
- Morpheus::Cli::CliCommand.genericOptions(opts,options)
430
+ build_common_options(opts, options, [:json, :remote])
393
431
  end
394
432
  if args.count < 2
395
433
  puts "\n#{optparse.banner}\n\n"
@@ -402,7 +440,7 @@ class Morpheus::Cli::Instances
402
440
  @instances_interface.del_env(instance['id'], args[1])
403
441
  envs([args[0]])
404
442
  rescue RestClient::Exception => e
405
- ::Morpheus::Cli::ErrorHandler.new.print_rest_exception(e)
443
+ print_rest_exception(e, options)
406
444
  exit 1
407
445
  end
408
446
  end
@@ -411,7 +449,7 @@ class Morpheus::Cli::Instances
411
449
  options = {}
412
450
  optparse = OptionParser.new do|opts|
413
451
  opts.banner = "Usage: morpheus instances stop [name]"
414
- Morpheus::Cli::CliCommand.genericOptions(opts,options)
452
+ build_common_options(opts, options, [:auto_confirm, :json, :remote])
415
453
  end
416
454
  if args.count < 1
417
455
  puts "\n#{optparse.banner}\n\n"
@@ -421,7 +459,7 @@ class Morpheus::Cli::Instances
421
459
  connect(options)
422
460
  begin
423
461
  instance = find_instance_by_name(args[0])
424
- if !::Morpheus::Cli::OptionTypes::confirm("Are you sure you would like to stop this instance?", options)
462
+ unless options[:yes] || ::Morpheus::Cli::OptionTypes::confirm("Are you sure you would like to stop this instance?", options)
425
463
  exit 1
426
464
  end
427
465
  json_response = @instances_interface.stop(instance['id'])
@@ -431,7 +469,7 @@ class Morpheus::Cli::Instances
431
469
  end
432
470
  return
433
471
  rescue RestClient::Exception => e
434
- ::Morpheus::Cli::ErrorHandler.new.print_rest_exception(e)
472
+ print_rest_exception(e, options)
435
473
  exit 1
436
474
  end
437
475
  end
@@ -440,7 +478,7 @@ class Morpheus::Cli::Instances
440
478
  options = {}
441
479
  optparse = OptionParser.new do|opts|
442
480
  opts.banner = "Usage: morpheus instances start [name]"
443
- Morpheus::Cli::CliCommand.genericOptions(opts,options)
481
+ build_common_options(opts, options, [:json, :remote])
444
482
  end
445
483
  if args.count < 1
446
484
  puts "\n#{optparse.banner}\n\n"
@@ -457,7 +495,7 @@ class Morpheus::Cli::Instances
457
495
  end
458
496
  return
459
497
  rescue RestClient::Exception => e
460
- ::Morpheus::Cli::ErrorHandler.new.print_rest_exception(e)
498
+ print_rest_exception(e, options)
461
499
  exit 1
462
500
  end
463
501
  end
@@ -466,7 +504,7 @@ class Morpheus::Cli::Instances
466
504
  options = {}
467
505
  optparse = OptionParser.new do|opts|
468
506
  opts.banner = "Usage: morpheus instances restart [name]"
469
- Morpheus::Cli::CliCommand.genericOptions(opts,options)
507
+ build_common_options(opts, options, [:auto_confirm, :json, :remote])
470
508
  end
471
509
  if args.count < 1
472
510
  puts "\n#{optparse.banner}\n\n"
@@ -476,7 +514,7 @@ class Morpheus::Cli::Instances
476
514
  connect(options)
477
515
  begin
478
516
  instance = find_instance_by_name(args[0])
479
- if !::Morpheus::Cli::OptionTypes::confirm("Are you sure you would like to restart this instance?", options)
517
+ unless options[:yes] || ::Morpheus::Cli::OptionTypes::confirm("Are you sure you would like to restart this instance?", options)
480
518
  exit 1
481
519
  end
482
520
  json_response = @instances_interface.restart(instance['id'])
@@ -486,7 +524,7 @@ class Morpheus::Cli::Instances
486
524
  end
487
525
  return
488
526
  rescue RestClient::Exception => e
489
- ::Morpheus::Cli::ErrorHandler.new.print_rest_exception(e)
527
+ print_rest_exception(e, options)
490
528
  exit 1
491
529
  end
492
530
  end
@@ -495,7 +533,7 @@ class Morpheus::Cli::Instances
495
533
  options = {}
496
534
  optparse = OptionParser.new do|opts|
497
535
  opts.banner = "Usage: morpheus instances stop-service [name]"
498
- Morpheus::Cli::CliCommand.genericOptions(opts,options)
536
+ build_common_options(opts, options, [:auto_confirm, :json, :remote])
499
537
  end
500
538
  if args.count < 1
501
539
  puts "\n#{optparse.banner}\n\n"
@@ -505,7 +543,7 @@ class Morpheus::Cli::Instances
505
543
  connect(options)
506
544
  begin
507
545
  instance = find_instance_by_name(args[0])
508
- if !::Morpheus::Cli::OptionTypes::confirm("Are you sure you would like to stop this instance?", options)
546
+ unless options[:yes] || ::Morpheus::Cli::OptionTypes::confirm("Are you sure you would like to stop this instance?", options)
509
547
  exit 1
510
548
  end
511
549
  json_response = @instances_interface.stop(instance['id'],false)
@@ -517,7 +555,7 @@ class Morpheus::Cli::Instances
517
555
  end
518
556
  return
519
557
  rescue RestClient::Exception => e
520
- ::Morpheus::Cli::ErrorHandler.new.print_rest_exception(e)
558
+ print_rest_exception(e, options)
521
559
  exit 1
522
560
  end
523
561
  end
@@ -526,7 +564,7 @@ class Morpheus::Cli::Instances
526
564
  options = {}
527
565
  optparse = OptionParser.new do|opts|
528
566
  opts.banner = "Usage: morpheus instances start-service [name]"
529
- Morpheus::Cli::CliCommand.genericOptions(opts,options)
567
+ build_common_options(opts, options, [:json, :remote])
530
568
  end
531
569
  if args.count < 1
532
570
  puts "\n#{optparse.banner}\n\n"
@@ -545,7 +583,7 @@ class Morpheus::Cli::Instances
545
583
  end
546
584
  return
547
585
  rescue RestClient::Exception => e
548
- ::Morpheus::Cli::ErrorHandler.new.print_rest_exception(e)
586
+ print_rest_exception(e, options)
549
587
  exit 1
550
588
  end
551
589
  end
@@ -554,7 +592,7 @@ class Morpheus::Cli::Instances
554
592
  options = {}
555
593
  optparse = OptionParser.new do|opts|
556
594
  opts.banner = "Usage: morpheus instances restart-service [name]"
557
- Morpheus::Cli::CliCommand.genericOptions(opts,options)
595
+ build_common_options(opts, options, [:auto_confirm, :json, :remote])
558
596
  end
559
597
  if args.count < 1
560
598
  puts "\n#{optparse.banner}\n\n"
@@ -564,7 +602,7 @@ class Morpheus::Cli::Instances
564
602
  connect(options)
565
603
  begin
566
604
  instance = find_instance_by_name(args[0])
567
- if !::Morpheus::Cli::OptionTypes::confirm("Are you sure you would like to restart this instance?", options)
605
+ unless options[:yes] || ::Morpheus::Cli::OptionTypes::confirm("Are you sure you would like to restart this instance?", options)
568
606
  exit 1
569
607
  end
570
608
  json_response = @instances_interface.restart(instance['id'],false)
@@ -576,7 +614,95 @@ class Morpheus::Cli::Instances
576
614
  end
577
615
  return
578
616
  rescue RestClient::Exception => e
579
- ::Morpheus::Cli::ErrorHandler.new.print_rest_exception(e)
617
+ print_rest_exception(e, options)
618
+ exit 1
619
+ end
620
+ end
621
+
622
+ def resize(args)
623
+ options = {}
624
+ optparse = OptionParser.new do|opts|
625
+ opts.banner = "Usage: morpheus instances resize [name]"
626
+ build_common_options(opts, options, [:options, :json, :remote])
627
+ end
628
+ if args.count < 1
629
+ puts "\n#{optparse.banner}\n\n"
630
+ exit 1
631
+ end
632
+ optparse.parse(args)
633
+ connect(options)
634
+ begin
635
+ instance = find_instance_by_name(args[0])
636
+
637
+ group_id = instance['group']['id']
638
+ cloud_id = instance['cloud']['id']
639
+ layout_id = instance['layout']['id']
640
+
641
+ plan_id = instance['plan']['id']
642
+ payload = {}
643
+
644
+ # avoid 500 error
645
+ payload[:servicePlanOptions] = {}
646
+
647
+ puts "\nDue to limitations by most Guest Operating Systems, Disk sizes can only be expanded and not reduced.\nIf a smaller plan is selected, memory and CPU (if relevant) will be reduced but storage will not.\n\n"
648
+
649
+
650
+ #plan_prompt = Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'servicePlan', 'type' => 'select', 'fieldLabel' => 'Plan', 'optionSource' => 'instanceServicePlans', 'required' => true, 'description' => 'Choose the appropriately sized plan for this instance'}],options[:options],@api_client,{groupId: groupId, zoneId: cloud, instanceTypeId: instance_type['id'], layoutId: layout_id, version: version_prompt['version']})
651
+ available_plans_result = @options_interface.options_for_source('instanceServicePlans',{groupId: group_id, zoneId: cloud_id, instanceTypeId: instance['instanceType']['id'], layoutId: layout_id, version: instance['instanceVersion']})
652
+ available_plans = available_plans_result['data']
653
+ available_plans.each do |plan|
654
+ if plan['value'] && plan['value'].to_i == plan_id.to_i
655
+ plan['name'] = "#{plan['name']} (current)"
656
+ end
657
+ end
658
+
659
+ plan_prompt = Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'servicePlan', 'type' => 'select', 'fieldLabel' => 'New Plan', 'selectOptions' => available_plans, 'required' => true, 'description' => 'Choose the new plan for this instance'}],options[:options] )
660
+ new_plan_id = plan_prompt['servicePlan']
661
+ payload[:servicePlanId] = new_plan_id
662
+
663
+ volumes_response = @instances_interface.volumes(instance['id'])
664
+ current_volumes = volumes_response['volumes'].sort {|x,y| x['displayOrder'] <=> y['displayOrder'] }
665
+
666
+ begin
667
+ service_plan_options_json = @instance_types_interface.service_plan_options(new_plan_id, {cloudId: cloud_id, zoneId: cloud_id, layoutId: layout_id})
668
+
669
+ # puts ""
670
+ # print JSON.pretty_generate(service_plan_options_json)
671
+
672
+ plan_options = service_plan_options_json['plan']
673
+ volumes = prompt_resize_instance_volumes(current_volumes, plan_options, options, @api_client, {})
674
+
675
+ # puts "VOLUMES:"
676
+ # print JSON.pretty_generate(volumes)
677
+
678
+ if !volumes.empty?
679
+ payload[:volumes] = volumes
680
+ end
681
+
682
+ # puts "\nexiting early...\n"
683
+ # exit 1
684
+
685
+ rescue RestClient::Exception => e
686
+ print_red_alert "Unable to load options for selected plan."
687
+ print_rest_exception(e, options)
688
+ exit 1
689
+ end
690
+
691
+ # only amazon supports this option
692
+ # for now, always do this
693
+ payload[:deleteOriginalVolumes] = true
694
+
695
+ json_response = @instances_interface.resize(instance['id'], payload)
696
+ if options[:json]
697
+ print JSON.pretty_generate(json_response)
698
+ print "\n"
699
+ else
700
+ print_green_success "Resizing instance #{instance['name']}"
701
+ list([])
702
+ end
703
+
704
+ rescue RestClient::Exception => e
705
+ print_rest_exception(e, options)
580
706
  exit 1
581
707
  end
582
708
  end
@@ -585,9 +711,12 @@ class Morpheus::Cli::Instances
585
711
  options = {}
586
712
  optparse = OptionParser.new do|opts|
587
713
  opts.banner = "Usage: morpheus instances backup [name]"
588
- Morpheus::Cli::CliCommand.genericOptions(opts,options)
714
+ build_common_options(opts, options, [:json, :remote])
715
+ end
716
+ if args.count < 1
717
+ puts "\n#{optparse.banner}\n\n"
718
+ exit 1
589
719
  end
590
- puts "\n#{optparse.banner}\n\n" and exit 1 if args.count < 1
591
720
  optparse.parse(args)
592
721
  connect(options)
593
722
  begin
@@ -601,7 +730,7 @@ class Morpheus::Cli::Instances
601
730
  end
602
731
  return
603
732
  rescue RestClient::Exception => e
604
- ::Morpheus::Cli::ErrorHandler.new.print_rest_exception(e)
733
+ print_rest_exception(e, options)
605
734
  exit 1
606
735
  end
607
736
  end
@@ -612,7 +741,7 @@ class Morpheus::Cli::Instances
612
741
  opts.on( '-g', '--group GROUP', "Group Name" ) do |group|
613
742
  options[:group] = group
614
743
  end
615
- Morpheus::Cli::CliCommand.genericOptions(opts,options)
744
+ build_common_options(opts, options, [:list, :json, :remote])
616
745
  end
617
746
  optparse.parse(args)
618
747
  connect(options)
@@ -624,14 +753,8 @@ class Morpheus::Cli::Instances
624
753
  params['site'] = group
625
754
  end
626
755
  end
627
- if !options[:max].nil?
628
- params['max'] = options[:max]
629
- end
630
- if !options[:offset].nil?
631
- params['offset'] = options[:offset]
632
- end
633
- if !options[:phrase].nil?
634
- params['phrase'] = options[:phrase]
756
+ [:phrase, :offset, :max, :sort, :direction].each do |k|
757
+ params[k] = options[k] unless options[k].nil?
635
758
  end
636
759
 
637
760
  json_response = @instances_interface.get(params)
@@ -661,15 +784,15 @@ class Morpheus::Cli::Instances
661
784
  if !instance['connectionInfo'].nil? && instance['connectionInfo'].empty? == false
662
785
  connection_string = "#{instance['connectionInfo'][0]['ip']}:#{instance['connectionInfo'][0]['port']}"
663
786
  end
664
- {id: instance['id'], name: instance['name'], connection: connection_string, environment: instance['instanceContext'], nodes: instance['containers'].count, status: status_string, type: instance['instanceType']['name'], group: !instance['group'].nil? ? instance['group']['name'] : nil}
787
+ {id: instance['id'], name: instance['name'], connection: connection_string, environment: instance['instanceContext'], nodes: instance['containers'].count, status: status_string, type: instance['instanceType']['name'], group: !instance['group'].nil? ? instance['group']['name'] : nil, cloud: !instance['cloud'].nil? ? instance['cloud']['name'] : nil}
665
788
  end
666
- tp instance_table, :id, :name,:group, :type, :environment, :nodes, :connection, :status
789
+ tp instance_table, :id, :name, :group, :cloud, :type, :environment, :nodes, :connection, :status
667
790
  end
668
791
  print reset,"\n\n"
669
792
  end
670
793
 
671
794
  rescue RestClient::Exception => e
672
- ::Morpheus::Cli::ErrorHandler.new.print_rest_exception(e)
795
+ print_rest_exception(e, options)
673
796
  exit 1
674
797
  end
675
798
  end
@@ -685,7 +808,7 @@ class Morpheus::Cli::Instances
685
808
  opts.on( '-B', '--keep-backups', "Preserve copy of backups" ) do
686
809
  query_params[:keepBackups] = 'on'
687
810
  end
688
- Morpheus::Cli::CliCommand.genericOptions(opts,options)
811
+ build_common_options(opts, options, [:auto_confirm, :json, :remote])
689
812
 
690
813
  end
691
814
  if args.count < 1
@@ -696,13 +819,13 @@ class Morpheus::Cli::Instances
696
819
  connect(options)
697
820
  begin
698
821
  instance = find_instance_by_name(args[0])
699
- if !::Morpheus::Cli::OptionTypes::confirm("Are you sure you would like to remove this instance?", options)
822
+ unless options[:yes] || ::Morpheus::Cli::OptionTypes::confirm("Are you sure you would like to remove this instance?", options)
700
823
  exit 1
701
824
  end
702
825
  @instances_interface.destroy(instance['id'],query_params)
703
826
  list([])
704
827
  rescue RestClient::Exception => e
705
- ::Morpheus::Cli::ErrorHandler.new.print_rest_exception(e)
828
+ print_rest_exception(e, options)
706
829
  exit 1
707
830
  end
708
831
  end
@@ -711,7 +834,7 @@ class Morpheus::Cli::Instances
711
834
  options = {}
712
835
  optparse = OptionParser.new do|opts|
713
836
  opts.banner = "Usage: morpheus instances firewall-disable [name]"
714
- Morpheus::Cli::CliCommand.genericOptions(opts,options)
837
+ build_common_options(opts, options, [:json, :remote])
715
838
  end
716
839
  if args.count < 1
717
840
  puts "\n#{optparse.banner}\n\n"
@@ -724,7 +847,7 @@ class Morpheus::Cli::Instances
724
847
  @instances_interface.firewall_disable(instance['id'])
725
848
  security_groups([args[0]])
726
849
  rescue RestClient::Exception => e
727
- ::Morpheus::Cli::ErrorHandler.new.print_rest_exception(e)
850
+ print_rest_exception(e, options)
728
851
  exit 1
729
852
  end
730
853
  end
@@ -733,7 +856,7 @@ class Morpheus::Cli::Instances
733
856
  options = {}
734
857
  optparse = OptionParser.new do|opts|
735
858
  opts.banner = "Usage: morpheus instances firewall-enable [name]"
736
- Morpheus::Cli::CliCommand.genericOptions(opts,options)
859
+ build_common_options(opts, options, [:json, :remote])
737
860
  end
738
861
  if args.count < 1
739
862
  puts "\n#{optparse.banner}\n\n"
@@ -750,7 +873,7 @@ class Morpheus::Cli::Instances
750
873
  @instances_interface.firewall_enable(instance_results['instances'][0]['id'])
751
874
  security_groups([args[0]])
752
875
  rescue RestClient::Exception => e
753
- ::Morpheus::Cli::ErrorHandler.new.print_rest_exception(e)
876
+ print_rest_exception(e, options)
754
877
  exit 1
755
878
  end
756
879
  end
@@ -759,7 +882,7 @@ class Morpheus::Cli::Instances
759
882
  options = {}
760
883
  optparse = OptionParser.new do|opts|
761
884
  opts.banner = "Usage: morpheus instances security-groups [name]"
762
- Morpheus::Cli::CliCommand.genericOptions(opts,options)
885
+ build_common_options(opts, options, [:json, :remote])
763
886
  end
764
887
  if args.count < 1
765
888
  puts "\n#{optparse.banner}\n\n"
@@ -785,7 +908,7 @@ class Morpheus::Cli::Instances
785
908
  print reset,"\n\n"
786
909
 
787
910
  rescue RestClient::Exception => e
788
- ::Morpheus::Cli::ErrorHandler.new.print_rest_exception(e)
911
+ print_rest_exception(e, options)
789
912
  exit 1
790
913
  end
791
914
  end
@@ -803,7 +926,7 @@ class Morpheus::Cli::Instances
803
926
  options[:securityGroupIds] = secgroups.split(",")
804
927
  clear_or_secgroups_specified = true
805
928
  end
806
- Morpheus::Cli::CliCommand.genericOptions(opts,options)
929
+ build_common_options(opts, options, [:json, :remote])
807
930
  end
808
931
  if args.count < 1
809
932
  puts "\n#{optparse.banner}\n\n"
@@ -822,7 +945,7 @@ class Morpheus::Cli::Instances
822
945
  @instances_interface.apply_security_groups(instance['id'], options)
823
946
  security_groups([args[0]])
824
947
  rescue RestClient::Exception => e
825
- ::Morpheus::Cli::ErrorHandler.new.print_rest_exception(e)
948
+ print_rest_exception(e, options)
826
949
  exit 1
827
950
  end
828
951
  end
@@ -833,7 +956,7 @@ class Morpheus::Cli::Instances
833
956
 
834
957
  optparse = OptionParser.new do|opts|
835
958
  opts.banner = "Usage: morpheus instances run-workflow [INSTANCE] [name] [options]"
836
- Morpheus::Cli::CliCommand.genericOptions(opts,options)
959
+ build_common_options(opts, options, [:options, :json, :remote])
837
960
  end
838
961
  if args.count < 2
839
962
  puts "\n#{optparse}\n\n"
@@ -877,7 +1000,7 @@ class Morpheus::Cli::Instances
877
1000
  puts "Running workflow..."
878
1001
  end
879
1002
  rescue RestClient::Exception => e
880
- ::Morpheus::Cli::ErrorHandler.new.print_rest_exception(e)
1003
+ print_rest_exception(e, options)
881
1004
  exit 1
882
1005
  end
883
1006
  end
@@ -887,7 +1010,7 @@ private
887
1010
  def find_instance_by_name(name)
888
1011
  instance_results = @instances_interface.get({name: name})
889
1012
  if instance_results['instances'].empty?
890
- puts "Instance not found by name #{name}"
1013
+ print_red_alert "Instance not found by name #{name}"
891
1014
  exit 1
892
1015
  end
893
1016
  return instance_results['instances'][0]
@@ -897,7 +1020,7 @@ private
897
1020
  if !task_set_results['taskSets'].nil? && !task_set_results['taskSets'].empty?
898
1021
  return task_set_results['taskSets'][0]
899
1022
  else
900
- puts "Workflow not found by name #{name}"
1023
+ print_red_alert "Workflow not found by name #{name}"
901
1024
  exit 1
902
1025
  end
903
1026
  end