morpheus-cli 6.2.2 → 6.2.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (34) 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/clusters_interface.rb +7 -0
  5. data/lib/morpheus/api/network_security_server_types_interface.rb +9 -0
  6. data/lib/morpheus/api/network_server_types_interface.rb +9 -0
  7. data/lib/morpheus/api/network_servers_interface.rb +4 -0
  8. data/lib/morpheus/cli/cli_command.rb +1 -0
  9. data/lib/morpheus/cli/commands/clouds.rb +101 -28
  10. data/lib/morpheus/cli/commands/clouds_types.rb +141 -0
  11. data/lib/morpheus/cli/commands/clusters.rb +44 -0
  12. data/lib/morpheus/cli/commands/instances.rb +1 -0
  13. data/lib/morpheus/cli/commands/network_dhcp_relays_command.rb +1 -42
  14. data/lib/morpheus/cli/commands/network_dhcp_servers_command.rb +3 -44
  15. data/lib/morpheus/cli/commands/network_edge_clusters_command.rb +1 -42
  16. data/lib/morpheus/cli/commands/network_firewalls_command.rb +1 -41
  17. data/lib/morpheus/cli/commands/network_pool_servers_command.rb +3 -1
  18. data/lib/morpheus/cli/commands/network_routers_command.rb +4 -6
  19. data/lib/morpheus/cli/commands/network_security_server_types.rb +20 -0
  20. data/lib/morpheus/cli/commands/network_server_types_command.rb +20 -0
  21. data/lib/morpheus/cli/commands/network_servers_command.rb +368 -0
  22. data/lib/morpheus/cli/commands/network_transport_zones_command.rb +1 -41
  23. data/lib/morpheus/cli/commands/networks_command.rb +1 -1
  24. data/lib/morpheus/cli/commands/options.rb +135 -2
  25. data/lib/morpheus/cli/mixins/infrastructure_helper.rb +103 -2
  26. data/lib/morpheus/cli/mixins/networks_helper.rb +62 -0
  27. data/lib/morpheus/cli/mixins/print_helper.rb +28 -7
  28. data/lib/morpheus/cli/mixins/prompt_helper.rb +15 -0
  29. data/lib/morpheus/cli/mixins/provisioning_helper.rb +25 -9
  30. data/lib/morpheus/cli/mixins/rest_command.rb +1 -1
  31. data/lib/morpheus/cli/option_types.rb +3 -3
  32. data/lib/morpheus/cli/version.rb +1 -1
  33. data/lib/morpheus/logging.rb +6 -3
  34. metadata +10 -2
@@ -2,6 +2,7 @@ require 'morpheus/cli/cli_command'
2
2
 
3
3
  class Morpheus::Cli::NetworkFirewallsCommand
4
4
  include Morpheus::Cli::CliCommand
5
+ include Morpheus::Cli::NetworksHelper
5
6
  include Morpheus::Cli::ProvisioningHelper
6
7
  include Morpheus::Cli::WhoamiHelper
7
8
 
@@ -685,47 +686,6 @@ class Morpheus::Cli::NetworkFirewallsCommand
685
686
 
686
687
  private
687
688
 
688
- def find_network_server(val)
689
- if val.to_s =~ /\A\d{1,}\Z/
690
- return find_network_server_by_id(val)
691
- else
692
- if server = find_network_server_by_name(val)
693
- return find_network_server_by_id(server['id'])
694
- end
695
- end
696
- end
697
-
698
- def find_network_server_by_id(id)
699
- begin
700
- json_response = @network_servers_interface.get(id.to_i)
701
- return json_response['networkServer']
702
- rescue RestClient::Exception => e
703
- if e.response && e.response.code == 404
704
- print_red_alert "Network Server not found by id #{id}"
705
- return nil
706
- else
707
- raise e
708
- end
709
- end
710
- end
711
-
712
- def find_network_server_by_name(name)
713
- servers = search_network_servers(name)
714
- if servers.empty?
715
- print_red_alert "Network Server not found by name #{name}"
716
- return nil
717
- elsif servers.size > 1
718
- print_red_alert "#{servers.size} network servers found by name #{name}"
719
- rows = servers.collect do |it|
720
- {id: it['id'], name: it['name']}
721
- end
722
- puts as_pretty_table(rows, [:id, :name], {color:red})
723
- return nil
724
- else
725
- return servers[0]
726
- end
727
- end
728
-
729
689
  def search_network_servers(phrase = nil)
730
690
  @network_servers_interface.list(phrase ? {phrase: phrase.to_s} : {})['networkServers']
731
691
  end
@@ -10,11 +10,13 @@ class Morpheus::Cli::NetworkPoolServersCommand
10
10
 
11
11
  register_subcommands :list, :get, :add, :update, :remove
12
12
  register_subcommands :list_types, :get_type
13
+ alias_subcommand :types, :'list-types'
14
+ alias_subcommand :type, :'get-type'
13
15
 
14
16
  # RestCommand settings
15
17
  register_interfaces :network_pool_servers, :network_pool_server_types, :clouds, :options
16
18
  set_rest_has_type true
17
- # set_rest_type :network_pool_server_types
19
+ set_rest_type :network_pool_server_types
18
20
 
19
21
  def handle(args)
20
22
  handle_subcommand(args)
@@ -301,7 +301,10 @@ class Morpheus::Cli::NetworkRoutersCommand
301
301
 
302
302
  if router_type['hasNetworkServer']
303
303
  if options[:network_server]
304
- server = find_network_server(options[:network_server])
304
+ # This is using network_services instead of network_servers though, hrmm
305
+ # server = find_network_server(options[:network_server])
306
+ services = @network_services_interface.list()['networkServices']
307
+ server = (options[:network_server].to_s =~ /\A\d{1,}\Z/) ? services.find {|it| it['id'].to_i == options[:network_server].to_i} : services.find {|it| it['name'] == options[:network_server]}
305
308
  if server.nil?
306
309
  print_red_alert "Network server #{options[:network_server]} not found"
307
310
  exit 1
@@ -2552,11 +2555,6 @@ class Morpheus::Cli::NetworkRoutersCommand
2552
2555
  @network_routers_interface.groups
2553
2556
  end
2554
2557
 
2555
- def find_network_server(val)
2556
- services = @network_services_interface.list()['networkServices']
2557
- (val.to_s =~ /\A\d{1,}\Z/) ? services.find {|it| it['id'].to_i == val.to_i} : services.find {|it| it['name'] == val}
2558
- end
2559
-
2560
2558
  def find_firewall_rule(router, rule_id)
2561
2559
  rule = nil
2562
2560
  if router['type']['hasFirewallGroups']
@@ -0,0 +1,20 @@
1
+ require 'morpheus/cli/cli_command'
2
+
3
+ class Morpheus::Cli::NetworkSecurityServerTypes
4
+ include Morpheus::Cli::CliCommand
5
+ include Morpheus::Cli::RestCommand
6
+ include Morpheus::Cli::InfrastructureHelper
7
+
8
+ set_command_description "View network security server types"
9
+ set_command_name :'network-security-server-types'
10
+ register_subcommands :list, :get
11
+
12
+ # hidden in favor of get-type and list-types
13
+ set_command_hidden
14
+
15
+ # register_interfaces :network_security_server_types
16
+
17
+ protected
18
+
19
+ end
20
+
@@ -0,0 +1,20 @@
1
+ require 'morpheus/cli/cli_command'
2
+
3
+ class Morpheus::Cli::NetworkServerTypes
4
+ include Morpheus::Cli::CliCommand
5
+ include Morpheus::Cli::RestCommand
6
+ include Morpheus::Cli::InfrastructureHelper
7
+
8
+ set_command_description "View network server types"
9
+ set_command_name :'network-server-types'
10
+ register_subcommands :list, :get
11
+
12
+ # hidden in favor of get-type and list-types
13
+ set_command_hidden
14
+
15
+ register_interfaces :network_server_types
16
+
17
+ protected
18
+
19
+ end
20
+
@@ -0,0 +1,368 @@
1
+ require 'morpheus/cli/cli_command'
2
+
3
+ class Morpheus::Cli::NetworkServersCommand
4
+ include Morpheus::Cli::CliCommand
5
+ include Morpheus::Cli::RestCommand
6
+ include Morpheus::Cli::InfrastructureHelper
7
+
8
+ set_command_description "View and manage network servers"
9
+ set_command_name :'network-servers'
10
+
11
+ register_subcommands :list, :get, :add, :update, :remove, :refresh
12
+ register_subcommands :list_types, :get_type
13
+ alias_subcommand :types, :'list-types'
14
+ alias_subcommand :type, :'get-type'
15
+
16
+ # RestCommand settings
17
+ register_interfaces :network_servers, :network_server_types, :clouds, :options
18
+ set_rest_has_type true
19
+ set_rest_type :network_server_types
20
+
21
+ def handle(args)
22
+ handle_subcommand(args)
23
+ end
24
+
25
+ def add(args)
26
+ options = {}
27
+ params = {}
28
+ ip_range_list = nil
29
+ optparse = Morpheus::Cli::OptionParser.new do |opts|
30
+ opts.banner = subcommand_usage("[name]")
31
+ opts.on('--name VALUE', String, "Name for this network server") do |val|
32
+ params['name'] = val
33
+ end
34
+ opts.on('--type VALUE', String, "Network Server Type code") do |val|
35
+ params['type'] = val
36
+ end
37
+ # opts.on('--enabled [on|off]', String, "Can be used to disable the network server") do |val|
38
+ # params['enabled'] = val.to_s == 'on' || val.to_s == 'true' || val.to_s.empty?
39
+ # end
40
+ # ['name', 'serviceUsername', 'servicePassword', 'servicePort', 'serviceHost', 'serviceUrl', 'serviceMode', 'networkFilter', 'tenantMatch']
41
+ build_standard_add_options(opts, options)
42
+ opts.footer = <<-EOT
43
+ Create a new network server.
44
+ [name] is required and can be passed as --name instead.
45
+ Configuration options vary by network server type.
46
+ EOT
47
+ end
48
+ optparse.parse!(args)
49
+ verify_args!(args:args, optparse:optparse, max: 1)
50
+ connect(options)
51
+
52
+ # support [name] as first argument
53
+ if args[0]
54
+ params['name'] = args[0]
55
+ end
56
+
57
+ # merge -O options into normally parsed options
58
+ params.deep_merge!(options[:options].reject {|k,v| k.is_a?(Symbol) }) if options[:options]
59
+
60
+ # construct payload
61
+ payload = nil
62
+ if options[:payload]
63
+ payload = options[:payload]
64
+ else
65
+ # prompt for network server options
66
+
67
+ # Name
68
+ if !params['name']
69
+ params['name'] = prompt_value({'fieldName' => 'name', 'fieldLabel' => 'Name', 'type' => 'text', 'required' => true, 'description' => 'Name for this network server.'}, params, options[:no_prompt])
70
+ # params['name'] = Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'name', 'fieldLabel' => 'Name', 'type' => 'text', 'required' => true, 'description' => 'Name for this network server.'}], params, @api_client, {}, options[:no_prompt])['name']
71
+ end
72
+
73
+ # Network Server Type
74
+ network_type_id = nil
75
+ # use this optionSource networkServices which is really network service
76
+ # where the response data is categories, each with a list ofservices (service types)
77
+ network_services_options = @options_interface.options_for_source('networkServices',{})['data']
78
+ networking_category = network_services_options.find {|it| it['value'] == 'networkServer'}
79
+ service_types = networking_category ? networking_category['services'] : []
80
+ network_server_type_options = service_types.collect {|it| {'name' => it['name'], 'value' => it['code'], 'code' => it['code'], 'id' => it['id']} }
81
+ if network_server_type_options.empty?
82
+ raise_command_error "No available network server types found"
83
+ end
84
+ # v_prompt = Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'type', 'fieldLabel' => 'Network Server Type', 'type' => 'select', 'optionSource' => 'networkServerTypes', 'required' => true, 'description' => 'Choose a network server type.'}], options, @api_client, {})
85
+ #network_type_id = v_prompt['type']
86
+ # allow matching type by id, name or code
87
+ selected_type = nil
88
+ if params['type'] && params['type'].to_s =~ /\A\d{1,}\Z/
89
+ network_type_id = params['type'].to_i
90
+ selected_type = network_server_type_options.find {|it| it['id'] == network_type_id }
91
+ if selected_type.nil?
92
+ raise_command_error "Network Server Type not found by id '#{params['type']}'"
93
+ end
94
+ network_type_code = selected_type['code']
95
+ else
96
+ network_type_code = prompt_value({'fieldName' => 'type', 'fieldLabel' => 'Network Server Type', 'type' => 'select', 'selectOptions' => network_server_type_options, 'required' => true, 'description' => 'Choose a network server type.'}, params, options[:no_prompt])
97
+ #network_type_code = Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'type', 'fieldLabel' => 'Network Server Type', 'type' => 'select', 'selectOptions' => network_server_type_options, 'required' => true, 'description' => 'Choose a network server type.'}], options, @api_client, {}, options[:no_prompt])['type']
98
+ selected_type = network_server_type_options.find {|it| it['code'] == network_type_code }
99
+ if selected_type.nil?
100
+ raise_command_error "Network Server Type not found by name or code '#{params['type']}'"
101
+ end
102
+ network_type_id = selected_type['id']
103
+ end
104
+ params['type'] = network_type_code
105
+
106
+ # prompt options by type
107
+ network_server_type = @network_server_types_interface.get(network_type_id.to_i)['networkServerType']
108
+ # params['type'] = network_server_type['code']
109
+ option_result = Morpheus::Cli::OptionTypes.prompt(network_server_type['optionTypes'], params.merge({:context_map => {'networkServer' => ''}}), @api_client, {}, options[:no_prompt], true)
110
+ params.deep_merge!(option_result)
111
+ payload = {'networkServer' => params}
112
+ end
113
+ @network_servers_interface.setopts(options)
114
+ if options[:dry_run]
115
+ print_dry_run @network_servers_interface.dry.create(payload)
116
+ return
117
+ end
118
+ json_response = @network_servers_interface.create(payload)
119
+ render_response(json_response, options, 'networkServer') do
120
+ network_server = json_response['networkServer']
121
+ print_green_success "Added network server #{network_server['name']}"
122
+ _get(network_server['id'], {}, options)
123
+ end
124
+ end
125
+
126
+ def update(args)
127
+ options = {}
128
+ params = {}
129
+ ip_range_list = nil
130
+ optparse = Morpheus::Cli::OptionParser.new do |opts|
131
+ opts.banner = subcommand_usage("[network server] [options]")
132
+ opts.on('--name VALUE', String, "Name for this network server") do |val|
133
+ params['name'] = val
134
+ end
135
+ # opts.on('--enabled [on|off]', String, "Can be used to enable or disable the network server") do |val|
136
+ # params['enabled'] = val.to_s == 'on' || val.to_s == 'true' || val.to_s.empty?
137
+ # end
138
+ # ['name', 'serviceUsername', 'servicePassword', 'servicePort', 'serviceHost', 'serviceUrl', 'serviceMode', 'networkFilter', 'tenantMatch']
139
+ build_standard_update_options(opts, options)
140
+ opts.footer = <<-EOT
141
+ Update a network server.
142
+ [network server] is required. This is the name or id of a network server.
143
+ Configuration options vary by network server type.
144
+ EOT
145
+ end
146
+ optparse.parse!(args)
147
+ verify_args!(args:args, optparse:optparse, count: 1)
148
+ connect(options)
149
+ # find network server to be updated
150
+ network_server = find_network_server_by_name_or_id(args[0])
151
+ return 1 if network_server.nil?
152
+
153
+ # merge -O options into normally parsed options
154
+ params.deep_merge!(options[:options].reject {|k,v| k.is_a?(Symbol) }) if options[:options]
155
+
156
+ # construct payload
157
+ payload = nil
158
+ if options[:payload]
159
+ payload = options[:payload]
160
+ else
161
+ payload = {
162
+ 'networkServer' => params
163
+ }
164
+ end
165
+ @network_servers_interface.setopts(options)
166
+ if options[:dry_run]
167
+ print_dry_run @network_servers_interface.dry.update(network_server["id"], payload)
168
+ return
169
+ end
170
+ json_response = @network_servers_interface.update(network_server["id"], payload)
171
+ render_response(json_response, options, 'networkServer') do
172
+ network_server = json_response['networkServer']
173
+ print_green_success "Updated network server #{network_server['name']}"
174
+ _get(network_server['id'], {}, options)
175
+ end
176
+ end
177
+
178
+ def refresh(args)
179
+ options = {}
180
+ params = {}
181
+ ip_range_list = nil
182
+ optparse = Morpheus::Cli::OptionParser.new do |opts|
183
+ opts.banner = subcommand_usage("[network server]")
184
+ # ['name', 'serviceUsername', 'servicePassword', 'servicePort', 'serviceHost', 'serviceUrl', 'serviceMode', 'networkFilter', 'tenantMatch']
185
+ build_standard_update_options(opts, options, [:query])
186
+ opts.footer = <<-EOT
187
+ Refresh a network server.
188
+ [network server] is required. This is the name or id of a network server.
189
+ EOT
190
+ end
191
+ optparse.parse!(args)
192
+ verify_args!(args:args, optparse:optparse, count: 1)
193
+ connect(options)
194
+ # find network server to be updated
195
+ network_server = find_network_server_by_name_or_id(args[0])
196
+ return 1 if network_server.nil?
197
+ # construct query parameters
198
+ params.merge!(parse_query_options(options))
199
+ # construct payload
200
+ payload = nil
201
+ if options[:payload]
202
+ payload = options[:payload]
203
+ else
204
+ payload = options[:options].reject {|k,v| k.is_a?(Symbol) }
205
+ end
206
+ @network_servers_interface.setopts(options)
207
+ if options[:dry_run]
208
+ print_dry_run @network_servers_interface.dry.refresh(network_server["id"], params, payload)
209
+ return
210
+ end
211
+ json_response = @network_servers_interface.refresh(network_server["id"], params, payload)
212
+ render_response(json_response, options, 'networkServer') do
213
+ #network_server = json_response['networkServer']
214
+ print_green_success "Refreshing network server #{network_server['name']}"
215
+ #_get(network_server['id'], {}, options)
216
+ end
217
+ end
218
+
219
+ private
220
+
221
+ # def render_response_for_get(json_response, options)
222
+ # # load the type and show fields dynamically based on optionTypes
223
+ # render_response(json_response, options, rest_object_key) do
224
+ # type_record = rest_type_find_by_name_or_id(json_response[rest_object_key]['type']['id']) rescue nil
225
+ # type_option_types = type_record ? (type_record['optionTypes'] || []) : []
226
+ # record = json_response[rest_object_key]
227
+ # print_h1 rest_label, [], options
228
+ # print cyan
229
+ # columns = rest_column_definitions(options)
230
+ # if record['credential'] && record['credential']['type'] != 'local'
231
+ # columns.delete("Username")
232
+ # columns.delete("Password")
233
+ # end
234
+ # columns.delete("Throttle Rate") unless type_option_types.find {|it| it['fieldName'] == 'serviceThrottleRate' }
235
+ # columns.delete("Disable SSL SNI") unless type_option_types.find {|it| it['fieldName'] == 'ignoreSsl' }
236
+ # columns.delete("Network Filter") unless type_option_types.find {|it| it['fieldName'] == 'networkFilter' }
237
+ # columns.delete("Zone Filter") unless type_option_types.find {|it| it['fieldName'] == 'zoneFilter' }
238
+ # columns.delete("Tenant Match") unless type_option_types.find {|it| it['fieldName'] == 'tenantMatch' }
239
+ # columns.delete("IP Mode") unless type_option_types.find {|it| it['fieldName'] == 'serviceMode' }
240
+ # columns.delete("Extra Attributes") unless type_option_types.find {|it| it['fieldName'] == 'extraAttributes' }
241
+ # columns.delete("App ID") unless type_option_types.find {|it| it['fieldName'] == 'appId' }
242
+ # columns.delete("Inventory Existing") unless type_option_types.find {|it| it['fieldName'] == 'inventoryExisting' }
243
+ # columns.delete("Enabled") if record['enabled'].nil? # was not always returned, so don't show false if not present..
244
+ # print_description_list(columns, record, options)
245
+ # print reset,"\n"
246
+ # end
247
+ # end
248
+
249
+ def find_network_server_by_name_or_id(val)
250
+ if val.to_s =~ /\A\d{1,}\Z/
251
+ return find_network_server_by_id(val)
252
+ else
253
+ return find_network_server_by_name(val)
254
+ end
255
+ end
256
+
257
+ def find_network_server_by_id(id)
258
+ begin
259
+ json_response = @network_servers_interface.get(id.to_i)
260
+ return json_response['networkServer']
261
+ rescue RestClient::Exception => e
262
+ if e.response && e.response.code == 404
263
+ print_red_alert "Network Server not found by id #{id}"
264
+ return nil
265
+ else
266
+ raise e
267
+ end
268
+ end
269
+ end
270
+
271
+ def find_network_server_by_name(name)
272
+ json_response = @network_servers_interface.list({name: name.to_s})
273
+ network_servers = json_response['networkServers']
274
+ if network_servers.empty?
275
+ print_red_alert "Network Server not found by name #{name}"
276
+ return nil
277
+ elsif network_servers.size > 1
278
+ print_red_alert "#{network_servers.size} network servers found by name #{name}"
279
+ # print_networks_table(networks, {color: red})
280
+ rows = network_servers.collect do |it|
281
+ {id: it['id'], name: it['name']}
282
+ end
283
+ puts as_pretty_table(rows, [:id, :name], {color:red})
284
+ return nil
285
+ else
286
+ return network_servers[0]
287
+ end
288
+ end
289
+
290
+ def add_network_server_option_types()
291
+ [
292
+ {'shorthand' => '-t', 'fieldName' => 'type', 'fieldLabel' => 'Network Server Type', 'type' => 'select', 'optionSource' => lambda {|api_client, api_params|
293
+ api_client.network_server_types.list({max:10000})['networkServerTypes'].collect { |it| {"name" => it["name"], "value" => it["code"]} }
294
+ }, 'required' => true},
295
+ {'fieldName' => 'name', 'fieldLabel' => 'Name', 'type' => 'text', 'required' => true},
296
+ {'fieldName' => 'description', 'fieldLabel' => 'Description', 'type' => 'text', 'required' => false},
297
+ {'fieldName' => 'enabled', 'fieldLabel' => 'Enabled', 'type' => 'checkbox', 'required' => false, 'defaultValue' => true},
298
+ ]
299
+ end
300
+
301
+ def add_network_server_advanced_option_types()
302
+ []
303
+ end
304
+
305
+ def update_network_server_option_types()
306
+ [
307
+ {'fieldName' => 'name', 'fieldLabel' => 'Name', 'type' => 'text'},
308
+ {'fieldName' => 'description', 'fieldLabel' => 'Description', 'type' => 'text'},
309
+ {'fieldName' => 'enabled', 'fieldLabel' => 'Enabled', 'type' => 'checkbox'},
310
+ ]
311
+ end
312
+
313
+ def update_network_server_advanced_option_types()
314
+ []
315
+ end
316
+
317
+ def network_server_list_column_definitions(options)
318
+ {
319
+ "ID" => 'id',
320
+ "Name" => lambda {|it| it['name'] },
321
+ "Type" => lambda {|it| it['type'] ? it['type']['name'] : '' },
322
+ "URL" => lambda {|it| it['serviceUrl'] },
323
+ # "Enabled" => lambda {|it| format_boolean(it['enabled']) },
324
+ "Status" => lambda {|it| format_network_server_status(it) },
325
+ "Date Created" => lambda {|it| format_local_dt(it['dateCreated']) },
326
+ "Last Updated" => lambda {|it| format_local_dt(it['lastUpdated']) },
327
+ }
328
+ end
329
+
330
+ def network_server_column_definitions(options)
331
+ {
332
+ "ID" => 'id',
333
+ "Name" => lambda {|it| it['name'] },
334
+ "Type" => lambda {|it| it['type'] ? it['type']['name'] : '' },
335
+ "URL" => lambda {|it| it['serviceUrl'] },
336
+ #todo: support credentials
337
+ #"Credentials" => lambda {|it| it['credential'] ? (it['credential']['type'] == 'local' ? '(Local)' : it['credential']['name']) : nil },
338
+ "Username" => lambda {|it| it['serviceUsername'] },
339
+ "Password" => lambda {|it| it['servicePassword'] },
340
+ "Service Mode" => lambda {|it| it['serviceMode'] },
341
+ "Service Path" => lambda {|it| it['servicePath'] },
342
+ "Network Filter" => lambda {|it| it['networkFilter'] },
343
+ "Tenant Match" => lambda {|it| it['tenantMatch'] },
344
+ #"Enabled" => lambda {|it| format_boolean(it['enabled']) },
345
+ "Status" => lambda {|it| format_network_server_status(it) },
346
+ "Date Created" => lambda {|it| format_local_dt(it['dateCreated']) },
347
+ "Last Updated" => lambda {|it| format_local_dt(it['lastUpdated']) },
348
+ }
349
+ end
350
+
351
+ def format_network_server_status(network_server, return_color=cyan)
352
+ out = ""
353
+ status_string = network_server['status']
354
+ if status_string.nil? || status_string.empty? || status_string == "unknown"
355
+ out << "#{white}UNKNOWN#{network_server['statusMessage'] ? "#{return_color} - #{network_server['statusMessage']}" : ''}#{return_color}"
356
+ # elsif network_server['enabled'] == false
357
+ # out << "#{red}DISABLED#{network_server['statusMessage'] ? "#{return_color} - #{network_server['statusMessage']}" : ''}#{return_color}"
358
+ elsif status_string == 'ok'
359
+ out << "#{green}#{status_string.upcase}#{return_color}"
360
+ elsif status_string == 'error' || status_string == 'offline'
361
+ out << "#{red}#{status_string ? status_string.upcase : 'N/A'}#{network_server['statusMessage'] ? "#{return_color} - #{network_server['statusMessage']}" : ''}#{return_color}"
362
+ else
363
+ out << "#{yellow}#{status_string.upcase}#{return_color}"
364
+ end
365
+ out
366
+ end
367
+
368
+ end
@@ -2,6 +2,7 @@ require 'morpheus/cli/cli_command'
2
2
 
3
3
  class Morpheus::Cli::NetworkTransportZonesCommand
4
4
  include Morpheus::Cli::CliCommand
5
+ include Morpheus::Cli::NetworksHelper
5
6
  include Morpheus::Cli::ProvisioningHelper
6
7
  include Morpheus::Cli::WhoamiHelper
7
8
 
@@ -359,47 +360,6 @@ class Morpheus::Cli::NetworkTransportZonesCommand
359
360
  end
360
361
  end
361
362
 
362
- def find_network_server(val)
363
- if val.to_s =~ /\A\d{1,}\Z/
364
- return find_network_server_by_id(val)
365
- else
366
- if server = find_network_server_by_name(val)
367
- return find_network_server_by_id(server['id'])
368
- end
369
- end
370
- end
371
-
372
- def find_network_server_by_id(id)
373
- begin
374
- json_response = @network_servers_interface.get(id.to_i)
375
- return json_response['networkServer']
376
- rescue RestClient::Exception => e
377
- if e.response && e.response.code == 404
378
- print_red_alert "Network Server not found by id #{id}"
379
- return nil
380
- else
381
- raise e
382
- end
383
- end
384
- end
385
-
386
- def find_network_server_by_name(name)
387
- servers = search_network_servers(name)
388
- if servers.empty?
389
- print_red_alert "Network Server not found by name #{name}"
390
- return nil
391
- elsif servers.size > 1
392
- print_red_alert "#{servers.size} network servers found by name #{name}"
393
- rows = servers.collect do |it|
394
- {id: it['id'], name: it['name']}
395
- end
396
- puts as_pretty_table(rows, [:id, :name], {color:red})
397
- return nil
398
- else
399
- return servers[0]
400
- end
401
- end
402
-
403
363
  def search_network_servers(phrase = nil)
404
364
  @network_servers_interface.list(phrase ? {phrase: phrase.to_s} : {})['networkServers']
405
365
  end
@@ -1542,7 +1542,7 @@ class Morpheus::Cli::NetworksCommand
1542
1542
  description_cols = {
1543
1543
  "ID" => 'id',
1544
1544
  "Name" => 'name',
1545
- "Code" => 'name',
1545
+ "Code" => 'code',
1546
1546
  "Description" => 'description',
1547
1547
  # lots more here
1548
1548
  "Createable" => lambda {|it| format_boolean(it['creatable']) },