morpheus-cli 7.0.3.3 → 7.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 0d00b77181b9cac12793a9ca84e0af07f7ebb3dab2920035cfa9cff6dea0b9a4
4
- data.tar.gz: 2f25d3e7a35190f8efc6322c57d27783859d0816d764a39704aee96181923b49
3
+ metadata.gz: 4ee9109e36c34c6c50f1c1053d9d183aa034e5aff2be97eb7494f1135213a209
4
+ data.tar.gz: 7cf3dfeb5794ae2457818d8bb3ec9a90068ab7a43397f9de31d773e7e8ff5b80
5
5
  SHA512:
6
- metadata.gz: d7efebaa9e888c1bdfa66b8daaf6342323c16d02f4ecd2dd165eb80e66de231c037430ca7021af4bfefcebdd0d2d7e496cf0ddac3cdd59b75ce2b4aff05fc2e2
7
- data.tar.gz: b28bbc5298b73082f6fadf6aafdfd5bc780defae18c210ceed8db354e6de4fc55dbbb1e4f39ed4180e554705f360c0b5a37b775d25050f63ac65e8e2e7c4fad3
6
+ metadata.gz: 4a4afd65531974bb6142919beb435aa756c251821d96660c3a3d8e0baf25c8d3a22e7be7a8b955212777bc7798714db7d0a3c00cd9ec190124a819f5188b84f6
7
+ data.tar.gz: 5fed3b5ab9017681ee8aba610f23da663fa9ee84000df7d3efa33a696cb4d8f27030cd8c4cda81ecf87dae523cf7a39e26235461130b137715dc098e0a75ae0d
data/Dockerfile CHANGED
@@ -1,5 +1,5 @@
1
1
  FROM ruby:2.7.5
2
2
 
3
- RUN gem install morpheus-cli -v 7.0.3.3
3
+ RUN gem install morpheus-cli -v 7.0.4
4
4
 
5
5
  ENTRYPOINT ["morpheus"]
@@ -141,6 +141,7 @@ class Morpheus::Cli::ExecutionRequestCommand
141
141
  options = {}
142
142
  params = {}
143
143
  script_content = nil
144
+ send_keys = nil
144
145
  options[:refresh_until_finished] = true
145
146
  optparse = Morpheus::Cli::OptionParser.new do|opts|
146
147
  opts.banner = subcommand_usage("[options]")
@@ -159,14 +160,11 @@ class Morpheus::Cli::ExecutionRequestCommand
159
160
  opts.on('--script SCRIPT', "Script to be executed" ) do |val|
160
161
  script_content = val
161
162
  end
162
- opts.on('--file FILE', "File containing the script. This can be used instead of --script" ) do |filename|
163
- full_filename = File.expand_path(filename)
164
- if File.exist?(full_filename)
165
- script_content = File.read(full_filename)
166
- else
167
- print_red_alert "File not found: #{full_filename}"
168
- exit 1
169
- end
163
+ opts.on('--optionTypes [true|false]', String, "Include optionTypes in the response. Default is false.") do |val|
164
+ params['optionTypes'] = (val.to_s == '' || val.to_s == 'on' || val.to_s == 'true')
165
+ end
166
+ opts.on('--send-keys [true|false]', "Send key mappings to the hypervisor console so commands such as <LEFT>, <RIGHT> and <WAIT> can be used." ) do |val|
167
+ send_keys = val.to_s == 'on' || val.to_s == 'true' || val.to_s.empty?
170
168
  end
171
169
  opts.on('--refresh [SECONDS]', String, "Refresh until execution is finished. Default interval is #{default_refresh_interval} seconds.") do |val|
172
170
  options[:refresh_until_finished] = true
@@ -208,6 +206,9 @@ class Morpheus::Cli::ExecutionRequestCommand
208
206
  script_content = v_prompt['script']
209
207
  end
210
208
  payload['script'] = script_content
209
+ if !send_keys.nil?
210
+ payload['sendKeys'] = send_keys
211
+ end
211
212
  end
212
213
  @execution_request_interface.setopts(options)
213
214
  if options[:dry_run]
@@ -38,6 +38,8 @@ class Morpheus::Cli::NetworkServersCommand
38
38
  # params['enabled'] = val.to_s == 'on' || val.to_s == 'true' || val.to_s.empty?
39
39
  # end
40
40
  # ['name', 'serviceUsername', 'servicePassword', 'servicePort', 'serviceHost', 'serviceUrl', 'serviceMode', 'networkFilter', 'tenantMatch']
41
+ #build_option_type_options(opts, options, add_network_server_option_types)
42
+ build_option_type_options(opts, options, add_network_server_advanced_option_types)
41
43
  build_standard_add_options(opts, options)
42
44
  opts.footer = <<-EOT
43
45
  Create a new network server.
@@ -108,8 +110,19 @@ EOT
108
110
  # prompt options by type
109
111
  network_server_type = @network_server_types_interface.get(network_type_id.to_i)['networkServerType']
110
112
  # params['type'] = network_server_type['code']
113
+ type_options_types = network_server_type['optionTypes'] || []
114
+ type_options_types.reject! {|it| it['fieldName'] == 'visibility' } # skip visibility, its under advanced now
111
115
  option_result = prompt(network_server_type['optionTypes'], options.merge({:context_map => {'networkServer' => ''}}))
112
116
  params.deep_merge!(option_result)
117
+
118
+ # advanced options
119
+ advanced_option_types = add_network_server_advanced_option_types
120
+ if advanced_option_types && !advanced_option_types.empty?
121
+ v_prompt = Morpheus::Cli::OptionTypes.prompt(advanced_option_types, options[:options], @api_client, {})
122
+ v_prompt.deep_compact!
123
+ v_prompt.booleanize! # 'on' => true
124
+ params.deep_merge!(v_prompt)
125
+ end
113
126
  payload.deep_merge!({rest_object_key => params})
114
127
  end
115
128
  @network_servers_interface.setopts(options)
@@ -138,6 +151,8 @@ EOT
138
151
  # params['enabled'] = val.to_s == 'on' || val.to_s == 'true' || val.to_s.empty?
139
152
  # end
140
153
  # ['name', 'serviceUsername', 'servicePassword', 'servicePort', 'serviceHost', 'serviceUrl', 'serviceMode', 'networkFilter', 'tenantMatch']
154
+ #build_option_type_options(opts, options, update_network_server_option_types)
155
+ build_option_type_options(opts, options, update_network_server_advanced_option_types)
141
156
  build_standard_update_options(opts, options)
142
157
  opts.footer = <<-EOT
143
158
  Update a network server.
@@ -155,6 +170,16 @@ EOT
155
170
  # merge -O options into normally parsed options
156
171
  params.deep_merge!(options[:options].reject {|k,v| k.is_a?(Symbol) }) if options[:options]
157
172
 
173
+ # params['tenants'] = options['tenants'].collect {|it| {'id': it}}
174
+ # advanced options
175
+ advanced_option_types = update_network_server_advanced_option_types
176
+ if advanced_option_types && !advanced_option_types.empty?
177
+ v_prompt = Morpheus::Cli::OptionTypes.no_prompt(advanced_option_types, options[:options], @api_client, {})
178
+ v_prompt.deep_compact!
179
+ v_prompt.booleanize! # 'on' => true
180
+ params.deep_merge!(v_prompt)
181
+ end
182
+
158
183
  # construct payload
159
184
  payload = nil
160
185
  if options[:payload]
@@ -228,35 +253,13 @@ EOT
228
253
  'networkServer'
229
254
  end
230
255
 
231
- # def render_response_for_get(json_response, options)
232
- # # load the type and show fields dynamically based on optionTypes
233
- # render_response(json_response, options, rest_object_key) do
234
- # type_record = rest_type_find_by_name_or_id(json_response[rest_object_key]['type']['id']) rescue nil
235
- # type_option_types = type_record ? (type_record['optionTypes'] || []) : []
236
- # record = json_response[rest_object_key]
237
- # print_h1 rest_label, [], options
238
- # print cyan
239
- # columns = rest_column_definitions(options)
240
- # if record['credential'] && record['credential']['type'] != 'local'
241
- # columns.delete("Username")
242
- # columns.delete("Password")
243
- # end
244
- # columns.delete("Throttle Rate") unless type_option_types.find {|it| it['fieldName'] == 'serviceThrottleRate' }
245
- # columns.delete("Disable SSL SNI") unless type_option_types.find {|it| it['fieldName'] == 'ignoreSsl' }
246
- # columns.delete("Network Filter") unless type_option_types.find {|it| it['fieldName'] == 'networkFilter' }
247
- # columns.delete("Zone Filter") unless type_option_types.find {|it| it['fieldName'] == 'zoneFilter' }
248
- # columns.delete("Tenant Match") unless type_option_types.find {|it| it['fieldName'] == 'tenantMatch' }
249
- # columns.delete("IP Mode") unless type_option_types.find {|it| it['fieldName'] == 'serviceMode' }
250
- # columns.delete("Extra Attributes") unless type_option_types.find {|it| it['fieldName'] == 'extraAttributes' }
251
- # columns.delete("App ID") unless type_option_types.find {|it| it['fieldName'] == 'appId' }
252
- # columns.delete("Inventory Existing") unless type_option_types.find {|it| it['fieldName'] == 'inventoryExisting' }
253
- # columns.delete("Enabled") if record['enabled'].nil? # was not always returned, so don't show false if not present..
254
- # print_description_list(columns, record, options)
255
- # print reset,"\n"
256
- # end
257
- # end
256
+ def render_response_for_get(json_response, options)
257
+ record = json_response[rest_object_key]
258
+ options[:exclude_tenants] = record['tenants'].nil?
259
+ super(json_response, options)
260
+ end
258
261
 
259
- def find_network_server_by_name_or_id(val)
262
+ def find_network_server_by_name_or_id(val)
260
263
  if val.to_s =~ /\A\d{1,}\Z/
261
264
  return find_network_server_by_id(val)
262
265
  else
@@ -309,19 +312,31 @@ EOT
309
312
  end
310
313
 
311
314
  def add_network_server_advanced_option_types()
312
- []
315
+ [
316
+ {'fieldName' => 'visibility', 'fieldLabel' => 'Visibility', 'type' => 'select', 'selectOptions' => [{'name' => 'Private', 'value' => 'private'},{'name' => 'Public', 'value' => 'public'}], 'required' => false, 'description' => 'Visibility', 'category' => 'permissions', 'defaultValue' => 'private'},
317
+ {'fieldName' => 'tenants', 'fieldLabel' => 'Tenants', 'fieldGroup' => 'Advanced', 'type' => 'multiSelect', 'resultValueField' => 'id', 'optionSource' => lambda { |api_client, api_params|
318
+ api_client.options.options_for_source("allTenants", {})['data']
319
+ }},
320
+ ]
313
321
  end
314
322
 
315
323
  def update_network_server_option_types()
316
- [
317
- {'fieldName' => 'name', 'fieldLabel' => 'Name', 'type' => 'text'},
318
- {'fieldName' => 'description', 'fieldLabel' => 'Description', 'type' => 'text'},
319
- {'fieldName' => 'enabled', 'fieldLabel' => 'Enabled', 'type' => 'checkbox'},
320
- ]
324
+ list = add_network_server_option_types.collect {|it|
325
+ it.delete('required')
326
+ it.delete('defaultValue')
327
+ it
328
+ }
329
+ list = list.reject {|it| ["type"].include? it['fieldName'] }
330
+ list
321
331
  end
322
332
 
323
333
  def update_network_server_advanced_option_types()
324
- []
334
+ list = add_network_server_advanced_option_types.collect {|it|
335
+ it.delete('required')
336
+ it.delete('defaultValue')
337
+ it
338
+ }
339
+ list
325
340
  end
326
341
 
327
342
  def network_server_list_column_definitions(options)
@@ -338,13 +353,12 @@ EOT
338
353
  end
339
354
 
340
355
  def network_server_column_definitions(options)
341
- {
356
+ columns = {
342
357
  "ID" => 'id',
343
358
  "Name" => lambda {|it| it['name'] },
344
359
  "Type" => lambda {|it| it['type'] ? it['type']['name'] : '' },
345
360
  "URL" => lambda {|it| it['serviceUrl'] },
346
- #todo: support credentials
347
- #"Credentials" => lambda {|it| it['credential'] ? (it['credential']['type'] == 'local' ? '(Local)' : it['credential']['name']) : nil },
361
+ "Credentials" => lambda {|it| it['credential'] ? (it['credential']['type'] == 'local' ? '(Local)' : it['credential']['name']) : nil },
348
362
  "Username" => lambda {|it| it['serviceUsername'] },
349
363
  "Password" => lambda {|it| it['servicePassword'] },
350
364
  "Service Mode" => lambda {|it| it['serviceMode'] },
@@ -352,10 +366,16 @@ EOT
352
366
  "Network Filter" => lambda {|it| it['networkFilter'] },
353
367
  "Tenant Match" => lambda {|it| it['tenantMatch'] },
354
368
  #"Enabled" => lambda {|it| format_boolean(it['enabled']) },
369
+ "Visibility" => lambda {|it| it['visibility'] ? it['visibility'].capitalize() : '' },
370
+ "Tenants" => lambda { |it| it['tenants'].collect {|tenant| tenant['name']}.join(', ') rescue '' },
355
371
  "Status" => lambda {|it| format_network_server_status(it) },
356
- "Date Created" => lambda {|it| format_local_dt(it['dateCreated']) },
357
- "Last Updated" => lambda {|it| format_local_dt(it['lastUpdated']) },
372
+ "Created" => lambda {|it| format_local_dt(it['dateCreated']) },
373
+ "Updated" => lambda {|it| format_local_dt(it['lastUpdated']) }
358
374
  }
375
+ if options[:exclude_tenants]
376
+ columns.delete("Tenants")
377
+ end
378
+ columns
359
379
  end
360
380
 
361
381
  def format_network_server_status(network_server, return_color=cyan)
@@ -1,6 +1,6 @@
1
1
 
2
2
  module Morpheus
3
3
  module Cli
4
- VERSION = "7.0.3.3"
4
+ VERSION = "7.0.4"
5
5
  end
6
6
  end
@@ -11,7 +11,8 @@ class MorpheusTest::InstancesTest < MorpheusTest::TestCase
11
11
  instance = client.instances.list({})['instances'][0]
12
12
  if instance
13
13
  assert_execute %(instances get "#{instance['id']}")
14
- assert_execute %(instances get "#{escape_arg instance['name']}")
14
+ name_arg = instance['displayName'] || instance['name']
15
+ assert_execute %(instances get "#{escape_arg name_arg}")
15
16
  else
16
17
  puts "No instance found, unable to execute test `#{__method__}`"
17
18
  end
@@ -8,7 +8,10 @@ class MorpheusTest::NetworkRoutersTest < MorpheusTest::TestCase
8
8
  end
9
9
 
10
10
  def test_network_routers_get
11
- network_router = client.network_routers.list({})['networkRouters'][0]
11
+ # find one that does not have a duplicate name..so we can get it by name
12
+ #network_router = client.network_routers.list({})['networkRouters'][0]
13
+ network_routers = client.network_routers.list({})['networkRouters']
14
+ network_router = network_routers.find {|it| !(network_routers.find {|other| other['name'] == it['name'] }) }
12
15
  if network_router
13
16
  assert_execute %(network-routers get "#{network_router['id']}")
14
17
  assert_execute %(network-routers get "#{escape_arg network_router['name']}")
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: morpheus-cli
3
3
  version: !ruby/object:Gem::Version
4
- version: 7.0.3.3
4
+ version: 7.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - David Estes
@@ -11,7 +11,7 @@ authors:
11
11
  autorequire:
12
12
  bindir: bin
13
13
  cert_chain: []
14
- date: 2024-06-17 00:00:00.000000000 Z
14
+ date: 2024-07-19 00:00:00.000000000 Z
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
17
  name: ffi