morpheus-cli 5.5.2.2 → 5.5.3
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/.gitignore +2 -1
- data/Dockerfile +1 -1
- data/README.md +57 -4
- data/Rakefile +9 -0
- data/bin/morpheus +4 -4
- data/lib/morpheus/api/api_client.rb +8 -2
- data/lib/morpheus/api/archive_buckets_interface.rb +1 -1
- data/lib/morpheus/api/archive_files_interface.rb +3 -3
- data/lib/morpheus/api/clients_interface.rb +2 -2
- data/lib/morpheus/api/clusters_interface.rb +8 -1
- data/lib/morpheus/api/containers_interface.rb +29 -16
- data/lib/morpheus/api/custom_instance_types_interface.rb +0 -2
- data/lib/morpheus/api/doc_interface.rb +8 -6
- data/lib/morpheus/api/file_copy_request_interface.rb +1 -1
- data/lib/morpheus/api/health_interface.rb +1 -1
- data/lib/morpheus/api/image_builder_interface.rb +3 -3
- data/lib/morpheus/api/instances_interface.rb +25 -0
- data/lib/morpheus/api/logs_interface.rb +2 -4
- data/lib/morpheus/api/monitoring_interface.rb +6 -6
- data/lib/morpheus/api/packages_interface.rb +1 -1
- data/lib/morpheus/api/reports_interface.rb +1 -1
- data/lib/morpheus/api/servers_interface.rb +9 -1
- data/lib/morpheus/api/storage_providers_interface.rb +2 -2
- data/lib/morpheus/api/virtual_images_interface.rb +1 -1
- data/lib/morpheus/api.rb +2 -0
- data/lib/morpheus/benchmarking.rb +1 -1
- data/lib/morpheus/cli/cli_command.rb +69 -36
- data/lib/morpheus/cli/cli_registry.rb +19 -10
- data/lib/morpheus/cli/commands/access_token_command.rb +1 -1
- data/lib/morpheus/cli/commands/apps.rb +1 -1
- data/lib/morpheus/cli/commands/archives_command.rb +25 -33
- data/lib/morpheus/cli/commands/blueprints_command.rb +10 -21
- data/lib/morpheus/cli/commands/boot_scripts_command.rb +2 -2
- data/lib/morpheus/cli/commands/cat_command.rb +1 -1
- data/lib/morpheus/cli/commands/catalog_item_types_command.rb +12 -12
- data/lib/morpheus/cli/commands/clouds.rb +3 -3
- data/lib/morpheus/cli/commands/clusters.rb +154 -3
- data/lib/morpheus/cli/commands/containers_command.rb +398 -253
- data/lib/morpheus/cli/commands/deployments.rb +1 -1
- data/lib/morpheus/cli/commands/deploys.rb +9 -9
- data/lib/morpheus/cli/commands/doc.rb +15 -16
- data/lib/morpheus/cli/commands/execution_request_command.rb +2 -2
- data/lib/morpheus/cli/commands/file_copy_request_command.rb +5 -5
- data/lib/morpheus/cli/commands/groups.rb +2 -2
- data/lib/morpheus/cli/commands/health_command.rb +4 -4
- data/lib/morpheus/cli/commands/hosts.rb +43 -5
- data/lib/morpheus/cli/commands/image_builder_command.rb +1 -1
- data/lib/morpheus/cli/commands/instances.rb +419 -148
- data/lib/morpheus/cli/commands/integrations_command.rb +22 -20
- data/lib/morpheus/cli/commands/key_pairs.rb +2 -2
- data/lib/morpheus/cli/commands/library_container_scripts_command.rb +2 -2
- data/lib/morpheus/cli/commands/library_container_templates_command.rb +2 -2
- data/lib/morpheus/cli/commands/library_instance_types_command.rb +3 -3
- data/lib/morpheus/cli/commands/library_spec_templates_command.rb +2 -2
- data/lib/morpheus/cli/commands/login.rb +1 -1
- data/lib/morpheus/cli/commands/man_command.rb +32 -18
- data/lib/morpheus/cli/commands/packages_command.rb +11 -11
- data/lib/morpheus/cli/commands/plugins.rb +1 -1
- data/lib/morpheus/cli/commands/policies_command.rb +4 -4
- data/lib/morpheus/cli/commands/preseed_scripts_command.rb +2 -2
- data/lib/morpheus/cli/commands/remote.rb +1 -1
- data/lib/morpheus/cli/commands/reports_command.rb +3 -3
- data/lib/morpheus/cli/commands/security_groups.rb +1 -1
- data/lib/morpheus/cli/commands/shell.rb +40 -62
- data/lib/morpheus/cli/commands/snapshots.rb +3 -5
- data/lib/morpheus/cli/commands/source_command.rb +8 -16
- data/lib/morpheus/cli/commands/storage_providers_command.rb +7 -7
- data/lib/morpheus/cli/commands/tasks.rb +2 -2
- data/lib/morpheus/cli/commands/vdi_pools_command.rb +6 -6
- data/lib/morpheus/cli/commands/view.rb +5 -1
- data/lib/morpheus/cli/commands/whitelabel_settings_command.rb +4 -4
- data/lib/morpheus/cli/commands/whoami.rb +2 -2
- data/lib/morpheus/cli/credentials.rb +30 -8
- data/lib/morpheus/cli/dot_file.rb +8 -15
- data/lib/morpheus/cli/error_handler.rb +16 -0
- data/lib/morpheus/cli/errors.rb +8 -1
- data/lib/morpheus/cli/mixins/print_helper.rb +17 -13
- data/lib/morpheus/cli/mixins/rest_command.rb +18 -18
- data/lib/morpheus/cli/mixins/secondary_rest_command.rb +12 -12
- data/lib/morpheus/cli/option_parser.rb +5 -1
- data/lib/morpheus/cli/option_types.rb +59 -12
- data/lib/morpheus/cli/version.rb +1 -1
- data/lib/morpheus/cli.rb +26 -16
- data/lib/morpheus/ext/rest_client.rb +3 -2
- data/lib/morpheus/formatters.rb +1 -1
- data/lib/morpheus/logging.rb +4 -4
- data/lib/morpheus/morpkg.rb +4 -4
- data/lib/morpheus/rest_client.rb +2 -2
- data/lib/morpheus/routes.rb +2 -2
- data/lib/morpheus/terminal.rb +65 -16
- data/lib/morpheus.rb +1 -1
- data/morpheus-cli.gemspec +1 -0
- data/test/api/containers_interface_test.rb +68 -0
- data/test/api/doc_interface_test.rb +35 -0
- data/test/api/instances_interface_test.rb +22 -0
- data/test/api/whoami_interface_test.rb +14 -0
- data/test/cli/access_token_test.rb +36 -0
- data/test/cli/auth_test.rb +82 -0
- data/test/cli/cli_test.rb +48 -0
- data/test/cli/containers_test.rb +92 -0
- data/test/cli/doc_test.rb +35 -0
- data/test/cli/help_test.rb +25 -0
- data/test/cli/instances_test.rb +36 -0
- data/test/cli/man_test.rb +14 -0
- data/test/cli/remote_test.rb +89 -0
- data/test/cli/roles_test.rb +34 -0
- data/test/cli/shell_test.rb +81 -0
- data/test/cli/version_test.rb +23 -0
- data/test/cli/view_test.rb +55 -0
- data/test/cli/whoami_test.rb +17 -0
- data/test/morpheus_test.rb +16 -0
- data/test/test_case.rb +338 -0
- data/test/test_config.rb +137 -0
- data/test/test_data_helper.rb +97 -0
- metadata +61 -3
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 52fcaca1c4feaa6a3b07b3ed8772a6765cac55ccbac1b8d79eba9525a859829a
|
|
4
|
+
data.tar.gz: 868ccdde25b11e328c5c275ed61374922f5a287a5d662e5d3901c0218c863808
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 1bff4307ff46a0940add6895b3fa16ac23da050e60ddc9d200d3c1d196eb29d1a3aa82025f203abb12b9f1950dd9fe7e7bf082bc13c797c91494bcf5092990ed
|
|
7
|
+
data.tar.gz: 874cfa21f6d6af7360c13dc504a453f3f7fb1539120c0b91af13a640727b6a19418b7c80912eb18b22dff4b4c94f8dea6f4372ba382ec7153c8936481de1131c
|
data/.gitignore
CHANGED
data/Dockerfile
CHANGED
data/README.md
CHANGED
|
@@ -13,15 +13,21 @@ This library is a Ruby gem that provides a command line interface for interactin
|
|
|
13
13
|
|
|
14
14
|
Install it using rubygems
|
|
15
15
|
|
|
16
|
-
|
|
16
|
+
```shell
|
|
17
|
+
gem install morpheus-cli
|
|
18
|
+
```
|
|
17
19
|
|
|
18
20
|
Or add this line to your application's Gemfile:
|
|
19
21
|
|
|
20
|
-
|
|
22
|
+
```ruby
|
|
23
|
+
gem 'morpheus-cli'
|
|
24
|
+
```
|
|
21
25
|
|
|
22
26
|
And then execute:
|
|
23
27
|
|
|
24
|
-
|
|
28
|
+
```shell
|
|
29
|
+
bundle install
|
|
30
|
+
```
|
|
25
31
|
|
|
26
32
|
## Usage
|
|
27
33
|
|
|
@@ -29,7 +35,7 @@ And then execute:
|
|
|
29
35
|
|
|
30
36
|
This gem installs the [morpheus](https://github.com/gomorpheus/morpheus-cli/wiki/CLI-Manual) binary for running commands in your terminal shell.
|
|
31
37
|
|
|
32
|
-
```
|
|
38
|
+
```shell
|
|
33
39
|
morpheus remote add
|
|
34
40
|
morpheus instances list
|
|
35
41
|
```
|
|
@@ -39,3 +45,50 @@ morpheus instances list
|
|
|
39
45
|
If you are interested in interfacing with the Morpheus appliance in ruby directly, you can use [Morpheus::APIClient](https://github.com/gomorpheus/morpheus-cli/wiki/APIClient) or [Morpheus::Terminal](https://github.com/gomorpheus/morpheus-cli/wiki/Terminal).
|
|
40
46
|
|
|
41
47
|
For more detailed usage information, visit the [Morpheus CLI Wiki](https://github.com/gomorpheus/morpheus-cli/wiki).
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
## Development
|
|
51
|
+
|
|
52
|
+
New API interfaces get added under the library directory: `lib/morpheus/api/`.
|
|
53
|
+
New CLI commands get added under the library directory: `lib/morpheus/cli/commands/`.
|
|
54
|
+
|
|
55
|
+
While developing, you can quickly reload your code changes in a morpheus shell while developing:
|
|
56
|
+
|
|
57
|
+
```shell
|
|
58
|
+
morpheus shell
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
Then to reload changes without restarting the morpheus shell (and the ruby process), use:
|
|
62
|
+
|
|
63
|
+
```shell
|
|
64
|
+
reload
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
Don't forget to add unit tests for your new commands under the directory: `test/`.
|
|
68
|
+
|
|
69
|
+
## Testing
|
|
70
|
+
|
|
71
|
+
To run the CLI unit tests, first create a `test_config.yaml` and then run `rake test`.
|
|
72
|
+
|
|
73
|
+
### Prepare Test Environment
|
|
74
|
+
|
|
75
|
+
Create a `test_config.yaml` like this:
|
|
76
|
+
|
|
77
|
+
```shell
|
|
78
|
+
touch test_config.yaml
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
Enter your test environment url and credentials in `test_config.yaml` like so:
|
|
82
|
+
|
|
83
|
+
```yaml
|
|
84
|
+
url: 'http://localhost:8080'
|
|
85
|
+
username: testrunner
|
|
86
|
+
password: 'SecretPassword123$'
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
### Run Tests
|
|
90
|
+
|
|
91
|
+
```shell
|
|
92
|
+
rake test
|
|
93
|
+
```
|
|
94
|
+
|
data/Rakefile
CHANGED
data/bin/morpheus
CHANGED
|
@@ -1,20 +1,20 @@
|
|
|
1
1
|
#!/usr/bin/env ruby
|
|
2
|
-
require 'morpheus
|
|
2
|
+
require 'morpheus'
|
|
3
3
|
|
|
4
4
|
# arguments
|
|
5
5
|
args = ARGV
|
|
6
6
|
|
|
7
7
|
# input pipe
|
|
8
8
|
# append piped data as arguments
|
|
9
|
-
if
|
|
10
|
-
pipe_data =
|
|
9
|
+
if !$stdin.tty?
|
|
10
|
+
pipe_data = $stdin.read
|
|
11
11
|
if pipe_data
|
|
12
12
|
args += pipe_data.split
|
|
13
13
|
end
|
|
14
14
|
end
|
|
15
15
|
|
|
16
16
|
# output pipe
|
|
17
|
-
# if
|
|
17
|
+
# if !$stdout.tty?
|
|
18
18
|
|
|
19
19
|
# end
|
|
20
20
|
|
|
@@ -9,7 +9,6 @@ class Morpheus::APIClient
|
|
|
9
9
|
|
|
10
10
|
CLIENT_ID = 'morph-cli' unless defined?(CLIENT_ID)
|
|
11
11
|
|
|
12
|
-
attr_accessor :client_id
|
|
13
12
|
# Initialize a new APIClient
|
|
14
13
|
# client = APIClient.new(url:"https://morpheus.yourcompany.com", verify_ssl:false)
|
|
15
14
|
# This old method signature is being deprecated:
|
|
@@ -40,9 +39,11 @@ class Morpheus::APIClient
|
|
|
40
39
|
end
|
|
41
40
|
@base_url = @base_url.chomp("/")
|
|
42
41
|
# todo: validate URI
|
|
42
|
+
@expires_at = nil
|
|
43
43
|
if expires_in != nil
|
|
44
44
|
@expires_at = Time.now + expires_in
|
|
45
45
|
end
|
|
46
|
+
@dry_run = false
|
|
46
47
|
set_ssl_verification_enabled(verify_ssl)
|
|
47
48
|
setopts(options)
|
|
48
49
|
end
|
|
@@ -956,7 +957,12 @@ class Morpheus::APIClient
|
|
|
956
957
|
protected
|
|
957
958
|
|
|
958
959
|
def validate_id!(id, param_name='id')
|
|
959
|
-
|
|
960
|
+
if !(id.is_a?(String) || id.is_a?(Integer))
|
|
961
|
+
raise "#{self.class} passed an invalid #{param_name}! Expected String or Integer and got (#{id.class}) #{id.inspect}"
|
|
962
|
+
elsif id.to_s.strip.empty?
|
|
963
|
+
raise "#{self.class} passed a blank #{param_name}!"
|
|
964
|
+
end
|
|
965
|
+
return true
|
|
960
966
|
end
|
|
961
967
|
|
|
962
968
|
end
|
|
@@ -83,7 +83,7 @@ class Morpheus::ArchiveBucketsInterface < Morpheus::APIClient
|
|
|
83
83
|
headers = { params: params, authorization: "Bearer #{@access_token}" }
|
|
84
84
|
opts = {method: :get, url: url, headers: headers, timeout: 172800}
|
|
85
85
|
# execute(opts, {parse_json:false})
|
|
86
|
-
if Dir.
|
|
86
|
+
if Dir.exist?(outfile)
|
|
87
87
|
raise "outfile is invalid. It is the name of an existing directory: #{outfile}"
|
|
88
88
|
end
|
|
89
89
|
# if @verify_ssl == false
|
|
@@ -24,7 +24,7 @@ class Morpheus::ArchiveFilesInterface < Morpheus::APIClient
|
|
|
24
24
|
headers = { params: params, authorization: "Bearer #{@access_token}" }
|
|
25
25
|
opts = {method: :get, url: url, headers: headers, timeout: 172800}
|
|
26
26
|
# execute(opts, {parse_json: false})
|
|
27
|
-
if Dir.
|
|
27
|
+
if Dir.exist?(outfile)
|
|
28
28
|
raise "outfile is invalid. It is the name of an existing directory: #{outfile}"
|
|
29
29
|
end
|
|
30
30
|
# if @verify_ssl == false
|
|
@@ -53,7 +53,7 @@ class Morpheus::ArchiveFilesInterface < Morpheus::APIClient
|
|
|
53
53
|
headers = { params: params, authorization: "Bearer #{@access_token}" }
|
|
54
54
|
opts = {method: :get, url: url, headers: headers, timeout: 172800}
|
|
55
55
|
# execute(opts, {parse_json: false})
|
|
56
|
-
if Dir.
|
|
56
|
+
if Dir.exist?(outfile)
|
|
57
57
|
raise "outfile is invalid. It is the name of an existing directory: #{outfile}"
|
|
58
58
|
end
|
|
59
59
|
# if @verify_ssl == false
|
|
@@ -83,7 +83,7 @@ class Morpheus::ArchiveFilesInterface < Morpheus::APIClient
|
|
|
83
83
|
headers = { params: params, authorization: "Bearer #{@access_token}" }
|
|
84
84
|
opts = {method: :get, url: url, headers: headers, timeout: 172800}
|
|
85
85
|
# execute(opts, {parse_json: false})
|
|
86
|
-
if Dir.
|
|
86
|
+
if Dir.exist?(outfile)
|
|
87
87
|
raise "outfile is invalid. It is the name of an existing directory: #{outfile}"
|
|
88
88
|
end
|
|
89
89
|
# if @verify_ssl == false
|
|
@@ -10,14 +10,14 @@ class Morpheus::ClientsInterface < Morpheus::APIClient
|
|
|
10
10
|
end
|
|
11
11
|
|
|
12
12
|
def get(id, params={})
|
|
13
|
-
|
|
13
|
+
raise "#{self.class}.get() passed a blank name!" if id.to_s == ''
|
|
14
14
|
url = "#{@base_url}/api/clients/#{id}"
|
|
15
15
|
headers = { params: params, authorization: "Bearer #{@access_token}" }
|
|
16
16
|
opts = {method: :get, url: url, headers: headers}
|
|
17
17
|
execute(opts)
|
|
18
18
|
end
|
|
19
19
|
|
|
20
|
-
|
|
20
|
+
def create(payload)
|
|
21
21
|
url = "#{@base_url}/api/clients"
|
|
22
22
|
headers = { :authorization => "Bearer #{@access_token}", 'Content-Type' => 'application/json' }
|
|
23
23
|
opts = {method: :post, url: url, headers: headers, payload: payload.to_json}
|
|
@@ -113,7 +113,7 @@ class Morpheus::ClustersInterface < Morpheus::APIClient
|
|
|
113
113
|
url = "#{base_path}/#{id}/upgrade-cluster"
|
|
114
114
|
headers = { params: params, authorization: "Bearer #{@access_token}", 'Content-Type' => 'application/json' }
|
|
115
115
|
execute(method: :post, url: url, headers: headers)
|
|
116
|
-
|
|
116
|
+
end
|
|
117
117
|
|
|
118
118
|
def list_services(id, params={})
|
|
119
119
|
url = "#{base_path}/#{id}/services"
|
|
@@ -306,4 +306,11 @@ class Morpheus::ClustersInterface < Morpheus::APIClient
|
|
|
306
306
|
execute(opts)
|
|
307
307
|
end
|
|
308
308
|
|
|
309
|
+
|
|
310
|
+
def apply_template(id, payload={})
|
|
311
|
+
url = "#{@base_url}/api/clusters/#{id}/apply-template"
|
|
312
|
+
|
|
313
|
+
headers = { :authorization => "Bearer #{@access_token}", 'Content-Type' => 'application/json' }
|
|
314
|
+
execute(method: :post, url: url, headers: headers, payload: payload.to_json)
|
|
315
|
+
end
|
|
309
316
|
end
|
|
@@ -4,18 +4,21 @@ require 'morpheus/api/api_client'
|
|
|
4
4
|
# All of the PUT methods support passing an array of IDs.
|
|
5
5
|
class Morpheus::ContainersInterface < Morpheus::APIClient
|
|
6
6
|
|
|
7
|
+
def base_path
|
|
8
|
+
"/api/containers"
|
|
9
|
+
end
|
|
7
10
|
# not used atm.. index api needs some work, we should implement it
|
|
8
11
|
# so it just paginates all containers.
|
|
9
12
|
# right now you can to pass params as {:ids => [1,2,3]}
|
|
10
13
|
def list(params={})
|
|
11
|
-
url = "#{
|
|
14
|
+
url = "#{base_path}"
|
|
12
15
|
headers = { params: params, authorization: "Bearer #{@access_token}" }
|
|
13
16
|
opts = {method: :get, url: url, headers: headers}
|
|
14
17
|
execute(opts)
|
|
15
18
|
end
|
|
16
19
|
|
|
17
20
|
def get(container_id)
|
|
18
|
-
url = "#{
|
|
21
|
+
url = "#{base_path}/#{container_id}"
|
|
19
22
|
headers = { :authorization => "Bearer #{@access_token}", 'Content-Type' => 'application/json' }
|
|
20
23
|
opts = {method: :get, url: url, headers: headers}
|
|
21
24
|
execute(opts)
|
|
@@ -24,10 +27,10 @@ class Morpheus::ContainersInterface < Morpheus::APIClient
|
|
|
24
27
|
def stop(container_id, payload={})
|
|
25
28
|
url, params = "", {}
|
|
26
29
|
if container_id.is_a?(Array)
|
|
27
|
-
url = "#{
|
|
30
|
+
url = "#{base_path}/stop"
|
|
28
31
|
params = {ids: container_id}
|
|
29
32
|
else
|
|
30
|
-
url = "#{
|
|
33
|
+
url = "#{base_path}/#{container_id}/stop"
|
|
31
34
|
params = {}
|
|
32
35
|
end
|
|
33
36
|
headers = { :params => params, :authorization => "Bearer #{@access_token}", 'Content-Type' => 'application/json' }
|
|
@@ -38,10 +41,10 @@ class Morpheus::ContainersInterface < Morpheus::APIClient
|
|
|
38
41
|
def start(container_id, payload={})
|
|
39
42
|
url, params = "", {}
|
|
40
43
|
if container_id.is_a?(Array)
|
|
41
|
-
url = "#{
|
|
44
|
+
url = "#{base_path}/start"
|
|
42
45
|
params = {ids: container_id}
|
|
43
46
|
else
|
|
44
|
-
url = "#{
|
|
47
|
+
url = "#{base_path}/#{container_id}/start"
|
|
45
48
|
params = {}
|
|
46
49
|
end
|
|
47
50
|
headers = { :params => params, :authorization => "Bearer #{@access_token}", 'Content-Type' => 'application/json' }
|
|
@@ -52,10 +55,10 @@ class Morpheus::ContainersInterface < Morpheus::APIClient
|
|
|
52
55
|
def restart(container_id, payload={})
|
|
53
56
|
url, params = "", {}
|
|
54
57
|
if container_id.is_a?(Array)
|
|
55
|
-
url = "#{
|
|
58
|
+
url = "#{base_path}/restart"
|
|
56
59
|
params = {ids: container_id}
|
|
57
60
|
else
|
|
58
|
-
url = "#{
|
|
61
|
+
url = "#{base_path}/#{container_id}/restart"
|
|
59
62
|
params = {}
|
|
60
63
|
end
|
|
61
64
|
headers = { :params => params, :authorization => "Bearer #{@access_token}", 'Content-Type' => 'application/json' }
|
|
@@ -66,10 +69,10 @@ class Morpheus::ContainersInterface < Morpheus::APIClient
|
|
|
66
69
|
def suspend(container_id, payload={})
|
|
67
70
|
url, params = "", {}
|
|
68
71
|
if container_id.is_a?(Array)
|
|
69
|
-
url = "#{
|
|
72
|
+
url = "#{base_path}/suspend"
|
|
70
73
|
params = {ids: container_id}
|
|
71
74
|
else
|
|
72
|
-
url = "#{
|
|
75
|
+
url = "#{base_path}/#{container_id}/suspend"
|
|
73
76
|
params = {}
|
|
74
77
|
end
|
|
75
78
|
headers = { :params => params, :authorization => "Bearer #{@access_token}", 'Content-Type' => 'application/json' }
|
|
@@ -80,10 +83,10 @@ class Morpheus::ContainersInterface < Morpheus::APIClient
|
|
|
80
83
|
def eject(container_id, payload={})
|
|
81
84
|
url, params = "", {}
|
|
82
85
|
if container_id.is_a?(Array)
|
|
83
|
-
url = "#{
|
|
86
|
+
url = "#{base_path}/eject"
|
|
84
87
|
params = {ids: container_id}
|
|
85
88
|
else
|
|
86
|
-
url = "#{
|
|
89
|
+
url = "#{base_path}/#{container_id}/eject"
|
|
87
90
|
params = {}
|
|
88
91
|
end
|
|
89
92
|
headers = { :params => params, :authorization => "Bearer #{@access_token}", 'Content-Type' => 'application/json' }
|
|
@@ -94,10 +97,10 @@ class Morpheus::ContainersInterface < Morpheus::APIClient
|
|
|
94
97
|
def available_actions(container_id)
|
|
95
98
|
url, params = "", {}
|
|
96
99
|
if container_id.is_a?(Array)
|
|
97
|
-
url = "#{
|
|
100
|
+
url = "#{base_path}/actions"
|
|
98
101
|
params = {ids: container_id}
|
|
99
102
|
else
|
|
100
|
-
url = "#{
|
|
103
|
+
url = "#{base_path}/#{container_id}/actions"
|
|
101
104
|
params = {}
|
|
102
105
|
end
|
|
103
106
|
headers = { :params => params, :authorization => "Bearer #{@access_token}", 'Content-Type' => 'application/json' }
|
|
@@ -108,10 +111,10 @@ class Morpheus::ContainersInterface < Morpheus::APIClient
|
|
|
108
111
|
def action(container_id, action_code, payload={})
|
|
109
112
|
url, params = "", {}
|
|
110
113
|
if container_id.is_a?(Array)
|
|
111
|
-
url = "#{
|
|
114
|
+
url = "#{base_path}/action"
|
|
112
115
|
params = {ids: container_id, code: action_code}
|
|
113
116
|
else
|
|
114
|
-
url = "#{
|
|
117
|
+
url = "#{base_path}/#{container_id}/action"
|
|
115
118
|
params = {code: action_code}
|
|
116
119
|
end
|
|
117
120
|
headers = { :params => params, :authorization => "Bearer #{@access_token}", 'Content-Type' => 'application/json' }
|
|
@@ -119,4 +122,14 @@ class Morpheus::ContainersInterface < Morpheus::APIClient
|
|
|
119
122
|
execute(opts)
|
|
120
123
|
end
|
|
121
124
|
|
|
125
|
+
def import(container_id, payload={}, headers={})
|
|
126
|
+
validate_id!(container_id)
|
|
127
|
+
execute(method: :put, url: "#{base_path}/#{container_id}/import", payload: payload, headers: headers)
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
def clone_image(container_id, payload={}, headers={})
|
|
131
|
+
validate_id!(container_id)
|
|
132
|
+
execute(method: :put, url: "#{base_path}/#{container_id}/clone-image", payload: payload, headers: headers)
|
|
133
|
+
end
|
|
134
|
+
|
|
122
135
|
end
|
|
@@ -73,7 +73,6 @@ class Morpheus::CustomInstanceTypesInterface < Morpheus::APIClient
|
|
|
73
73
|
def destroy_version(instance_type_id, id)
|
|
74
74
|
url = "#{@base_url}/api/custom-instance-types/#{instance_type_id}/versions/#{id}"
|
|
75
75
|
headers = { :params => {}, :authorization => "Bearer #{@access_token}", 'Content-Type' => 'application/json'}
|
|
76
|
-
payload = options
|
|
77
76
|
execute(method: :delete, url: url, headers: headers)
|
|
78
77
|
end
|
|
79
78
|
|
|
@@ -94,7 +93,6 @@ class Morpheus::CustomInstanceTypesInterface < Morpheus::APIClient
|
|
|
94
93
|
def destroy_upgrade(instance_type_id, id)
|
|
95
94
|
url = "#{@base_url}/api/custom-instance-types/#{instance_type_id}/upgrades/#{id}"
|
|
96
95
|
headers = { :params => {}, :authorization => "Bearer #{@access_token}", 'Content-Type' => 'application/json'}
|
|
97
|
-
payload = options
|
|
98
96
|
execute(method: :delete, url: url, headers: headers)
|
|
99
97
|
end
|
|
100
98
|
|
|
@@ -13,9 +13,8 @@ class Morpheus::DocInterface < Morpheus::APIClient
|
|
|
13
13
|
execute(method: :get, url: url, headers: headers)
|
|
14
14
|
end
|
|
15
15
|
|
|
16
|
-
def
|
|
17
|
-
url = "/api/doc/
|
|
18
|
-
# prefer /swagger.yml instead of /swagger?format=yml
|
|
16
|
+
def openapi(params={})
|
|
17
|
+
url = "/api/doc/openapi"
|
|
19
18
|
fmt = params.delete('format')
|
|
20
19
|
if fmt
|
|
21
20
|
url = url + "." + fmt
|
|
@@ -25,10 +24,11 @@ class Morpheus::DocInterface < Morpheus::APIClient
|
|
|
25
24
|
execute(method: :get, url: url, headers: headers, timeout: 172800, parse_json: !is_yaml)
|
|
26
25
|
end
|
|
27
26
|
|
|
28
|
-
|
|
27
|
+
alias :swagger :openapi
|
|
28
|
+
|
|
29
|
+
def download_openapi(outfile, params={})
|
|
29
30
|
# note that RestClient.execute still requires the full path with base_url
|
|
30
|
-
url = "#{@base_url}/api/doc/
|
|
31
|
-
# prefer /swagger.yml instead of /swagger?format=yml
|
|
31
|
+
url = "#{@base_url}/api/doc/openapi"
|
|
32
32
|
fmt = params.delete('format')
|
|
33
33
|
if fmt
|
|
34
34
|
url = url + "." + fmt
|
|
@@ -54,4 +54,6 @@ class Morpheus::DocInterface < Morpheus::APIClient
|
|
|
54
54
|
http_response
|
|
55
55
|
end
|
|
56
56
|
|
|
57
|
+
alias :swagger :download_openapi
|
|
58
|
+
|
|
57
59
|
end
|
|
@@ -42,7 +42,7 @@ class Morpheus::FileCopyRequestInterface < Morpheus::APIClient
|
|
|
42
42
|
headers = { params: params, authorization: "Bearer #{@access_token}" }
|
|
43
43
|
opts = {method: :get, url: url, headers: headers}
|
|
44
44
|
# execute(opts, {parse_json: false})
|
|
45
|
-
if Dir.
|
|
45
|
+
if Dir.exist?(outfile)
|
|
46
46
|
raise "outfile is invalid. It is the name of an existing directory: #{outfile}"
|
|
47
47
|
end
|
|
48
48
|
# if @verify_ssl == false
|
|
@@ -68,7 +68,7 @@ class Morpheus::HealthInterface < Morpheus::APIClient
|
|
|
68
68
|
headers = { params: params, authorization: "Bearer #{@access_token}" }
|
|
69
69
|
opts = {method: :get, url: url, headers: headers}
|
|
70
70
|
# execute(opts, {parse_json: false})
|
|
71
|
-
if Dir.
|
|
71
|
+
if Dir.exist?(outfile)
|
|
72
72
|
raise "outfile is invalid. It is the name of an existing directory: #{outfile}"
|
|
73
73
|
end
|
|
74
74
|
# if @verify_ssl == false
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
require 'morpheus/api/api_client'
|
|
2
|
-
require 'morpheus/api/image_builder_image_builds_interface'
|
|
3
|
-
require 'morpheus/api/image_builder_preseed_scripts_interface'
|
|
4
|
-
require 'morpheus/api/image_builder_boot_scripts_interface'
|
|
2
|
+
# require 'morpheus/api/image_builder_image_builds_interface'
|
|
3
|
+
# require 'morpheus/api/image_builder_preseed_scripts_interface'
|
|
4
|
+
# require 'morpheus/api/image_builder_boot_scripts_interface'
|
|
5
5
|
|
|
6
6
|
class Morpheus::ImageBuilderInterface < Morpheus::APIClient
|
|
7
7
|
|
|
@@ -318,6 +318,31 @@ class Morpheus::InstancesInterface < Morpheus::APIClient
|
|
|
318
318
|
execute(opts)
|
|
319
319
|
end
|
|
320
320
|
|
|
321
|
+
def list_schedules(id, params={}, headers={})
|
|
322
|
+
validate_id!(id)
|
|
323
|
+
execute(method: :get, url: "#{base_path}/#{id}/schedules", params: params, headers: headers)
|
|
324
|
+
end
|
|
325
|
+
|
|
326
|
+
def get_schedule(id, schedule_id, params={}, headers={})
|
|
327
|
+
validate_id!(id) && validate_id!(schedule_id, 'schedule_id')
|
|
328
|
+
execute(method: :get, url: "#{base_path}/#{id}/schedules/#{schedule_id}", params: params, headers: headers)
|
|
329
|
+
end
|
|
330
|
+
|
|
331
|
+
def create_schedule(id, payload, params={}, headers={})
|
|
332
|
+
validate_id!(id)
|
|
333
|
+
execute(method: :post, url: "#{base_path}/#{id}/schedules", params: params, payload: payload, headers: headers)
|
|
334
|
+
end
|
|
335
|
+
|
|
336
|
+
def update_schedule(id, schedule_id, payload, params={}, headers={})
|
|
337
|
+
validate_id!(id) && validate_id!(schedule_id, 'schedule_id')
|
|
338
|
+
execute(method: :put, url: "#{base_path}/#{id}/schedules/#{schedule_id}", params: params, payload: payload, headers: headers)
|
|
339
|
+
end
|
|
340
|
+
|
|
341
|
+
def destroy_schedule(id, schedule_id, params = {}, headers={})
|
|
342
|
+
validate_id!(id) && validate_id!(schedule_id, 'schedule_id')
|
|
343
|
+
execute(method: :delete, url: "#{base_path}/#{id}/schedules/#{schedule_id}", params: params, headers: headers)
|
|
344
|
+
end
|
|
345
|
+
|
|
321
346
|
def update_load_balancer(id, payload)
|
|
322
347
|
url = "#{@base_url}/api/instances/#{id}/load-balancer"
|
|
323
348
|
headers = {authorization: "Bearer #{@access_token}", 'Content-Type' => 'application/json' }
|
|
@@ -4,7 +4,6 @@ class Morpheus::LogsInterface < Morpheus::APIClient
|
|
|
4
4
|
|
|
5
5
|
def list(params={})
|
|
6
6
|
url = "#{@base_url}/api/logs"
|
|
7
|
-
# old versions expected containers[]
|
|
8
7
|
headers = { params: params, authorization: "Bearer #{@access_token}" }
|
|
9
8
|
execute({method: :get, url: url, headers: headers})
|
|
10
9
|
end
|
|
@@ -12,14 +11,13 @@ class Morpheus::LogsInterface < Morpheus::APIClient
|
|
|
12
11
|
def container_logs(containers=[], params={})
|
|
13
12
|
url = "#{@base_url}/api/logs"
|
|
14
13
|
# old versions expected containers[]
|
|
15
|
-
headers = { params: {'containers' => containers
|
|
14
|
+
headers = { params: {'containers' => containers}.merge(params), authorization: "Bearer #{@access_token}" }
|
|
16
15
|
execute({method: :get, url: url, headers: headers})
|
|
17
16
|
end
|
|
18
17
|
|
|
19
18
|
def server_logs(servers=[], params={})
|
|
20
19
|
url = "#{@base_url}/api/logs"
|
|
21
|
-
|
|
22
|
-
headers = { params: {'servers' => servers, 'servers[]' => servers}.merge(params), authorization: "Bearer #{@access_token}" }
|
|
20
|
+
headers = { params: {'servers' => servers}.merge(params), authorization: "Bearer #{@access_token}" }
|
|
23
21
|
execute({method: :get, url: url, headers: headers})
|
|
24
22
|
end
|
|
25
23
|
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
require 'morpheus/api/api_client'
|
|
2
|
-
require 'morpheus/api/monitoring_checks_interface'
|
|
3
|
-
require 'morpheus/api/monitoring_groups_interface'
|
|
4
|
-
require 'morpheus/api/monitoring_apps_interface'
|
|
5
|
-
require 'morpheus/api/monitoring_incidents_interface'
|
|
6
|
-
require 'morpheus/api/monitoring_contacts_interface'
|
|
7
|
-
require 'morpheus/api/monitoring_alerts_interface'
|
|
2
|
+
# require 'morpheus/api/monitoring_checks_interface'
|
|
3
|
+
# require 'morpheus/api/monitoring_groups_interface'
|
|
4
|
+
# require 'morpheus/api/monitoring_apps_interface'
|
|
5
|
+
# require 'morpheus/api/monitoring_incidents_interface'
|
|
6
|
+
# require 'morpheus/api/monitoring_contacts_interface'
|
|
7
|
+
# require 'morpheus/api/monitoring_alerts_interface'
|
|
8
8
|
|
|
9
9
|
class Morpheus::MonitoringInterface < Morpheus::APIClient
|
|
10
10
|
|
|
@@ -79,7 +79,7 @@ class Morpheus::PackagesInterface < Morpheus::APIClient
|
|
|
79
79
|
headers = { params: params, authorization: "Bearer #{@access_token}" }
|
|
80
80
|
opts = {method: :post, url: url, headers: headers}
|
|
81
81
|
# execute(opts, {parse_json: false})
|
|
82
|
-
if Dir.
|
|
82
|
+
if Dir.exist?(outfile)
|
|
83
83
|
raise "outfile is invalid. It is the name of an existing directory: #{outfile}"
|
|
84
84
|
end
|
|
85
85
|
# if @verify_ssl == false
|
|
@@ -44,7 +44,7 @@ class Morpheus::ReportsInterface < Morpheus::APIClient
|
|
|
44
44
|
headers = { params: params, authorization: "Bearer #{@access_token}" }
|
|
45
45
|
opts = {method: :get, url: url, headers: headers, timeout: 172800}
|
|
46
46
|
# execute(opts, {parse_json: false})
|
|
47
|
-
if Dir.
|
|
47
|
+
if Dir.exist?(outfile)
|
|
48
48
|
raise "outfile is invalid. It is the name of an existing directory: #{outfile}"
|
|
49
49
|
end
|
|
50
50
|
# if @verify_ssl == false
|
|
@@ -55,6 +55,14 @@ class Morpheus::ServersInterface < Morpheus::APIClient
|
|
|
55
55
|
execute(opts)
|
|
56
56
|
end
|
|
57
57
|
|
|
58
|
+
def restart(serverId,payload = {}, params = {})
|
|
59
|
+
url = "#{@base_url}/api/servers/#{serverId}/restart"
|
|
60
|
+
|
|
61
|
+
headers = { :params => params, :authorization => "Bearer #{@access_token}", 'Content-Type' => 'application/json' }
|
|
62
|
+
opts = {method: :put, url: url, headers: headers, payload: payload.to_json}
|
|
63
|
+
execute(opts)
|
|
64
|
+
end
|
|
65
|
+
|
|
58
66
|
def make_managed(serverId,payload = {})
|
|
59
67
|
url = "#{@base_url}/api/servers/#{serverId}/install-agent"
|
|
60
68
|
#url = "#{@base_url}/api/servers/#{serverId}/make-managed" # added in 4.1
|
|
@@ -176,7 +184,7 @@ class Morpheus::ServersInterface < Morpheus::APIClient
|
|
|
176
184
|
execute(opts)
|
|
177
185
|
end
|
|
178
186
|
|
|
179
|
-
|
|
187
|
+
def update_network_label(network_id, server_id, payload)
|
|
180
188
|
url = "#{@base_url}/api/servers/#{server_id}/networkInterfaces/#{network_id}"
|
|
181
189
|
headers = {authorization: "Bearer #{@access_token}", 'Content-Type' => 'application/json' }
|
|
182
190
|
opts = {method: :put, url: url, headers: headers, payload: payload.to_json}
|
|
@@ -96,7 +96,7 @@ class Morpheus::StorageProvidersInterface < Morpheus::APIClient
|
|
|
96
96
|
headers = { params: params, authorization: "Bearer #{@access_token}" }
|
|
97
97
|
opts = {method: :get, url: url, headers: headers}
|
|
98
98
|
# execute(opts, false)
|
|
99
|
-
if Dir.
|
|
99
|
+
if Dir.exist?(outfile)
|
|
100
100
|
raise "outfile is invalid. It is the name of an existing directory: #{outfile}"
|
|
101
101
|
end
|
|
102
102
|
# if @verify_ssl == false
|
|
@@ -125,7 +125,7 @@ class Morpheus::StorageProvidersInterface < Morpheus::APIClient
|
|
|
125
125
|
headers = { params: params, authorization: "Bearer #{@access_token}" }
|
|
126
126
|
opts = {method: :get, url: url, headers: headers}
|
|
127
127
|
# execute(opts, false)
|
|
128
|
-
if Dir.
|
|
128
|
+
if Dir.exist?(outfile)
|
|
129
129
|
raise "outfile is invalid. It is the name of an existing directory: #{outfile}"
|
|
130
130
|
end
|
|
131
131
|
# if @verify_ssl == false
|
|
@@ -81,7 +81,7 @@ class Morpheus::VirtualImagesInterface < Morpheus::APIClient
|
|
|
81
81
|
# opts[:verify_ssl] = OpenSSL::SSL::VERIFY_NONE
|
|
82
82
|
end
|
|
83
83
|
|
|
84
|
-
start_time = Time.now
|
|
84
|
+
# start_time = Time.now
|
|
85
85
|
query_params = headers.delete(:params) || {}
|
|
86
86
|
file_size = image_file.size
|
|
87
87
|
if File.blockdev?(image_file)
|
data/lib/morpheus/api.rb
CHANGED
|
@@ -145,7 +145,7 @@ module Morpheus::Benchmarking
|
|
|
145
145
|
|
|
146
146
|
# finish the current benchmark and optionally print the time taken.
|
|
147
147
|
def stop_benchmark(exit_code=0, err=nil)
|
|
148
|
-
if @benchmark_record
|
|
148
|
+
if defined?(@benchmark_record) && @benchmark_record
|
|
149
149
|
@benchmark_record.stop(exit_code, err)
|
|
150
150
|
@last_benchmark_record = @benchmark_record
|
|
151
151
|
@benchmark_record = nil
|