morpheus-cli 4.2.6 → 4.2.7
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 +4 -4
- data/Dockerfile +1 -1
- data/lib/morpheus/api/api_client.rb +4 -0
- data/lib/morpheus/api/clouds_interface.rb +14 -0
- data/lib/morpheus/api/guidance_interface.rb +47 -0
- data/lib/morpheus/api/users_interface.rb +7 -0
- data/lib/morpheus/cli.rb +1 -0
- data/lib/morpheus/cli/account_groups_command.rb +1 -1
- data/lib/morpheus/cli/approvals_command.rb +2 -2
- data/lib/morpheus/cli/apps.rb +26 -30
- data/lib/morpheus/cli/blueprints_command.rb +1 -1
- data/lib/morpheus/cli/budgets_command.rb +2 -2
- data/lib/morpheus/cli/change_password_command.rb +0 -1
- data/lib/morpheus/cli/cli_command.rb +19 -9
- data/lib/morpheus/cli/clouds.rb +107 -10
- data/lib/morpheus/cli/clusters.rb +12 -12
- data/lib/morpheus/cli/commands/standard/curl_command.rb +7 -0
- data/lib/morpheus/cli/deployments.rb +2 -2
- data/lib/morpheus/cli/environments_command.rb +1 -1
- data/lib/morpheus/cli/execution_request_command.rb +1 -1
- data/lib/morpheus/cli/groups.rb +1 -1
- data/lib/morpheus/cli/guidance_command.rb +529 -0
- data/lib/morpheus/cli/hosts.rb +2 -10
- data/lib/morpheus/cli/instances.rb +31 -13
- data/lib/morpheus/cli/integrations_command.rb +1 -1
- data/lib/morpheus/cli/jobs_command.rb +2 -2
- data/lib/morpheus/cli/library_container_types_command.rb +4 -4
- data/lib/morpheus/cli/library_instance_types_command.rb +3 -3
- data/lib/morpheus/cli/library_spec_templates_command.rb +1 -1
- data/lib/morpheus/cli/load_balancers.rb +2 -2
- data/lib/morpheus/cli/mixins/print_helper.rb +43 -3
- data/lib/morpheus/cli/mixins/provisioning_helper.rb +251 -165
- data/lib/morpheus/cli/network_routers_command.rb +1 -1
- data/lib/morpheus/cli/price_sets_command.rb +2 -2
- data/lib/morpheus/cli/provisioning_licenses_command.rb +1 -1
- data/lib/morpheus/cli/remote.rb +6 -1
- data/lib/morpheus/cli/reports_command.rb +1 -1
- data/lib/morpheus/cli/security_group_rules.rb +1 -1
- data/lib/morpheus/cli/security_groups.rb +13 -5
- data/lib/morpheus/cli/service_plans_command.rb +2 -2
- data/lib/morpheus/cli/user_groups_command.rb +2 -6
- data/lib/morpheus/cli/user_settings_command.rb +31 -5
- data/lib/morpheus/cli/user_sources_command.rb +3 -3
- data/lib/morpheus/cli/users.rb +117 -90
- data/lib/morpheus/cli/version.rb +1 -1
- data/lib/morpheus/cli/virtual_images.rb +2 -2
- data/lib/morpheus/cli/whitelabel_settings_command.rb +95 -15
- data/lib/morpheus/cli/wiki_command.rb +2 -2
- data/lib/morpheus/cli/workflows.rb +2 -3
- data/lib/morpheus/formatters.rb +14 -5
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 126814172818496eedcb013dedfd88920675f1646b924b1304aa89986b4883d7
|
4
|
+
data.tar.gz: 936e0252a66ee0cd7ad99c691b87ed4e3a608ffd38810fccf4673c79dc53b47f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 72ee705d6fa646418aa223fe6ba2ab2558850a8a949ab8d821018878c3288c486bde5175c2ce8d360db8587f5db9a1bd0e760af900216ec9fb82b407270648f2
|
7
|
+
data.tar.gz: 6bb390e9947db29cf1e5ead6ea4c1de0ff4f78b11268247616354d677d42b838edf9e87ffc976f75423576b98509bb98462630ce48020300cb3e749a6b4f5f01
|
data/Dockerfile
CHANGED
@@ -686,6 +686,10 @@ class Morpheus::APIClient
|
|
686
686
|
Morpheus::InvoicesInterface.new(@access_token, @refresh_token, @expires_at, @base_url).setopts(@options)
|
687
687
|
end
|
688
688
|
|
689
|
+
def guidance
|
690
|
+
Morpheus::GuidanceInterface.new(@access_token, @refresh_token, @expires_at, @base_url).setopts(@options)
|
691
|
+
end
|
692
|
+
|
689
693
|
# add new interfaces here
|
690
694
|
|
691
695
|
end
|
@@ -73,6 +73,20 @@ class Morpheus::CloudsInterface < Morpheus::APIClient
|
|
73
73
|
execute(opts)
|
74
74
|
end
|
75
75
|
|
76
|
+
def refresh(id, params={}, payload={})
|
77
|
+
url = "#{@base_url}/api/zones/#{id}/refresh"
|
78
|
+
headers = { :params => params, :authorization => "Bearer #{@access_token}", 'Content-Type' => 'application/json' }
|
79
|
+
opts = {method: :post, url: url, headers: headers, payload: payload.to_json}
|
80
|
+
execute(opts)
|
81
|
+
end
|
82
|
+
|
83
|
+
def sync(id, params={}, payload={})
|
84
|
+
url = "#{@base_url}/api/zones/#{id}/sync"
|
85
|
+
headers = { :params => params, :authorization => "Bearer #{@access_token}", 'Content-Type' => 'application/json' }
|
86
|
+
opts = {method: :post, url: url, headers: headers, payload: payload.to_json}
|
87
|
+
execute(opts)
|
88
|
+
end
|
89
|
+
|
76
90
|
def firewall_disable(id)
|
77
91
|
url = "#{@base_url}/api/zones/#{id}/security-groups/disable"
|
78
92
|
headers = { :authorization => "Bearer #{@access_token}", 'Content-Type' => 'application/json' }
|
@@ -0,0 +1,47 @@
|
|
1
|
+
require 'morpheus/api/api_client'
|
2
|
+
|
3
|
+
class Morpheus::GuidanceInterface < Morpheus::APIClient
|
4
|
+
def initialize(access_token, refresh_token,expires_at = nil, base_url=nil, api='guidance')
|
5
|
+
@access_token = access_token
|
6
|
+
@refresh_token = refresh_token
|
7
|
+
@base_url = base_url
|
8
|
+
@api_url = "#{base_url}/api/#{api}"
|
9
|
+
@expires_at = expires_at
|
10
|
+
end
|
11
|
+
|
12
|
+
def list(params={})
|
13
|
+
url = @api_url
|
14
|
+
headers = { params: params, authorization: "Bearer #{@access_token}" }
|
15
|
+
execute(method: :get, url: url, headers: headers)
|
16
|
+
end
|
17
|
+
|
18
|
+
def stats()
|
19
|
+
url = "#{@api_url}/stats"
|
20
|
+
headers = { params: {}, authorization: "Bearer #{@access_token}" }
|
21
|
+
execute(method: :get, url: url, headers: headers)
|
22
|
+
end
|
23
|
+
|
24
|
+
def types()
|
25
|
+
url = "#{@api_url}/types"
|
26
|
+
headers = { params: {}, authorization: "Bearer #{@access_token}" }
|
27
|
+
execute(method: :get, url: url, headers: headers)
|
28
|
+
end
|
29
|
+
|
30
|
+
def get(id, params={})
|
31
|
+
url = "#{@api_url}/#{id}"
|
32
|
+
headers = { params: params, authorization: "Bearer #{@access_token}" }
|
33
|
+
execute(method: :get, url: url, headers: headers)
|
34
|
+
end
|
35
|
+
|
36
|
+
def exec(id, params={})
|
37
|
+
url = "#{@api_url}/#{id}/execute"
|
38
|
+
headers = { params: params, :authorization => "Bearer #{@access_token}", 'Content-Type' => 'application/json' }
|
39
|
+
execute(method: :put, url: url, headers: headers)
|
40
|
+
end
|
41
|
+
|
42
|
+
def ignore(id, params={})
|
43
|
+
url = "#{@api_url}/#{id}/ignore"
|
44
|
+
headers = { params: params, :authorization => "Bearer #{@access_token}", 'Content-Type' => 'application/json' }
|
45
|
+
execute(method: :put, url: url, headers: headers)
|
46
|
+
end
|
47
|
+
end
|
@@ -31,6 +31,13 @@ class Morpheus::UsersInterface < Morpheus::APIClient
|
|
31
31
|
execute(opts)
|
32
32
|
end
|
33
33
|
|
34
|
+
def permissions(account_id, id)
|
35
|
+
url = build_url(account_id, id) + "/permissions"
|
36
|
+
headers = { params: {}, authorization: "Bearer #{@access_token}" }
|
37
|
+
opts = {method: :get, url: url, timeout: 10, headers: headers}
|
38
|
+
execute(opts)
|
39
|
+
end
|
40
|
+
|
34
41
|
def available_roles(account_id, id=nil, options={})
|
35
42
|
url = build_url(account_id, id) + "/available-roles"
|
36
43
|
headers = { params: {}, authorization: "Bearer #{@access_token}" }
|
data/lib/morpheus/cli.rb
CHANGED
@@ -83,7 +83,7 @@ class Morpheus::Cli::AccountGroupsCommand
|
|
83
83
|
subtitles += parse_list_subtitles(options)
|
84
84
|
print_h1 title, subtitles, options
|
85
85
|
if groups.empty?
|
86
|
-
print
|
86
|
+
print cyan,"No groups found.",reset,"\n"
|
87
87
|
else
|
88
88
|
print_groups_table(groups, options)
|
89
89
|
print_results_pagination(json_response)
|
@@ -52,7 +52,7 @@ class Morpheus::Cli::ApprovalsCommand
|
|
52
52
|
|
53
53
|
approvals = json_response['approvals']
|
54
54
|
if approvals.empty?
|
55
|
-
print
|
55
|
+
print cyan,"No approvals found.",reset,"\n"
|
56
56
|
else
|
57
57
|
rows = approvals.collect do |it|
|
58
58
|
{
|
@@ -159,7 +159,7 @@ class Morpheus::Cli::ApprovalsCommand
|
|
159
159
|
]
|
160
160
|
print as_pretty_table(rows, columns, options)
|
161
161
|
else
|
162
|
-
print
|
162
|
+
print cyan,"No requested items.",reset,"\n"
|
163
163
|
end
|
164
164
|
|
165
165
|
print reset,"\n"
|
data/lib/morpheus/cli/apps.rb
CHANGED
@@ -298,15 +298,24 @@ class Morpheus::Cli::Apps
|
|
298
298
|
end
|
299
299
|
|
300
300
|
# Environment
|
301
|
+
selected_environment = nil
|
302
|
+
available_environments = get_available_environments()
|
301
303
|
if options[:environment]
|
302
304
|
payload['environment'] = options[:environment]
|
303
305
|
else
|
304
|
-
v_prompt = Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'environment', 'fieldLabel' => 'Environment', 'type' => '
|
306
|
+
v_prompt = Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'environment', 'fieldLabel' => 'Environment', 'type' => 'select', 'selectOptions' => available_environments}], options[:options], @api_client)
|
305
307
|
payload['environment'] = v_prompt['environment'] unless v_prompt['environment'].to_s.empty?
|
306
308
|
end
|
309
|
+
selected_environment = nil
|
310
|
+
if payload['environment']
|
311
|
+
selected_environment = available_environments.find {|it| it['code'] == payload['environment'] || it['name'] == payload['environment'] }
|
312
|
+
if selected_environment.nil?
|
313
|
+
print_red_alert "Environment not found by name or code '#{payload['environment']}'"
|
314
|
+
return 1
|
315
|
+
end
|
316
|
+
end
|
307
317
|
# payload['appContext'] = payload['environment'] if payload['environment']
|
308
318
|
|
309
|
-
|
310
319
|
if !payload['tiers']
|
311
320
|
if payload['blueprintId'] != 'existing'
|
312
321
|
|
@@ -376,19 +385,21 @@ class Morpheus::Cli::Apps
|
|
376
385
|
|
377
386
|
# prompt for the cloud for this instance
|
378
387
|
# the cloud is part of finding the scoped config in the blueprint
|
379
|
-
scoped_instance_config = get_scoped_instance_config(instance_config.clone,
|
388
|
+
scoped_instance_config = get_scoped_instance_config(instance_config.clone, selected_environment ? selected_environment['name'] : nil, group ? group['name'] : nil, cloud ? cloud['name'] : nil)
|
380
389
|
|
381
390
|
# now configure an instance like normal, use the config as default options with :always_prompt
|
382
391
|
instance_prompt_options = {}
|
383
392
|
instance_prompt_options[:group] = group ? group['id'] : nil
|
384
393
|
#instance_prompt_options[:cloud] = cloud ? cloud['name'] : nil
|
385
394
|
instance_prompt_options[:default_cloud] = cloud ? cloud['name'] : nil
|
395
|
+
instance_prompt_options[:environment] = selected_environment ? selected_environment['code'] : nil
|
396
|
+
instance_prompt_options[:default_security_groups] = scoped_instance_config['securityGroups'] ? scoped_instance_config['securityGroups'] : nil
|
397
|
+
|
386
398
|
instance_prompt_options[:no_prompt] = options[:no_prompt]
|
387
399
|
#instance_prompt_options[:always_prompt] = options[:no_prompt] != true # options[:always_prompt]
|
388
400
|
instance_prompt_options[:options] = scoped_instance_config # meh, actually need to make these default values instead..
|
389
401
|
#instance_prompt_options[:options][:always_prompt] = instance_prompt_options[:no_prompt] != true
|
390
402
|
instance_prompt_options[:options][:no_prompt] = instance_prompt_options[:no_prompt]
|
391
|
-
|
392
403
|
# also allow arbritrary options passed as tierName.instanceIndex like Web.0.instance.layout.id=75
|
393
404
|
instance_extra_options = {}
|
394
405
|
if tier_extra_options && tier_extra_options[instance_index.to_s]
|
@@ -402,6 +413,7 @@ class Morpheus::Cli::Apps
|
|
402
413
|
help_field_prefix = "#{tier_name}.#{instance_index}"
|
403
414
|
instance_prompt_options[:help_field_prefix] = help_field_prefix
|
404
415
|
instance_prompt_options[:options][:help_field_prefix] = help_field_prefix
|
416
|
+
instance_prompt_options[:locked_fields] = scoped_instance_config['lockedFields']
|
405
417
|
# this provisioning helper method handles all (most) of the parsing and prompting
|
406
418
|
instance_config_payload = prompt_new_instance(instance_prompt_options)
|
407
419
|
|
@@ -414,6 +426,7 @@ class Morpheus::Cli::Apps
|
|
414
426
|
final_config.delete('environments')
|
415
427
|
final_config.delete('groups')
|
416
428
|
final_config.delete('clouds')
|
429
|
+
final_config.delete('lockedFields')
|
417
430
|
# add config to payload
|
418
431
|
payload['tiers'][tier_name]['instances'] ||= []
|
419
432
|
payload['tiers'][tier_name]['instances'] << final_config
|
@@ -531,7 +544,12 @@ class Morpheus::Cli::Apps
|
|
531
544
|
rescue TypeError, JSON::ParserError => ex
|
532
545
|
print_error red, "Failed to parse JSON response: #{ex}", reset, "\n"
|
533
546
|
end
|
534
|
-
|
547
|
+
# The default way to print errors, except instances => []
|
548
|
+
(json_response['errors'] || {}).each do |error_key, error_msg|
|
549
|
+
if error_key != 'instances'
|
550
|
+
print_error red, " * #{error_key} : #{error_msg}", reset, "\n"
|
551
|
+
end
|
552
|
+
end
|
535
553
|
# looks for special error format like instances.instanceErrors
|
536
554
|
if json_response['errors'] && json_response['errors']['instances']
|
537
555
|
json_response['errors']['instances'].each do |error_obj|
|
@@ -545,13 +563,6 @@ class Morpheus::Cli::Apps
|
|
545
563
|
end
|
546
564
|
end
|
547
565
|
end
|
548
|
-
else
|
549
|
-
# a default way to print errors
|
550
|
-
(json_response['errors'] || {}).each do |error_key, error_msg|
|
551
|
-
if error_key != 'instances'
|
552
|
-
print_error red, " * #{error_key} : #{error_msg}", reset, "\n"
|
553
|
-
end
|
554
|
-
end
|
555
566
|
end
|
556
567
|
exit 1
|
557
568
|
end
|
@@ -613,6 +624,7 @@ class Morpheus::Cli::Apps
|
|
613
624
|
"Description" => 'description',
|
614
625
|
"Blueprint" => lambda {|it| it['blueprint'] ? it['blueprint']['name'] : '' },
|
615
626
|
"Group" => lambda {|it| it['group'] ? it['group']['name'] : it['siteId'] },
|
627
|
+
"Environment" => lambda {|it| it['appContext'] },
|
616
628
|
"Account" => lambda {|it| it['account'] ? it['account']['name'] : '' },
|
617
629
|
"Tiers" => lambda {|it|
|
618
630
|
# it['instanceCount']
|
@@ -1938,6 +1950,7 @@ class Morpheus::Cli::Apps
|
|
1938
1950
|
id: app['id'],
|
1939
1951
|
name: app['name'],
|
1940
1952
|
group: app['group'] ? app['group']['name'] : app['siteId'],
|
1953
|
+
environment: app['appContext'],
|
1941
1954
|
tiers: tiers_str,
|
1942
1955
|
instances: instances_str,
|
1943
1956
|
containers: containers_str,
|
@@ -1954,6 +1967,7 @@ class Morpheus::Cli::Apps
|
|
1954
1967
|
:id,
|
1955
1968
|
:name,
|
1956
1969
|
:group,
|
1970
|
+
:environment,
|
1957
1971
|
:tiers,
|
1958
1972
|
:instances,
|
1959
1973
|
:containers,
|
@@ -2025,24 +2039,6 @@ class Morpheus::Cli::Apps
|
|
2025
2039
|
return @available_blueprints
|
2026
2040
|
end
|
2027
2041
|
|
2028
|
-
def get_available_environments(refresh=false)
|
2029
|
-
if !@available_environments || refresh
|
2030
|
-
# results = @options_interface.options_for_source('environments',{})
|
2031
|
-
# @available_environments = results['data'].collect {|it|
|
2032
|
-
# {"id" => it["value"], "name" => it["name"], "value" => it["value"]}
|
2033
|
-
# }
|
2034
|
-
# todo: api call
|
2035
|
-
@available_environments = [
|
2036
|
-
{'name' => 'Dev', 'value' => 'Dev'},
|
2037
|
-
{'name' => 'Test', 'value' => 'Test'},
|
2038
|
-
{'name' => 'Staging', 'value' => 'Staging'},
|
2039
|
-
{'name' => 'Production', 'value' => 'Production'}
|
2040
|
-
]
|
2041
|
-
end
|
2042
|
-
#puts "get_available_environments() rtn: #{@available_environments.inspect}"
|
2043
|
-
return @available_environments
|
2044
|
-
end
|
2045
|
-
|
2046
2042
|
def find_blueprint_by_name_or_id(val)
|
2047
2043
|
if val.to_s =~ /\A\d{1,}\Z/
|
2048
2044
|
return find_blueprint_by_id(val)
|
@@ -1733,7 +1733,7 @@ class Morpheus::Cli::BlueprintsCommand
|
|
1733
1733
|
else
|
1734
1734
|
print_h1 "Available Tiers"
|
1735
1735
|
if tiers.empty?
|
1736
|
-
print
|
1736
|
+
print cyan,"No tiers found.",reset,"\n"
|
1737
1737
|
else
|
1738
1738
|
print cyan
|
1739
1739
|
tiers.each do |tier_name|
|
@@ -46,7 +46,7 @@ class Morpheus::Cli::BudgetsCommand
|
|
46
46
|
subtitles += parse_list_subtitles(options)
|
47
47
|
print_h1 title, subtitles
|
48
48
|
if budgets.empty?
|
49
|
-
print
|
49
|
+
print cyan,"No budgets found.",reset,"\n"
|
50
50
|
else
|
51
51
|
columns = [
|
52
52
|
{"ID" => lambda {|budget| budget['id'] } },
|
@@ -264,7 +264,7 @@ class Morpheus::Cli::BudgetsCommand
|
|
264
264
|
print red,"Failed to render budget summary.",reset,"\n"
|
265
265
|
end
|
266
266
|
else
|
267
|
-
print
|
267
|
+
print cyan,"No budget stat data found.",reset,"\n"
|
268
268
|
end
|
269
269
|
return 0
|
270
270
|
rescue RestClient::Exception => e
|
@@ -56,7 +56,6 @@ class Morpheus::Cli::ChangePasswordCommand
|
|
56
56
|
|
57
57
|
connect(options)
|
58
58
|
@current_remote = @appliance_name ? ::Morpheus::Cli::Remote.load_remote(@appliance_name) : ::Morpheus::Cli::Remote.load_active_remote()
|
59
|
-
puts "args is #{args}"
|
60
59
|
begin
|
61
60
|
if args[0]
|
62
61
|
username = args[0]
|
@@ -258,8 +258,8 @@ module Morpheus
|
|
258
258
|
case option_key.to_sym
|
259
259
|
|
260
260
|
when :account
|
261
|
-
opts.on('-a','--account ACCOUNT', "Account Name") do |val|
|
262
|
-
options[:
|
261
|
+
opts.on('-a','--account ACCOUNT', "Account Name or ID") do |val|
|
262
|
+
options[:account] = val
|
263
263
|
end
|
264
264
|
opts.on('-A','--account-id ID', "Account ID") do |val|
|
265
265
|
options[:account_id] = val
|
@@ -602,18 +602,28 @@ module Morpheus
|
|
602
602
|
end
|
603
603
|
|
604
604
|
when :fields
|
605
|
-
opts.on('-f', '--fields x,y,z', Array, "Filter Output to a limited set of fields. Default is all fields.") do |val|
|
606
|
-
|
605
|
+
opts.on('-f', '--fields x,y,z', Array, "Filter Output to a limited set of fields. Default is all fields for json,csv,yaml.") do |val|
|
606
|
+
if val.size == 1 && val[0].downcase == 'all'
|
607
|
+
options[:all_fields] = true
|
608
|
+
else
|
609
|
+
options[:include_fields] = val
|
610
|
+
end
|
607
611
|
end
|
608
612
|
opts.on('-F', '--old-fields x,y,z', Array, "alias for -f, --fields") do |val|
|
609
|
-
|
613
|
+
if val.size == 1 && val[0].downcase == 'all'
|
614
|
+
options[:all_fields] = true
|
615
|
+
else
|
616
|
+
options[:include_fields] = val
|
617
|
+
end
|
610
618
|
end
|
611
|
-
opts.
|
619
|
+
opts.add_hidden_option('-F,') if opts.is_a?(Morpheus::Cli::OptionParser)
|
620
|
+
opts.on(nil, '--all-fields', "Show all fields present in the data.") do
|
612
621
|
options[:all_fields] = true
|
613
622
|
end
|
614
|
-
opts.add_hidden_option('--all-fields') if opts.is_a?(Morpheus::Cli::OptionParser)
|
615
|
-
opts.
|
616
|
-
|
623
|
+
#opts.add_hidden_option('--all-fields') if opts.is_a?(Morpheus::Cli::OptionParser)
|
624
|
+
opts.on(nil, '--wrap', "Wrap table columns instead hiding them when terminal is not wide enough.") do
|
625
|
+
options[:responsive_table] = false
|
626
|
+
end
|
617
627
|
when :thin
|
618
628
|
opts.on( '--thin', '--thin', "Format headers and columns with thin borders." ) do |val|
|
619
629
|
options[:border_style] = :thin
|
data/lib/morpheus/cli/clouds.rb
CHANGED
@@ -12,7 +12,7 @@ class Morpheus::Cli::Clouds
|
|
12
12
|
include Morpheus::Cli::InfrastructureHelper
|
13
13
|
include Morpheus::Cli::ProvisioningHelper
|
14
14
|
|
15
|
-
register_subcommands :list, :count, :get, :add, :update, :remove, :security_groups, :apply_security_groups, :types => :list_cloud_types
|
15
|
+
register_subcommands :list, :count, :get, :add, :update, :remove, :refresh, :security_groups, :apply_security_groups, :types => :list_cloud_types
|
16
16
|
register_subcommands :wiki, :update_wiki
|
17
17
|
#register_subcommands :firewall_disable, :firewall_enable
|
18
18
|
alias_subcommand :details, :get
|
@@ -335,12 +335,11 @@ class Morpheus::Cli::Clouds
|
|
335
335
|
json_response = @clouds_interface.create(payload)
|
336
336
|
cloud = json_response['zone']
|
337
337
|
if options[:json]
|
338
|
-
|
339
|
-
print "\n"
|
338
|
+
puts as_json(json_response, options)
|
340
339
|
else
|
341
|
-
|
342
|
-
get([cloud["id"]])
|
340
|
+
get([cloud['id']] + (options[:remote] ? ["-r",options[:remote]] : []))
|
343
341
|
end
|
342
|
+
return 0
|
344
343
|
rescue RestClient::Exception => e
|
345
344
|
print_rest_exception(e, options)
|
346
345
|
exit 1
|
@@ -405,12 +404,11 @@ class Morpheus::Cli::Clouds
|
|
405
404
|
end
|
406
405
|
json_response = @clouds_interface.update(cloud['id'], payload)
|
407
406
|
if options[:json]
|
408
|
-
|
409
|
-
print "\n"
|
407
|
+
puts as_json(json_response, options)
|
410
408
|
else
|
411
|
-
|
412
|
-
get([cloud["id"]])
|
409
|
+
get([cloud['id']] + (options[:remote] ? ["-r",options[:remote]] : []))
|
413
410
|
end
|
411
|
+
return 0
|
414
412
|
rescue RestClient::Exception => e
|
415
413
|
print_rest_exception(e, options)
|
416
414
|
exit 1
|
@@ -458,6 +456,105 @@ class Morpheus::Cli::Clouds
|
|
458
456
|
end
|
459
457
|
end
|
460
458
|
|
459
|
+
def refresh(args)
|
460
|
+
options = {}
|
461
|
+
query_params = {}
|
462
|
+
params = {}
|
463
|
+
optparse = Morpheus::Cli::OptionParser.new do |opts|
|
464
|
+
opts.banner = subcommand_usage("[name] [options]")
|
465
|
+
opts.on( '-f', '--force', "Force Delete" ) do
|
466
|
+
query_params[:force] = 'true'
|
467
|
+
end
|
468
|
+
build_common_options(opts, options, [:options, :payload, :json, :dry_run, :remote])
|
469
|
+
opts.footer = "Refresh a cloud." + "\n" +
|
470
|
+
"[cloud] is required. This is the name or id of a cloud."
|
471
|
+
end
|
472
|
+
optparse.parse!(args)
|
473
|
+
if args.count != 1
|
474
|
+
raise_command_error "wrong number of arguments, expected 1 and got (#{args.count}) #{args}\n#{optparse}"
|
475
|
+
end
|
476
|
+
connect(options)
|
477
|
+
begin
|
478
|
+
cloud = find_cloud_by_name_or_id(args[0])
|
479
|
+
return 1 if cloud.nil?
|
480
|
+
passed_options = options[:options] ? options[:options].reject {|k,v| k.is_a?(Symbol) } : {}
|
481
|
+
payload = nil
|
482
|
+
if options[:payload]
|
483
|
+
payload = options[:payload]
|
484
|
+
payload.deep_merge!(passed_options) unless passed_options.empty?
|
485
|
+
else
|
486
|
+
payload = {}
|
487
|
+
payload.deep_merge!(passed_options) unless passed_options.empty?
|
488
|
+
end
|
489
|
+
@clouds_interface.setopts(options)
|
490
|
+
if options[:dry_run]
|
491
|
+
print_dry_run @clouds_interface.dry.refresh(cloud['id'], query_params, payload)
|
492
|
+
return
|
493
|
+
end
|
494
|
+
json_response = @clouds_interface.refresh(cloud['id'], query_params, payload)
|
495
|
+
if options[:json]
|
496
|
+
puts as_json(json_response, options)
|
497
|
+
else
|
498
|
+
print_green_success "Refreshing cloud #{cloud['name']}..."
|
499
|
+
#get([cloud['id']] + (options[:remote] ? ["-r",options[:remote]] : []))
|
500
|
+
end
|
501
|
+
return 0
|
502
|
+
rescue RestClient::Exception => e
|
503
|
+
print_rest_exception(e, options)
|
504
|
+
exit 1
|
505
|
+
end
|
506
|
+
end
|
507
|
+
|
508
|
+
# not exposed yet, refresh should be all that's needed.
|
509
|
+
def sync(args)
|
510
|
+
options = {}
|
511
|
+
query_params = {}
|
512
|
+
params = {}
|
513
|
+
optparse = Morpheus::Cli::OptionParser.new do |opts|
|
514
|
+
opts.banner = subcommand_usage("[name] [options]")
|
515
|
+
opts.on( '-f', '--force', "Force Delete" ) do
|
516
|
+
query_params[:force] = 'true'
|
517
|
+
end
|
518
|
+
build_common_options(opts, options, [:options, :payload, :json, :dry_run, :remote])
|
519
|
+
opts.footer = "Sync a cloud." + "\n" +
|
520
|
+
"[cloud] is required. This is the name or id of a cloud."
|
521
|
+
end
|
522
|
+
optparse.parse!(args)
|
523
|
+
if args.count != 1
|
524
|
+
raise_command_error "wrong number of arguments, expected 1 and got (#{args.count}) #{args}\n#{optparse}"
|
525
|
+
end
|
526
|
+
connect(options)
|
527
|
+
begin
|
528
|
+
cloud = find_cloud_by_name_or_id(args[0])
|
529
|
+
return 1 if cloud.nil?
|
530
|
+
passed_options = options[:options] ? options[:options].reject {|k,v| k.is_a?(Symbol) } : {}
|
531
|
+
payload = nil
|
532
|
+
if options[:payload]
|
533
|
+
payload = options[:payload]
|
534
|
+
payload.deep_merge!(passed_options) unless passed_options.empty?
|
535
|
+
else
|
536
|
+
payload = {}
|
537
|
+
payload.deep_merge!(passed_options) unless passed_options.empty?
|
538
|
+
end
|
539
|
+
@clouds_interface.setopts(options)
|
540
|
+
if options[:dry_run]
|
541
|
+
print_dry_run @clouds_interface.dry.sync(cloud['id'], query_params, payload)
|
542
|
+
return
|
543
|
+
end
|
544
|
+
json_response = @clouds_interface.sync(cloud['id'], query_params, payload)
|
545
|
+
if options[:json]
|
546
|
+
puts as_json(json_response, options)
|
547
|
+
else
|
548
|
+
print_green_success "Syncing cloud #{cloud['name']}..."
|
549
|
+
#get([cloud['id']] + (options[:remote] ? ["-r",options[:remote]] : []))
|
550
|
+
end
|
551
|
+
return 0
|
552
|
+
rescue RestClient::Exception => e
|
553
|
+
print_rest_exception(e, options)
|
554
|
+
exit 1
|
555
|
+
end
|
556
|
+
end
|
557
|
+
|
461
558
|
def firewall_disable(args)
|
462
559
|
options = {}
|
463
560
|
clear_or_secgroups_specified = false
|
@@ -643,7 +740,7 @@ class Morpheus::Cli::Clouds
|
|
643
740
|
print_h1 title, subtitles
|
644
741
|
|
645
742
|
if cloud_types.empty?
|
646
|
-
print
|
743
|
+
print cyan,"No cloud types found.",reset,"\n"
|
647
744
|
else
|
648
745
|
print cyan
|
649
746
|
cloud_types = cloud_types.select {|it| it['enabled'] }
|