morpheus-cli 5.3.3 → 5.3.4

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 (35) hide show
  1. checksums.yaml +4 -4
  2. data/Dockerfile +1 -1
  3. data/lib/morpheus/api/api_client.rb +12 -0
  4. data/lib/morpheus/api/clouds_interface.rb +4 -11
  5. data/lib/morpheus/api/load_balancer_pools_interface.rb +4 -4
  6. data/lib/morpheus/api/load_balancer_profiles_interface.rb +10 -0
  7. data/lib/morpheus/api/load_balancer_virtual_servers_interface.rb +4 -4
  8. data/lib/morpheus/api/network_routers_interface.rb +21 -0
  9. data/lib/morpheus/api/network_servers_interface.rb +42 -0
  10. data/lib/morpheus/api/rest_interface.rb +2 -1
  11. data/lib/morpheus/api/virtual_servers_interface.rb +9 -0
  12. data/lib/morpheus/cli/cli_command.rb +2 -1
  13. data/lib/morpheus/cli/cloud_resource_pools_command.rb +1 -1
  14. data/lib/morpheus/cli/clouds.rb +22 -40
  15. data/lib/morpheus/cli/hosts.rb +0 -1
  16. data/lib/morpheus/cli/instances.rb +111 -7
  17. data/lib/morpheus/cli/invoices_command.rb +42 -38
  18. data/lib/morpheus/cli/library_option_lists_command.rb +3 -3
  19. data/lib/morpheus/cli/load_balancer_pools.rb +111 -0
  20. data/lib/morpheus/cli/load_balancer_virtual_servers.rb +136 -0
  21. data/lib/morpheus/cli/load_balancers.rb +0 -155
  22. data/lib/morpheus/cli/mixins/load_balancers_helper.rb +2 -2
  23. data/lib/morpheus/cli/mixins/provisioning_helper.rb +32 -11
  24. data/lib/morpheus/cli/mixins/rest_command.rb +53 -37
  25. data/lib/morpheus/cli/mixins/secondary_rest_command.rb +488 -0
  26. data/lib/morpheus/cli/network_routers_command.rb +291 -7
  27. data/lib/morpheus/cli/network_scopes_command.rb +442 -0
  28. data/lib/morpheus/cli/networks_command.rb +2 -2
  29. data/lib/morpheus/cli/option_types.rb +20 -0
  30. data/lib/morpheus/cli/subnets_command.rb +7 -2
  31. data/lib/morpheus/cli/tasks.rb +25 -2
  32. data/lib/morpheus/cli/version.rb +1 -1
  33. data/lib/morpheus/cli/virtual_images.rb +2 -0
  34. data/lib/morpheus/cli.rb +9 -1
  35. metadata +9 -2
@@ -584,7 +584,7 @@ module Morpheus::Cli::ProvisioningHelper
584
584
  if options[:description]
585
585
  options[:options]['description'] = options[:description]
586
586
  end
587
- v_prompt = Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'description', 'fieldLabel' => 'Description', 'type' => 'text', 'required' => false}], options[:options])
587
+ v_prompt = Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'description', 'fieldLabel' => 'Description', 'type' => 'text', 'required' => false, 'defaultValue' => options[:default_description]}], options[:options])
588
588
  payload['instance']['description'] = v_prompt['description'] if !v_prompt['description'].empty?
589
589
 
590
590
  # Environment
@@ -593,14 +593,14 @@ module Morpheus::Cli::ProvisioningHelper
593
593
  elsif options[:options]['instanceContext'] && !options[:options]['environment']
594
594
  options[:options]['environment'] = options[:options]['instanceContext']
595
595
  end
596
- v_prompt = Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'environment', 'fieldLabel' => 'Environment', 'type' => 'select', 'required' => false, 'selectOptions' => get_available_environments()}], options[:options])
596
+ v_prompt = Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'environment', 'fieldLabel' => 'Environment', 'type' => 'select', 'required' => false, 'selectOptions' => get_available_environments(), 'defaultValue' => options[:default_environment]}], options[:options])
597
597
  payload['instance']['instanceContext'] = v_prompt['environment'] if !v_prompt['environment'].empty?
598
598
 
599
599
  # Labels (used to be called tags)
600
600
  if options[:labels]
601
601
  payload['instance']['labels'] = options[:labels].is_a?(Array) ? options[:labels] : options[:labels].to_s.split(',').collect {|it| it.to_s.strip }.compact.uniq
602
602
  else
603
- v_prompt = Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'labels', 'fieldLabel' => 'Labels', 'type' => 'text', 'required' => false}], options[:options])
603
+ v_prompt = Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'labels', 'fieldLabel' => 'Labels', 'type' => 'text', 'required' => false, 'defaultValue' => options[:default_labels]}], options[:options])
604
604
  payload['instance']['labels'] = v_prompt['labels'].split(',').collect {|it| it.to_s.strip }.compact.uniq if !v_prompt['labels'].empty?
605
605
  end
606
606
 
@@ -986,20 +986,28 @@ module Morpheus::Cli::ProvisioningHelper
986
986
  end
987
987
 
988
988
  # metadata tags
989
- if options[:options]['metadata'].is_a?(Array) && !options[:metadata]
990
- options[:metadata] = options[:options]['metadata']
989
+ # metadata_tag_key = 'metadata'
990
+ metadata_tag_key = 'tags'
991
+ if !options[:metadata]
992
+ if options[:options]['metadata'].is_a?(Array)
993
+ options[:metadata] = options[:options]['metadata']
994
+ end
995
+ if options[:options]['tags'].is_a?(Array)
996
+ options[:metadata] = options[:options]['tags']
997
+ end
991
998
  end
992
999
  if options[:metadata]
1000
+ metadata = []
993
1001
  if options[:metadata] == "[]" || options[:metadata] == "null"
994
- payload['metadata'] = []
1002
+ metadata = []
995
1003
  elsif options[:metadata].is_a?(Array)
996
- payload['metadata'] = options[:metadata]
1004
+ metadata = options[:metadata]
997
1005
  else
998
1006
  # parse string into format name:value, name:value
999
1007
  # merge IDs from current metadata
1000
1008
  # todo: should allow quoted semicolons..
1001
- metadata_list = options[:metadata].split(",").select {|it| !it.to_s.empty? }
1002
- metadata_list = metadata_list.collect do |it|
1009
+ metadata = options[:metadata].split(",").select {|it| !it.to_s.empty? }
1010
+ metadata = metadata.collect do |it|
1003
1011
  metadata_pair = it.split(":")
1004
1012
  if metadata_pair.size < 2 && it.include?("=")
1005
1013
  metadata_pair = it.split("=")
@@ -1009,13 +1017,13 @@ module Morpheus::Cli::ProvisioningHelper
1009
1017
  row['value'] = metadata_pair[1].to_s.strip
1010
1018
  row
1011
1019
  end
1012
- payload['metadata'] = metadata_list
1013
1020
  end
1021
+ payload[metadata_tag_key] = metadata
1014
1022
  else
1015
1023
  # prompt for metadata tags
1016
1024
  metadata = prompt_metadata(options)
1017
1025
  if !metadata.empty?
1018
- payload['metadata'] = metadata
1026
+ payload[metadata_tag_key] = metadata
1019
1027
  end
1020
1028
  end
1021
1029
 
@@ -1737,6 +1745,19 @@ module Morpheus::Cli::ProvisioningHelper
1737
1745
  no_prompt = (options[:no_prompt] || (options[:options] && options[:options][:no_prompt]))
1738
1746
  metadata_array = []
1739
1747
  metadata_index = 0
1748
+ # Keep Current Tags (foo:bar,hello:world)
1749
+ # this is used by clone()
1750
+ if options[:current_tags] && !options[:current_tags].empty?
1751
+ current_tags_string = options[:current_tags].collect { |tag| tag['name'].to_s + '=' + tag['value'].to_s }.join(', ')
1752
+ v_prompt = Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'keepExistingTags', 'type' => 'checkbox', 'fieldLabel' => "Keep existing metadata tags (#{current_tags_string}) ?", 'required' => true, 'description' => 'Whether or not to keep existing metadata tags', 'defaultValue' => true}], options[:options])
1753
+ if ['on','true','1',''].include?(v_prompt['keepExistingTags'].to_s.downcase)
1754
+ options[:current_tags].each do |tag|
1755
+ current_tag = tag.clone
1756
+ current_tag.delete('id')
1757
+ metadata_array << current_tag
1758
+ end
1759
+ end
1760
+ end
1740
1761
  has_another_metadata = options[:options] && options[:options]["metadata#{metadata_index}"]
1741
1762
  add_another_metadata = has_another_metadata || (!no_prompt && Morpheus::Cli::OptionTypes.confirm("Add a metadata tag?", {default: false}))
1742
1763
  while add_another_metadata do
@@ -10,7 +10,8 @@
10
10
  # * load_balancer_column_definitions() - Column definitions for the "get" command display output.
11
11
  # * load_balancer_list_column_definitions() - Column definitions for the "list" command display output.
12
12
  #
13
- # # An example of a RestCommand for `morpheus load-balancers`.
13
+ # Example of a RestCommand for `morpheus load-balancers`.
14
+ #
14
15
  # class Morpheus::Cli::LoadBalancers
15
16
  #
16
17
  # include Morpheus::Cli::CliCommand
@@ -21,7 +22,7 @@
21
22
  # # and would be the default values if not set.
22
23
  # set_rest_name :load_balancers
23
24
  # set_rest_label "Load Balancer"
24
- # set_rest_plural_label "Load Balancers"
25
+ # set_rest_label_plural "Load Balancers"
25
26
  # set_rest_object_key "load_balancer"
26
27
  # set_rest_has_type true
27
28
  # set_rest_type "load_balancer_types"
@@ -50,7 +51,7 @@ module Morpheus::Cli::RestCommand
50
51
  end
51
52
 
52
53
  def rest_name=(v)
53
- @rest_name = v
54
+ @rest_name = v.to_s
54
55
  end
55
56
 
56
57
  alias :set_rest_name :rest_name=
@@ -61,11 +62,11 @@ module Morpheus::Cli::RestCommand
61
62
  end
62
63
 
63
64
  def default_rest_key
64
- rest_name.chomp("s")
65
+ rest_name.to_s.chomp("s")
65
66
  end
66
67
 
67
68
  def rest_key=(v)
68
- @rest_key = v
69
+ @rest_key = v.to_s
69
70
  end
70
71
 
71
72
  alias :set_rest_key :rest_key=
@@ -80,7 +81,7 @@ module Morpheus::Cli::RestCommand
80
81
  end
81
82
 
82
83
  def rest_arg=(v)
83
- @rest_arg = v
84
+ @rest_arg = v.to_s
84
85
  end
85
86
 
86
87
  alias :set_rest_arg :rest_arg=
@@ -95,26 +96,26 @@ module Morpheus::Cli::RestCommand
95
96
  end
96
97
 
97
98
  def rest_label=(v)
98
- @rest_label = v
99
+ @rest_label = v.to_s
99
100
  end
100
101
 
101
102
  alias :set_rest_label :rest_label=
102
103
 
103
104
  # the plural version of the label eg. "Neat Things"
104
- def rest_plural_label
105
- @rest_plural_label || default_rest_plural_label
105
+ def rest_label_plural
106
+ @rest_label_plural || default_rest_label_plural
106
107
  end
107
108
 
108
- def default_rest_plural_label
109
+ def default_rest_label_plural
109
110
  #rest_name.to_s.split("_").collect {|it| it.to_s.capitalize }.join(" ")
110
111
  rest_label.to_s.pluralize
111
112
  end
112
113
 
113
- def rest_plural_label=(v)
114
- @rest_plural_label = v
114
+ def rest_label_plural=(v)
115
+ @rest_label_plural = v.to_s
115
116
  end
116
117
 
117
- alias :set_rest_plural_label :rest_plural_label=
118
+ alias :set_rest_label_plural :rest_label_plural=
118
119
 
119
120
  # rest_interface_name is the interface name for the resource. eg. "neat_things"
120
121
  def rest_interface_name
@@ -126,7 +127,7 @@ module Morpheus::Cli::RestCommand
126
127
  end
127
128
 
128
129
  def rest_interface_name=(v)
129
- @rest_interface_name = v
130
+ @rest_interface_name = v.to_s
130
131
  end
131
132
 
132
133
  alias :set_rest_interface_name :rest_interface_name=
@@ -158,7 +159,7 @@ module Morpheus::Cli::RestCommand
158
159
  end
159
160
 
160
161
  def rest_type_name=(v)
161
- @rest_type_name = v
162
+ @rest_type_name = v.to_s
162
163
  end
163
164
 
164
165
  alias :set_rest_type_name :rest_type_name=
@@ -175,7 +176,7 @@ module Morpheus::Cli::RestCommand
175
176
  end
176
177
 
177
178
  def rest_type_key=(v)
178
- @rest_type_key = v
179
+ @rest_type_key = v.to_s
179
180
  end
180
181
 
181
182
  alias :set_rest_type_key :rest_type_key=
@@ -190,7 +191,7 @@ module Morpheus::Cli::RestCommand
190
191
  end
191
192
 
192
193
  def rest_type_arg=(v)
193
- @rest_type_arg = v
194
+ @rest_type_arg = v.to_s
194
195
  end
195
196
 
196
197
  alias :set_rest_type_arg :rest_type_arg=
@@ -205,26 +206,26 @@ module Morpheus::Cli::RestCommand
205
206
  end
206
207
 
207
208
  def rest_type_label=(v)
208
- @rest_type_label = v
209
+ @rest_type_label = v.to_s
209
210
  end
210
211
 
211
212
  alias :set_rest_type_label :rest_type_label=
212
213
 
213
214
  # the plural version of the label eg. "Neat Things"
214
- def rest_type_plural_label
215
- @rest_type_plural_label || default_rest_type_plural_label
215
+ def rest_type_label_plural
216
+ @rest_type_label_plural || default_rest_type_label_plural
216
217
  end
217
218
 
218
- def default_rest_type_plural_label
219
+ def default_rest_type_label_plural
219
220
  #rest_type_name.to_s.split("_").collect {|it| it.to_s.capitalize }.join(" ")
220
221
  rest_type_label.to_s.pluralize
221
222
  end
222
223
 
223
- def rest_type_plural_label=(v)
224
- @rest_type_plural_label = v
224
+ def rest_type_label_plural=(v)
225
+ @rest_type_label_plural = v.to_s
225
226
  end
226
227
 
227
- alias :set_rest_type_plural_label :rest_type_plural_label=
228
+ alias :set_rest_type_label_plural :rest_type_label_plural=
228
229
 
229
230
  # the name of the default interface, matches the rest name eg. "neat_things"
230
231
  def rest_type_interface_name
@@ -236,7 +237,7 @@ module Morpheus::Cli::RestCommand
236
237
  end
237
238
 
238
239
  def rest_type_interface_name=(v)
239
- @rest_type_interface_name = v
240
+ @rest_type_interface_name = v.to_s
240
241
  end
241
242
 
242
243
  alias :set_rest_type_interface_name :rest_type_interface_name=
@@ -247,7 +248,7 @@ module Morpheus::Cli::RestCommand
247
248
  def register_interfaces(*interfaces)
248
249
  @registered_interfaces ||= []
249
250
  interfaces.flatten.each do |it|
250
- @registered_interfaces << it.to_sym
251
+ @registered_interfaces << it.to_s
251
252
  end
252
253
  # put the default rest_interface first
253
254
  if rest_interface_name && !@registered_interfaces.include?(rest_interface_name)
@@ -300,8 +301,8 @@ module Morpheus::Cli::RestCommand
300
301
  self.class.rest_label
301
302
  end
302
303
 
303
- def rest_plural_label
304
- self.class.rest_plural_label
304
+ def rest_label_plural
305
+ self.class.rest_label_plural
305
306
  end
306
307
 
307
308
  def rest_interface_name
@@ -356,8 +357,8 @@ module Morpheus::Cli::RestCommand
356
357
  self.class.rest_type_label
357
358
  end
358
359
 
359
- def rest_type_plural_label
360
- self.class.rest_type_plural_label
360
+ def rest_type_label_plural
361
+ self.class.rest_type_label_plural
361
362
  end
362
363
 
363
364
  def rest_type_interface_name
@@ -415,9 +416,12 @@ module Morpheus::Cli::RestCommand
415
416
  params = {}
416
417
  options = {}
417
418
  optparse = Morpheus::Cli::OptionParser.new do |opts|
418
- opts.banner = subcommand_usage()
419
+ opts.banner = subcommand_usage("[search]")
419
420
  build_standard_list_options(opts, options)
420
- opts.footer = "List #{rest_plural_label.downcase}."
421
+ opts.footer = <<-EOT
422
+ List #{rest_label_plural.downcase}.
423
+ [search] is optional. This is a search phrase to filter the results.
424
+ EOT
421
425
  end
422
426
  optparse.parse!(args)
423
427
  connect(options)
@@ -433,9 +437,9 @@ module Morpheus::Cli::RestCommand
433
437
  json_response = rest_interface.list(params)
434
438
  render_response(json_response, options, rest_list_key) do
435
439
  records = json_response[rest_list_key]
436
- print_h1 "Morpheus #{rest_plural_label}"
440
+ print_h1 "Morpheus #{rest_label_plural}"
437
441
  if records.nil? || records.empty?
438
- print cyan,"No #{rest_plural_label.downcase} found.",reset,"\n"
442
+ print cyan,"No #{rest_label_plural.downcase} found.",reset,"\n"
439
443
  else
440
444
  print as_pretty_table(records, rest_list_column_definitions.upcase_keys!, options)
441
445
  print_results_pagination(json_response) if json_response['meta']
@@ -449,7 +453,7 @@ module Morpheus::Cli::RestCommand
449
453
  params = {}
450
454
  options = {}
451
455
  optparse = Morpheus::Cli::OptionParser.new do |opts|
452
- opts.banner = subcommand_usage("[type]")
456
+ opts.banner = subcommand_usage("[#{rest_arg}]")
453
457
  build_standard_get_options(opts, options)
454
458
  opts.footer = <<-EOT
455
459
  Get details about #{a_or_an(rest_label)} #{rest_label.downcase}.
@@ -504,17 +508,21 @@ EOT
504
508
  options = {}
505
509
  optparse = Morpheus::Cli::OptionParser.new do |opts|
506
510
  if rest_has_type
507
- opts.banner = subcommand_usage("[name] -t TYPE")
511
+ opts.banner = subcommand_usage("[#{rest_arg}] -t TYPE")
508
512
  opts.on( '-t', "--#{rest_type_arg} TYPE", "#{rest_type_label}" ) do |val|
509
513
  record_type_id = val
510
514
  end
511
515
  else
512
- opts.banner = subcommand_usage("[name]")
516
+ opts.banner = subcommand_usage("[#{rest_arg}]")
513
517
  end
514
518
  # if defined?(add_#{rest_key}_option_types)
515
519
  # build_option_type_options(opts, options, add_#{rest_key}_option_types)
516
520
  # end
517
521
  build_standard_add_options(opts, options)
522
+ opts.footer = <<-EOT
523
+ Create a new #{rest_label.downcase}.
524
+ [#{rest_arg}] is required. This is the name of the new #{rest_label.downcase}.
525
+ EOT
518
526
  end
519
527
  optparse.parse!(args)
520
528
  # todo: make supporting args[0] optional and more flexible
@@ -592,6 +600,10 @@ EOT
592
600
  optparse = Morpheus::Cli::OptionParser.new do |opts|
593
601
  opts.banner = subcommand_usage("[#{rest_arg}] [options]")
594
602
  build_standard_update_options(opts, options)
603
+ opts.footer = <<-EOT
604
+ Update an existing #{rest_label.downcase}.
605
+ [#{rest_arg}] is required. This is the name or id of #{a_or_an(rest_label)} #{rest_label.downcase}.
606
+ EOT
595
607
  end
596
608
  optparse.parse!(args)
597
609
  verify_args!(args:args, optparse:optparse, count:1)
@@ -629,6 +641,10 @@ EOT
629
641
  optparse = Morpheus::Cli::OptionParser.new do |opts|
630
642
  opts.banner = subcommand_usage("[#{rest_arg}]")
631
643
  build_standard_remove_options(opts, options)
644
+ opts.footer = <<-EOT
645
+ Delete an existing #{rest_label.downcase}.
646
+ [#{rest_arg}] is required. This is the name or id of #{a_or_an(rest_label)} #{rest_label.downcase}.
647
+ EOT
632
648
  end
633
649
  optparse.parse!(args)
634
650
  verify_args!(args:args, optparse:optparse, count:1)