morpheus-cli 3.6.8 → 3.6.9
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/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
|