morpheus-cli 5.4.0 → 5.4.3.1

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 (92) 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 +55 -10
  5. data/lib/morpheus/api/audit_interface.rb +9 -0
  6. data/lib/morpheus/api/catalog_item_types_interface.rb +20 -0
  7. data/lib/morpheus/api/instances_interface.rb +49 -0
  8. data/lib/morpheus/api/load_balancer_monitors_interface.rb +9 -0
  9. data/lib/morpheus/api/load_balancer_pools_interface.rb +4 -4
  10. data/lib/morpheus/api/load_balancer_profiles_interface.rb +4 -5
  11. data/lib/morpheus/api/load_balancer_virtual_servers_interface.rb +13 -4
  12. data/lib/morpheus/api/load_balancers_interface.rb +5 -0
  13. data/lib/morpheus/api/network_routers_interface.rb +9 -0
  14. data/lib/morpheus/api/network_static_routes_interface.rb +36 -0
  15. data/lib/morpheus/api/ping_interface.rb +2 -0
  16. data/lib/morpheus/api/read_interface.rb +4 -3
  17. data/lib/morpheus/api/rest_interface.rb +3 -3
  18. data/lib/morpheus/api/secondary_read_interface.rb +1 -1
  19. data/lib/morpheus/api/secondary_rest_interface.rb +19 -19
  20. data/lib/morpheus/api/setup_interface.rb +4 -0
  21. data/lib/morpheus/api/snapshots_interface.rb +19 -0
  22. data/lib/morpheus/api/storage_server_types_interface.rb +14 -0
  23. data/lib/morpheus/api/storage_servers_interface.rb +9 -0
  24. data/lib/morpheus/api/storage_volume_types_interface.rb +9 -0
  25. data/lib/morpheus/api/storage_volumes_interface.rb +9 -0
  26. data/lib/morpheus/api/users_interface.rb +16 -63
  27. data/lib/morpheus/cli/cli_command.rb +253 -5
  28. data/lib/morpheus/cli/cli_registry.rb +1 -1
  29. data/lib/morpheus/cli/commands/alias_command.rb +1 -1
  30. data/lib/morpheus/cli/commands/apps.rb +14 -78
  31. data/lib/morpheus/cli/commands/audit.rb +188 -0
  32. data/lib/morpheus/cli/commands/blueprints_command.rb +1 -1
  33. data/lib/morpheus/cli/commands/catalog_item_types_command.rb +88 -0
  34. data/lib/morpheus/cli/commands/change_password_command.rb +4 -4
  35. data/lib/morpheus/cli/commands/clusters.rb +96 -58
  36. data/lib/morpheus/cli/commands/hosts.rb +27 -15
  37. data/lib/morpheus/cli/commands/image_builder_command.rb +4 -8
  38. data/lib/morpheus/cli/commands/instances.rb +359 -3
  39. data/lib/morpheus/cli/commands/integrations_command.rb +1 -12
  40. data/lib/morpheus/cli/commands/library_instance_types_command.rb +3 -0
  41. data/lib/morpheus/cli/commands/load_balancer_monitors.rb +70 -0
  42. data/lib/morpheus/cli/commands/load_balancer_pools.rb +29 -50
  43. data/lib/morpheus/cli/commands/load_balancer_profiles.rb +64 -0
  44. data/lib/morpheus/cli/commands/load_balancer_types.rb +9 -4
  45. data/lib/morpheus/cli/commands/load_balancer_virtual_servers.rb +69 -58
  46. data/lib/morpheus/cli/commands/load_balancers.rb +109 -6
  47. data/lib/morpheus/cli/commands/network_firewalls_command.rb +22 -5
  48. data/lib/morpheus/cli/commands/network_routers_command.rb +96 -45
  49. data/lib/morpheus/cli/commands/network_static_routes_command.rb +451 -0
  50. data/lib/morpheus/cli/commands/network_transport_zones_command.rb +4 -4
  51. data/lib/morpheus/cli/commands/networks_command.rb +2 -2
  52. data/lib/morpheus/cli/commands/open_command.rb +30 -0
  53. data/lib/morpheus/cli/commands/options.rb +98 -0
  54. data/lib/morpheus/cli/commands/ping.rb +3 -5
  55. data/lib/morpheus/cli/commands/policies_command.rb +2 -2
  56. data/lib/morpheus/cli/commands/prices_command.rb +7 -7
  57. data/lib/morpheus/cli/commands/provisioning_settings_command.rb +1 -0
  58. data/lib/morpheus/cli/commands/remote.rb +20 -12
  59. data/lib/morpheus/cli/commands/roles.rb +1 -1
  60. data/lib/morpheus/cli/commands/security_groups.rb +2 -2
  61. data/lib/morpheus/cli/commands/service_plans_command.rb +1 -1
  62. data/lib/morpheus/cli/commands/setup.rb +1 -1
  63. data/lib/morpheus/cli/commands/shell.rb +2 -2
  64. data/lib/morpheus/cli/commands/snapshots.rb +139 -0
  65. data/lib/morpheus/cli/commands/storage_server_types.rb +50 -0
  66. data/lib/morpheus/cli/commands/storage_servers.rb +122 -0
  67. data/lib/morpheus/cli/commands/storage_volume_types.rb +50 -0
  68. data/lib/morpheus/cli/commands/storage_volumes.rb +103 -0
  69. data/lib/morpheus/cli/commands/tasks.rb +5 -5
  70. data/lib/morpheus/cli/commands/tenants_command.rb +1 -1
  71. data/lib/morpheus/cli/commands/user_groups_command.rb +1 -1
  72. data/lib/morpheus/cli/commands/user_settings_command.rb +3 -2
  73. data/lib/morpheus/cli/commands/user_sources_command.rb +1 -1
  74. data/lib/morpheus/cli/commands/users.rb +28 -28
  75. data/lib/morpheus/cli/commands/view.rb +102 -0
  76. data/lib/morpheus/cli/commands/virtual_images.rb +4 -1
  77. data/lib/morpheus/cli/mixins/accounts_helper.rb +5 -5
  78. data/lib/morpheus/cli/mixins/load_balancers_helper.rb +24 -4
  79. data/lib/morpheus/cli/mixins/print_helper.rb +50 -18
  80. data/lib/morpheus/cli/mixins/processes_helper.rb +1 -2
  81. data/lib/morpheus/cli/mixins/provisioning_helper.rb +96 -6
  82. data/lib/morpheus/cli/mixins/rest_command.rb +148 -74
  83. data/lib/morpheus/cli/mixins/secondary_rest_command.rb +174 -82
  84. data/lib/morpheus/cli/mixins/storage_servers_helper.rb +156 -0
  85. data/lib/morpheus/cli/mixins/storage_volumes_helper.rb +119 -0
  86. data/lib/morpheus/cli/option_types.rb +95 -28
  87. data/lib/morpheus/cli/version.rb +1 -1
  88. data/lib/morpheus/cli.rb +1 -0
  89. data/lib/morpheus/ext/string.rb +29 -6
  90. data/lib/morpheus/routes.rb +238 -0
  91. data/lib/morpheus/util.rb +6 -1
  92. metadata +26 -2
@@ -634,59 +634,51 @@ class Morpheus::Cli::NetworkRoutersCommand
634
634
  end
635
635
 
636
636
  def _firewall_rule_group(router_id, group_id, options)
637
- begin
638
- @network_routers_interface.setopts(options)
639
- if options[:dry_run]
640
- if args[0].to_s =~ /\A\d{1,}\Z/
641
- print_dry_run @network_routers_interface.dry.get(router_id.to_i)
637
+ @network_routers_interface.setopts(options)
638
+ if options[:dry_run]
639
+ if router_id.to_s =~ /\A\d{1,}\Z/
640
+ print_dry_run @network_routers_interface.dry.list({name:router_id})
641
+ else
642
+ if group_id.to_s =~ /\A\d{1,}\Z/
643
+ print_dry_run @network_routers_interface.dry.get_firewall_rule_group(router_id.to_i, group_id)
642
644
  else
643
- print_dry_run @network_routers_interface.dry.list({name:router_id})
645
+ print_dry_run @network_routers_interface.dry.list_firewall_rule_groups(router_id.to_i, {phrase:router_id})
644
646
  end
645
- return
646
647
  end
647
- router = find_router(router_id)
648
- if router.nil?
649
- return 1
650
- end
651
-
652
- if router['type']['hasFirewallGroups']
653
- group = (router['firewall']['ruleGroups'] || []).find {|it| it['id'].to_s == group_id.to_s || it['name'] == group_id.to_s}
648
+ return
649
+ end
650
+ router = find_router(router_id)
651
+ if router.nil?
652
+ return 1
653
+ end
654
654
 
655
- if group
656
- json_response = {'ruleGroup' => group}
655
+ if router['type']['hasFirewallGroups']
656
+ group = find_firewall_rule_group(router['id'], group_id)
657
+ return 1 if group.nil?
657
658
 
658
- if options[:json]
659
- puts as_json(json_response, options, "ruleGroup")
660
- return 0
661
- elsif options[:yaml]
662
- puts as_yaml(json_response, options, "ruleGroup")
663
- return 0
664
- elsif options[:csv]
665
- puts records_as_csv([json_response['ruleGroup']], options)
666
- return 0
667
- end
659
+ render_response({ruleGroup: group}, options, 'ruleGroup') do
660
+ print_h1 "Firewall Rule Group Details"
661
+ print cyan
662
+ description_cols = {
663
+ "ID" => lambda {|it| it['id'] },
664
+ "Name" => lambda {|it| it['name'] },
665
+ "Description" => lambda {|it| it['description']},
666
+ "Priority" => lambda {|it| it['priority']},
667
+ "Category" => lambda {|it| it['groupLayer']}
668
+ }
669
+ print_description_list(description_cols, group)
668
670
 
669
- print_h1 "Firewall Rule Group Details"
670
- print cyan
671
- description_cols = {
672
- "ID" => lambda {|it| it['id'] },
673
- "Name" => lambda {|it| it['name'] },
674
- "Description" => lambda {|it| it['description']},
675
- "Priority" => lambda {|it| it['priority']},
676
- "Category" => lambda {|it| it['groupLayer']}
677
- }
678
- print_description_list(description_cols, group)
679
- else
680
- print_red_alert "Firewall rule group #{group_id} not found for router #{router['name']}"
671
+ if is_master_account
672
+ description_cols["Visibility"] = lambda {|it| it['visibility']}
673
+ description_cols["Tenants"] = lambda {|it| it['tenants'].collect {|tenant| tenant['name']}.join(', ')}
681
674
  end
682
- else
683
- print_h1 "No Firewall Rule Groups"
675
+ print_description_list(description_cols, group)
684
676
  end
685
- println reset
686
- rescue RestClient::Exception => e
687
- print_rest_exception(e, options)
677
+ else
678
+ print_red_alert "Firewall rule groups not supported for #{router['type']['name']}"
688
679
  return 1
689
680
  end
681
+ println reset
690
682
  end
691
683
 
692
684
  def add_firewall_rule_group(args)
@@ -703,6 +695,7 @@ class Morpheus::Cli::NetworkRoutersCommand
703
695
  opts.on('--priority VALUE', Integer, "Priority for this firewall rule group (not applicable to all firewall types)") do |val|
704
696
  params['priority'] = val
705
697
  end
698
+ add_perms_options(opts, options, ['plans', 'groups'])
706
699
  build_common_options(opts, options, [:options, :payload, :json, :dry_run, :remote])
707
700
  opts.footer = "Create a network router firewall rule group."
708
701
  end
@@ -742,7 +735,14 @@ class Morpheus::Cli::NetworkRoutersCommand
742
735
 
743
736
  # prompt options
744
737
  option_result = Morpheus::Cli::OptionTypes.prompt(option_types, options[:options].deep_merge({:context_map => {'group' => ''}}), @api_client, {}, nil, true)
745
- payload = {'ruleGroup' => params.deep_merge(option_result)}
738
+
739
+ rule_group = params.deep_merge(option_result)
740
+
741
+ # prompt perms
742
+ if is_master_account
743
+ rule_group.merge!(prompt_permissions_v2(options, ['plans', 'groups']))
744
+ end
745
+ payload = {'ruleGroup' => rule_group}
746
746
  end
747
747
 
748
748
  @network_routers_interface.setopts(options)
@@ -779,6 +779,7 @@ class Morpheus::Cli::NetworkRoutersCommand
779
779
  opts.on('--priority VALUE', Integer, "Priority for this firewall rule group (not applicable to all firewall types)") do |val|
780
780
  params['priority'] = val
781
781
  end
782
+ add_perms_options(opts, options, ['plans', 'groups'])
782
783
  build_common_options(opts, options, [:options, :payload, :json, :dry_run, :remote])
783
784
  opts.footer = "Update a network router firewall rule group.\n" +
784
785
  "[router] is required. This is the name or id of an existing network router.\n" +
@@ -810,6 +811,11 @@ class Morpheus::Cli::NetworkRoutersCommand
810
811
  exit 1
811
812
  end
812
813
 
814
+ if is_master_account
815
+ params['visibility'] = options[:visibility] if !options[:visibility].nil?
816
+ params['tenants'] = options[:tenants].collect {|it| {'id' => it}} if !options[:tenants].nil?
817
+ end
818
+
813
819
  payload = parse_payload(options) || {'ruleGroup' => params}
814
820
  payload['ruleGroup'].deep_merge!(options[:options].reject {|k,v| k.is_a?(Symbol) }) if options[:options]
815
821
 
@@ -2564,8 +2570,53 @@ class Morpheus::Cli::NetworkRoutersCommand
2564
2570
  end
2565
2571
  end
2566
2572
  else
2567
- rule = router['firewall'] && router['firewall']['rules'] ? router['firewall']['rules'].find {|it| it['name'] == args[1] || it['id'] == args[1].to_i} : nil
2573
+ rule = router['firewall'] && router['firewall']['rules'] ? router['firewall']['rules'].find {|it| it['name'] == rule_id || it['id'] == rule_id.to_i} : nil
2568
2574
  end
2569
2575
  rule
2570
2576
  end
2577
+
2578
+ def find_firewall_rule_group(router_id, val)
2579
+ if val.to_s =~ /\A\d{1,}\Z/
2580
+ return find_firewall_rule_group_by_id(router_id, val)
2581
+ else
2582
+ if group = find_firewall_rule_group_by_name(router_id, val)
2583
+ return find_firewall_rule_group_by_id(router_id, group['id'])
2584
+ end
2585
+ end
2586
+ end
2587
+
2588
+ def find_firewall_rule_group_by_id(router_id, group_id)
2589
+ begin
2590
+ json_response = @network_routers_interface.get_firewall_rule_group(router_id, group_id.to_i)
2591
+ return json_response['ruleGroup']
2592
+ rescue RestClient::Exception => e
2593
+ if e.response && e.response.code == 404
2594
+ print_red_alert "Network firewall rule group not found by id #{group_id}"
2595
+ return nil
2596
+ else
2597
+ raise e
2598
+ end
2599
+ end
2600
+ end
2601
+
2602
+ def find_firewall_rule_group_by_name(router_id, name)
2603
+ groups = search_firewall_rule_groups(router_id, name)
2604
+ if groups.empty?
2605
+ print_red_alert "Network firewall rule group not found by name #{name}"
2606
+ return nil
2607
+ elsif groups.size > 1
2608
+ print_red_alert "#{scopes.size} network firewall rule groups found by name #{name}"
2609
+ rows = groups.collect do |it|
2610
+ {id: it['id'], name: it['name']}
2611
+ end
2612
+ puts as_pretty_table(rows, [:id, :name], {color:red})
2613
+ return nil
2614
+ else
2615
+ return groups[0]
2616
+ end
2617
+ end
2618
+
2619
+ def search_firewall_rule_groups(router_id, phrase = nil)
2620
+ @network_routers_interface.list_firewall_rule_groups(router_id, phrase ? {phrase: phrase.to_s} : {})['ruleGroups']
2621
+ end
2571
2622
  end
@@ -0,0 +1,451 @@
1
+ require 'morpheus/cli/cli_command'
2
+
3
+ class Morpheus::Cli::NetworkStaticRoutesCommand
4
+ include Morpheus::Cli::CliCommand
5
+ include Morpheus::Cli::ProvisioningHelper
6
+ include Morpheus::Cli::WhoamiHelper
7
+
8
+ set_command_name :'network-static-routes'
9
+ register_subcommands :list, :get, :add, :remove, :update
10
+
11
+ def connect(opts)
12
+ @api_client = establish_remote_appliance_connection(opts)
13
+ @account_interface = @api_client.accounts
14
+ @network_static_routes_interface = @api_client.network_static_routes
15
+ @networks_interface = @api_client.networks
16
+ @network_types_interface = @api_client.network_types
17
+ @options_interface = @api_client.options
18
+ end
19
+
20
+ def handle(args)
21
+ handle_subcommand(args)
22
+ end
23
+
24
+ def list(args)
25
+ options = {}
26
+ optparse = Morpheus::Cli::OptionParser.new do |opts|
27
+ opts.banner = subcommand_usage("[network] [search]")
28
+ build_standard_list_options(opts, options)
29
+ opts.footer = "List network DHCP Static Routes." + "\n" +
30
+ "[network] is required. This is the name or id of a network."
31
+ end
32
+
33
+ optparse.parse!(args)
34
+ connect(options)
35
+
36
+ verify_args!(args:args, optparse:optparse, min:1)
37
+ if args.count > 1
38
+ options[:phrase] = args[1..-1].join(" ")
39
+ end
40
+
41
+ network = find_network(args[0])
42
+ if network.nil?
43
+ return 1
44
+ end
45
+
46
+ network_type = find_network_type(network['type']['id'])
47
+ if network_type.nil?
48
+ return 1
49
+ end
50
+
51
+ _list(network, network_type, options)
52
+ end
53
+
54
+ def _list(network, network_type, options)
55
+ params = parse_list_options(options)
56
+ @network_static_routes_interface.setopts(options)
57
+ if options[:dry_run]
58
+ print_dry_run @network_static_routes_interface.dry.list_static_routes(network['id'], params)
59
+ return
60
+ end
61
+
62
+ json_response = @network_static_routes_interface.list_static_routes(network['id'], params)
63
+ render_response(json_response, options, 'networkRoutes') do
64
+ print_h1 "Network DHCP Static Routes For: #{network['name']}"
65
+ print_static_routes(network, network_type, json_response)
66
+ end
67
+ return 0, nil
68
+ end
69
+
70
+ def get(args)
71
+ options = {}
72
+ optparse = Morpheus::Cli::OptionParser.new do |opts|
73
+ opts.banner = subcommand_usage("[network] [network_route]")
74
+ build_standard_get_options(opts, options)
75
+ opts.footer = "Display details on a network Static Route." + "\n" +
76
+ "[network] is required. This is the name or id of a network.\n" +
77
+ "[network_route] is required. This is the id of a network route.\n"
78
+ end
79
+
80
+ optparse.parse!(args)
81
+ connect(options)
82
+
83
+ verify_args!(args:args, optparse:optparse, count:2)
84
+
85
+ network = find_network(args[0])
86
+ if network.nil?
87
+ return 1
88
+ end
89
+
90
+ network_type = find_network_type(network['type']['id'])
91
+ if network_type.nil?
92
+ return 1
93
+ end
94
+
95
+ _get(network, network_type, args[1], options)
96
+ end
97
+
98
+ def _get(network, network_type, route_id, options)
99
+ # params = parse_query_options(options) # todo: use this
100
+ @network_static_routes_interface.setopts(options)
101
+
102
+ if options[:dry_run]
103
+ if route_id.to_s =~ /\A\d{1,}\Z/
104
+ print_dry_run @network_static_routes_interface.dry.get_static_route(network['id'], route_id.to_i)
105
+ else
106
+ print_dry_run @network_static_routes_interface.dry.list_static_routes(network['id'], {name: route_id})
107
+ end
108
+ return
109
+ end
110
+
111
+ route = find_static_route(network['id'], route_id)
112
+ return 1 if route.nil?
113
+
114
+ render_response({route: route}, options, 'route') do
115
+ print_h1 "Network Route Details"
116
+ print cyan
117
+
118
+ description_cols = {}
119
+
120
+ network_type['routeOptionTypes'].sort_by {|it| it['displayOrder']}.each do |option_type|
121
+ description_cols[option_type['fieldLabel']] = lambda {|it| Morpheus::Cli::OptionTypes.get_option_value(it, option_type, true)}
122
+ end
123
+ print_description_list(description_cols, route)
124
+ end
125
+
126
+ println reset
127
+ end
128
+
129
+ def add(args)
130
+ options = {:options=>{}}
131
+ params = {}
132
+ optparse = Morpheus::Cli::OptionParser.new do|opts|
133
+ opts.banner = subcommand_usage("[network]")
134
+ build_standard_add_options(opts, options)
135
+ opts.footer = "Create a network static route." + "\n" +
136
+ "[network] is required. This is the name or id of a network.\n";
137
+ end
138
+ optparse.parse!(args)
139
+ connect(options)
140
+ verify_args!(args:args, optparse:optparse, count:1)
141
+
142
+ network = find_network(args[0])
143
+ if network.nil?
144
+ return 1
145
+ end
146
+
147
+ network_type = find_network_type(network['type']['id'])
148
+ if network_type.nil?
149
+ return 1
150
+ end
151
+
152
+ if !network_type['hasStaticRoutes']
153
+ print_red_alert "Static routes not supported for #{network_type['name']}"
154
+ return 1
155
+ end
156
+
157
+ payload = nil
158
+ if options[:payload]
159
+ payload = options[:payload]
160
+ else
161
+ option_types = network_type['routeOptionTypes'].sort_by {|it| it['displayOrder']}
162
+ # prompt options
163
+ option_result = Morpheus::Cli::OptionTypes.prompt(option_types, options[:options].deep_merge({:context_map => {'networkRoute' => ''}}), @api_client, {'networkId' => network['id']}, nil, true)
164
+ payload = {'networkRoute' => params.deep_merge(option_result)}
165
+ # copy all domain level fields to route
166
+ if payload['networkRoute']['domain']
167
+ payload['networkRoute']['domain'].each do |k,v|
168
+ payload['networkRoute'][k] = v
169
+ end
170
+ end
171
+ payload['networkRoute'].delete('domain')
172
+
173
+ end
174
+
175
+ @network_static_routes_interface.setopts(options)
176
+
177
+ if options[:dry_run]
178
+ print_dry_run @network_static_routes_interface.dry.create_static_route(network['id'], payload)
179
+ return
180
+ end
181
+
182
+ json_response = @network_static_routes_interface.create_static_route(network['id'], payload)
183
+ render_response(json_response, options, 'networkRoute') do
184
+ print_green_success "\nAdded Network Static Route #{json_response['id']}\n"
185
+ _get(network, network_type, json_response['id'], options)
186
+ end
187
+ end
188
+
189
+ def update(args)
190
+ options = {:options=>{}}
191
+ params = {}
192
+ optparse = Morpheus::Cli::OptionParser.new do|opts|
193
+ opts.banner = subcommand_usage("[network] [networkRoute]")
194
+ build_standard_update_options(opts, options)
195
+ opts.footer = "Update a network Static Route.\n" +
196
+ "[network] is required. This is the name or id of an existing network.\n" +
197
+ "[networkRoute] is required. This is the name or id of an existing network static route."
198
+ end
199
+ optparse.parse!(args)
200
+ verify_args!(args:args, optparse:optparse, count:2)
201
+ connect(options)
202
+
203
+ network = find_network(args[0])
204
+ if network.nil?
205
+ return 1
206
+ end
207
+
208
+ network_type = find_network_type(network['type']['id'])
209
+ if network_type.nil?
210
+ return 1
211
+ end
212
+
213
+ route = find_static_route(network['id'], args[1])
214
+ return 1 if route.nil?
215
+
216
+ payload = parse_payload(options) || {'networkRoute' => params}
217
+ payload['networkRoute'].deep_merge!(options[:options].reject {|k,v| k.is_a?(Symbol) }) if options[:options] && !payload['networkRoute'].nil?
218
+
219
+ if payload['networkRoute'].empty?
220
+ option_types = network_type['routeOptionTypes'].sort_by {|it| it['displayOrder']}
221
+ print_green_success "Nothing to update"
222
+ println cyan
223
+ print Morpheus::Cli::OptionTypes.display_option_types_help(
224
+ option_types,
225
+ {:include_context => true, :context_map => {'networkRoute' => ''}, :color => cyan, :title => "Available Network Static Route Options"}
226
+ )
227
+ exit 1
228
+ end
229
+
230
+ # copy all domain level fields to route
231
+ if payload['networkRoute']['domain']
232
+ payload['networkRoute']['domain'].each do |k,v|
233
+ payload['networkRoute'][k] = v
234
+ end
235
+ payload['networkRoute'].delete('domain')
236
+ end
237
+
238
+ @network_static_routes_interface.setopts(options)
239
+
240
+ if options[:dry_run]
241
+ print_dry_run @network_static_routes_interface.dry.update_static_route(network['id'], route['id'], payload)
242
+ return
243
+ end
244
+
245
+ # build update payload
246
+ update_payload = {'networkRoute' => route.select{|x| !['id', 'code', 'internalId', 'externalId', 'uniqueId', 'providerId', 'externalType', 'enabled', 'visible', 'externalInterface'].include?(x)}}.deep_merge(payload)
247
+
248
+ json_response = @network_static_routes_interface.update_static_route(network['id'], route['id'], update_payload)
249
+ render_response(json_response, options, 'networkRoute') do
250
+ print_green_success "\nUpdated Network Static Route #{route['id']}\n"
251
+ _get(network, network_type, route['id'], options)
252
+ end
253
+ end
254
+
255
+ def remove(args)
256
+ options = {}
257
+ optparse = Morpheus::Cli::OptionParser.new do |opts|
258
+ opts.banner = subcommand_usage("[network] [network_route]")
259
+ build_standard_remove_options(opts, options)
260
+ opts.footer = "Delete a network static route.\n" +
261
+ "[network] is required. This is the name or id of an existing network.\n" +
262
+ "[network_route] is required. This is the name or id of an existing network static route."
263
+ end
264
+ optparse.parse!(args)
265
+ verify_args!(args:args, optparse:optparse, count:2)
266
+ connect(options)
267
+
268
+ network = find_network(args[0])
269
+ if network.nil?
270
+ return 1
271
+ end
272
+
273
+ network_type = find_network_type(network['type']['id'])
274
+ if network_type.nil?
275
+ return 1
276
+ end
277
+
278
+ route = find_static_route(network['id'], args[1])
279
+ return 1 if route.nil?
280
+
281
+ unless options[:yes] || ::Morpheus::Cli::OptionTypes::confirm("Are you sure you would like to remove the network static route '#{route['source']},#{route['destination']}' from network '#{network['name']}'?", options)
282
+ return 9, "aborted command"
283
+ end
284
+
285
+ @network_static_routes_interface.setopts(options)
286
+
287
+ if options[:dry_run]
288
+ print_dry_run @network_static_routes_interface.dry.delete_static_routes(network['id'], route['id'])
289
+ return
290
+ end
291
+ json_response = @network_static_routes_interface.delete_static_route(network['id'], route['id'])
292
+ render_response(json_response, options, 'networkRoute') do
293
+ print_green_success "\nDeleted Network Static Route '#{route['source']},#{route['destination']}'\n"
294
+ _list(network, network_type, options)
295
+ end
296
+ end
297
+
298
+ private
299
+
300
+ def print_static_routes(network, network_type, json_response)
301
+ routes = json_response['networkRoutes']
302
+ print cyan
303
+ if routes.count > 0
304
+ cols = [:id]
305
+ network_type['routeOptionTypes'].sort_by {|it| it['displayOrder']}.each do |option_type|
306
+ cols << option_type['fieldLabel']
307
+ end
308
+ rows = routes.collect do |it|
309
+ row = {
310
+ id: it['id']
311
+ }
312
+ network_type['routeOptionTypes'].sort_by {|it| it['displayOrder']}.each do |option_type|
313
+ row[option_type['fieldLabel']] = Morpheus::Cli::OptionTypes.get_option_value(it, option_type, true)
314
+ end
315
+ row
316
+ end
317
+ print as_pretty_table(rows, cols)
318
+ print_results_pagination(json_response)
319
+ else
320
+ println "No Static Routes"
321
+ end
322
+ println reset
323
+ end
324
+
325
+ def find_network(val)
326
+ if val.to_s =~ /\A\d{1,}\Z/
327
+ return find_network_by_id(val)
328
+ else
329
+ if network = find_network_by_name(val)
330
+ return find_network_by_id(network['id'])
331
+ end
332
+ end
333
+ end
334
+
335
+ def find_network_by_id(id)
336
+ begin
337
+ json_response = @networks_interface.get(id.to_i)
338
+ return json_response['network']
339
+ rescue RestClient::Exception => e
340
+ if e.response && e.response.code == 404
341
+ print_red_alert "Network not found by id #{id}"
342
+ return nil
343
+ else
344
+ raise e
345
+ end
346
+ end
347
+ end
348
+
349
+ def find_network_by_name(name)
350
+ json_response = @networks_interface.list({phrase: name.to_s})
351
+ networks = json_response['network']
352
+ if networks.empty?
353
+ print_red_alert "Network not found by name #{name}"
354
+ return nil
355
+ elsif networks.size > 1
356
+ print_red_alert "#{networks.size} network found by name #{name}"
357
+ rows = networks.collect do |it|
358
+ {id: it['id'], name: it['name']}
359
+ end
360
+ puts as_pretty_table(rows, [:id, :name], {color:red})
361
+ return nil
362
+ else
363
+ return networks[0]
364
+ end
365
+ end
366
+
367
+ def find_network_type(val)
368
+ if val.to_s =~ /\A\d{1,}\Z/
369
+ return find_network_type_by_id(val)
370
+ else
371
+ if network_type = find_network_type_by_name(val)
372
+ return find_network_type_by_id(network_type['id'])
373
+ end
374
+ end
375
+ end
376
+
377
+ def find_network_type_by_id(id)
378
+ begin
379
+ json_response = @network_types_interface.get(id.to_i)
380
+ return json_response['networkType']
381
+ rescue RestClient::Exception => e
382
+ if e.response && e.response.code == 404
383
+ print_red_alert "Network Type not found by id #{id}"
384
+ return nil
385
+ else
386
+ raise e
387
+ end
388
+ end
389
+ end
390
+
391
+ def find_network_type_by_name(name)
392
+ json_response = @network_types_interface.list({phrase: name.to_s})
393
+ networkTypes = json_response['networkType']
394
+ if networkTypes.empty?
395
+ print_red_alert "Network Type not found by name #{name}"
396
+ return nil
397
+ elsif networkTypes.size > 1
398
+ print_red_alert "#{networkTypes.size} network type found by name #{name}"
399
+ rows = networkTypes.collect do |it|
400
+ {id: it['id'], name: it['name']}
401
+ end
402
+ puts as_pretty_table(rows, [:id, :name], {color:red})
403
+ return nil
404
+ else
405
+ return networkTypes[0]
406
+ end
407
+ end
408
+
409
+ def find_static_route(network_id, val)
410
+ if val.to_s =~ /\A\d{1,}\Z/
411
+ return find_static_route_by_id(network_id, val)
412
+ else
413
+ if route = find_static_route_by_name(network_id, val)
414
+ return find_static_route_by_id(network_id, route['id'])
415
+ end
416
+ end
417
+ end
418
+
419
+ def find_static_route_by_id(network_id, route_id)
420
+ begin
421
+ json_response = @network_static_routes_interface.get_static_route(network_id, route_id.to_i)
422
+ return json_response['networkRoute']
423
+ rescue RestClient::Exception => e
424
+ if e.response && e.response.code == 404
425
+ print_red_alert "Network Static Route not found by id #{route_id}"
426
+ return nil
427
+ else
428
+ raise e
429
+ end
430
+ end
431
+ end
432
+
433
+ def find_static_route_by_name(network_id, name)
434
+ json_response = @network_static_routes_interface.list_static_routes(network_id, {phrase: name.to_s})
435
+ routes = json_response['networkRoutes']
436
+ if routes.empty?
437
+ print_red_alert "Network Static Routes not found by name #{name}"
438
+ return nil
439
+ elsif routes.size > 1
440
+ print_red_alert "#{routes.size} network Static Routes found by name #{name}"
441
+ rows = routes.collect do |it|
442
+ {id: it['id'], source: it['source'], destination: it['destination']}
443
+ end
444
+ puts as_pretty_table(rows, [:id, :source, :destination], {color:red})
445
+ return nil
446
+ else
447
+ return routes[0]
448
+ end
449
+ end
450
+
451
+ end
@@ -89,7 +89,7 @@ class Morpheus::Cli::NetworkTransportZonesCommand
89
89
  server = find_network_server(server_id)
90
90
  return 1 if server.nil?
91
91
 
92
- scope_id = args.count > 1 ? args[1] : Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'rule', 'type' => 'select', 'fieldLabel' => 'Firewall Rule', 'selectOptions' => search_scopes(server['id']).collect {|it| {'name' => it['name'], 'value' => it['id']}}, 'required' => true, 'description' => 'Select Firewall Rule.'}],options[:options],@api_client,{})['rule']
92
+ scope_id = args.count > 1 ? args[1] : Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'rule', 'type' => 'select', 'fieldLabel' => 'Transport Zone', 'selectOptions' => search_scopes(server['id']).collect {|it| {'name' => it['name'], 'value' => it['id']}}, 'required' => true, 'description' => 'Select Transport Zone.'}],options[:options],@api_client,{})['rule']
93
93
 
94
94
  _get(server, scope_id, options)
95
95
  end
@@ -236,7 +236,7 @@ class Morpheus::Cli::NetworkTransportZonesCommand
236
236
  return 1
237
237
  end
238
238
 
239
- scope_id = args.count > 1 ? args[1] : Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'scope', 'type' => 'select', 'fieldLabel' => 'Firewall Rule', 'selectOptions' => search_scopes(server['id']).collect {|it| {'name' => it['name'], 'value' => it['id']}}, 'required' => true, 'description' => 'Select Transport Zone.'}],options[:options],@api_client,{})['scope']
239
+ scope_id = args.count > 1 ? args[1] : Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'scope', 'type' => 'select', 'fieldLabel' => 'Transport Zone', 'selectOptions' => search_scopes(server['id']).collect {|it| {'name' => it['name'], 'value' => it['id']}}, 'required' => true, 'description' => 'Select Transport Zone.'}],options[:options],@api_client,{})['scope']
240
240
  scope = find_scope(server['id'], scope_id)
241
241
  return 1 if scope.nil?
242
242
 
@@ -305,7 +305,7 @@ class Morpheus::Cli::NetworkTransportZonesCommand
305
305
  return 1
306
306
  end
307
307
 
308
- scope_id = args.count > 1 ? args[1] : Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'scope', 'type' => 'select', 'fieldLabel' => 'Firewall Rule', 'selectOptions' => search_scopes(server['id']).collect {|it| {'name' => it['name'], 'value' => it['id']}}, 'required' => true, 'description' => 'Select Transport Zone.'}],options[:options],@api_client,{})['scope']
308
+ scope_id = args.count > 1 ? args[1] : Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'scope', 'type' => 'select', 'fieldLabel' => 'Transport Zone', 'selectOptions' => search_scopes(server['id']).collect {|it| {'name' => it['name'], 'value' => it['id']}}, 'required' => true, 'description' => 'Select Transport Zone.'}],options[:options],@api_client,{})['scope']
309
309
  scope = find_scope(server['id'], scope_id)
310
310
  return 1 if scope.nil?
311
311
 
@@ -384,7 +384,7 @@ class Morpheus::Cli::NetworkTransportZonesCommand
384
384
  end
385
385
 
386
386
  def find_network_server_by_name(name)
387
- servers = search_network_servers
387
+ servers = search_network_servers(name)
388
388
  if servers.empty?
389
389
  print_red_alert "Network Server not found by name #{name}"
390
390
  return nil