morpheus-cli 6.1.0 → 6.1.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/api_client.rb +8 -0
- data/lib/morpheus/api/cypher_interface.rb +11 -5
- data/lib/morpheus/api/load_balancer_pool_nodes_interface.rb +8 -0
- data/lib/morpheus/api/load_balancer_pools_interface.rb +4 -4
- data/lib/morpheus/api/load_balancer_pools_secondary_interface.rb +9 -0
- data/lib/morpheus/api/roles_interface.rb +8 -8
- data/lib/morpheus/cli/commands/load_balancer_pool_nodes.rb +87 -0
- data/lib/morpheus/cli/commands/load_balancer_pools.rb +7 -4
- data/lib/morpheus/cli/commands/roles.rb +403 -586
- data/lib/morpheus/cli/commands/users.rb +46 -2
- data/lib/morpheus/cli/mixins/provisioning_helper.rb +6 -6
- data/lib/morpheus/cli/version.rb +1 -1
- metadata +5 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3cf8719e8fbab69a6e0de10b9d2920b0394bb55d4928ba4266b82c9430f53658
|
4
|
+
data.tar.gz: a518e58f7b2adc050e786ca6f29e0f7832787e5c294c495d5599960f7232aacc
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 30263a5621c68dc42d8bb1093c67c21a27eab9c440bd12848a345ddee7200d45d8744531418dd9b936529405623a7c464d44b957503903ac0fc1e2bb462b431a
|
7
|
+
data.tar.gz: 2bc5e8dc185195a1dc470394d487b1c970c1c8626701803636441ae84a6f138352dcafd07481d39a151c24911a05526dfa8748882ee7b1b48f57c02bba584e54
|
data/Dockerfile
CHANGED
@@ -492,6 +492,10 @@ class Morpheus::APIClient
|
|
492
492
|
Morpheus::LoadBalancerPoolsInterface.new(common_interface_options).setopts(@options)
|
493
493
|
end
|
494
494
|
|
495
|
+
def load_balancer_pools_secondary
|
496
|
+
Morpheus::LoadBalancerPoolsSecondaryInterface.new(common_interface_options).setopts(@options)
|
497
|
+
end
|
498
|
+
|
495
499
|
def load_balancer_profiles
|
496
500
|
Morpheus::LoadBalancerProfilesInterface.new(common_interface_options).setopts(@options)
|
497
501
|
end
|
@@ -500,6 +504,10 @@ class Morpheus::APIClient
|
|
500
504
|
Morpheus::LoadBalancerMonitorsInterface.new(common_interface_options).setopts(@options)
|
501
505
|
end
|
502
506
|
|
507
|
+
def load_balancer_pool_nodes
|
508
|
+
Morpheus::LoadBalancerPoolNodesInterface.new(common_interface_options).setopts(@options)
|
509
|
+
end
|
510
|
+
|
503
511
|
def tasks
|
504
512
|
Morpheus::TasksInterface.new(common_interface_options).setopts(@options)
|
505
513
|
end
|
@@ -9,7 +9,7 @@ class Morpheus::CypherInterface < Morpheus::APIClient
|
|
9
9
|
|
10
10
|
def get(item_key, params={})
|
11
11
|
raise "#{self.class}.get() passed a blank item_key!" if item_key.to_s == ''
|
12
|
-
url = "#{@base_url}#{base_path}/#{item_key}"
|
12
|
+
url = "#{@base_url}#{base_path}/#{escape_item_key(item_key)}"
|
13
13
|
headers = { :params => params, :authorization => "Bearer #{@access_token}" }
|
14
14
|
execute({method: :get, url: url, headers: headers})
|
15
15
|
end
|
@@ -17,29 +17,35 @@ class Morpheus::CypherInterface < Morpheus::APIClient
|
|
17
17
|
# list url is the same as get but uses $itemKey/?list=true
|
18
18
|
# method: 'LIST' would be neat though
|
19
19
|
def list(item_key=nil, params={})
|
20
|
-
url = item_key ? "#{@base_url}#{base_path}/#{item_key}" : "#{@base_url}#{base_path}"
|
20
|
+
url = item_key ? "#{@base_url}#{base_path}/#{escape_item_key(item_key)}" : "#{@base_url}#{base_path}"
|
21
21
|
params.merge!({list:'true'}) # ditch this probably
|
22
22
|
headers = { :params => params, :authorization => "Bearer #{@access_token}" }
|
23
23
|
execute({method: :get, url: url, headers: headers})
|
24
24
|
end
|
25
25
|
|
26
26
|
def create(item_key, params={}, payload={})
|
27
|
-
url = "#{@base_url}#{base_path}/#{item_key}"
|
27
|
+
url = "#{@base_url}#{base_path}/#{escape_item_key(item_key)}"
|
28
28
|
headers = { :params => params, :authorization => "Bearer #{@access_token}", 'Content-Type' => 'application/json' }
|
29
29
|
execute({method: :post, url: url, headers: headers, payload: payload.to_json})
|
30
30
|
end
|
31
31
|
|
32
32
|
# update is not even needed I don't think, same as POST
|
33
33
|
def update(item_key, params={}, payload={})
|
34
|
-
url = "#{@base_url}#{base_path}/#{item_key}"
|
34
|
+
url = "#{@base_url}#{base_path}/#{escape_item_key(item_key)}"
|
35
35
|
headers = { :params => params, :authorization => "Bearer #{@access_token}", 'Content-Type' => 'application/json' }
|
36
36
|
execute({method: :put, url: url, headers: headers, payload: payload.to_json})
|
37
37
|
end
|
38
38
|
|
39
39
|
def destroy(item_key, params={})
|
40
|
-
url = "#{@base_url}#{base_path}/#{item_key}"
|
40
|
+
url = "#{@base_url}#{base_path}/#{escape_item_key(item_key)}"
|
41
41
|
headers = { :params => params, :authorization => "Bearer #{@access_token}", 'Content-Type' => 'application/json' }
|
42
42
|
execute({method: :delete, url: url, headers: headers})
|
43
43
|
end
|
44
44
|
|
45
|
+
protected
|
46
|
+
|
47
|
+
def escape_item_key(item_key)
|
48
|
+
item_key.to_s.split("/").collect {|i| CGI::escape(i.to_s) }.join("/")
|
49
|
+
end
|
50
|
+
|
45
51
|
end
|
@@ -1,9 +1,9 @@
|
|
1
|
-
require 'morpheus/api/
|
1
|
+
require 'morpheus/api/rest_interface'
|
2
2
|
|
3
|
-
class Morpheus::LoadBalancerPoolsInterface < Morpheus::
|
3
|
+
class Morpheus::LoadBalancerPoolsInterface < Morpheus::RestInterface
|
4
4
|
|
5
|
-
def base_path
|
6
|
-
"/api/load-
|
5
|
+
def base_path
|
6
|
+
"/api/load-balancer-pools"
|
7
7
|
end
|
8
8
|
|
9
9
|
end
|
@@ -2,10 +2,10 @@ require 'morpheus/api/api_client'
|
|
2
2
|
|
3
3
|
class Morpheus::RolesInterface < Morpheus::APIClient
|
4
4
|
|
5
|
-
def get(account_id, id)
|
5
|
+
def get(account_id, id, params={})
|
6
6
|
raise "#{self.class}.get() passed a blank id!" if id.to_s == ''
|
7
7
|
url = build_url(account_id, id)
|
8
|
-
headers = { params:
|
8
|
+
headers = { params: params, authorization: "Bearer #{@access_token}" }
|
9
9
|
execute(method: :get, url: url, headers: headers)
|
10
10
|
end
|
11
11
|
|
@@ -21,24 +21,24 @@ class Morpheus::RolesInterface < Morpheus::APIClient
|
|
21
21
|
execute(method: :get, url: url, headers: headers)
|
22
22
|
end
|
23
23
|
|
24
|
-
def create(account_id, options)
|
24
|
+
def create(account_id, options, params={})
|
25
25
|
url = build_url(account_id)
|
26
26
|
headers = { :authorization => "Bearer #{@access_token}", 'Content-Type' => 'application/json' }
|
27
27
|
payload = options
|
28
|
-
execute(method: :post, url: url, headers: headers, payload: payload.to_json)
|
28
|
+
execute(method: :post, url: url, headers: headers, payload: payload.to_json, params: params)
|
29
29
|
end
|
30
30
|
|
31
|
-
def update(account_id, id, options)
|
31
|
+
def update(account_id, id, options, params={})
|
32
32
|
url = build_url(account_id, id)
|
33
33
|
headers = { :authorization => "Bearer #{@access_token}", 'Content-Type' => 'application/json' }
|
34
34
|
payload = options
|
35
|
-
execute(method: :put, url: url, headers: headers, payload: payload.to_json)
|
35
|
+
execute(method: :put, url: url, headers: headers, payload: payload.to_json, params: params)
|
36
36
|
end
|
37
37
|
|
38
|
-
def destroy(account_id, id)
|
38
|
+
def destroy(account_id, id, params={})
|
39
39
|
url = build_url(account_id, id)
|
40
40
|
headers = { :authorization => "Bearer #{@access_token}", 'Content-Type' => 'application/json' }
|
41
|
-
execute(method: :delete, url: url, headers: headers)
|
41
|
+
execute(method: :delete, url: url, headers: headers, params: params)
|
42
42
|
end
|
43
43
|
|
44
44
|
def update_permission(account_id, id, options)
|
@@ -0,0 +1,87 @@
|
|
1
|
+
require 'morpheus/cli/cli_command'
|
2
|
+
|
3
|
+
class Morpheus::Cli::LoadBalancerPoolNodes
|
4
|
+
include Morpheus::Cli::CliCommand
|
5
|
+
include Morpheus::Cli::RestCommand
|
6
|
+
include Morpheus::Cli::SecondaryRestCommand
|
7
|
+
include Morpheus::Cli::LoadBalancersHelper
|
8
|
+
|
9
|
+
set_command_description "View and manage load balancer pool member nodes."
|
10
|
+
set_command_name :'load-balancer-pool-nodes'
|
11
|
+
|
12
|
+
set_rest_key :load_balancer_node
|
13
|
+
set_rest_parent_name :load_balancer_pools
|
14
|
+
set_rest_option_context_map({'loadBalancerNode' => ''})
|
15
|
+
|
16
|
+
register_subcommands :list, :get, :add, :update, :remove
|
17
|
+
register_interfaces :load_balancer_types, :load_balancer_pools
|
18
|
+
|
19
|
+
protected
|
20
|
+
|
21
|
+
def load_balancer_node_list_column_definitions(options)
|
22
|
+
{
|
23
|
+
"ID" => 'id',
|
24
|
+
"Status" => 'status',
|
25
|
+
"Name" => 'name',
|
26
|
+
"IP Address" => 'ipAddress',
|
27
|
+
"Port" => 'port'
|
28
|
+
}
|
29
|
+
end
|
30
|
+
|
31
|
+
def load_balancer_node_column_definitions(options)
|
32
|
+
{
|
33
|
+
"ID" => 'id',
|
34
|
+
"Name" => 'name',
|
35
|
+
"Description" => 'description',
|
36
|
+
"State" => lambda {|it| it['config']['adminState']},
|
37
|
+
"IP Address" => 'ipAddress',
|
38
|
+
"Port" => 'port',
|
39
|
+
"Weight" => 'weight',
|
40
|
+
"Backup Member" => lambda {|it| format_boolean it['config']['backupMember']},
|
41
|
+
"Max Concurrent Connections" => lambda {|it| it['config']['maxConcurrentConnections']}
|
42
|
+
}
|
43
|
+
end
|
44
|
+
|
45
|
+
def load_balancer_node_object_key
|
46
|
+
'loadBalancerNode'
|
47
|
+
end
|
48
|
+
|
49
|
+
def load_balancer_node_list_key
|
50
|
+
'loadBalancerNodes'
|
51
|
+
end
|
52
|
+
|
53
|
+
def load_balancer_node_label
|
54
|
+
'Load Balancer Node'
|
55
|
+
end
|
56
|
+
|
57
|
+
def load_balancer_node_label_plural
|
58
|
+
'Load Balancer Nodes'
|
59
|
+
end
|
60
|
+
|
61
|
+
def format_load_balancer_pool_status(record, return_color=cyan)
|
62
|
+
out = ""
|
63
|
+
status_string = record['status']
|
64
|
+
if status_string.nil? || status_string.empty? || status_string == "unknown"
|
65
|
+
out << "#{white}UNKNOWN#{return_color}"
|
66
|
+
elsif status_string == 'ok'
|
67
|
+
out << "#{green}#{status_string.upcase}#{return_color}"
|
68
|
+
elsif status_string == 'warning'
|
69
|
+
out << "#{yellow}#{status_string.upcase}#{return_color}"
|
70
|
+
else
|
71
|
+
out << "#{red}#{status_string ? status_string.upcase : 'N/A'}#{record['statusMessage'] ? "#{return_color} - #{record['statusMessage']}" : ''}#{return_color}"
|
72
|
+
end
|
73
|
+
out
|
74
|
+
end
|
75
|
+
|
76
|
+
def load_option_types_for_load_balancer_node(type_record, parent_record)
|
77
|
+
load_balancer_pool = parent_record
|
78
|
+
load_balancer_type = find_by_id(:load_balancer_type, load_balancer_pool['loadBalancer']['type']['id'])
|
79
|
+
load_balancer_type['nodeOptionTypes']
|
80
|
+
end
|
81
|
+
|
82
|
+
def find_load_balancer_node_by_name_or_id(parent_id, val)
|
83
|
+
(@load_balancer_pool_nodes_interface.get(parent_id, val)['loadBalancerNode']) rescue nil
|
84
|
+
end
|
85
|
+
## using CliCommand's generic find_by methods
|
86
|
+
|
87
|
+
end
|
@@ -8,12 +8,14 @@ class Morpheus::Cli::LoadBalancerPools
|
|
8
8
|
|
9
9
|
set_command_description "View and manage load balancer pools."
|
10
10
|
set_command_name :'load-balancer-pools'
|
11
|
-
register_subcommands :list, :get, :add, :update, :remove
|
12
|
-
register_interfaces :load_balancer_pools,
|
13
|
-
:load_balancers, :load_balancer_types
|
14
11
|
|
12
|
+
set_rest_interface_name :load_balancer_pools_secondary
|
15
13
|
set_rest_parent_name :load_balancers
|
16
14
|
|
15
|
+
register_subcommands :list, :get, :add, :update, :remove
|
16
|
+
register_interfaces :load_balancers, :load_balancer_types
|
17
|
+
|
18
|
+
|
17
19
|
# set_rest_interface_name :load_balancer_pools
|
18
20
|
# set_parent_rest_interface_name :load_balancers
|
19
21
|
|
@@ -30,6 +32,7 @@ class Morpheus::Cli::LoadBalancerPools
|
|
30
32
|
"Name" => 'name',
|
31
33
|
#"Load Balancer" => lambda {|it| it['loadBalancer'] ? it['loadBalancer']['name'] : '' },
|
32
34
|
"Balancer Mode" => lambda {|it| it['vipBalance'] },
|
35
|
+
"Status" => lambda {|it| format_load_balancer_pool_status(it) }
|
33
36
|
}
|
34
37
|
end
|
35
38
|
|
@@ -68,7 +71,7 @@ class Morpheus::Cli::LoadBalancerPools
|
|
68
71
|
status_string = record['status']
|
69
72
|
if status_string.nil? || status_string.empty? || status_string == "unknown"
|
70
73
|
out << "#{white}UNKNOWN#{return_color}"
|
71
|
-
elsif status_string == 'ok'
|
74
|
+
elsif status_string == 'online' || status_string == 'ok'
|
72
75
|
out << "#{green}#{status_string.upcase}#{return_color}"
|
73
76
|
elsif status_string == 'syncing'
|
74
77
|
out << "#{yellow}#{status_string.upcase}#{return_color}"
|