morpheus-cli 5.4.0 → 5.4.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (75) hide show
  1. checksums.yaml +4 -4
  2. data/Dockerfile +1 -1
  3. data/lib/morpheus/api/account_users_interface.rb +68 -0
  4. data/lib/morpheus/api/api_client.rb +51 -9
  5. data/lib/morpheus/api/audit_interface.rb +9 -0
  6. data/lib/morpheus/api/instances_interface.rb +21 -0
  7. data/lib/morpheus/api/load_balancer_monitors_interface.rb +9 -0
  8. data/lib/morpheus/api/load_balancer_pools_interface.rb +4 -4
  9. data/lib/morpheus/api/load_balancer_profiles_interface.rb +4 -5
  10. data/lib/morpheus/api/load_balancer_virtual_servers_interface.rb +13 -4
  11. data/lib/morpheus/api/load_balancers_interface.rb +5 -0
  12. data/lib/morpheus/api/network_routers_interface.rb +9 -0
  13. data/lib/morpheus/api/network_static_routes_interface.rb +36 -0
  14. data/lib/morpheus/api/read_interface.rb +4 -3
  15. data/lib/morpheus/api/rest_interface.rb +3 -3
  16. data/lib/morpheus/api/secondary_read_interface.rb +1 -1
  17. data/lib/morpheus/api/secondary_rest_interface.rb +19 -19
  18. data/lib/morpheus/api/storage_server_types_interface.rb +14 -0
  19. data/lib/morpheus/api/storage_servers_interface.rb +9 -0
  20. data/lib/morpheus/api/storage_volume_types_interface.rb +9 -0
  21. data/lib/morpheus/api/storage_volumes_interface.rb +9 -0
  22. data/lib/morpheus/api/users_interface.rb +16 -63
  23. data/lib/morpheus/cli/cli_command.rb +253 -5
  24. data/lib/morpheus/cli/cli_registry.rb +1 -1
  25. data/lib/morpheus/cli/commands/alias_command.rb +1 -1
  26. data/lib/morpheus/cli/commands/apps.rb +14 -78
  27. data/lib/morpheus/cli/commands/audit.rb +188 -0
  28. data/lib/morpheus/cli/commands/blueprints_command.rb +1 -1
  29. data/lib/morpheus/cli/commands/change_password_command.rb +4 -4
  30. data/lib/morpheus/cli/commands/clusters.rb +37 -12
  31. data/lib/morpheus/cli/commands/hosts.rb +15 -15
  32. data/lib/morpheus/cli/commands/instances.rb +109 -2
  33. data/lib/morpheus/cli/commands/load_balancer_monitors.rb +71 -0
  34. data/lib/morpheus/cli/commands/load_balancer_pools.rb +30 -50
  35. data/lib/morpheus/cli/commands/load_balancer_profiles.rb +65 -0
  36. data/lib/morpheus/cli/commands/load_balancer_types.rb +9 -4
  37. data/lib/morpheus/cli/commands/load_balancer_virtual_servers.rb +77 -57
  38. data/lib/morpheus/cli/commands/load_balancers.rb +93 -6
  39. data/lib/morpheus/cli/commands/network_firewalls_command.rb +22 -5
  40. data/lib/morpheus/cli/commands/network_routers_command.rb +96 -45
  41. data/lib/morpheus/cli/commands/network_static_routes_command.rb +446 -0
  42. data/lib/morpheus/cli/commands/network_transport_zones_command.rb +4 -4
  43. data/lib/morpheus/cli/commands/open_command.rb +30 -0
  44. data/lib/morpheus/cli/commands/options.rb +98 -0
  45. data/lib/morpheus/cli/commands/policies_command.rb +1 -1
  46. data/lib/morpheus/cli/commands/prices_command.rb +7 -7
  47. data/lib/morpheus/cli/commands/remote.rb +4 -2
  48. data/lib/morpheus/cli/commands/roles.rb +1 -1
  49. data/lib/morpheus/cli/commands/shell.rb +2 -2
  50. data/lib/morpheus/cli/commands/storage_server_types.rb +50 -0
  51. data/lib/morpheus/cli/commands/storage_servers.rb +122 -0
  52. data/lib/morpheus/cli/commands/storage_volume_types.rb +50 -0
  53. data/lib/morpheus/cli/commands/storage_volumes.rb +103 -0
  54. data/lib/morpheus/cli/commands/tenants_command.rb +1 -1
  55. data/lib/morpheus/cli/commands/user_groups_command.rb +1 -1
  56. data/lib/morpheus/cli/commands/user_settings_command.rb +2 -1
  57. data/lib/morpheus/cli/commands/user_sources_command.rb +1 -1
  58. data/lib/morpheus/cli/commands/users.rb +28 -28
  59. data/lib/morpheus/cli/commands/view.rb +102 -0
  60. data/lib/morpheus/cli/mixins/accounts_helper.rb +5 -5
  61. data/lib/morpheus/cli/mixins/load_balancers_helper.rb +24 -4
  62. data/lib/morpheus/cli/mixins/print_helper.rb +50 -18
  63. data/lib/morpheus/cli/mixins/processes_helper.rb +1 -2
  64. data/lib/morpheus/cli/mixins/provisioning_helper.rb +15 -5
  65. data/lib/morpheus/cli/mixins/rest_command.rb +145 -73
  66. data/lib/morpheus/cli/mixins/secondary_rest_command.rb +174 -81
  67. data/lib/morpheus/cli/mixins/storage_servers_helper.rb +156 -0
  68. data/lib/morpheus/cli/mixins/storage_volumes_helper.rb +119 -0
  69. data/lib/morpheus/cli/option_types.rb +45 -24
  70. data/lib/morpheus/cli/version.rb +1 -1
  71. data/lib/morpheus/cli.rb +1 -0
  72. data/lib/morpheus/ext/string.rb +29 -6
  73. data/lib/morpheus/routes.rb +238 -0
  74. data/lib/morpheus/util.rb +6 -1
  75. metadata +29 -8
@@ -9,7 +9,7 @@ class Morpheus::Cli::ChangePasswordCommand
9
9
  def connect(opts)
10
10
  @api_client = establish_remote_appliance_connection(opts)
11
11
  @whoami_interface = @api_client.whoami
12
- @users_interface = @api_client.users
12
+ @account_users_interface = @api_client.account_users
13
13
  @accounts_interface = @api_client.accounts
14
14
  @roles_interface = @api_client.roles
15
15
  end
@@ -105,9 +105,9 @@ class Morpheus::Cli::ChangePasswordCommand
105
105
  'password' => new_password
106
106
  }
107
107
  }
108
- @users_interface.setopts(options)
108
+ @account_users_interface.setopts(options)
109
109
  if options[:dry_run]
110
- print_dry_run @users_interface.dry.update(account_id, user['id'], payload)
110
+ print_dry_run @account_users_interface.dry.update(account_id, user['id'], payload)
111
111
  return 0
112
112
  end
113
113
 
@@ -117,7 +117,7 @@ class Morpheus::Cli::ChangePasswordCommand
117
117
  end
118
118
  end
119
119
 
120
- json_response = @users_interface.update(account_id, user['id'], payload)
120
+ json_response = @account_users_interface.update(account_id, user['id'], payload)
121
121
  if options[:json]
122
122
  puts as_json(json_response)
123
123
  elsif !options[:quiet]
@@ -458,6 +458,10 @@ class Morpheus::Cli::Clusters
458
458
 
459
459
  cluster_payload['type'] = cluster_type['code'] # {'id' => cluster_type['id']}
460
460
 
461
+ # Group / Site
462
+ group = load_group(cluster_type['code'], options)
463
+ cluster_payload['group'] = {'id' => group['id']}
464
+
461
465
  # Cluster Name
462
466
  if args.empty? && options[:no_prompt]
463
467
  print_red_alert "No cluster name provided"
@@ -514,10 +518,6 @@ class Morpheus::Cli::Clusters
514
518
 
515
519
  server_payload['tags'] = tags if tags
516
520
 
517
- # Group / Site
518
- group = load_group(options)
519
- cluster_payload['group'] = {'id' => group['id']}
520
-
521
521
  # Cloud / Zone
522
522
  cloud_id = nil
523
523
  cloud = options[:cloud] ? find_cloud_by_name_or_id_for_provisioning(group['id'], options[:cloud]) : nil
@@ -526,7 +526,7 @@ class Morpheus::Cli::Clusters
526
526
  cloud = @clouds_interface.get(cloud['id'])['zone']
527
527
  cloud_id = cloud['id']
528
528
  else
529
- available_clouds = get_available_clouds(group['id'])
529
+ available_clouds = get_available_clouds(group['id'], {groupType: cluster_payload['type']})
530
530
 
531
531
  if available_clouds.empty?
532
532
  print_red_alert "Group #{group['name']} has no available clouds"
@@ -556,12 +556,12 @@ class Morpheus::Cli::Clusters
556
556
  end
557
557
  end
558
558
 
559
- cluster_payload['layout'] = {id: layout['id']}
559
+ cluster_payload['layout'] = {'id' => layout['id']}
560
560
 
561
561
  # Provision Type
562
562
  provision_type = (layout && layout['provisionType'] ? layout['provisionType'] : nil) || get_provision_type_for_zone_type(cloud['zoneType']['id'])
563
563
 
564
- api_params = {zoneId: cloud['id'], siteId: group['id'], layoutId: layout['id'], groupTypeId: cluster_type['id'], provisionTypeId: provision_type['id']}
564
+ api_params = {zoneId: cloud['id'], siteId: group['id'], layoutId: layout['id'], groupTypeId: cluster_type['id'], provisionType: provision_type['code'], provisionTypeId: provision_type['id']}
565
565
 
566
566
  # Controller type
567
567
  server_types = @server_types_interface.list({max:1, computeTypeId: cluster_type['controllerTypes'].first['id'], zoneTypeId: cloud['zoneType']['id'], useZoneProvisionTypes: true})['serverTypes']
@@ -621,6 +621,10 @@ class Morpheus::Cli::Clusters
621
621
  # Visibility
622
622
  server_payload['visibility'] = options[:visibility] || (Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'visibility', 'fieldLabel' => 'Visibility', 'type' => 'select', 'defaultValue' => 'private', 'required' => true, 'selectOptions' => [{'name' => 'Private', 'value' => 'private'},{'name' => 'Public', 'value' => 'public'}]}], options[:options], @api_client, {})['visibility'])
623
623
 
624
+ # Layout template options
625
+ cluster_payload.deep_merge!(Morpheus::Cli::OptionTypes.prompt(load_layout_options(cluster_payload), options[:options], @api_client, api_params, options[:no_prompt], true))
626
+
627
+ # Server options
624
628
  server_payload.deep_merge!(Morpheus::Cli::OptionTypes.prompt(option_type_list, options[:options], @api_client, api_params, options[:no_prompt], true))
625
629
 
626
630
  # Worker count
@@ -3665,7 +3669,7 @@ class Morpheus::Cli::Clusters
3665
3669
  @clouds_interface.cloud_type(zone_type_id)['zoneType']['provisionTypes'].first rescue nil
3666
3670
  end
3667
3671
 
3668
- def load_group(options)
3672
+ def load_group(group_type, options)
3669
3673
  # Group / Site
3670
3674
  group_id = nil
3671
3675
  group = options[:group] ? find_group_by_name_or_id_for_provisioning(options[:group]) : nil
@@ -3676,15 +3680,13 @@ class Morpheus::Cli::Clusters
3676
3680
  if @active_group_id
3677
3681
  group_id = @active_group_id
3678
3682
  else
3679
- available_groups = get_available_groups
3683
+ available_groups = get_available_groups({groupType: group_type})
3680
3684
 
3681
3685
  if available_groups.empty?
3682
3686
  print_red_alert "No available groups"
3683
3687
  exit 1
3684
- elsif available_groups.count > 1 && !options[:no_prompt]
3688
+ else available_groups.count > 1 && !options[:no_prompt]
3685
3689
  group_id = Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'group', 'type' => 'select', 'fieldLabel' => 'Group', 'selectOptions' => available_groups, 'required' => true, 'description' => 'Select Group.'}],options[:options],@api_client,{})['group']
3686
- else
3687
- group_id = available_groups.first['id']
3688
3690
  end
3689
3691
  end
3690
3692
  end
@@ -3926,4 +3928,27 @@ class Morpheus::Cli::Clusters
3926
3928
  ]
3927
3929
  end
3928
3930
 
3931
+ def load_layout_options(cluster)
3932
+ (@api_client.options.options_for_source('computeTypeLayoutParameters', {layoutId: cluster['layout']['id']})['data'] || []).collect do |it|
3933
+ it['fieldName'] = it['name']
3934
+ it['fieldLabel'] = it['displayName']
3935
+ it['fieldContext'] = 'config.templateParameter'
3936
+ if it['type'] == 'ServicePlan'
3937
+ it['optionSource'] = 'servicePlans'
3938
+ it['type'] = 'select'
3939
+ it['params'] = {:provisionType => '', :zoneId => '', :siteId => '', :resourcePoolId => ''}
3940
+ it['params'][:provisionType] = 'azure' if it['azureServicePlanType']
3941
+ elsif it['type'] == 'Subnet'
3942
+ it['optionSource'] = 'networks'
3943
+ it['type'] = 'select'
3944
+ it['params'] = {:siteId => '', :instanceId => '', :serverId => '', :zonePoolId => '', :zoneRegionId => '', :zoneId => '', :provisionType => ''}
3945
+ if cluster['type'] == 'aks-cluster'
3946
+ it['params'][:provisionType] = 'azure'
3947
+ end
3948
+ else
3949
+ it['type'] = 'text'
3950
+ end
3951
+ it
3952
+ end
3953
+ end
3929
3954
  end
@@ -22,7 +22,7 @@ class Morpheus::Cli::Hosts
22
22
  def connect(opts)
23
23
  @api_client = establish_remote_appliance_connection(opts)
24
24
  @accounts_interface = @api_client.accounts
25
- @users_interface = @api_client.users
25
+ @account_users_interface = @api_client.account_users
26
26
  @clouds_interface = @api_client.clouds
27
27
  @options_interface = @api_client.options
28
28
  @tasks_interface = @api_client.tasks
@@ -81,25 +81,25 @@ class Morpheus::Cli::Hosts
81
81
  opts.on( '--plan-code CODE', String, "Filter by Plan code(s)" ) do |val|
82
82
  params['planCode'] = parse_id_list(val)
83
83
  end
84
- opts.on( '', '--vm', "Show only virtual machines" ) do |val|
84
+ opts.on('--vm', "Show only virtual machines" ) do
85
85
  params[:vm] = true
86
86
  end
87
- opts.on( '', '--hypervisor', "Show only VM Hypervisors" ) do |val|
87
+ opts.on('--hypervisor', "Show only VM Hypervisors" ) do
88
88
  params[:vmHypervisor] = true
89
89
  end
90
- opts.on( '', '--container', "Show only Container Hypervisors" ) do |val|
90
+ opts.on('--container', "Show only Container Hypervisors" ) do
91
91
  params[:containerHypervisor] = true
92
92
  end
93
- opts.on( '', '--baremetal', "Show only Baremetal Servers" ) do |val|
93
+ opts.on('--baremetal', "Show only Baremetal Servers" ) do
94
94
  params[:bareMetalHost] = true
95
95
  end
96
- opts.on( '', '--status STATUS', "Filter by Status" ) do |val|
96
+ opts.on('--status STATUS', String, "Filter by Status" ) do |val|
97
97
  params[:status] = val
98
98
  end
99
- opts.on( '', '--agent', "Show only Servers with the agent installed" ) do |val|
99
+ opts.on('--agent', "Show only Servers with the agent installed" ) do
100
100
  params[:agentInstalled] = true
101
101
  end
102
- opts.on( '', '--noagent', "Show only Servers with No agent" ) do |val|
102
+ opts.on('--noagent', "Show only Servers with No agent" ) do
103
103
  params[:agentInstalled] = false
104
104
  end
105
105
  opts.on( '--created-by USER', "Created By User Username or ID" ) do |val|
@@ -374,25 +374,25 @@ class Morpheus::Cli::Hosts
374
374
  opts.on( '-i', '--ip IPADDRESS', "Filter by IP Address" ) do |val|
375
375
  params[:ip] = val
376
376
  end
377
- opts.on( '', '--vm', "Show only virtual machines" ) do |val|
377
+ opts.on('--vm', "Show only virtual machines" ) do
378
378
  params[:vm] = true
379
379
  end
380
- opts.on( '', '--hypervisor', "Show only VM Hypervisors" ) do |val|
380
+ opts.on('--hypervisor', "Show only VM Hypervisors" ) do
381
381
  params[:vmHypervisor] = true
382
382
  end
383
- opts.on( '', '--container', "Show only Container Hypervisors" ) do |val|
383
+ opts.on('--container', "Show only Container Hypervisors" ) do
384
384
  params[:containerHypervisor] = true
385
385
  end
386
- opts.on( '', '--baremetal', "Show only Baremetal Servers" ) do |val|
386
+ opts.on('--baremetal', "Show only Baremetal Servers" ) do
387
387
  params[:bareMetalHost] = true
388
388
  end
389
- opts.on( '', '--status STATUS', "Filter by Status" ) do |val|
389
+ opts.on('--status STATUS', "Filter by Status" ) do |val|
390
390
  params[:status] = val
391
391
  end
392
- opts.on( '', '--agent', "Show only Servers with the agent installed" ) do |val|
392
+ opts.on('--agent', "Show only Servers with the agent installed" ) do
393
393
  params[:agentInstalled] = true
394
394
  end
395
- opts.on( '', '--noagent', "Show only Servers with No agent" ) do |val|
395
+ opts.on('--noagent', "Show only Servers with No agent" ) do
396
396
  params[:agentInstalled] = false
397
397
  end
398
398
  opts.on( '--created-by USER', "Created By User Username or ID" ) do |val|
@@ -22,7 +22,8 @@ class Morpheus::Cli::Instances
22
22
  :scaling, {:'scaling-update' => :scaling_update},
23
23
  :wiki, :update_wiki,
24
24
  {:exec => :execution_request},
25
- :deploys
25
+ :deploys,
26
+ :refresh, :apply
26
27
  #register_subcommands :firewall_disable, :firewall_enable
27
28
  # register_subcommands {:'lb-update' => :load_balancer_update}
28
29
  alias_subcommand :details, :get
@@ -35,7 +36,7 @@ class Morpheus::Cli::Instances
35
36
  def connect(opts)
36
37
  @api_client = establish_remote_appliance_connection(opts)
37
38
  @accounts_interface = @api_client.accounts
38
- @users_interface = @api_client.users
39
+ @account_users_interface = @api_client.account_users
39
40
  @instances_interface = @api_client.instances
40
41
  @task_sets_interface = @api_client.task_sets
41
42
  @logs_interface = @api_client.logs
@@ -77,6 +78,12 @@ class Morpheus::Cli::Instances
77
78
  opts.on( '--created-by USER', "Alias for --owner" ) do |val|
78
79
  options[:owner] = val
79
80
  end
81
+ opts.on('--agent', "Show only Instances with the agent installed" ) do
82
+ params[:agentInstalled] = true
83
+ end
84
+ opts.on('--noagent', "Show only Instances with No agent" ) do
85
+ params[:agentInstalled] = false
86
+ end
80
87
  opts.add_hidden_option('--created-by')
81
88
  opts.on('--status STATUS', "Filter by status i.e. provisioning,running,starting,stopping") do |val|
82
89
  params['status'] = (params['status'] || []) + val.to_s.split(',').collect {|s| s.strip }.select {|s| s != "" }
@@ -4230,6 +4237,106 @@ EOT
4230
4237
  return 0, nil
4231
4238
  end
4232
4239
 
4240
+ def refresh(args)
4241
+ params, payload, options = {}, {}, {}
4242
+ optparse = Morpheus::Cli::OptionParser.new do |opts|
4243
+ opts.banner = subcommand_usage("[instance] [options]")
4244
+ build_standard_update_options(opts, options, [:auto_confirm])
4245
+ opts.footer = <<-EOT
4246
+ Refresh an instance.
4247
+ [instance] is required. This is the name or id of an instance.
4248
+ This is only supported by certain types of instances such as terraform.
4249
+ EOT
4250
+ end
4251
+ optparse.parse!(args)
4252
+ verify_args!(args:args, optparse:optparse, count:1)
4253
+ connect(options)
4254
+
4255
+ begin
4256
+ instance = find_instance_by_name_or_id(args[0])
4257
+ return 1 if instance.nil?
4258
+ # construct request
4259
+ params.merge!(parse_query_options(options))
4260
+ payload = {}
4261
+ if options[:payload]
4262
+ payload = options[:payload]
4263
+ payload.deep_merge!(parse_passed_options(options))
4264
+ else
4265
+ payload.deep_merge!(parse_passed_options(options))
4266
+ # raise_command_error "Specify at least one option to update.\n#{optparse}" if payload.empty?
4267
+ end
4268
+ unless options[:yes] || Morpheus::Cli::OptionTypes.confirm("Are you sure you want to refresh this instance: #{instance['name']}?")
4269
+ return 9, "aborted command"
4270
+ end
4271
+ @instances_interface.setopts(options)
4272
+ if options[:dry_run]
4273
+ print_dry_run @instances_interface.dry.refresh(instance["id"], params, payload)
4274
+ return
4275
+ end
4276
+ json_response = @instances_interface.refresh(instance["id"], params, payload)
4277
+ render_response(json_response, options) do
4278
+ print_green_success "Refreshing instance #{instance['name']}"
4279
+ # return _get(instance['id'], options)
4280
+ end
4281
+ return 0, nil
4282
+ rescue RestClient::Exception => e
4283
+ print_rest_exception(e, options)
4284
+ exit 1
4285
+ end
4286
+ end
4287
+
4288
+ def apply(args)
4289
+ params, payload, options = {}, {}, {}
4290
+ optparse = Morpheus::Cli::OptionParser.new do |opts|
4291
+ opts.banner = subcommand_usage("[instance] [options]")
4292
+ build_standard_update_options(opts, options, [:auto_confirm])
4293
+ opts.footer = <<-EOT
4294
+ Apply an instance.
4295
+ [instance] is required. This is the name or id of an instance.
4296
+ This is only supported by certain types of instances such as terraform.
4297
+ EOT
4298
+ end
4299
+ optparse.parse!(args)
4300
+ verify_args!(args:args, optparse:optparse, count:1)
4301
+ connect(options)
4302
+
4303
+ begin
4304
+ instance = find_instance_by_name_or_id(args[0])
4305
+ return 1 if instance.nil?
4306
+ # construct request
4307
+ params.merge!(parse_query_options(options))
4308
+ payload = {}
4309
+ if options[:payload]
4310
+ payload = options[:payload]
4311
+ payload.deep_merge!(parse_passed_options(options))
4312
+ else
4313
+ payload.deep_merge!(parse_passed_options(options))
4314
+ # raise_command_error "Specify at least one option to update.\n#{optparse}" if payload.empty?
4315
+ end
4316
+ unless options[:yes] || Morpheus::Cli::OptionTypes.confirm("Are you sure you want to apply this instance: #{instance['name']}?")
4317
+ return 9, "aborted command"
4318
+ end
4319
+ @instances_interface.setopts(options)
4320
+ if options[:dry_run]
4321
+ print_dry_run @instances_interface.dry.apply(instance["id"], params, payload)
4322
+ return
4323
+ end
4324
+ json_response = @instances_interface.apply(instance["id"], params, payload)
4325
+ render_response(json_response, options) do
4326
+ print_green_success "Applying instance #{instance['name']}"
4327
+ # return _get(instance['id'], options)
4328
+ end
4329
+ return 0, nil
4330
+ rescue RestClient::Exception => e
4331
+ print_rest_exception(e, options)
4332
+ exit 1
4333
+ end
4334
+ end
4335
+
4336
+ # todo: print state summary
4337
+ def state_summary(args)
4338
+ end
4339
+
4233
4340
  private
4234
4341
 
4235
4342
  def find_zone_by_name_or_id(group_id, val)
@@ -0,0 +1,71 @@
1
+ require 'morpheus/cli/cli_command'
2
+
3
+ class Morpheus::Cli::LoadBalancerMonitors
4
+ include Morpheus::Cli::CliCommand
5
+ include Morpheus::Cli::RestCommand
6
+ include Morpheus::Cli::SecondaryRestCommand
7
+ include Morpheus::Cli::LoadBalancersHelper
8
+
9
+ set_command_hidden
10
+ set_command_description "View and manage load balancer monitors."
11
+ set_command_name :'load-balancer-monitors'
12
+ register_subcommands :list, :get, :add, :update, :remove
13
+ register_interfaces :load_balancer_monitors,
14
+ :load_balancers, :load_balancer_types
15
+
16
+ set_rest_parent_name :load_balancers
17
+
18
+ # set_rest_interface_name :load_balancer_monitors
19
+ # set_parent_rest_interface_name :load_balancers
20
+
21
+ # todo: a configurable way to load the optionTypes
22
+ # option_types = loadBalancer['monitorOptionTypes']
23
+ # set_rest_has_type true
24
+ # set_rest_type :load_balancer_virtual_server_types
25
+
26
+ protected
27
+
28
+ def load_balancer_monitor_list_column_definitions(options)
29
+ {
30
+ "ID" => 'id',
31
+ "Name" => 'name',
32
+ "Monitor Type" => lambda {|it| it['monitorTypeDisplay'] || it['monitorType'] },
33
+ }
34
+ end
35
+
36
+ def load_balancer_monitor_column_definitions(options)
37
+ {
38
+ "ID" => 'id',
39
+ "Name" => 'name',
40
+ "Load Balancer" => lambda {|it| it['loadBalancer'] ? it['loadBalancer']['name'] : '' },
41
+ "Description" => 'description',
42
+ "Monitor Type" => lambda {|it| it['monitorTypeDisplay'] || it['monitorType'] },
43
+ "Created" => lambda {|it| format_local_dt(it['dateCreated']) },
44
+ "Updated" => lambda {|it| format_local_dt(it['lastUpdated']) }
45
+ }
46
+ end
47
+
48
+ def load_balancer_monitor_object_key
49
+ 'loadBalancerMonitor'
50
+ end
51
+
52
+ def load_balancer_monitor_list_key
53
+ 'loadBalancerMonitors'
54
+ end
55
+
56
+ def load_balancer_monitor_label
57
+ 'Load Balancer Monitor'
58
+ end
59
+
60
+ def load_balancer_monitor_label_plural
61
+ 'Load Balancer Monitors'
62
+ end
63
+
64
+ def load_option_types_for_load_balancer_monitor(type_record, parent_record)
65
+ load_balancer = parent_record
66
+ load_balancer_type_id = load_balancer['type']['id']
67
+ load_balancer_type = find_by_id(:load_balancer_type, load_balancer_type_id)
68
+ load_balancer_type['monitorOptionTypes']
69
+ end
70
+
71
+ end
@@ -3,33 +3,44 @@ require 'morpheus/cli/cli_command'
3
3
  class Morpheus::Cli::LoadBalancerPools
4
4
  include Morpheus::Cli::CliCommand
5
5
  include Morpheus::Cli::RestCommand
6
+ include Morpheus::Cli::SecondaryRestCommand
6
7
  include Morpheus::Cli::LoadBalancersHelper
7
8
 
8
- set_command_hidden # hide until ready
9
+ set_command_hidden
10
+ set_command_description "View and manage load balancer pools."
9
11
  set_command_name :'load-balancer-pools'
10
12
  register_subcommands :list, :get, :add, :update, :remove
11
-
12
13
  register_interfaces :load_balancer_pools,
13
- :load_balancers, :load_balancer_pools
14
+ :load_balancers, :load_balancer_types
15
+
16
+ set_rest_parent_name :load_balancers
17
+
18
+ # set_rest_interface_name :load_balancer_pools
19
+ # set_parent_rest_interface_name :load_balancers
20
+
21
+ # todo: a configurable way to load the optionTypes
22
+ # option_types = loadBalancer['poolOptionTypes']
23
+ # set_rest_has_type true
24
+ # set_rest_type :load_balancer_virtual_server_types
14
25
 
15
26
  protected
16
27
 
17
- def load_balancer_pool_list_column_definitions()
28
+ def load_balancer_pool_list_column_definitions(options)
18
29
  {
19
30
  "ID" => 'id',
20
31
  "Name" => 'name',
32
+ #"Load Balancer" => lambda {|it| it['loadBalancer'] ? it['loadBalancer']['name'] : '' },
21
33
  "Balancer Mode" => lambda {|it| it['vipBalance'] },
22
- "LB" => lambda {|it| it['loadBalancer'] ? it['loadBalancer']['name'] : '' },
23
34
  }
24
35
  end
25
36
 
26
- def load_balancer_pool_column_definitions()
37
+ def load_balancer_pool_column_definitions(options)
27
38
  {
28
39
  "ID" => 'id',
29
40
  "Name" => 'name',
41
+ "Load Balancer" => lambda {|it| it['loadBalancer'] ? it['loadBalancer']['name'] : '' },
30
42
  "Description" => 'description',
31
43
  "Balancer Mode" => lambda {|it| it['vipBalance'] },
32
- "LB" => lambda {|it| it['loadBalancer'] ? it['loadBalancer']['name'] : '' },
33
44
  # todo: more properties to show here
34
45
  "Status" => lambda {|it| format_load_balancer_pool_status(it) },
35
46
  "Created" => lambda {|it| format_local_dt(it['dateCreated']) },
@@ -53,49 +64,9 @@ class Morpheus::Cli::LoadBalancerPools
53
64
  'Load Balancer Pools'
54
65
  end
55
66
 
56
- def find_load_balancer_pool_by_name_or_id(val)
57
- if val.to_s =~ /\A\d{1,}\Z/
58
- return find_load_balancer_pool_by_id(val)
59
- else
60
- return find_load_balancer_pool_by_name(val)
61
- end
62
- end
63
-
64
- def find_load_balancer_pool_by_id(id)
65
- begin
66
- json_response = load_balancer_pools_interface.get(id.to_i)
67
- return json_response[load_balancer_pool_object_key]
68
- rescue RestClient::Exception => e
69
- if e.response && e.response.code == 404
70
- print_red_alert "#{load_balancer_pool_label} not found by id #{id}"
71
- return nil
72
- else
73
- raise e
74
- end
75
- end
76
- end
77
-
78
- def find_load_balancer_pool_by_name(name)
79
- json_response = load_balancer_pools_interface.list({name: name.to_s})
80
- load_balancer_pools = json_response[load_balancer_pool_list_key]
81
- if load_balancer_pools.empty?
82
- print_red_alert "#{load_balancer_pool_label_plural} not found by name #{name}"
83
- return load_balancer_pools
84
- elsif load_balancer_pools.size > 1
85
- print_red_alert "#{load_balancer_pools.size} #{load_balancer_pool_label_plural.downcase} found by name #{name}"
86
- rows = load_balancer_pools.collect do |it|
87
- {id: it['id'], name: it['name']}
88
- end
89
- puts as_pretty_table(rows, [:id, :name], {color:red})
90
- return nil
91
- else
92
- return load_balancer_pools[0]
93
- end
94
- end
95
-
96
- def format_load_balancer_pool_status(pool, return_color=cyan)
67
+ def format_load_balancer_pool_status(record, return_color=cyan)
97
68
  out = ""
98
- status_string = pool['vipStatus'] || pool['status']
69
+ status_string = record['status']
99
70
  if status_string.nil? || status_string.empty? || status_string == "unknown"
100
71
  out << "#{white}UNKNOWN#{return_color}"
101
72
  elsif status_string == 'ok'
@@ -103,9 +74,18 @@ class Morpheus::Cli::LoadBalancerPools
103
74
  elsif status_string == 'syncing'
104
75
  out << "#{yellow}#{status_string.upcase}#{return_color}"
105
76
  else
106
- out << "#{red}#{status_string ? status_string.upcase : 'N/A'}#{pool['statusMessage'] ? "#{return_color} - #{pool['statusMessage']}" : ''}#{return_color}"
77
+ out << "#{red}#{status_string ? status_string.upcase : 'N/A'}#{record['statusMessage'] ? "#{return_color} - #{record['statusMessage']}" : ''}#{return_color}"
107
78
  end
108
79
  out
109
80
  end
110
81
 
82
+ def load_option_types_for_load_balancer_pool(type_record, parent_record)
83
+ load_balancer = parent_record
84
+ load_balancer_type_id = load_balancer['type']['id']
85
+ load_balancer_type = find_by_id(:load_balancer_type, load_balancer_type_id)
86
+ load_balancer_type['poolOptionTypes']
87
+ end
88
+
89
+ ## using CliCommand's generic find_by methods
90
+
111
91
  end
@@ -0,0 +1,65 @@
1
+ require 'morpheus/cli/cli_command'
2
+
3
+ class Morpheus::Cli::LoadBalancerProfiles
4
+ include Morpheus::Cli::CliCommand
5
+ include Morpheus::Cli::RestCommand
6
+ include Morpheus::Cli::SecondaryRestCommand
7
+ include Morpheus::Cli::LoadBalancersHelper
8
+
9
+ set_command_hidden
10
+ set_command_description "View and manage load balancer profiles."
11
+ set_command_name :'load-balancer-profiles'
12
+ register_subcommands :list, :get, :add, :update, :remove
13
+ register_interfaces :load_balancer_profiles,
14
+ :load_balancers, :load_balancer_types
15
+
16
+ set_rest_parent_name :load_balancers
17
+
18
+ protected
19
+
20
+ def load_balancer_profile_list_column_definitions(options)
21
+ {
22
+ "ID" => 'id',
23
+ "Name" => 'name',
24
+ # "Profile Type" => lambda {|it| it['config']['profileType'] rescue '' },
25
+ "Service Type" => lambda {|it| it['serviceTypeDisplay'] || it['serviceType'] },
26
+ }
27
+ end
28
+
29
+ def load_balancer_profile_column_definitions(options)
30
+ {
31
+ "ID" => 'id',
32
+ "Name" => 'name',
33
+ "Load Balancer" => lambda {|it| it['loadBalancer'] ? it['loadBalancer']['name'] : '' },
34
+ "Description" => 'description',
35
+ # "Profile Type" => lambda {|it| it['config']['profileType'] rescue '' },
36
+ "Service Type" => lambda {|it| it['serviceTypeDisplay'] || it['serviceType'] },
37
+ "Created" => lambda {|it| format_local_dt(it['dateCreated']) },
38
+ "Updated" => lambda {|it| format_local_dt(it['lastUpdated']) }
39
+ }
40
+ end
41
+
42
+ def load_balancer_profile_object_key
43
+ 'loadBalancerProfile'
44
+ end
45
+
46
+ def load_balancer_profile_list_key
47
+ 'loadBalancerProfiles'
48
+ end
49
+
50
+ def load_balancer_profile_label
51
+ 'Load Balancer Profile'
52
+ end
53
+
54
+ def load_balancer_profile_label_plural
55
+ 'Load Balancer Profiles'
56
+ end
57
+
58
+ def load_option_types_for_load_balancer_profile(type_record, parent_record)
59
+ load_balancer = parent_record
60
+ load_balancer_type_id = load_balancer['type']['id']
61
+ load_balancer_type = find_by_id(:load_balancer_type, load_balancer_type_id)
62
+ load_balancer_type['profileOptionTypes']
63
+ end
64
+
65
+ end
@@ -12,16 +12,21 @@ class Morpheus::Cli::LoadBalancerTypes
12
12
 
13
13
  protected
14
14
 
15
- def load_balancer_type_column_definitions
15
+ def load_balancer_type_list_column_definitions(options)
16
16
  {
17
17
  "ID" => 'id',
18
18
  "Name" => 'name',
19
- "Code" => 'code'
19
+ "Code" => 'code',
20
20
  }
21
21
  end
22
22
 
23
- def load_balancer_type_list_column_definitions
24
- load_balancer_type_column_definitions
23
+ def load_balancer_type_column_definitions(options)
24
+ {
25
+ "ID" => 'id',
26
+ "Name" => 'name',
27
+ "Code" => 'code',
28
+ "Creatable" => lambda {|it| format_boolean(it['creatable']) },
29
+ }
25
30
  end
26
31
 
27
32
  # overridden to support name or code