morpheus-cli 5.4.0 → 5.4.3.1
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/account_users_interface.rb +68 -0
- data/lib/morpheus/api/api_client.rb +55 -10
- data/lib/morpheus/api/audit_interface.rb +9 -0
- data/lib/morpheus/api/catalog_item_types_interface.rb +20 -0
- data/lib/morpheus/api/instances_interface.rb +49 -0
- data/lib/morpheus/api/load_balancer_monitors_interface.rb +9 -0
- data/lib/morpheus/api/load_balancer_pools_interface.rb +4 -4
- data/lib/morpheus/api/load_balancer_profiles_interface.rb +4 -5
- data/lib/morpheus/api/load_balancer_virtual_servers_interface.rb +13 -4
- data/lib/morpheus/api/load_balancers_interface.rb +5 -0
- data/lib/morpheus/api/network_routers_interface.rb +9 -0
- data/lib/morpheus/api/network_static_routes_interface.rb +36 -0
- data/lib/morpheus/api/ping_interface.rb +2 -0
- data/lib/morpheus/api/read_interface.rb +4 -3
- data/lib/morpheus/api/rest_interface.rb +3 -3
- data/lib/morpheus/api/secondary_read_interface.rb +1 -1
- data/lib/morpheus/api/secondary_rest_interface.rb +19 -19
- data/lib/morpheus/api/setup_interface.rb +4 -0
- data/lib/morpheus/api/snapshots_interface.rb +19 -0
- data/lib/morpheus/api/storage_server_types_interface.rb +14 -0
- data/lib/morpheus/api/storage_servers_interface.rb +9 -0
- data/lib/morpheus/api/storage_volume_types_interface.rb +9 -0
- data/lib/morpheus/api/storage_volumes_interface.rb +9 -0
- data/lib/morpheus/api/users_interface.rb +16 -63
- data/lib/morpheus/cli/cli_command.rb +253 -5
- data/lib/morpheus/cli/cli_registry.rb +1 -1
- data/lib/morpheus/cli/commands/alias_command.rb +1 -1
- data/lib/morpheus/cli/commands/apps.rb +14 -78
- data/lib/morpheus/cli/commands/audit.rb +188 -0
- data/lib/morpheus/cli/commands/blueprints_command.rb +1 -1
- data/lib/morpheus/cli/commands/catalog_item_types_command.rb +88 -0
- data/lib/morpheus/cli/commands/change_password_command.rb +4 -4
- data/lib/morpheus/cli/commands/clusters.rb +96 -58
- data/lib/morpheus/cli/commands/hosts.rb +27 -15
- data/lib/morpheus/cli/commands/image_builder_command.rb +4 -8
- data/lib/morpheus/cli/commands/instances.rb +359 -3
- data/lib/morpheus/cli/commands/integrations_command.rb +1 -12
- data/lib/morpheus/cli/commands/library_instance_types_command.rb +3 -0
- data/lib/morpheus/cli/commands/load_balancer_monitors.rb +70 -0
- data/lib/morpheus/cli/commands/load_balancer_pools.rb +29 -50
- data/lib/morpheus/cli/commands/load_balancer_profiles.rb +64 -0
- data/lib/morpheus/cli/commands/load_balancer_types.rb +9 -4
- data/lib/morpheus/cli/commands/load_balancer_virtual_servers.rb +69 -58
- data/lib/morpheus/cli/commands/load_balancers.rb +109 -6
- data/lib/morpheus/cli/commands/network_firewalls_command.rb +22 -5
- data/lib/morpheus/cli/commands/network_routers_command.rb +96 -45
- data/lib/morpheus/cli/commands/network_static_routes_command.rb +451 -0
- data/lib/morpheus/cli/commands/network_transport_zones_command.rb +4 -4
- data/lib/morpheus/cli/commands/networks_command.rb +2 -2
- data/lib/morpheus/cli/commands/open_command.rb +30 -0
- data/lib/morpheus/cli/commands/options.rb +98 -0
- data/lib/morpheus/cli/commands/ping.rb +3 -5
- data/lib/morpheus/cli/commands/policies_command.rb +2 -2
- data/lib/morpheus/cli/commands/prices_command.rb +7 -7
- data/lib/morpheus/cli/commands/provisioning_settings_command.rb +1 -0
- data/lib/morpheus/cli/commands/remote.rb +20 -12
- data/lib/morpheus/cli/commands/roles.rb +1 -1
- data/lib/morpheus/cli/commands/security_groups.rb +2 -2
- data/lib/morpheus/cli/commands/service_plans_command.rb +1 -1
- data/lib/morpheus/cli/commands/setup.rb +1 -1
- data/lib/morpheus/cli/commands/shell.rb +2 -2
- data/lib/morpheus/cli/commands/snapshots.rb +139 -0
- data/lib/morpheus/cli/commands/storage_server_types.rb +50 -0
- data/lib/morpheus/cli/commands/storage_servers.rb +122 -0
- data/lib/morpheus/cli/commands/storage_volume_types.rb +50 -0
- data/lib/morpheus/cli/commands/storage_volumes.rb +103 -0
- data/lib/morpheus/cli/commands/tasks.rb +5 -5
- data/lib/morpheus/cli/commands/tenants_command.rb +1 -1
- data/lib/morpheus/cli/commands/user_groups_command.rb +1 -1
- data/lib/morpheus/cli/commands/user_settings_command.rb +3 -2
- data/lib/morpheus/cli/commands/user_sources_command.rb +1 -1
- data/lib/morpheus/cli/commands/users.rb +28 -28
- data/lib/morpheus/cli/commands/view.rb +102 -0
- data/lib/morpheus/cli/commands/virtual_images.rb +4 -1
- data/lib/morpheus/cli/mixins/accounts_helper.rb +5 -5
- data/lib/morpheus/cli/mixins/load_balancers_helper.rb +24 -4
- data/lib/morpheus/cli/mixins/print_helper.rb +50 -18
- data/lib/morpheus/cli/mixins/processes_helper.rb +1 -2
- data/lib/morpheus/cli/mixins/provisioning_helper.rb +96 -6
- data/lib/morpheus/cli/mixins/rest_command.rb +148 -74
- data/lib/morpheus/cli/mixins/secondary_rest_command.rb +174 -82
- data/lib/morpheus/cli/mixins/storage_servers_helper.rb +156 -0
- data/lib/morpheus/cli/mixins/storage_volumes_helper.rb +119 -0
- data/lib/morpheus/cli/option_types.rb +95 -28
- data/lib/morpheus/cli/version.rb +1 -1
- data/lib/morpheus/cli.rb +1 -0
- data/lib/morpheus/ext/string.rb +29 -6
- data/lib/morpheus/routes.rb +238 -0
- data/lib/morpheus/util.rb +6 -1
- metadata +26 -2
|
@@ -634,59 +634,51 @@ class Morpheus::Cli::NetworkRoutersCommand
|
|
|
634
634
|
end
|
|
635
635
|
|
|
636
636
|
def _firewall_rule_group(router_id, group_id, options)
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
if
|
|
640
|
-
|
|
641
|
-
|
|
637
|
+
@network_routers_interface.setopts(options)
|
|
638
|
+
if options[:dry_run]
|
|
639
|
+
if router_id.to_s =~ /\A\d{1,}\Z/
|
|
640
|
+
print_dry_run @network_routers_interface.dry.list({name:router_id})
|
|
641
|
+
else
|
|
642
|
+
if group_id.to_s =~ /\A\d{1,}\Z/
|
|
643
|
+
print_dry_run @network_routers_interface.dry.get_firewall_rule_group(router_id.to_i, group_id)
|
|
642
644
|
else
|
|
643
|
-
print_dry_run @network_routers_interface.dry.
|
|
645
|
+
print_dry_run @network_routers_interface.dry.list_firewall_rule_groups(router_id.to_i, {phrase:router_id})
|
|
644
646
|
end
|
|
645
|
-
return
|
|
646
647
|
end
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
group = (router['firewall']['ruleGroups'] || []).find {|it| it['id'].to_s == group_id.to_s || it['name'] == group_id.to_s}
|
|
648
|
+
return
|
|
649
|
+
end
|
|
650
|
+
router = find_router(router_id)
|
|
651
|
+
if router.nil?
|
|
652
|
+
return 1
|
|
653
|
+
end
|
|
654
654
|
|
|
655
|
-
|
|
656
|
-
|
|
655
|
+
if router['type']['hasFirewallGroups']
|
|
656
|
+
group = find_firewall_rule_group(router['id'], group_id)
|
|
657
|
+
return 1 if group.nil?
|
|
657
658
|
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
659
|
+
render_response({ruleGroup: group}, options, 'ruleGroup') do
|
|
660
|
+
print_h1 "Firewall Rule Group Details"
|
|
661
|
+
print cyan
|
|
662
|
+
description_cols = {
|
|
663
|
+
"ID" => lambda {|it| it['id'] },
|
|
664
|
+
"Name" => lambda {|it| it['name'] },
|
|
665
|
+
"Description" => lambda {|it| it['description']},
|
|
666
|
+
"Priority" => lambda {|it| it['priority']},
|
|
667
|
+
"Category" => lambda {|it| it['groupLayer']}
|
|
668
|
+
}
|
|
669
|
+
print_description_list(description_cols, group)
|
|
668
670
|
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
description_cols = {
|
|
672
|
-
"ID" => lambda {|it| it['id'] },
|
|
673
|
-
"Name" => lambda {|it| it['name'] },
|
|
674
|
-
"Description" => lambda {|it| it['description']},
|
|
675
|
-
"Priority" => lambda {|it| it['priority']},
|
|
676
|
-
"Category" => lambda {|it| it['groupLayer']}
|
|
677
|
-
}
|
|
678
|
-
print_description_list(description_cols, group)
|
|
679
|
-
else
|
|
680
|
-
print_red_alert "Firewall rule group #{group_id} not found for router #{router['name']}"
|
|
671
|
+
if is_master_account
|
|
672
|
+
description_cols["Visibility"] = lambda {|it| it['visibility']}
|
|
673
|
+
description_cols["Tenants"] = lambda {|it| it['tenants'].collect {|tenant| tenant['name']}.join(', ')}
|
|
681
674
|
end
|
|
682
|
-
|
|
683
|
-
print_h1 "No Firewall Rule Groups"
|
|
675
|
+
print_description_list(description_cols, group)
|
|
684
676
|
end
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
print_rest_exception(e, options)
|
|
677
|
+
else
|
|
678
|
+
print_red_alert "Firewall rule groups not supported for #{router['type']['name']}"
|
|
688
679
|
return 1
|
|
689
680
|
end
|
|
681
|
+
println reset
|
|
690
682
|
end
|
|
691
683
|
|
|
692
684
|
def add_firewall_rule_group(args)
|
|
@@ -703,6 +695,7 @@ class Morpheus::Cli::NetworkRoutersCommand
|
|
|
703
695
|
opts.on('--priority VALUE', Integer, "Priority for this firewall rule group (not applicable to all firewall types)") do |val|
|
|
704
696
|
params['priority'] = val
|
|
705
697
|
end
|
|
698
|
+
add_perms_options(opts, options, ['plans', 'groups'])
|
|
706
699
|
build_common_options(opts, options, [:options, :payload, :json, :dry_run, :remote])
|
|
707
700
|
opts.footer = "Create a network router firewall rule group."
|
|
708
701
|
end
|
|
@@ -742,7 +735,14 @@ class Morpheus::Cli::NetworkRoutersCommand
|
|
|
742
735
|
|
|
743
736
|
# prompt options
|
|
744
737
|
option_result = Morpheus::Cli::OptionTypes.prompt(option_types, options[:options].deep_merge({:context_map => {'group' => ''}}), @api_client, {}, nil, true)
|
|
745
|
-
|
|
738
|
+
|
|
739
|
+
rule_group = params.deep_merge(option_result)
|
|
740
|
+
|
|
741
|
+
# prompt perms
|
|
742
|
+
if is_master_account
|
|
743
|
+
rule_group.merge!(prompt_permissions_v2(options, ['plans', 'groups']))
|
|
744
|
+
end
|
|
745
|
+
payload = {'ruleGroup' => rule_group}
|
|
746
746
|
end
|
|
747
747
|
|
|
748
748
|
@network_routers_interface.setopts(options)
|
|
@@ -779,6 +779,7 @@ class Morpheus::Cli::NetworkRoutersCommand
|
|
|
779
779
|
opts.on('--priority VALUE', Integer, "Priority for this firewall rule group (not applicable to all firewall types)") do |val|
|
|
780
780
|
params['priority'] = val
|
|
781
781
|
end
|
|
782
|
+
add_perms_options(opts, options, ['plans', 'groups'])
|
|
782
783
|
build_common_options(opts, options, [:options, :payload, :json, :dry_run, :remote])
|
|
783
784
|
opts.footer = "Update a network router firewall rule group.\n" +
|
|
784
785
|
"[router] is required. This is the name or id of an existing network router.\n" +
|
|
@@ -810,6 +811,11 @@ class Morpheus::Cli::NetworkRoutersCommand
|
|
|
810
811
|
exit 1
|
|
811
812
|
end
|
|
812
813
|
|
|
814
|
+
if is_master_account
|
|
815
|
+
params['visibility'] = options[:visibility] if !options[:visibility].nil?
|
|
816
|
+
params['tenants'] = options[:tenants].collect {|it| {'id' => it}} if !options[:tenants].nil?
|
|
817
|
+
end
|
|
818
|
+
|
|
813
819
|
payload = parse_payload(options) || {'ruleGroup' => params}
|
|
814
820
|
payload['ruleGroup'].deep_merge!(options[:options].reject {|k,v| k.is_a?(Symbol) }) if options[:options]
|
|
815
821
|
|
|
@@ -2564,8 +2570,53 @@ class Morpheus::Cli::NetworkRoutersCommand
|
|
|
2564
2570
|
end
|
|
2565
2571
|
end
|
|
2566
2572
|
else
|
|
2567
|
-
rule = router['firewall'] && router['firewall']['rules'] ? router['firewall']['rules'].find {|it| it['name'] ==
|
|
2573
|
+
rule = router['firewall'] && router['firewall']['rules'] ? router['firewall']['rules'].find {|it| it['name'] == rule_id || it['id'] == rule_id.to_i} : nil
|
|
2568
2574
|
end
|
|
2569
2575
|
rule
|
|
2570
2576
|
end
|
|
2577
|
+
|
|
2578
|
+
def find_firewall_rule_group(router_id, val)
|
|
2579
|
+
if val.to_s =~ /\A\d{1,}\Z/
|
|
2580
|
+
return find_firewall_rule_group_by_id(router_id, val)
|
|
2581
|
+
else
|
|
2582
|
+
if group = find_firewall_rule_group_by_name(router_id, val)
|
|
2583
|
+
return find_firewall_rule_group_by_id(router_id, group['id'])
|
|
2584
|
+
end
|
|
2585
|
+
end
|
|
2586
|
+
end
|
|
2587
|
+
|
|
2588
|
+
def find_firewall_rule_group_by_id(router_id, group_id)
|
|
2589
|
+
begin
|
|
2590
|
+
json_response = @network_routers_interface.get_firewall_rule_group(router_id, group_id.to_i)
|
|
2591
|
+
return json_response['ruleGroup']
|
|
2592
|
+
rescue RestClient::Exception => e
|
|
2593
|
+
if e.response && e.response.code == 404
|
|
2594
|
+
print_red_alert "Network firewall rule group not found by id #{group_id}"
|
|
2595
|
+
return nil
|
|
2596
|
+
else
|
|
2597
|
+
raise e
|
|
2598
|
+
end
|
|
2599
|
+
end
|
|
2600
|
+
end
|
|
2601
|
+
|
|
2602
|
+
def find_firewall_rule_group_by_name(router_id, name)
|
|
2603
|
+
groups = search_firewall_rule_groups(router_id, name)
|
|
2604
|
+
if groups.empty?
|
|
2605
|
+
print_red_alert "Network firewall rule group not found by name #{name}"
|
|
2606
|
+
return nil
|
|
2607
|
+
elsif groups.size > 1
|
|
2608
|
+
print_red_alert "#{scopes.size} network firewall rule groups found by name #{name}"
|
|
2609
|
+
rows = groups.collect do |it|
|
|
2610
|
+
{id: it['id'], name: it['name']}
|
|
2611
|
+
end
|
|
2612
|
+
puts as_pretty_table(rows, [:id, :name], {color:red})
|
|
2613
|
+
return nil
|
|
2614
|
+
else
|
|
2615
|
+
return groups[0]
|
|
2616
|
+
end
|
|
2617
|
+
end
|
|
2618
|
+
|
|
2619
|
+
def search_firewall_rule_groups(router_id, phrase = nil)
|
|
2620
|
+
@network_routers_interface.list_firewall_rule_groups(router_id, phrase ? {phrase: phrase.to_s} : {})['ruleGroups']
|
|
2621
|
+
end
|
|
2571
2622
|
end
|
|
@@ -0,0 +1,451 @@
|
|
|
1
|
+
require 'morpheus/cli/cli_command'
|
|
2
|
+
|
|
3
|
+
class Morpheus::Cli::NetworkStaticRoutesCommand
|
|
4
|
+
include Morpheus::Cli::CliCommand
|
|
5
|
+
include Morpheus::Cli::ProvisioningHelper
|
|
6
|
+
include Morpheus::Cli::WhoamiHelper
|
|
7
|
+
|
|
8
|
+
set_command_name :'network-static-routes'
|
|
9
|
+
register_subcommands :list, :get, :add, :remove, :update
|
|
10
|
+
|
|
11
|
+
def connect(opts)
|
|
12
|
+
@api_client = establish_remote_appliance_connection(opts)
|
|
13
|
+
@account_interface = @api_client.accounts
|
|
14
|
+
@network_static_routes_interface = @api_client.network_static_routes
|
|
15
|
+
@networks_interface = @api_client.networks
|
|
16
|
+
@network_types_interface = @api_client.network_types
|
|
17
|
+
@options_interface = @api_client.options
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def handle(args)
|
|
21
|
+
handle_subcommand(args)
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def list(args)
|
|
25
|
+
options = {}
|
|
26
|
+
optparse = Morpheus::Cli::OptionParser.new do |opts|
|
|
27
|
+
opts.banner = subcommand_usage("[network] [search]")
|
|
28
|
+
build_standard_list_options(opts, options)
|
|
29
|
+
opts.footer = "List network DHCP Static Routes." + "\n" +
|
|
30
|
+
"[network] is required. This is the name or id of a network."
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
optparse.parse!(args)
|
|
34
|
+
connect(options)
|
|
35
|
+
|
|
36
|
+
verify_args!(args:args, optparse:optparse, min:1)
|
|
37
|
+
if args.count > 1
|
|
38
|
+
options[:phrase] = args[1..-1].join(" ")
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
network = find_network(args[0])
|
|
42
|
+
if network.nil?
|
|
43
|
+
return 1
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
network_type = find_network_type(network['type']['id'])
|
|
47
|
+
if network_type.nil?
|
|
48
|
+
return 1
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
_list(network, network_type, options)
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def _list(network, network_type, options)
|
|
55
|
+
params = parse_list_options(options)
|
|
56
|
+
@network_static_routes_interface.setopts(options)
|
|
57
|
+
if options[:dry_run]
|
|
58
|
+
print_dry_run @network_static_routes_interface.dry.list_static_routes(network['id'], params)
|
|
59
|
+
return
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
json_response = @network_static_routes_interface.list_static_routes(network['id'], params)
|
|
63
|
+
render_response(json_response, options, 'networkRoutes') do
|
|
64
|
+
print_h1 "Network DHCP Static Routes For: #{network['name']}"
|
|
65
|
+
print_static_routes(network, network_type, json_response)
|
|
66
|
+
end
|
|
67
|
+
return 0, nil
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
def get(args)
|
|
71
|
+
options = {}
|
|
72
|
+
optparse = Morpheus::Cli::OptionParser.new do |opts|
|
|
73
|
+
opts.banner = subcommand_usage("[network] [network_route]")
|
|
74
|
+
build_standard_get_options(opts, options)
|
|
75
|
+
opts.footer = "Display details on a network Static Route." + "\n" +
|
|
76
|
+
"[network] is required. This is the name or id of a network.\n" +
|
|
77
|
+
"[network_route] is required. This is the id of a network route.\n"
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
optparse.parse!(args)
|
|
81
|
+
connect(options)
|
|
82
|
+
|
|
83
|
+
verify_args!(args:args, optparse:optparse, count:2)
|
|
84
|
+
|
|
85
|
+
network = find_network(args[0])
|
|
86
|
+
if network.nil?
|
|
87
|
+
return 1
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
network_type = find_network_type(network['type']['id'])
|
|
91
|
+
if network_type.nil?
|
|
92
|
+
return 1
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
_get(network, network_type, args[1], options)
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
def _get(network, network_type, route_id, options)
|
|
99
|
+
# params = parse_query_options(options) # todo: use this
|
|
100
|
+
@network_static_routes_interface.setopts(options)
|
|
101
|
+
|
|
102
|
+
if options[:dry_run]
|
|
103
|
+
if route_id.to_s =~ /\A\d{1,}\Z/
|
|
104
|
+
print_dry_run @network_static_routes_interface.dry.get_static_route(network['id'], route_id.to_i)
|
|
105
|
+
else
|
|
106
|
+
print_dry_run @network_static_routes_interface.dry.list_static_routes(network['id'], {name: route_id})
|
|
107
|
+
end
|
|
108
|
+
return
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
route = find_static_route(network['id'], route_id)
|
|
112
|
+
return 1 if route.nil?
|
|
113
|
+
|
|
114
|
+
render_response({route: route}, options, 'route') do
|
|
115
|
+
print_h1 "Network Route Details"
|
|
116
|
+
print cyan
|
|
117
|
+
|
|
118
|
+
description_cols = {}
|
|
119
|
+
|
|
120
|
+
network_type['routeOptionTypes'].sort_by {|it| it['displayOrder']}.each do |option_type|
|
|
121
|
+
description_cols[option_type['fieldLabel']] = lambda {|it| Morpheus::Cli::OptionTypes.get_option_value(it, option_type, true)}
|
|
122
|
+
end
|
|
123
|
+
print_description_list(description_cols, route)
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
println reset
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
def add(args)
|
|
130
|
+
options = {:options=>{}}
|
|
131
|
+
params = {}
|
|
132
|
+
optparse = Morpheus::Cli::OptionParser.new do|opts|
|
|
133
|
+
opts.banner = subcommand_usage("[network]")
|
|
134
|
+
build_standard_add_options(opts, options)
|
|
135
|
+
opts.footer = "Create a network static route." + "\n" +
|
|
136
|
+
"[network] is required. This is the name or id of a network.\n";
|
|
137
|
+
end
|
|
138
|
+
optparse.parse!(args)
|
|
139
|
+
connect(options)
|
|
140
|
+
verify_args!(args:args, optparse:optparse, count:1)
|
|
141
|
+
|
|
142
|
+
network = find_network(args[0])
|
|
143
|
+
if network.nil?
|
|
144
|
+
return 1
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
network_type = find_network_type(network['type']['id'])
|
|
148
|
+
if network_type.nil?
|
|
149
|
+
return 1
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
if !network_type['hasStaticRoutes']
|
|
153
|
+
print_red_alert "Static routes not supported for #{network_type['name']}"
|
|
154
|
+
return 1
|
|
155
|
+
end
|
|
156
|
+
|
|
157
|
+
payload = nil
|
|
158
|
+
if options[:payload]
|
|
159
|
+
payload = options[:payload]
|
|
160
|
+
else
|
|
161
|
+
option_types = network_type['routeOptionTypes'].sort_by {|it| it['displayOrder']}
|
|
162
|
+
# prompt options
|
|
163
|
+
option_result = Morpheus::Cli::OptionTypes.prompt(option_types, options[:options].deep_merge({:context_map => {'networkRoute' => ''}}), @api_client, {'networkId' => network['id']}, nil, true)
|
|
164
|
+
payload = {'networkRoute' => params.deep_merge(option_result)}
|
|
165
|
+
# copy all domain level fields to route
|
|
166
|
+
if payload['networkRoute']['domain']
|
|
167
|
+
payload['networkRoute']['domain'].each do |k,v|
|
|
168
|
+
payload['networkRoute'][k] = v
|
|
169
|
+
end
|
|
170
|
+
end
|
|
171
|
+
payload['networkRoute'].delete('domain')
|
|
172
|
+
|
|
173
|
+
end
|
|
174
|
+
|
|
175
|
+
@network_static_routes_interface.setopts(options)
|
|
176
|
+
|
|
177
|
+
if options[:dry_run]
|
|
178
|
+
print_dry_run @network_static_routes_interface.dry.create_static_route(network['id'], payload)
|
|
179
|
+
return
|
|
180
|
+
end
|
|
181
|
+
|
|
182
|
+
json_response = @network_static_routes_interface.create_static_route(network['id'], payload)
|
|
183
|
+
render_response(json_response, options, 'networkRoute') do
|
|
184
|
+
print_green_success "\nAdded Network Static Route #{json_response['id']}\n"
|
|
185
|
+
_get(network, network_type, json_response['id'], options)
|
|
186
|
+
end
|
|
187
|
+
end
|
|
188
|
+
|
|
189
|
+
def update(args)
|
|
190
|
+
options = {:options=>{}}
|
|
191
|
+
params = {}
|
|
192
|
+
optparse = Morpheus::Cli::OptionParser.new do|opts|
|
|
193
|
+
opts.banner = subcommand_usage("[network] [networkRoute]")
|
|
194
|
+
build_standard_update_options(opts, options)
|
|
195
|
+
opts.footer = "Update a network Static Route.\n" +
|
|
196
|
+
"[network] is required. This is the name or id of an existing network.\n" +
|
|
197
|
+
"[networkRoute] is required. This is the name or id of an existing network static route."
|
|
198
|
+
end
|
|
199
|
+
optparse.parse!(args)
|
|
200
|
+
verify_args!(args:args, optparse:optparse, count:2)
|
|
201
|
+
connect(options)
|
|
202
|
+
|
|
203
|
+
network = find_network(args[0])
|
|
204
|
+
if network.nil?
|
|
205
|
+
return 1
|
|
206
|
+
end
|
|
207
|
+
|
|
208
|
+
network_type = find_network_type(network['type']['id'])
|
|
209
|
+
if network_type.nil?
|
|
210
|
+
return 1
|
|
211
|
+
end
|
|
212
|
+
|
|
213
|
+
route = find_static_route(network['id'], args[1])
|
|
214
|
+
return 1 if route.nil?
|
|
215
|
+
|
|
216
|
+
payload = parse_payload(options) || {'networkRoute' => params}
|
|
217
|
+
payload['networkRoute'].deep_merge!(options[:options].reject {|k,v| k.is_a?(Symbol) }) if options[:options] && !payload['networkRoute'].nil?
|
|
218
|
+
|
|
219
|
+
if payload['networkRoute'].empty?
|
|
220
|
+
option_types = network_type['routeOptionTypes'].sort_by {|it| it['displayOrder']}
|
|
221
|
+
print_green_success "Nothing to update"
|
|
222
|
+
println cyan
|
|
223
|
+
print Morpheus::Cli::OptionTypes.display_option_types_help(
|
|
224
|
+
option_types,
|
|
225
|
+
{:include_context => true, :context_map => {'networkRoute' => ''}, :color => cyan, :title => "Available Network Static Route Options"}
|
|
226
|
+
)
|
|
227
|
+
exit 1
|
|
228
|
+
end
|
|
229
|
+
|
|
230
|
+
# copy all domain level fields to route
|
|
231
|
+
if payload['networkRoute']['domain']
|
|
232
|
+
payload['networkRoute']['domain'].each do |k,v|
|
|
233
|
+
payload['networkRoute'][k] = v
|
|
234
|
+
end
|
|
235
|
+
payload['networkRoute'].delete('domain')
|
|
236
|
+
end
|
|
237
|
+
|
|
238
|
+
@network_static_routes_interface.setopts(options)
|
|
239
|
+
|
|
240
|
+
if options[:dry_run]
|
|
241
|
+
print_dry_run @network_static_routes_interface.dry.update_static_route(network['id'], route['id'], payload)
|
|
242
|
+
return
|
|
243
|
+
end
|
|
244
|
+
|
|
245
|
+
# build update payload
|
|
246
|
+
update_payload = {'networkRoute' => route.select{|x| !['id', 'code', 'internalId', 'externalId', 'uniqueId', 'providerId', 'externalType', 'enabled', 'visible', 'externalInterface'].include?(x)}}.deep_merge(payload)
|
|
247
|
+
|
|
248
|
+
json_response = @network_static_routes_interface.update_static_route(network['id'], route['id'], update_payload)
|
|
249
|
+
render_response(json_response, options, 'networkRoute') do
|
|
250
|
+
print_green_success "\nUpdated Network Static Route #{route['id']}\n"
|
|
251
|
+
_get(network, network_type, route['id'], options)
|
|
252
|
+
end
|
|
253
|
+
end
|
|
254
|
+
|
|
255
|
+
def remove(args)
|
|
256
|
+
options = {}
|
|
257
|
+
optparse = Morpheus::Cli::OptionParser.new do |opts|
|
|
258
|
+
opts.banner = subcommand_usage("[network] [network_route]")
|
|
259
|
+
build_standard_remove_options(opts, options)
|
|
260
|
+
opts.footer = "Delete a network static route.\n" +
|
|
261
|
+
"[network] is required. This is the name or id of an existing network.\n" +
|
|
262
|
+
"[network_route] is required. This is the name or id of an existing network static route."
|
|
263
|
+
end
|
|
264
|
+
optparse.parse!(args)
|
|
265
|
+
verify_args!(args:args, optparse:optparse, count:2)
|
|
266
|
+
connect(options)
|
|
267
|
+
|
|
268
|
+
network = find_network(args[0])
|
|
269
|
+
if network.nil?
|
|
270
|
+
return 1
|
|
271
|
+
end
|
|
272
|
+
|
|
273
|
+
network_type = find_network_type(network['type']['id'])
|
|
274
|
+
if network_type.nil?
|
|
275
|
+
return 1
|
|
276
|
+
end
|
|
277
|
+
|
|
278
|
+
route = find_static_route(network['id'], args[1])
|
|
279
|
+
return 1 if route.nil?
|
|
280
|
+
|
|
281
|
+
unless options[:yes] || ::Morpheus::Cli::OptionTypes::confirm("Are you sure you would like to remove the network static route '#{route['source']},#{route['destination']}' from network '#{network['name']}'?", options)
|
|
282
|
+
return 9, "aborted command"
|
|
283
|
+
end
|
|
284
|
+
|
|
285
|
+
@network_static_routes_interface.setopts(options)
|
|
286
|
+
|
|
287
|
+
if options[:dry_run]
|
|
288
|
+
print_dry_run @network_static_routes_interface.dry.delete_static_routes(network['id'], route['id'])
|
|
289
|
+
return
|
|
290
|
+
end
|
|
291
|
+
json_response = @network_static_routes_interface.delete_static_route(network['id'], route['id'])
|
|
292
|
+
render_response(json_response, options, 'networkRoute') do
|
|
293
|
+
print_green_success "\nDeleted Network Static Route '#{route['source']},#{route['destination']}'\n"
|
|
294
|
+
_list(network, network_type, options)
|
|
295
|
+
end
|
|
296
|
+
end
|
|
297
|
+
|
|
298
|
+
private
|
|
299
|
+
|
|
300
|
+
def print_static_routes(network, network_type, json_response)
|
|
301
|
+
routes = json_response['networkRoutes']
|
|
302
|
+
print cyan
|
|
303
|
+
if routes.count > 0
|
|
304
|
+
cols = [:id]
|
|
305
|
+
network_type['routeOptionTypes'].sort_by {|it| it['displayOrder']}.each do |option_type|
|
|
306
|
+
cols << option_type['fieldLabel']
|
|
307
|
+
end
|
|
308
|
+
rows = routes.collect do |it|
|
|
309
|
+
row = {
|
|
310
|
+
id: it['id']
|
|
311
|
+
}
|
|
312
|
+
network_type['routeOptionTypes'].sort_by {|it| it['displayOrder']}.each do |option_type|
|
|
313
|
+
row[option_type['fieldLabel']] = Morpheus::Cli::OptionTypes.get_option_value(it, option_type, true)
|
|
314
|
+
end
|
|
315
|
+
row
|
|
316
|
+
end
|
|
317
|
+
print as_pretty_table(rows, cols)
|
|
318
|
+
print_results_pagination(json_response)
|
|
319
|
+
else
|
|
320
|
+
println "No Static Routes"
|
|
321
|
+
end
|
|
322
|
+
println reset
|
|
323
|
+
end
|
|
324
|
+
|
|
325
|
+
def find_network(val)
|
|
326
|
+
if val.to_s =~ /\A\d{1,}\Z/
|
|
327
|
+
return find_network_by_id(val)
|
|
328
|
+
else
|
|
329
|
+
if network = find_network_by_name(val)
|
|
330
|
+
return find_network_by_id(network['id'])
|
|
331
|
+
end
|
|
332
|
+
end
|
|
333
|
+
end
|
|
334
|
+
|
|
335
|
+
def find_network_by_id(id)
|
|
336
|
+
begin
|
|
337
|
+
json_response = @networks_interface.get(id.to_i)
|
|
338
|
+
return json_response['network']
|
|
339
|
+
rescue RestClient::Exception => e
|
|
340
|
+
if e.response && e.response.code == 404
|
|
341
|
+
print_red_alert "Network not found by id #{id}"
|
|
342
|
+
return nil
|
|
343
|
+
else
|
|
344
|
+
raise e
|
|
345
|
+
end
|
|
346
|
+
end
|
|
347
|
+
end
|
|
348
|
+
|
|
349
|
+
def find_network_by_name(name)
|
|
350
|
+
json_response = @networks_interface.list({phrase: name.to_s})
|
|
351
|
+
networks = json_response['network']
|
|
352
|
+
if networks.empty?
|
|
353
|
+
print_red_alert "Network not found by name #{name}"
|
|
354
|
+
return nil
|
|
355
|
+
elsif networks.size > 1
|
|
356
|
+
print_red_alert "#{networks.size} network found by name #{name}"
|
|
357
|
+
rows = networks.collect do |it|
|
|
358
|
+
{id: it['id'], name: it['name']}
|
|
359
|
+
end
|
|
360
|
+
puts as_pretty_table(rows, [:id, :name], {color:red})
|
|
361
|
+
return nil
|
|
362
|
+
else
|
|
363
|
+
return networks[0]
|
|
364
|
+
end
|
|
365
|
+
end
|
|
366
|
+
|
|
367
|
+
def find_network_type(val)
|
|
368
|
+
if val.to_s =~ /\A\d{1,}\Z/
|
|
369
|
+
return find_network_type_by_id(val)
|
|
370
|
+
else
|
|
371
|
+
if network_type = find_network_type_by_name(val)
|
|
372
|
+
return find_network_type_by_id(network_type['id'])
|
|
373
|
+
end
|
|
374
|
+
end
|
|
375
|
+
end
|
|
376
|
+
|
|
377
|
+
def find_network_type_by_id(id)
|
|
378
|
+
begin
|
|
379
|
+
json_response = @network_types_interface.get(id.to_i)
|
|
380
|
+
return json_response['networkType']
|
|
381
|
+
rescue RestClient::Exception => e
|
|
382
|
+
if e.response && e.response.code == 404
|
|
383
|
+
print_red_alert "Network Type not found by id #{id}"
|
|
384
|
+
return nil
|
|
385
|
+
else
|
|
386
|
+
raise e
|
|
387
|
+
end
|
|
388
|
+
end
|
|
389
|
+
end
|
|
390
|
+
|
|
391
|
+
def find_network_type_by_name(name)
|
|
392
|
+
json_response = @network_types_interface.list({phrase: name.to_s})
|
|
393
|
+
networkTypes = json_response['networkType']
|
|
394
|
+
if networkTypes.empty?
|
|
395
|
+
print_red_alert "Network Type not found by name #{name}"
|
|
396
|
+
return nil
|
|
397
|
+
elsif networkTypes.size > 1
|
|
398
|
+
print_red_alert "#{networkTypes.size} network type found by name #{name}"
|
|
399
|
+
rows = networkTypes.collect do |it|
|
|
400
|
+
{id: it['id'], name: it['name']}
|
|
401
|
+
end
|
|
402
|
+
puts as_pretty_table(rows, [:id, :name], {color:red})
|
|
403
|
+
return nil
|
|
404
|
+
else
|
|
405
|
+
return networkTypes[0]
|
|
406
|
+
end
|
|
407
|
+
end
|
|
408
|
+
|
|
409
|
+
def find_static_route(network_id, val)
|
|
410
|
+
if val.to_s =~ /\A\d{1,}\Z/
|
|
411
|
+
return find_static_route_by_id(network_id, val)
|
|
412
|
+
else
|
|
413
|
+
if route = find_static_route_by_name(network_id, val)
|
|
414
|
+
return find_static_route_by_id(network_id, route['id'])
|
|
415
|
+
end
|
|
416
|
+
end
|
|
417
|
+
end
|
|
418
|
+
|
|
419
|
+
def find_static_route_by_id(network_id, route_id)
|
|
420
|
+
begin
|
|
421
|
+
json_response = @network_static_routes_interface.get_static_route(network_id, route_id.to_i)
|
|
422
|
+
return json_response['networkRoute']
|
|
423
|
+
rescue RestClient::Exception => e
|
|
424
|
+
if e.response && e.response.code == 404
|
|
425
|
+
print_red_alert "Network Static Route not found by id #{route_id}"
|
|
426
|
+
return nil
|
|
427
|
+
else
|
|
428
|
+
raise e
|
|
429
|
+
end
|
|
430
|
+
end
|
|
431
|
+
end
|
|
432
|
+
|
|
433
|
+
def find_static_route_by_name(network_id, name)
|
|
434
|
+
json_response = @network_static_routes_interface.list_static_routes(network_id, {phrase: name.to_s})
|
|
435
|
+
routes = json_response['networkRoutes']
|
|
436
|
+
if routes.empty?
|
|
437
|
+
print_red_alert "Network Static Routes not found by name #{name}"
|
|
438
|
+
return nil
|
|
439
|
+
elsif routes.size > 1
|
|
440
|
+
print_red_alert "#{routes.size} network Static Routes found by name #{name}"
|
|
441
|
+
rows = routes.collect do |it|
|
|
442
|
+
{id: it['id'], source: it['source'], destination: it['destination']}
|
|
443
|
+
end
|
|
444
|
+
puts as_pretty_table(rows, [:id, :source, :destination], {color:red})
|
|
445
|
+
return nil
|
|
446
|
+
else
|
|
447
|
+
return routes[0]
|
|
448
|
+
end
|
|
449
|
+
end
|
|
450
|
+
|
|
451
|
+
end
|
|
@@ -89,7 +89,7 @@ class Morpheus::Cli::NetworkTransportZonesCommand
|
|
|
89
89
|
server = find_network_server(server_id)
|
|
90
90
|
return 1 if server.nil?
|
|
91
91
|
|
|
92
|
-
scope_id = args.count > 1 ? args[1] : Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'rule', 'type' => 'select', 'fieldLabel' => '
|
|
92
|
+
scope_id = args.count > 1 ? args[1] : Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'rule', 'type' => 'select', 'fieldLabel' => 'Transport Zone', 'selectOptions' => search_scopes(server['id']).collect {|it| {'name' => it['name'], 'value' => it['id']}}, 'required' => true, 'description' => 'Select Transport Zone.'}],options[:options],@api_client,{})['rule']
|
|
93
93
|
|
|
94
94
|
_get(server, scope_id, options)
|
|
95
95
|
end
|
|
@@ -236,7 +236,7 @@ class Morpheus::Cli::NetworkTransportZonesCommand
|
|
|
236
236
|
return 1
|
|
237
237
|
end
|
|
238
238
|
|
|
239
|
-
scope_id = args.count > 1 ? args[1] : Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'scope', 'type' => 'select', 'fieldLabel' => '
|
|
239
|
+
scope_id = args.count > 1 ? args[1] : Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'scope', 'type' => 'select', 'fieldLabel' => 'Transport Zone', 'selectOptions' => search_scopes(server['id']).collect {|it| {'name' => it['name'], 'value' => it['id']}}, 'required' => true, 'description' => 'Select Transport Zone.'}],options[:options],@api_client,{})['scope']
|
|
240
240
|
scope = find_scope(server['id'], scope_id)
|
|
241
241
|
return 1 if scope.nil?
|
|
242
242
|
|
|
@@ -305,7 +305,7 @@ class Morpheus::Cli::NetworkTransportZonesCommand
|
|
|
305
305
|
return 1
|
|
306
306
|
end
|
|
307
307
|
|
|
308
|
-
scope_id = args.count > 1 ? args[1] : Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'scope', 'type' => 'select', 'fieldLabel' => '
|
|
308
|
+
scope_id = args.count > 1 ? args[1] : Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'scope', 'type' => 'select', 'fieldLabel' => 'Transport Zone', 'selectOptions' => search_scopes(server['id']).collect {|it| {'name' => it['name'], 'value' => it['id']}}, 'required' => true, 'description' => 'Select Transport Zone.'}],options[:options],@api_client,{})['scope']
|
|
309
309
|
scope = find_scope(server['id'], scope_id)
|
|
310
310
|
return 1 if scope.nil?
|
|
311
311
|
|
|
@@ -384,7 +384,7 @@ class Morpheus::Cli::NetworkTransportZonesCommand
|
|
|
384
384
|
end
|
|
385
385
|
|
|
386
386
|
def find_network_server_by_name(name)
|
|
387
|
-
servers = search_network_servers
|
|
387
|
+
servers = search_network_servers(name)
|
|
388
388
|
if servers.empty?
|
|
389
389
|
print_red_alert "Network Server not found by name #{name}"
|
|
390
390
|
return nil
|