morpheus-cli 6.2.2 → 6.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. checksums.yaml +4 -4
  2. data/Dockerfile +1 -1
  3. data/README.md +6 -0
  4. data/lib/morpheus/api/api_client.rb +12 -0
  5. data/lib/morpheus/api/clusters_interface.rb +7 -0
  6. data/lib/morpheus/api/network_security_server_types_interface.rb +9 -0
  7. data/lib/morpheus/api/network_server_types_interface.rb +9 -0
  8. data/lib/morpheus/api/network_servers_interface.rb +4 -0
  9. data/lib/morpheus/cli/cli_command.rb +1 -0
  10. data/lib/morpheus/cli/commands/clouds.rb +101 -28
  11. data/lib/morpheus/cli/commands/clouds_types.rb +141 -0
  12. data/lib/morpheus/cli/commands/clusters.rb +43 -0
  13. data/lib/morpheus/cli/commands/instances.rb +1 -0
  14. data/lib/morpheus/cli/commands/network_dhcp_relays_command.rb +1 -42
  15. data/lib/morpheus/cli/commands/network_dhcp_servers_command.rb +3 -44
  16. data/lib/morpheus/cli/commands/network_edge_clusters_command.rb +1 -42
  17. data/lib/morpheus/cli/commands/network_firewalls_command.rb +1 -41
  18. data/lib/morpheus/cli/commands/network_pool_servers_command.rb +3 -1
  19. data/lib/morpheus/cli/commands/network_routers_command.rb +4 -6
  20. data/lib/morpheus/cli/commands/network_security_server_types.rb +20 -0
  21. data/lib/morpheus/cli/commands/network_server_types_command.rb +20 -0
  22. data/lib/morpheus/cli/commands/network_servers_command.rb +368 -0
  23. data/lib/morpheus/cli/commands/network_transport_zones_command.rb +1 -41
  24. data/lib/morpheus/cli/commands/networks_command.rb +1 -1
  25. data/lib/morpheus/cli/commands/options.rb +135 -2
  26. data/lib/morpheus/cli/commands/policies_command.rb +112 -128
  27. data/lib/morpheus/cli/commands/roles.rb +3 -0
  28. data/lib/morpheus/cli/mixins/accounts_helper.rb +2 -0
  29. data/lib/morpheus/cli/mixins/infrastructure_helper.rb +103 -2
  30. data/lib/morpheus/cli/mixins/networks_helper.rb +62 -0
  31. data/lib/morpheus/cli/mixins/print_helper.rb +28 -7
  32. data/lib/morpheus/cli/mixins/prompt_helper.rb +15 -0
  33. data/lib/morpheus/cli/mixins/provisioning_helper.rb +25 -9
  34. data/lib/morpheus/cli/mixins/rest_command.rb +1 -1
  35. data/lib/morpheus/cli/option_types.rb +3 -3
  36. data/lib/morpheus/cli/version.rb +1 -1
  37. data/lib/morpheus/logging.rb +6 -3
  38. metadata +10 -2
@@ -2,6 +2,7 @@ require 'morpheus/cli/cli_command'
2
2
 
3
3
  class Morpheus::Cli::NetworkEdgeClustersCommand
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
 
@@ -242,48 +243,6 @@ class Morpheus::Cli::NetworkEdgeClustersCommand
242
243
  end
243
244
  end
244
245
 
245
- def find_network_server(val)
246
- if val.to_s =~ /\A\d{1,}\Z/
247
- return find_network_server_by_id(val)
248
- else
249
- if server = find_network_server_by_name(val)
250
- return find_network_server_by_id(server['id'])
251
- end
252
- end
253
- end
254
-
255
- def find_network_server_by_id(id)
256
- begin
257
- json_response = @network_servers_interface.get(id.to_i)
258
- return json_response['networkServer']
259
- rescue RestClient::Exception => e
260
- if e.response && e.response.code == 404
261
- print_red_alert "Network Server not found by id #{id}"
262
- return nil
263
- else
264
- raise e
265
- end
266
- end
267
- end
268
-
269
- def find_network_server_by_name(name)
270
- json_response = @network_servers_interface.list({phrase: name.to_s})
271
- servers = json_response['networkServers']
272
- if servers.empty?
273
- print_red_alert "Network Server not found by name #{name}"
274
- return nil
275
- elsif servers.size > 1
276
- print_red_alert "#{servers.size} network servers found by name #{name}"
277
- rows = servers.collect do |it|
278
- {id: it['id'], name: it['name']}
279
- end
280
- puts as_pretty_table(rows, [:id, :name], {color:red})
281
- return nil
282
- else
283
- return servers[0]
284
- end
285
- end
286
-
287
246
  def find_edge_cluster(server_id, val)
288
247
  if val.to_s =~ /\A\d{1,}\Z/
289
248
  return find_edge_cluster_by_id(server_id, val)
@@ -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']) },