morpheus-cli 3.6.8 → 3.6.9
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/morpheus/api/account_groups_interface.rb +2 -2
- data/lib/morpheus/api/accounts_interface.rb +4 -7
- data/lib/morpheus/api/api_client.rb +207 -70
- data/lib/morpheus/api/app_templates_interface.rb +7 -28
- data/lib/morpheus/api/apps_interface.rb +14 -21
- data/lib/morpheus/api/archive_buckets_interface.rb +2 -2
- data/lib/morpheus/api/archive_files_interface.rb +6 -6
- data/lib/morpheus/api/auth_interface.rb +14 -1
- data/lib/morpheus/api/blueprints_interface.rb +9 -16
- data/lib/morpheus/api/cloud_datastores_interface.rb +1 -1
- data/lib/morpheus/api/cloud_policies_interface.rb +1 -1
- data/lib/morpheus/api/clouds_interface.rb +18 -21
- data/lib/morpheus/api/cypher_interface.rb +19 -28
- data/lib/morpheus/api/file_copy_request_interface.rb +1 -1
- data/lib/morpheus/api/group_policies_interface.rb +1 -1
- data/lib/morpheus/api/groups_interface.rb +4 -4
- data/lib/morpheus/api/image_builder_boot_scripts_interface.rb +1 -1
- data/lib/morpheus/api/image_builder_image_builds_interface.rb +2 -2
- data/lib/morpheus/api/image_builder_preseed_scripts_interface.rb +1 -1
- data/lib/morpheus/api/instances_interface.rb +17 -23
- data/lib/morpheus/api/logs_interface.rb +7 -10
- data/lib/morpheus/api/network_domains_interface.rb +1 -1
- data/lib/morpheus/api/network_groups_interface.rb +1 -1
- data/lib/morpheus/api/network_pool_servers_interface.rb +1 -1
- data/lib/morpheus/api/network_pools_interface.rb +1 -1
- data/lib/morpheus/api/network_proxies_interface.rb +1 -1
- data/lib/morpheus/api/network_services_interface.rb +1 -1
- data/lib/morpheus/api/networks_interface.rb +1 -1
- data/lib/morpheus/api/old_cypher_interface.rb +55 -0
- data/lib/morpheus/api/packages_interface.rb +1 -1
- data/lib/morpheus/api/policies_interface.rb +1 -1
- data/lib/morpheus/api/setup_interface.rb +1 -1
- data/lib/morpheus/api/storage_providers_interface.rb +1 -1
- data/lib/morpheus/api/whoami_interface.rb +1 -1
- data/lib/morpheus/benchmarking.rb +277 -0
- data/lib/morpheus/cli.rb +6 -22
- data/lib/morpheus/cli/access_token_command.rb +172 -0
- data/lib/morpheus/cli/accounts.rb +5 -0
- data/lib/morpheus/cli/apps.rb +93 -37
- data/lib/morpheus/cli/archives_command.rb +0 -2
- data/lib/morpheus/cli/auth_command.rb +112 -0
- data/lib/morpheus/cli/blueprints_command.rb +50 -13
- data/lib/morpheus/cli/change_password_command.rb +148 -0
- data/lib/morpheus/cli/cli_command.rb +173 -49
- data/lib/morpheus/cli/clouds.rb +15 -5
- data/lib/morpheus/cli/command_error.rb +7 -1
- data/lib/morpheus/cli/{alias_command.rb → commands/standard/alias_command.rb} +79 -51
- data/lib/morpheus/cli/commands/standard/benchmark_command.rb +399 -0
- data/lib/morpheus/cli/commands/standard/coloring_command.rb +60 -0
- data/lib/morpheus/cli/{curl_command.rb → commands/standard/curl_command.rb} +0 -7
- data/lib/morpheus/cli/commands/standard/debug_command.rb +61 -0
- data/lib/morpheus/cli/{echo_command.rb → commands/standard/echo_command.rb} +1 -1
- data/lib/morpheus/cli/{edit_profile_command.rb → commands/standard/edit_profile_command.rb} +0 -0
- data/lib/morpheus/cli/{edit_rc_command.rb → commands/standard/edit_rc_command.rb} +0 -0
- data/lib/morpheus/cli/commands/standard/get_prompt_command.rb +39 -0
- data/lib/morpheus/cli/commands/standard/history_command.rb +76 -0
- data/lib/morpheus/cli/{log_level_command.rb → commands/standard/log_level_command.rb} +1 -1
- data/lib/morpheus/cli/{man_command.rb → commands/standard/man_command.rb} +2 -2
- data/lib/morpheus/cli/commands/standard/rm_command.rb +14 -0
- data/lib/morpheus/cli/commands/standard/set_prompt_command.rb +54 -0
- data/lib/morpheus/cli/{sleep_command.rb → commands/standard/sleep_command.rb} +0 -0
- data/lib/morpheus/cli/{source_command.rb → commands/standard/source_command.rb} +0 -0
- data/lib/morpheus/cli/{ssl_verification_command.rb → commands/standard/ssl_verification_command.rb} +1 -1
- data/lib/morpheus/cli/commands/standard/tee_command.rb +14 -0
- data/lib/morpheus/cli/{version_command.rb → commands/standard/version_command.rb} +0 -0
- data/lib/morpheus/cli/credentials.rb +276 -87
- data/lib/morpheus/cli/cypher_command.rb +333 -214
- data/lib/morpheus/cli/error_handler.rb +12 -2
- data/lib/morpheus/cli/groups.rb +44 -20
- data/lib/morpheus/cli/hosts.rb +39 -16
- data/lib/morpheus/cli/instances.rb +114 -62
- data/lib/morpheus/cli/login.rb +74 -21
- data/lib/morpheus/cli/logout.rb +3 -4
- data/lib/morpheus/cli/mixins/accounts_helper.rb +50 -18
- data/lib/morpheus/cli/mixins/print_helper.rb +207 -42
- data/lib/morpheus/cli/old_cypher_command.rb +414 -0
- data/lib/morpheus/cli/option_parser.rb +6 -1
- data/lib/morpheus/cli/processes_command.rb +3 -0
- data/lib/morpheus/cli/remote.rb +11 -17
- data/lib/morpheus/cli/roles.rb +17 -17
- data/lib/morpheus/cli/security_groups.rb +47 -17
- data/lib/morpheus/cli/shell.rb +139 -79
- data/lib/morpheus/cli/tenants_command.rb +353 -0
- data/lib/morpheus/cli/users.rb +26 -18
- data/lib/morpheus/cli/version.rb +1 -1
- data/lib/morpheus/cli/whoami.rb +14 -10
- data/lib/morpheus/formatters.rb +4 -4
- data/lib/morpheus/logging.rb +16 -8
- data/lib/morpheus/terminal.rb +63 -34
- metadata +28 -15
- data/lib/morpheus/cli/coloring_command.rb +0 -45
- data/lib/morpheus/cli/set_prompt_command.rb +0 -51
@@ -48,7 +48,7 @@ class Morpheus::FileCopyRequestInterface < Morpheus::APIClient
|
|
48
48
|
url = "#{@base_url}/api/file-copy-request/download/#{URI.escape(id)}"
|
49
49
|
headers = { params: params, authorization: "Bearer #{@access_token}" }
|
50
50
|
opts = {method: :get, url: url, headers: headers}
|
51
|
-
# execute(opts, false)
|
51
|
+
# execute(opts, {parse_json: false})
|
52
52
|
if Dir.exists?(outfile)
|
53
53
|
raise "outfile is invalid. It is the name of an existing directory: #{outfile}"
|
54
54
|
end
|
@@ -40,7 +40,7 @@ class Morpheus::GroupPoliciesInterface < Morpheus::APIClient
|
|
40
40
|
def destroy(group_id, id, params={})
|
41
41
|
url = "#{@base_url}/api/groups/#{group_id}/policies/#{id}"
|
42
42
|
headers = { :params => params, :authorization => "Bearer #{@access_token}", 'Content-Type' => 'application/json' }
|
43
|
-
opts = {method: :delete, url: url,
|
43
|
+
opts = {method: :delete, url: url, headers: headers}
|
44
44
|
execute(opts)
|
45
45
|
end
|
46
46
|
|
@@ -20,7 +20,7 @@ class Morpheus::GroupsInterface < Morpheus::APIClient
|
|
20
20
|
elsif options.is_a?(String)
|
21
21
|
headers[:params]['name'] = options
|
22
22
|
end
|
23
|
-
opts = {method: :get, url: url,
|
23
|
+
opts = {method: :get, url: url, headers: headers}
|
24
24
|
execute(opts)
|
25
25
|
end
|
26
26
|
|
@@ -28,7 +28,7 @@ class Morpheus::GroupsInterface < Morpheus::APIClient
|
|
28
28
|
url = "#{@base_url}/api/groups"
|
29
29
|
headers = { :authorization => "Bearer #{@access_token}", 'Content-Type' => 'application/json' }
|
30
30
|
payload = options
|
31
|
-
opts = {method: :post, url: url,
|
31
|
+
opts = {method: :post, url: url, headers: headers, payload: payload.to_json}
|
32
32
|
execute(opts)
|
33
33
|
end
|
34
34
|
|
@@ -43,7 +43,7 @@ class Morpheus::GroupsInterface < Morpheus::APIClient
|
|
43
43
|
def destroy(id)
|
44
44
|
url = "#{@base_url}/api/groups/#{id}"
|
45
45
|
headers = { :authorization => "Bearer #{@access_token}", 'Content-Type' => 'application/json' }
|
46
|
-
opts = {method: :delete, url: url,
|
46
|
+
opts = {method: :delete, url: url, headers: headers}
|
47
47
|
execute(opts)
|
48
48
|
end
|
49
49
|
|
@@ -51,7 +51,7 @@ class Morpheus::GroupsInterface < Morpheus::APIClient
|
|
51
51
|
url = "#{@base_url}/api/groups/#{id}/update-zones"
|
52
52
|
headers = { :authorization => "Bearer #{@access_token}", 'Content-Type' => 'application/json' }
|
53
53
|
payload = options
|
54
|
-
opts = {method: :put, url: url,
|
54
|
+
opts = {method: :put, url: url, headers: headers, payload: payload.to_json}
|
55
55
|
execute(opts)
|
56
56
|
end
|
57
57
|
end
|
@@ -40,7 +40,7 @@ class Morpheus::ImageBuilderBootScriptsInterface < Morpheus::APIClient
|
|
40
40
|
def destroy(id, params={})
|
41
41
|
url = "#{@base_url}/api/boot-scripts/#{id}"
|
42
42
|
headers = { :params => params, :authorization => "Bearer #{@access_token}", 'Content-Type' => 'application/json' }
|
43
|
-
opts = {method: :delete, url: url,
|
43
|
+
opts = {method: :delete, url: url, headers: headers}
|
44
44
|
execute(opts)
|
45
45
|
end
|
46
46
|
|
@@ -47,14 +47,14 @@ class Morpheus::ImageBuilderImageBuildsInterface < Morpheus::APIClient
|
|
47
47
|
def destroy(id, params={})
|
48
48
|
url = "#{@base_url}/api/image-builds/#{id}"
|
49
49
|
headers = { :params => params, :authorization => "Bearer #{@access_token}", 'Content-Type' => 'application/json' }
|
50
|
-
opts = {method: :delete, url: url,
|
50
|
+
opts = {method: :delete, url: url, headers: headers}
|
51
51
|
execute(opts)
|
52
52
|
end
|
53
53
|
|
54
54
|
def run(id, params={})
|
55
55
|
url = "#{@base_url}/api/image-builds/#{id}/run"
|
56
56
|
headers = { :params => params, :authorization => "Bearer #{@access_token}", 'Content-Type' => 'application/json' }
|
57
|
-
opts = {method: :post, url: url,
|
57
|
+
opts = {method: :post, url: url, headers: headers}
|
58
58
|
execute(opts)
|
59
59
|
end
|
60
60
|
|
@@ -40,7 +40,7 @@ class Morpheus::ImageBuilderPreseedScriptsInterface < Morpheus::APIClient
|
|
40
40
|
def destroy(id, params={})
|
41
41
|
url = "#{@base_url}/api/preseed-scripts/#{id}"
|
42
42
|
headers = { :params => params, :authorization => "Bearer #{@access_token}", 'Content-Type' => 'application/json' }
|
43
|
-
opts = {method: :delete, url: url,
|
43
|
+
opts = {method: :delete, url: url, headers: headers}
|
44
44
|
execute(opts)
|
45
45
|
end
|
46
46
|
|
@@ -8,36 +8,34 @@ class Morpheus::InstancesInterface < Morpheus::APIClient
|
|
8
8
|
@expires_at = expires_at
|
9
9
|
end
|
10
10
|
|
11
|
-
def get(
|
11
|
+
def get(params={})
|
12
12
|
url = "#{@base_url}/api/instances"
|
13
13
|
headers = { params: {}, authorization: "Bearer #{@access_token}" }
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
headers[:params]['name'] = options
|
14
|
+
if params.is_a?(Hash)
|
15
|
+
headers[:params].merge!(params)
|
16
|
+
elsif params.is_a?(Numeric)
|
17
|
+
url = "#{@base_url}/api/instances/#{params}"
|
18
|
+
elsif params.is_a?(String)
|
19
|
+
headers[:params]['name'] = params
|
21
20
|
end
|
22
21
|
opts = {method: :get, url: url, headers: headers}
|
23
22
|
execute(opts)
|
24
23
|
end
|
25
24
|
|
26
|
-
def list(
|
27
|
-
get(
|
25
|
+
def list(params={})
|
26
|
+
get(params)
|
28
27
|
end
|
29
28
|
|
30
|
-
def get_envs(id,
|
29
|
+
def get_envs(id, params={})
|
31
30
|
url = "#{@base_url}/api/instances/#{id}/envs"
|
32
|
-
headers = { params:
|
31
|
+
headers = { params: params, authorization: "Bearer #{@access_token}" }
|
33
32
|
opts = {method: :get, url: url, headers: headers}
|
34
33
|
execute(opts)
|
35
34
|
end
|
36
35
|
|
37
|
-
def create_env(id,
|
36
|
+
def create_env(id, payload={})
|
38
37
|
url = "#{@base_url}/api/instances/#{id}/envs"
|
39
38
|
headers = { :authorization => "Bearer #{@access_token}", 'Content-Type' => 'application/json' }
|
40
|
-
payload = options
|
41
39
|
opts = {method: :post, url: url, headers: headers, payload: payload.to_json}
|
42
40
|
execute(opts)
|
43
41
|
end
|
@@ -49,18 +47,16 @@ class Morpheus::InstancesInterface < Morpheus::APIClient
|
|
49
47
|
execute(opts)
|
50
48
|
end
|
51
49
|
|
52
|
-
def create(
|
50
|
+
def create(payload)
|
53
51
|
url = "#{@base_url}/api/instances"
|
54
52
|
headers = { :authorization => "Bearer #{@access_token}", 'Content-Type' => 'application/json' }
|
55
|
-
payload = options
|
56
53
|
opts = {method: :post, url: url, headers: headers, payload: payload.to_json}
|
57
54
|
execute(opts)
|
58
55
|
end
|
59
56
|
|
60
|
-
def update(id,
|
57
|
+
def update(id, payload)
|
61
58
|
url = "#{@base_url}/api/instances/#{id}"
|
62
59
|
headers = { :authorization => "Bearer #{@access_token}", 'Content-Type' => 'application/json' }
|
63
|
-
payload = options
|
64
60
|
opts = {method: :put, url: url, headers: headers, payload: payload.to_json}
|
65
61
|
execute(opts)
|
66
62
|
end
|
@@ -180,10 +176,9 @@ class Morpheus::InstancesInterface < Morpheus::APIClient
|
|
180
176
|
execute(opts)
|
181
177
|
end
|
182
178
|
|
183
|
-
def clone(id,
|
179
|
+
def clone(id, payload)
|
184
180
|
url = "#{@base_url}/api/instances/#{id}/clone"
|
185
181
|
headers = {:authorization => "Bearer #{@access_token}", 'Content-Type' => 'application/json' }
|
186
|
-
payload = options
|
187
182
|
opts = {method: :put, url: url, headers: headers, payload: payload.to_json}
|
188
183
|
execute(opts)
|
189
184
|
end
|
@@ -209,10 +204,9 @@ class Morpheus::InstancesInterface < Morpheus::APIClient
|
|
209
204
|
execute(opts)
|
210
205
|
end
|
211
206
|
|
212
|
-
def apply_security_groups(id,
|
207
|
+
def apply_security_groups(id, payload)
|
213
208
|
url = "#{@base_url}/api/instances/#{id}/security-groups"
|
214
209
|
headers = { :authorization => "Bearer #{@access_token}", 'Content-Type' => 'application/json' }
|
215
|
-
payload = options
|
216
210
|
opts = {method: :post, url: url, headers: headers, payload: payload.to_json}
|
217
211
|
execute(opts)
|
218
212
|
end
|
@@ -223,7 +217,7 @@ class Morpheus::InstancesInterface < Morpheus::APIClient
|
|
223
217
|
execute(opts)
|
224
218
|
end
|
225
219
|
|
226
|
-
def service_plans(params)
|
220
|
+
def service_plans(params={})
|
227
221
|
url = "#{@base_url}/api/instances/service-plans"
|
228
222
|
headers = { params: params, authorization: "Bearer #{@access_token}" }
|
229
223
|
opts = {method: :get, url: url, headers: headers}
|
@@ -8,25 +8,22 @@ class Morpheus::LogsInterface < Morpheus::APIClient
|
|
8
8
|
@expires_at = expires_at
|
9
9
|
end
|
10
10
|
|
11
|
-
def container_logs(containers=[],
|
11
|
+
def container_logs(containers=[], params={})
|
12
12
|
url = "#{@base_url}/api/logs"
|
13
|
-
headers = { params: {'containers' => containers}.merge(
|
14
|
-
|
15
|
-
execute(opts)
|
13
|
+
headers = { params: {'containers' => containers}.merge(params), authorization: "Bearer #{@access_token}" }
|
14
|
+
execute({method: :get, url: url, headers: headers})
|
16
15
|
end
|
17
16
|
|
18
|
-
def server_logs(servers=[],
|
17
|
+
def server_logs(servers=[], params={})
|
19
18
|
url = "#{@base_url}/api/logs"
|
20
|
-
headers = { params: {'servers' => servers}.merge(
|
21
|
-
|
22
|
-
execute(opts)
|
19
|
+
headers = { params: {'servers' => servers}.merge(params), authorization: "Bearer #{@access_token}" }
|
20
|
+
execute({method: :get, url: url, headers: headers})
|
23
21
|
end
|
24
22
|
|
25
23
|
def stats()
|
26
24
|
url = "#{@base_url}/api/logs/log-stats"
|
27
25
|
headers = { params: {}, authorization: "Bearer #{@access_token}" }
|
28
|
-
|
29
|
-
execute(opts)
|
26
|
+
execute({method: :get, url: url, headers: headers})
|
30
27
|
end
|
31
28
|
|
32
29
|
|
@@ -40,7 +40,7 @@ class Morpheus::NetworkDomainsInterface < Morpheus::APIClient
|
|
40
40
|
def destroy(id, params={})
|
41
41
|
url = "#{@base_url}/api/networks/domains/#{id}"
|
42
42
|
headers = { :params => params, :authorization => "Bearer #{@access_token}", 'Content-Type' => 'application/json' }
|
43
|
-
opts = {method: :delete, url: url,
|
43
|
+
opts = {method: :delete, url: url, headers: headers}
|
44
44
|
execute(opts)
|
45
45
|
end
|
46
46
|
|
@@ -40,7 +40,7 @@ class Morpheus::NetworkGroupsInterface < Morpheus::APIClient
|
|
40
40
|
def destroy(id, params={})
|
41
41
|
url = "#{@base_url}/api/networks/groups/#{id}"
|
42
42
|
headers = { :params => params, :authorization => "Bearer #{@access_token}", 'Content-Type' => 'application/json' }
|
43
|
-
opts = {method: :delete, url: url,
|
43
|
+
opts = {method: :delete, url: url, headers: headers}
|
44
44
|
execute(opts)
|
45
45
|
end
|
46
46
|
|
@@ -40,7 +40,7 @@ class Morpheus::NetworkPoolServersInterface < Morpheus::APIClient
|
|
40
40
|
def destroy(id, params={})
|
41
41
|
url = "#{@base_url}/api/networks/pool-servers/#{id}"
|
42
42
|
headers = { :params => params, :authorization => "Bearer #{@access_token}", 'Content-Type' => 'application/json' }
|
43
|
-
opts = {method: :delete, url: url,
|
43
|
+
opts = {method: :delete, url: url, headers: headers}
|
44
44
|
execute(opts)
|
45
45
|
end
|
46
46
|
|
@@ -40,7 +40,7 @@ class Morpheus::NetworkPoolsInterface < Morpheus::APIClient
|
|
40
40
|
def destroy(id, params={})
|
41
41
|
url = "#{@base_url}/api/networks/pools/#{id}"
|
42
42
|
headers = { :params => params, :authorization => "Bearer #{@access_token}", 'Content-Type' => 'application/json' }
|
43
|
-
opts = {method: :delete, url: url,
|
43
|
+
opts = {method: :delete, url: url, headers: headers}
|
44
44
|
execute(opts)
|
45
45
|
end
|
46
46
|
|
@@ -40,7 +40,7 @@ class Morpheus::NetworkProxiesInterface < Morpheus::APIClient
|
|
40
40
|
def destroy(id, params={})
|
41
41
|
url = "#{@base_url}/api/networks/proxies/#{id}"
|
42
42
|
headers = { :params => params, :authorization => "Bearer #{@access_token}", 'Content-Type' => 'application/json' }
|
43
|
-
opts = {method: :delete, url: url,
|
43
|
+
opts = {method: :delete, url: url, headers: headers}
|
44
44
|
execute(opts)
|
45
45
|
end
|
46
46
|
|
@@ -40,7 +40,7 @@ class Morpheus::NetworkServicesInterface < Morpheus::APIClient
|
|
40
40
|
# def destroy(id, params={})
|
41
41
|
# url = "#{@base_url}/api/networks/services/#{id}"
|
42
42
|
# headers = { :params => params, :authorization => "Bearer #{@access_token}", 'Content-Type' => 'application/json' }
|
43
|
-
# opts = {method: :delete, url: url,
|
43
|
+
# opts = {method: :delete, url: url, headers: headers}
|
44
44
|
# execute(opts)
|
45
45
|
# end
|
46
46
|
|
@@ -40,7 +40,7 @@ class Morpheus::NetworksInterface < Morpheus::APIClient
|
|
40
40
|
def destroy(id, params={})
|
41
41
|
url = "#{@base_url}/api/networks/#{id}"
|
42
42
|
headers = { :params => params, :authorization => "Bearer #{@access_token}", 'Content-Type' => 'application/json' }
|
43
|
-
opts = {method: :delete, url: url,
|
43
|
+
opts = {method: :delete, url: url, headers: headers}
|
44
44
|
execute(opts)
|
45
45
|
end
|
46
46
|
|
@@ -0,0 +1,55 @@
|
|
1
|
+
require 'morpheus/api/api_client'
|
2
|
+
require 'uri'
|
3
|
+
|
4
|
+
class Morpheus::OldCypherInterface < Morpheus::APIClient
|
5
|
+
def initialize(access_token, refresh_token,expires_at = nil, base_url=nil)
|
6
|
+
@access_token = access_token
|
7
|
+
@refresh_token = refresh_token
|
8
|
+
@base_url = base_url
|
9
|
+
@expires_at = expires_at
|
10
|
+
end
|
11
|
+
|
12
|
+
def get(id, params={})
|
13
|
+
raise "#{self.class}.get() passed a blank id!" if id.to_s == ''
|
14
|
+
url = "#{@base_url}/api/cypher/#{id}"
|
15
|
+
headers = { params: params, authorization: "Bearer #{@access_token}" }
|
16
|
+
opts = {method: :get, url: url, headers: headers}
|
17
|
+
execute(opts)
|
18
|
+
end
|
19
|
+
|
20
|
+
def list(params={})
|
21
|
+
url = "#{@base_url}/api/cypher"
|
22
|
+
headers = { params: params, authorization: "Bearer #{@access_token}" }
|
23
|
+
opts = {method: :get, url: url, headers: headers}
|
24
|
+
execute(opts)
|
25
|
+
end
|
26
|
+
|
27
|
+
def create(payload)
|
28
|
+
url = "#{@base_url}/api/cypher"
|
29
|
+
headers = { :authorization => "Bearer #{@access_token}", 'Content-Type' => 'application/json' }
|
30
|
+
opts = {method: :post, url: url, headers: headers, payload: payload.to_json}
|
31
|
+
execute(opts)
|
32
|
+
end
|
33
|
+
|
34
|
+
def update(id, payload)
|
35
|
+
url = "#{@base_url}/api/cypher/#{id}"
|
36
|
+
headers = { :authorization => "Bearer #{@access_token}", 'Content-Type' => 'application/json' }
|
37
|
+
opts = {method: :put, url: url, headers: headers, payload: payload.to_json}
|
38
|
+
execute(opts)
|
39
|
+
end
|
40
|
+
|
41
|
+
def destroy(id, params={})
|
42
|
+
url = "#{@base_url}/api/cypher/#{id}"
|
43
|
+
headers = { :params => params, :authorization => "Bearer #{@access_token}", 'Content-Type' => 'application/json' }
|
44
|
+
opts = {method: :delete, url: url, headers: headers}
|
45
|
+
execute(opts)
|
46
|
+
end
|
47
|
+
|
48
|
+
def decrypt(id, params={})
|
49
|
+
url = "#{@base_url}/api/cypher/#{id}/decrypt"
|
50
|
+
headers = { params: params, authorization: "Bearer #{@access_token}" }
|
51
|
+
opts = {method: :get, url: url, headers: headers}
|
52
|
+
execute(opts)
|
53
|
+
end
|
54
|
+
|
55
|
+
end
|
@@ -84,7 +84,7 @@ class Morpheus::PackagesInterface < Morpheus::APIClient
|
|
84
84
|
url = "#{@base_url}/api/packages/export"
|
85
85
|
headers = { params: params, authorization: "Bearer #{@access_token}" }
|
86
86
|
opts = {method: :post, url: url, headers: headers}
|
87
|
-
# execute(opts, false)
|
87
|
+
# execute(opts, {parse_json: false})
|
88
88
|
if Dir.exists?(outfile)
|
89
89
|
raise "outfile is invalid. It is the name of an existing directory: #{outfile}"
|
90
90
|
end
|
@@ -41,7 +41,7 @@ class Morpheus::PoliciesInterface < Morpheus::APIClient
|
|
41
41
|
def destroy(id, params={})
|
42
42
|
url = "#{@base_url}/api/policies/#{id}"
|
43
43
|
headers = { :params => params, :authorization => "Bearer #{@access_token}", 'Content-Type' => 'application/json' }
|
44
|
-
opts = {method: :delete, url: url,
|
44
|
+
opts = {method: :delete, url: url, headers: headers}
|
45
45
|
execute(opts)
|
46
46
|
end
|
47
47
|
|
@@ -17,7 +17,7 @@ class Morpheus::SetupInterface < Morpheus::APIClient
|
|
17
17
|
url = "#{@base_url}/ping"
|
18
18
|
headers = {:params => params }
|
19
19
|
opts = {method: :get, url: url, headers: headers, timeout: timeout}
|
20
|
-
execute(opts, false)
|
20
|
+
execute(opts, {parse_json: false})
|
21
21
|
end
|
22
22
|
|
23
23
|
def check(params={}, timeout=5)
|
@@ -41,7 +41,7 @@ class Morpheus::StorageProvidersInterface < Morpheus::APIClient
|
|
41
41
|
def destroy(id, params={})
|
42
42
|
url = "#{@base_url}/api/storage/buckets/#{id}"
|
43
43
|
headers = { :params => params, :authorization => "Bearer #{@access_token}", 'Content-Type' => 'application/json' }
|
44
|
-
opts = {method: :delete, url: url,
|
44
|
+
opts = {method: :delete, url: url, headers: headers}
|
45
45
|
execute(opts)
|
46
46
|
end
|
47
47
|
|
@@ -8,7 +8,7 @@ class Morpheus::WhoamiInterface < Morpheus::APIClient
|
|
8
8
|
@expires_at = expires_at
|
9
9
|
end
|
10
10
|
|
11
|
-
def get()
|
11
|
+
def get(params={})
|
12
12
|
url = "#{@base_url}/api/whoami"
|
13
13
|
headers = { params: {}, authorization: "Bearer #{@access_token}" }
|
14
14
|
execute(method: :get, url: url, headers: headers, timeout: 5)
|
@@ -0,0 +1,277 @@
|
|
1
|
+
require 'securerandom'
|
2
|
+
require 'morpheus/logging'
|
3
|
+
|
4
|
+
# Provides global Benchmarking functionality
|
5
|
+
# This provides a store of benchmarking records which can be looked up by name.
|
6
|
+
# There is also a global enabled flag that can be used.
|
7
|
+
# There is a mixin HasBenchmarking which provides start_benchmark(), stop_benchmark() and with_benchmark()
|
8
|
+
#
|
9
|
+
module Morpheus::Benchmarking
|
10
|
+
|
11
|
+
# a global toggle switch for benchmarking
|
12
|
+
@@enabled = false
|
13
|
+
|
14
|
+
def self.enabled?
|
15
|
+
@@enabled
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.enabled
|
19
|
+
@@enabled
|
20
|
+
end
|
21
|
+
|
22
|
+
def self.enabled=(val)
|
23
|
+
@@enabled = !!val
|
24
|
+
end
|
25
|
+
|
26
|
+
# internal Array to store benchmark records for recording
|
27
|
+
# todo: garbage cleanup, roll these off to disk probably.
|
28
|
+
@@benchmark_record_list = []
|
29
|
+
def self.benchmark_record_list
|
30
|
+
@@benchmark_record_list
|
31
|
+
end
|
32
|
+
|
33
|
+
# internal Hash to lookup benchmark records by id
|
34
|
+
@@benchmark_id_store = {}
|
35
|
+
def self.benchmark_id_store
|
36
|
+
@@benchmark_id_store
|
37
|
+
end
|
38
|
+
|
39
|
+
# internal Hash to lookup benchmark records by name
|
40
|
+
@@benchmark_name_store = {}
|
41
|
+
def self.benchmark_name_store
|
42
|
+
@@benchmark_name_store
|
43
|
+
end
|
44
|
+
|
45
|
+
# start a new BenchmarkRecord
|
46
|
+
# @params opts [String or Hash] String as name like like "my routine" or with a Hash like {name: "my routine"}
|
47
|
+
# Just a String for name is fine because there are no other settings of interest at the moment.
|
48
|
+
# Optional, a test can be created without a name. A random :id will be available in the response.
|
49
|
+
# Examples:
|
50
|
+
# Morpheus::Benchmarking.start()
|
51
|
+
# Morpheus::Benchmarking.start("my routine")
|
52
|
+
# @returns BenchmarkRecord that looks like {id: ID, name:"my routine",start_time:Time}
|
53
|
+
def self.start(opts={})
|
54
|
+
benchmark_record = BenchmarkRecord.new(opts)
|
55
|
+
benchmark_record_list << benchmark_record
|
56
|
+
# index name and id
|
57
|
+
if benchmark_record.name
|
58
|
+
benchmark_name_store[benchmark_record.name.to_s] = benchmark_record
|
59
|
+
end
|
60
|
+
if benchmark_record.id
|
61
|
+
benchmark_id_store[benchmark_record.id.to_s] = benchmark_record
|
62
|
+
end
|
63
|
+
#benchmark_record.start() # initialize does it
|
64
|
+
return benchmark_record
|
65
|
+
end
|
66
|
+
|
67
|
+
# stop a BenchmarkRecord identified by name or options
|
68
|
+
# maybe: if opts is nil, the last record is returned
|
69
|
+
# @params opts [String or Hash] String as name like like "my routine" or with a Hash like {name: "my routine"} or {id:ID}
|
70
|
+
# @returns BenchmarkRecord that looks like {id: ID, name:"my routine",start_time:Time}
|
71
|
+
def self.stop(opts, exit_code=0, error=nil)
|
72
|
+
benchmark_record = self.lookup(opts)
|
73
|
+
if benchmark_record
|
74
|
+
benchmark_record.stop(exit_code, error)
|
75
|
+
return benchmark_record
|
76
|
+
else
|
77
|
+
return nil
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
# lookup a BenchmarkRecord identified by name or options, usually just name.
|
82
|
+
# @params cmd [String or Hash] Name like "my routine" or with a Hash like {id: ID}
|
83
|
+
# @returns BenchmarkRecord that looks like {id: ID, name:"my routine",start_time:Time}
|
84
|
+
def self.lookup(opts={})
|
85
|
+
benchmark_record = nil
|
86
|
+
if opts.nil? || opts.empty?
|
87
|
+
benchmark_record = nil
|
88
|
+
elsif opts.is_a?(Hash)
|
89
|
+
if opts[:id]
|
90
|
+
benchmark_record = benchmark_name_store[opts[:id].to_s]
|
91
|
+
elsif opts[:name]
|
92
|
+
benchmark_record = benchmark_id_store[opts[:name].to_s]
|
93
|
+
end
|
94
|
+
elsif opts.is_a?(String) || opts.is_a?(Symbol)
|
95
|
+
benchmark_record = benchmark_name_store[opts.to_s] || benchmark_id_store[opts.to_s]
|
96
|
+
else
|
97
|
+
Morpheus::Logging::DarkPrinter.puts "Benchmarking lookup passed a bad lookup argument: #{opts}" if Morpheus::Logging.debug?
|
98
|
+
end
|
99
|
+
# could to slow traversal of benchmark_record_list here..
|
100
|
+
return benchmark_record
|
101
|
+
end
|
102
|
+
|
103
|
+
# get last benchmark started. useful if the name, so `benchmark stop` can work
|
104
|
+
# use a unique name or else your record may be overwritten!
|
105
|
+
def self.last()
|
106
|
+
(@@benchmark_record_list || []).last
|
107
|
+
end
|
108
|
+
|
109
|
+
# Mixin for any class that needs benchmarking
|
110
|
+
module HasBenchmarking
|
111
|
+
|
112
|
+
# true when benchmark is currently running
|
113
|
+
# def benchmarking?
|
114
|
+
# !!@benchmark_record
|
115
|
+
# end
|
116
|
+
|
117
|
+
# def benchmark_record
|
118
|
+
# @benchmark_record
|
119
|
+
# end
|
120
|
+
|
121
|
+
def with_benchmark(opts, &block)
|
122
|
+
exit_code, err = 0, nil
|
123
|
+
begin
|
124
|
+
start_benchmark(opts)
|
125
|
+
if block_given?
|
126
|
+
result = block.call()
|
127
|
+
# exit_code, err = Morpheus::Cli::CliCommand.parse_command_result(result)
|
128
|
+
if result.is_a?(Array)
|
129
|
+
exit_code = result[0]
|
130
|
+
err = result[0]
|
131
|
+
elsif result == true || result == nil
|
132
|
+
exit_code = 0
|
133
|
+
elsif result == false
|
134
|
+
exit_code = 1
|
135
|
+
else
|
136
|
+
exit_code = result
|
137
|
+
end
|
138
|
+
end
|
139
|
+
rescue => ex
|
140
|
+
raise ex
|
141
|
+
# exit_code = 1
|
142
|
+
# err = ex.msg
|
143
|
+
ensure
|
144
|
+
stop_benchmark(exit_code, err)
|
145
|
+
end
|
146
|
+
return exit_code, err
|
147
|
+
end
|
148
|
+
|
149
|
+
def start_benchmark(opts)
|
150
|
+
@benchmark_record = BenchmarkRecord.new(opts)
|
151
|
+
return @benchmark_record
|
152
|
+
end
|
153
|
+
|
154
|
+
# finish the current benchmark and optionally print the time taken.
|
155
|
+
def stop_benchmark(exit_code=0, err=nil)
|
156
|
+
if @benchmark_record
|
157
|
+
@benchmark_record.stop(exit_code, err)
|
158
|
+
@last_benchmark_record = @benchmark_record
|
159
|
+
@benchmark_record = nil
|
160
|
+
return @last_benchmark_record
|
161
|
+
else
|
162
|
+
return nil
|
163
|
+
end
|
164
|
+
end
|
165
|
+
|
166
|
+
end
|
167
|
+
|
168
|
+
# An internal class for modeling benchmark info on a single run.
|
169
|
+
# Examples:
|
170
|
+
# BenchmarkRecord.new()
|
171
|
+
# BenchmarkRecord.new("my routine")
|
172
|
+
# BenchmarkRecord.new({name:"my routine"})
|
173
|
+
class BenchmarkRecord
|
174
|
+
|
175
|
+
attr_reader :id, :name, :command, :start_time, :end_time, :exit_code, :error
|
176
|
+
|
177
|
+
def initialize(opts={})
|
178
|
+
# no info is fine, anonymous benchmark is cool
|
179
|
+
if opts.nil? || opts.empty?
|
180
|
+
opts = {}
|
181
|
+
end
|
182
|
+
# support String
|
183
|
+
opts = opts.is_a?(Hash) ? opts : {name: opts.to_s}
|
184
|
+
@id = opts[:id] || self.object_id
|
185
|
+
@name = opts[:name]
|
186
|
+
#@command = opts[:command]
|
187
|
+
# store the list of commands would be cool... to record adhoc scripts
|
188
|
+
# @commands = []
|
189
|
+
# @commands << @command if @command
|
190
|
+
start()
|
191
|
+
end
|
192
|
+
|
193
|
+
def start()
|
194
|
+
if !@start_time
|
195
|
+
@start_time = Time.now
|
196
|
+
end
|
197
|
+
return self
|
198
|
+
end
|
199
|
+
|
200
|
+
def stop(exit_code=0, error=nil)
|
201
|
+
if !@end_time
|
202
|
+
@end_time = Time.now
|
203
|
+
@exit_code = exit_code
|
204
|
+
@error = error
|
205
|
+
end
|
206
|
+
return self
|
207
|
+
end
|
208
|
+
|
209
|
+
def duration
|
210
|
+
if @start_time && @end_time
|
211
|
+
return @end_time - @start_time
|
212
|
+
elsif @start_time
|
213
|
+
return Time.now - @start_time
|
214
|
+
else
|
215
|
+
return 0
|
216
|
+
end
|
217
|
+
end
|
218
|
+
|
219
|
+
def msg
|
220
|
+
time_str = ""
|
221
|
+
seconds = self.duration
|
222
|
+
if seconds > 0.002
|
223
|
+
seconds = seconds.round(3)
|
224
|
+
else
|
225
|
+
#seconds = seconds.round(3)
|
226
|
+
end
|
227
|
+
duration_str = duration
|
228
|
+
if @start_time && @end_time
|
229
|
+
time_str = "#{seconds} seconds"
|
230
|
+
elsif @start_time
|
231
|
+
time_str = "#{seconds} seconds (running)"
|
232
|
+
else
|
233
|
+
time_str = "(unstarted)"
|
234
|
+
end
|
235
|
+
command_str = "#{@name}" # or "#{@name || @id}"
|
236
|
+
exit_str = "#{@exit_code}"
|
237
|
+
error_str = "#{@error}" # should inspect and format this
|
238
|
+
out = ""
|
239
|
+
|
240
|
+
if @end_time
|
241
|
+
out << "#{command_str.ljust(30, ' ')}"
|
242
|
+
else
|
243
|
+
out << "#{command_str.ljust(30, ' ')}"
|
244
|
+
end
|
245
|
+
|
246
|
+
# if @end_time
|
247
|
+
# out << "finished: #{command_str.ljust(30, ' ')}"
|
248
|
+
# else
|
249
|
+
# out << "running: #{command_str.ljust(30, ' ')}"
|
250
|
+
# end
|
251
|
+
|
252
|
+
#out = "benchmark: #{command_str.ljust(22, ' ')} time: #{time_str.ljust(9, ' ')} exit: #{exit_str.ljust(2, ' ')}"
|
253
|
+
# out = "benchmark: #{command_str.ljust(27, ' ')} time: #{time_str.ljust(9, ' ')} exit: #{exit_str.ljust(2, ' ')}"
|
254
|
+
#out = "time: #{time_str.ljust(9, ' ')} exit: #{exit_str.ljust(2, ' ')} exec: #{command_str}"
|
255
|
+
# how about a command you can copy and paste?
|
256
|
+
# out = "time: #{time_str.ljust(9, ' ')} exit: #{exit_str.ljust(2, ' ')} #{command_str}"
|
257
|
+
# out = "time: #{time_str.ljust(9, ' ')} exit: #{exit_str.ljust(4, ' ')} benchmark exec '#{command_str}'"
|
258
|
+
if @end_time || @exit_code
|
259
|
+
out << "\texit: #{exit_str.ljust(2, ' ')}"
|
260
|
+
end
|
261
|
+
if @end_time && @exit_code != 0 && @error
|
262
|
+
out << "\terror: #{error_str.ljust(12, ' ')}"
|
263
|
+
end
|
264
|
+
|
265
|
+
out << "\t#{time_str.ljust(9, ' ')}"
|
266
|
+
|
267
|
+
|
268
|
+
return out
|
269
|
+
end
|
270
|
+
|
271
|
+
def to_s
|
272
|
+
msg
|
273
|
+
end
|
274
|
+
|
275
|
+
end
|
276
|
+
|
277
|
+
end
|