morpheus-cli 7.0.3.2 → 7.0.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c575768ed100dbe1ed0c3e6c54544b098b11dcb461011783f8f7a6e926a60053
4
- data.tar.gz: 5eca0987802e1b4db68f3a179aaada0e4557bff802045816965f97abd11e1585
3
+ metadata.gz: 4ee9109e36c34c6c50f1c1053d9d183aa034e5aff2be97eb7494f1135213a209
4
+ data.tar.gz: 7cf3dfeb5794ae2457818d8bb3ec9a90068ab7a43397f9de31d773e7e8ff5b80
5
5
  SHA512:
6
- metadata.gz: 7075f5a635d1a133d643246dbd2156d06eff8b885388e702f05214186a77a5a578c8b18677162c6fe6fc0699488039d5911c20b364ddf0c3fe9fafe46709732d
7
- data.tar.gz: 9b1928f8760c9667700e5f27eaa4727eed8e776fe7f2972e4d1a34b4880fcd4e00843b544ae7b8b62a21ac71318d67749d599d0a5beaeac919bd51028e10c4fc
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.2
3
+ RUN gem install morpheus-cli -v 7.0.4
4
4
 
5
5
  ENTRYPOINT ["morpheus"]
data/Gemfile CHANGED
@@ -1,7 +1,7 @@
1
1
  source 'https://rubygems.org'
2
2
 
3
3
  # Fix for mismatched deps: https://github.com/ffi/ffi/issues/1103
4
- gem "ffi", "< 1.17.0"
4
+ gem "ffi", "1.15.5"
5
5
 
6
6
  # Specify your gem's dependencies in morpheus-cli.gemspec
7
7
  gemspec
@@ -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.2"
4
+ VERSION = "7.0.4"
5
5
  end
6
6
  end
data/morpheus-cli.gemspec CHANGED
@@ -19,6 +19,7 @@ Gem::Specification.new do |spec|
19
19
  spec.require_paths = ["lib"]
20
20
 
21
21
  spec.required_ruby_version = '>= 2.5.1' # according to http.rb doc
22
+ spec.add_dependency "ffi", "1.15.5" # Fix for mismatched deps: https://github.com/ffi/ffi/issues/1103
22
23
  spec.add_development_dependency "bundler", "~> 2.2"
23
24
  spec.add_development_dependency "rake"
24
25
  spec.add_dependency 'term-ansicolor', '~> 1.3.0'
@@ -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.2
4
+ version: 7.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - David Estes
@@ -11,8 +11,22 @@ 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
+ - !ruby/object:Gem::Dependency
17
+ name: ffi
18
+ requirement: !ruby/object:Gem::Requirement
19
+ requirements:
20
+ - - '='
21
+ - !ruby/object:Gem::Version
22
+ version: 1.15.5
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - '='
28
+ - !ruby/object:Gem::Version
29
+ version: 1.15.5
16
30
  - !ruby/object:Gem::Dependency
17
31
  name: bundler
18
32
  requirement: !ruby/object:Gem::Requirement