morpheus-cli 8.0.0 → 8.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Dockerfile +1 -1
- data/lib/morpheus/api/appliance_settings_interface.rb +7 -0
- data/lib/morpheus/api/virtual_images_interface.rb +6 -0
- data/lib/morpheus/cli/commands/appliance_settings_command.rb +21 -2
- data/lib/morpheus/cli/commands/apps.rb +1 -1
- data/lib/morpheus/cli/commands/clouds.rb +1 -1
- data/lib/morpheus/cli/commands/virtual_images.rb +56 -6
- data/lib/morpheus/cli/mixins/print_helper.rb +4 -2
- data/lib/morpheus/cli/mixins/provisioning_helper.rb +7 -6
- data/lib/morpheus/cli/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c8074c5d41cd8ca2aa6f199a0b85f22f7c2b8d3647b2788604d42424b7abbd9b
|
4
|
+
data.tar.gz: 8176b21a71b63466b537ca4d43933e06411ae374cbb159ab451f4e37042299e5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 05414d569b3e9d323ca0ebf0ff86778e9656f84b92af1a2e6520e826351dc444eb1c6d6721ef7137ffbe603be703832dcd15f4e14c31f28005b6de7c2cc454f8
|
7
|
+
data.tar.gz: fca09ddb93cf6cc58401d1652803a61d220fe9999427a931b0fed515c5a8e0a2933013299323722739a7f65c9b9b42edffe4a62972cad85e9b5651a4fcded2df
|
data/Dockerfile
CHANGED
@@ -25,6 +25,13 @@ class Morpheus::ApplianceSettingsInterface < Morpheus::APIClient
|
|
25
25
|
execute(opts)
|
26
26
|
end
|
27
27
|
|
28
|
+
def locales(params={})
|
29
|
+
url = "#{base_path}/locales"
|
30
|
+
headers = { params: params, authorization: "Bearer #{@access_token}" }
|
31
|
+
opts = {method: :get, url: url, headers: headers}
|
32
|
+
execute(opts)
|
33
|
+
end
|
34
|
+
|
28
35
|
def maintenance(params={}, payload={})
|
29
36
|
url = "#{base_path}/maintenance"
|
30
37
|
headers = { params: params, authorization: "Bearer #{@access_token}" }
|
@@ -44,6 +44,12 @@ class Morpheus::VirtualImagesInterface < Morpheus::APIClient
|
|
44
44
|
execute(method: :put, url: url, headers: headers, payload: payload.to_json)
|
45
45
|
end
|
46
46
|
|
47
|
+
def convert(id, payload)
|
48
|
+
url = "#{@base_url}/api/virtual-images/#{id}/convert"
|
49
|
+
headers = { :authorization => "Bearer #{@access_token}", 'Content-Type' => 'application/json' }
|
50
|
+
execute(method: :post, url: url, headers: headers, payload: payload.to_json)
|
51
|
+
end
|
52
|
+
|
47
53
|
def destroy(id, params={})
|
48
54
|
url = "#{@base_url}/api/virtual-images/#{id}"
|
49
55
|
headers = { :authorization => "Bearer #{@access_token}", 'Content-Type' => 'application/json' }
|
@@ -7,7 +7,7 @@ class Morpheus::Cli::ApplianceSettingsCommand
|
|
7
7
|
set_command_name :'appliance-settings'
|
8
8
|
|
9
9
|
register_subcommands :get, :update, :toggle_maintenance, :'reindex'
|
10
|
-
|
10
|
+
|
11
11
|
set_default_subcommand :get
|
12
12
|
|
13
13
|
def connect(opts)
|
@@ -33,7 +33,7 @@ class Morpheus::Cli::ApplianceSettingsCommand
|
|
33
33
|
raise_command_error "wrong number of arguments, expected 0 and got (#{args.count}) #{args}\n#{optparse}"
|
34
34
|
return 1
|
35
35
|
end
|
36
|
-
|
36
|
+
|
37
37
|
begin
|
38
38
|
@appliance_settings_interface.setopts(options)
|
39
39
|
|
@@ -220,6 +220,25 @@ class Morpheus::Cli::ApplianceSettingsCommand
|
|
220
220
|
opts.on("--stats-retainment-period DAYS", Integer, "Stats retainment period. The number of days stats should be available. Can be 30, 60, or 90.") do |val|
|
221
221
|
params['statsRetainmentPeriod'] = val.to_i
|
222
222
|
end
|
223
|
+
opts.on("--cloud-sync-interval-seconds SECONDS", Integer, "Cloud sync interval in seconds") do |val|
|
224
|
+
params['cloudSyncIntervalSeconds'] = val.to_i
|
225
|
+
end
|
226
|
+
opts.on("--cluster-sync-interval-seconds SECONDS", Integer, "Cluster sync interval in seconds") do |val|
|
227
|
+
params['clusterSyncIntervalSeconds'] = val.to_i
|
228
|
+
end
|
229
|
+
opts.on("--usage-retainment-period DAYS", Integer, "Retainment period for usage records") do |val|
|
230
|
+
params['usageRetainmentPeriod'] = val.to_i
|
231
|
+
end
|
232
|
+
opts.on("--invoice-retainment-period DAYS", Integer, "Retainment period for invoice records") do |val|
|
233
|
+
params['invoiceRetainmentPeriod'] = val.to_i
|
234
|
+
end
|
235
|
+
opts.on("--max-option-list-size NUMBER", Integer, "Max option list size (x10^3)") do |val|
|
236
|
+
params['maxOptionListSize'] = val.to_i
|
237
|
+
end
|
238
|
+
opts.on("--default-locale STRING", String, "Default locale for the appliance") do |val|
|
239
|
+
params['defaultLocale'] = val == 'null' ? nil : val
|
240
|
+
end
|
241
|
+
|
223
242
|
build_common_options(opts, options, [:json, :payload, :dry_run, :quiet, :remote])
|
224
243
|
end
|
225
244
|
|
@@ -1183,7 +1183,7 @@ EOT
|
|
1183
1183
|
|
1184
1184
|
# Details (zoneType.optionTypes)
|
1185
1185
|
|
1186
|
-
if cloud_type && cloud_type['optionTypes']
|
1186
|
+
if cloud_type && cloud_type['optionTypes'] && cloud_type['code'] != 'standard'
|
1187
1187
|
if !cloud_type['optionTypes'].find {|opt| opt['type'] == 'credential'}
|
1188
1188
|
tmp_option_types << {'fieldName' => 'type', 'fieldLabel' => 'Credentials', 'type' => 'credential', 'optionSource' => 'credentials', 'required' => true, 'defaultValue' => 'local', 'config' => {'credentialTypes' => get_cloud_type_credential_types(cloud_type['code'])}, 'displayOrder' => 7}
|
1189
1189
|
cloud_type['optionTypes'].select {|opt| ['username', 'password', 'serviceUsername', 'servicePassword'].include?(opt['fieldName'])}.each {|opt| opt['localCredential'] = true}
|
@@ -6,7 +6,7 @@ class Morpheus::Cli::VirtualImages
|
|
6
6
|
include Morpheus::Cli::CliCommand
|
7
7
|
include Morpheus::Cli::ProvisioningHelper
|
8
8
|
|
9
|
-
register_subcommands :list, :get, :add, :add_file, :remove_file, :update, :remove, :types => :virtual_image_types
|
9
|
+
register_subcommands :list, :get, :add, :add_file, :remove_file, :update, :remove, :convert, :types => :virtual_image_types
|
10
10
|
register_subcommands :list_locations, :get_location, :remove_location
|
11
11
|
|
12
12
|
# def initialize()
|
@@ -302,7 +302,7 @@ EOT
|
|
302
302
|
options = {}
|
303
303
|
tenants_list = nil
|
304
304
|
optparse = Morpheus::Cli::OptionParser.new do |opts|
|
305
|
-
opts.banner = subcommand_usage("[
|
305
|
+
opts.banner = subcommand_usage("[image] [options]")
|
306
306
|
opts.on('--tenants LIST', Array, "Tenant Access, comma separated list of account IDs") do |list|
|
307
307
|
if list.size == 1 && list[0] == 'null' # hacky way to clear it
|
308
308
|
tenants_list = []
|
@@ -324,7 +324,7 @@ EOT
|
|
324
324
|
end
|
325
325
|
build_common_options(opts, options, [:options, :payload, :json, :dry_run, :remote])
|
326
326
|
opts.footer = "Update a virtual image." + "\n" +
|
327
|
-
"[
|
327
|
+
"[image] is required. This is the name or id of a virtual image."
|
328
328
|
end
|
329
329
|
optparse.parse!(args)
|
330
330
|
verify_args!(args:args, optparse:optparse, count:1)
|
@@ -377,6 +377,56 @@ EOT
|
|
377
377
|
|
378
378
|
end
|
379
379
|
|
380
|
+
def convert(args)
|
381
|
+
image_name = args[0]
|
382
|
+
options = {}
|
383
|
+
# storageProviderId, format, name
|
384
|
+
optparse = Morpheus::Cli::OptionParser.new do |opts|
|
385
|
+
opts.banner = subcommand_usage("[image] [options]")
|
386
|
+
opts.on('-n', '--name NAME', String, "Name (optional) of the new converted image. Default is name of the original image.") do |val|
|
387
|
+
options[:options]['name'] = val
|
388
|
+
end
|
389
|
+
opts.on('-f', '--format FORMAT', String, "Format (optional). Default is 'qcow2'") do |val|
|
390
|
+
options[:options]['format'] = val
|
391
|
+
end
|
392
|
+
opts.on('--storageProvider VALUE', String, "Storage Provider ID (optional). Default is storage provider of the original image.") do |val|
|
393
|
+
options[:options]['storageProvider'] = val.to_s
|
394
|
+
end
|
395
|
+
build_common_options(opts, options, [:options, :payload, :json, :dry_run, :remote])
|
396
|
+
opts.footer = "Convert a virtual image to a new format." + "\n" +
|
397
|
+
"[image] is required. This is the name or id of a virtual image."
|
398
|
+
end
|
399
|
+
optparse.parse!(args)
|
400
|
+
verify_args!(args:args, optparse:optparse, min:1, max:4)
|
401
|
+
|
402
|
+
connect(options)
|
403
|
+
|
404
|
+
virtual_image = find_virtual_image_by_name_or_id(image_name)
|
405
|
+
return 1, "Virtual image not found for #{image_name}" if virtual_image.nil?
|
406
|
+
|
407
|
+
passed_options = parse_passed_options(options)
|
408
|
+
payload = nil
|
409
|
+
if options[:payload]
|
410
|
+
payload = options[:payload]
|
411
|
+
payload.deep_merge!({virtual_image_object_key => passed_options}) unless passed_options.empty?
|
412
|
+
else
|
413
|
+
virtual_image_payload = passed_options
|
414
|
+
virtual_image_payload['storageProvider'] = {'id' => virtual_image_payload['storageProvider']} unless virtual_image_payload['storageProvider'].nil?
|
415
|
+
payload = virtual_image_payload
|
416
|
+
end
|
417
|
+
@virtual_images_interface.setopts(options)
|
418
|
+
if options[:dry_run]
|
419
|
+
print_dry_run @virtual_images_interface.dry.convert(virtual_image['id'], payload)
|
420
|
+
return
|
421
|
+
end
|
422
|
+
json_response = @virtual_images_interface.convert(virtual_image['id'], payload)
|
423
|
+
render_response(json_response, options, 'virtualImage') do
|
424
|
+
print_green_success "Updated virtual image #{virtual_image['name']}"
|
425
|
+
_get(virtual_image["id"], {}, options)
|
426
|
+
end
|
427
|
+
return 0, nil
|
428
|
+
end
|
429
|
+
|
380
430
|
def virtual_image_types(args)
|
381
431
|
options = {}
|
382
432
|
optparse = Morpheus::Cli::OptionParser.new do |opts|
|
@@ -621,7 +671,7 @@ EOT
|
|
621
671
|
do_gzip = false
|
622
672
|
options = {}
|
623
673
|
optparse = Morpheus::Cli::OptionParser.new do |opts|
|
624
|
-
opts.banner = subcommand_usage("[
|
674
|
+
opts.banner = subcommand_usage("[image] [filepath]")
|
625
675
|
opts.on('--filename FILENAME', String, "Filename for uploaded file. Derived from [filepath] by default." ) do |val|
|
626
676
|
file_name = val
|
627
677
|
end
|
@@ -633,7 +683,7 @@ EOT
|
|
633
683
|
end
|
634
684
|
build_common_options(opts, options, [:json, :dry_run, :quiet, :remote])
|
635
685
|
opts.footer = "Upload a virtual image file." + "\n" +
|
636
|
-
"[
|
686
|
+
"[image] is required. This is the name or id of a virtual image." + "\n" +
|
637
687
|
"[filepath] or --url is required. This is location of the virtual image file."
|
638
688
|
end
|
639
689
|
optparse.parse!(args)
|
@@ -700,7 +750,7 @@ EOT
|
|
700
750
|
def remove_file(args)
|
701
751
|
options = {}
|
702
752
|
optparse = Morpheus::Cli::OptionParser.new do |opts|
|
703
|
-
opts.banner = subcommand_usage("[
|
753
|
+
opts.banner = subcommand_usage("[image] [filename]")
|
704
754
|
build_common_options(opts, options, [:auto_confirm, :json, :dry_run, :remote])
|
705
755
|
end
|
706
756
|
optparse.parse!(args)
|
@@ -509,13 +509,15 @@ module Morpheus::Cli::PrintHelper
|
|
509
509
|
bars = []
|
510
510
|
percent = 0
|
511
511
|
percent_sigdig = opts[:percent_sigdig] || 2
|
512
|
-
if max_value.
|
512
|
+
if max_value.nil?
|
513
513
|
percent = 0
|
514
|
+
elsif max_value == 0
|
515
|
+
percent = used_value.to_f == 0 ? 0 : 100
|
514
516
|
else
|
515
517
|
percent = ((used_value.to_f / max_value.to_f) * 100)
|
516
518
|
end
|
517
519
|
unlimited_label = opts[:unlimited_label] || "n/a"
|
518
|
-
percent_label = (
|
520
|
+
percent_label = (max_value.nil? ? unlimited_label : "#{percent.round(percent_sigdig)}%").rjust(6, ' ')
|
519
521
|
bar_display = ""
|
520
522
|
if percent > 100
|
521
523
|
max_bars.times { bars << "|" }
|
@@ -508,16 +508,17 @@ module Morpheus::Cli::ProvisioningHelper
|
|
508
508
|
|
509
509
|
while instance_name.nil? do
|
510
510
|
name_prompt = Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'name', 'fieldLabel' => 'Instance Name', 'type' => 'text', 'required' => options[:name_required], 'defaultValue' => options[:default_name]}], options[:options])
|
511
|
-
|
512
|
-
if
|
511
|
+
name = name_prompt['name']
|
512
|
+
if name.nil? && !options[:name_required]
|
513
513
|
break
|
514
514
|
else
|
515
|
-
if instances_interface.list({name:
|
516
|
-
instance_name =
|
515
|
+
if instances_interface.list({name: name})['instances'].empty?
|
516
|
+
instance_name = name
|
517
517
|
else
|
518
|
-
print_red_alert "Name must be unique"
|
518
|
+
print_red_alert "Name must be unique, #{name} already exists"
|
519
|
+
options[:options].delete('name')
|
519
520
|
exit 1 if no_prompt
|
520
|
-
if options[:default_name] ==
|
521
|
+
if options[:default_name] == name
|
521
522
|
options[:default_name] += '-2'
|
522
523
|
end
|
523
524
|
end
|
data/lib/morpheus/cli/version.rb
CHANGED
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: 8.0.
|
4
|
+
version: 8.0.1
|
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-
|
14
|
+
date: 2024-12-13 00:00:00.000000000 Z
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
17
17
|
name: public_suffix
|