morpheus-cli 5.5.2.1 → 5.5.3
Sign up to get free protection for your applications and to get access to all the features.
- 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/roles.rb +6 -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
data/lib/morpheus/morpkg.rb
CHANGED
@@ -9,7 +9,7 @@ module Morpheus
|
|
9
9
|
def self.parse_package_manifest(source_directory)
|
10
10
|
source_directory = File.expand_path(source_directory)
|
11
11
|
manifest_filename = File.join(source_directory, "package-manifest.json")
|
12
|
-
if !File.
|
12
|
+
if !File.exist?(manifest_filename)
|
13
13
|
raise "Package manifest file not found: #{manifest_filename}"
|
14
14
|
end
|
15
15
|
manifest = JSON.parse(File.read(manifest_filename))
|
@@ -46,10 +46,10 @@ module Morpheus
|
|
46
46
|
elsif File.directory?(outfile)
|
47
47
|
outfile = File.join(outfile, "#{code}-#{version}.morpkg")
|
48
48
|
end
|
49
|
-
if Dir.
|
49
|
+
if Dir.exist?(outfile)
|
50
50
|
raise "Invalid package target. #{outfile} is the name of an existing directory."
|
51
51
|
end
|
52
|
-
if File.
|
52
|
+
if File.exist?(outfile)
|
53
53
|
if do_overwrite
|
54
54
|
# don't delete, just overwrite.
|
55
55
|
# File.delete(outfile)
|
@@ -58,7 +58,7 @@ module Morpheus
|
|
58
58
|
end
|
59
59
|
end
|
60
60
|
# build directories if needed
|
61
|
-
if !Dir.
|
61
|
+
if !Dir.exist?(File.dirname(outfile))
|
62
62
|
Dir.mkdir(File.dirname(outfile))
|
63
63
|
end
|
64
64
|
|
data/lib/morpheus/rest_client.rb
CHANGED
@@ -8,11 +8,11 @@ module Morpheus
|
|
8
8
|
class << self
|
9
9
|
|
10
10
|
def user_agent
|
11
|
-
if
|
11
|
+
if !defined?(@user_agent) || @user_agent.nil?
|
12
12
|
begin
|
13
13
|
@user_agent = "morpheus-cli #{Morpheus::Cli::VERSION}"
|
14
14
|
@user_agent = "#{@user_agent} (#{::RestClient::Platform.architecture}) #{::RestClient::Platform.ruby_agent_version}"
|
15
|
-
rescue
|
15
|
+
rescue
|
16
16
|
end
|
17
17
|
end
|
18
18
|
return @user_agent
|
data/lib/morpheus/routes.rb
CHANGED
@@ -178,7 +178,7 @@ module Morpheus::Routes
|
|
178
178
|
end
|
179
179
|
|
180
180
|
best_route = nil
|
181
|
-
best_index = nil
|
181
|
+
#best_index = nil
|
182
182
|
best_prefix_words = nil
|
183
183
|
paths.each do |p|
|
184
184
|
if best_route.nil?
|
@@ -190,7 +190,7 @@ module Morpheus::Routes
|
|
190
190
|
#if best_index.nil? || match_index < best_index
|
191
191
|
if best_prefix_words.nil? || prefix_words.size < best_prefix_words.size
|
192
192
|
best_route = it
|
193
|
-
best_index = match_index
|
193
|
+
#best_index = match_index
|
194
194
|
best_prefix_words = prefix_words
|
195
195
|
end
|
196
196
|
end
|
data/lib/morpheus/terminal.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
require 'morpheus/cli'
|
1
|
+
#require 'morpheus/cli' #todo: remove circular require...
|
2
2
|
require 'morpheus/benchmarking'
|
3
3
|
require 'morpheus/logging'
|
4
4
|
require 'morpheus/rest_client'
|
@@ -7,6 +7,7 @@ require 'morpheus/cli/dot_file'
|
|
7
7
|
require 'morpheus/cli/error_handler'
|
8
8
|
require 'morpheus/cli/expression_parser'
|
9
9
|
require 'morpheus/cli/option_parser'
|
10
|
+
require 'morpheus/cli/version'
|
10
11
|
require 'term/ansicolor'
|
11
12
|
|
12
13
|
module Morpheus
|
@@ -41,7 +42,13 @@ module Morpheus
|
|
41
42
|
include Morpheus::Benchmarking::HasBenchmarking
|
42
43
|
# todo: this can be combined with Cli::Shell
|
43
44
|
|
44
|
-
class Blackhole # <
|
45
|
+
class Blackhole # < File
|
46
|
+
|
47
|
+
def initialize(*args)
|
48
|
+
# we shouldn't actually need a File tho.. but Readline wants one
|
49
|
+
# File.open(Morpheus::Cli.windows? ? 'NUL:' : '/dev/null', 'w')
|
50
|
+
end
|
51
|
+
|
45
52
|
def accrete_data(*mgs)
|
46
53
|
# Singularity.push(*msgs)
|
47
54
|
return nil
|
@@ -61,7 +68,7 @@ module Morpheus
|
|
61
68
|
end
|
62
69
|
|
63
70
|
def self.prompt
|
64
|
-
if @prompt.nil?
|
71
|
+
if !defined?(@prompt) || @prompt.nil?
|
65
72
|
if ENV['MORPHEUS_PS1']
|
66
73
|
@prompt = ENV['MORPHEUS_PS1'].dup
|
67
74
|
else
|
@@ -91,7 +98,7 @@ module Morpheus
|
|
91
98
|
# the global Morpheus::Terminal instance
|
92
99
|
# This should go away, but it needed for now...
|
93
100
|
def self.instance
|
94
|
-
@morphterm
|
101
|
+
@morphterm ||= self.new({})
|
95
102
|
end
|
96
103
|
|
97
104
|
# hack alert! This should go away, but is needed for now...
|
@@ -112,13 +119,13 @@ module Morpheus
|
|
112
119
|
# @param stderr [IO] Default is STDERR
|
113
120
|
# @param [IO] stderr
|
114
121
|
# @stderr = stderr
|
115
|
-
def initialize(stdin
|
122
|
+
def initialize(stdin=$stdin,stdout=$stdout, stderr=$stderr, homedir=nil)
|
116
123
|
attrs = {}
|
117
124
|
if stdin.is_a?(Hash)
|
118
125
|
attrs = stdin.clone()
|
119
|
-
stdin = attrs[:stdin] ||
|
120
|
-
stdout = attrs[:stdout] ||
|
121
|
-
stderr = attrs[:stderr] ||
|
126
|
+
stdin = attrs[:stdin] || $stdin
|
127
|
+
stdout = attrs[:stdout] || $stdout
|
128
|
+
stderr = attrs[:stderr] || $stderr
|
122
129
|
homedir = attrs[:homedir] || attrs[:home] || attrs[:home_directory]
|
123
130
|
end
|
124
131
|
# establish IO
|
@@ -132,12 +139,12 @@ module Morpheus
|
|
132
139
|
set_home_directory(use_homedir)
|
133
140
|
|
134
141
|
# use colors by default
|
135
|
-
set_coloring(
|
142
|
+
set_coloring($stdout.isatty) #rescue nil
|
136
143
|
# Term::ANSIColor::coloring = STDOUT.isatty
|
137
144
|
# @coloring = Term::ANSIColor::coloring?
|
138
145
|
|
139
146
|
# startup script
|
140
|
-
if File.
|
147
|
+
if File.exist? Morpheus::Cli::DotFile.morpheus_profile_filename
|
141
148
|
@profile_dot_file = Morpheus::Cli::DotFile.new(Morpheus::Cli::DotFile.morpheus_profile_filename)
|
142
149
|
else
|
143
150
|
@profile_dot_file = nil
|
@@ -197,13 +204,52 @@ module Morpheus
|
|
197
204
|
@stderr
|
198
205
|
end
|
199
206
|
|
207
|
+
def with_pipes(opts, &block)
|
208
|
+
originals = {} #{stdout: stdout, stderr: stderr, stdin: stdin}
|
209
|
+
if opts[:stdout]
|
210
|
+
originals[:stdout] = stdout
|
211
|
+
set_stdout(opts[:stdout])
|
212
|
+
end
|
213
|
+
if opts[:stderr]
|
214
|
+
originals[:stderr] = stderr
|
215
|
+
set_stderr(opts[:stderr])
|
216
|
+
end
|
217
|
+
if opts[:stdin]
|
218
|
+
originals[:stdin] = stdin
|
219
|
+
set_stdin(opts[:stdin])
|
220
|
+
end
|
221
|
+
begin
|
222
|
+
yield
|
223
|
+
ensure
|
224
|
+
set_stdout(originals[:stdout]) if originals[:stdout]
|
225
|
+
set_stderr(originals[:stderr]) if originals[:stderr]
|
226
|
+
set_stdin(originals[:stdin]) if originals[:stdin]
|
227
|
+
end
|
228
|
+
end
|
229
|
+
|
230
|
+
def with_stdout(io, &block)
|
231
|
+
with_pipes(stdout:io, &block)
|
232
|
+
end
|
233
|
+
|
234
|
+
def with_stderr(io, &block)
|
235
|
+
with_pipes(stderr:io, &block)
|
236
|
+
end
|
237
|
+
|
238
|
+
def with_stdout_and_stderr(io, &block)
|
239
|
+
with_pipes(stdout:io, stderr:io, &block)
|
240
|
+
end
|
241
|
+
|
242
|
+
def with_stdin(io, &block)
|
243
|
+
with_pipes(stdin:io, &block)
|
244
|
+
end
|
245
|
+
|
200
246
|
def home_directory=(homedir)
|
201
247
|
set_home_directory(homedir)
|
202
248
|
end
|
203
249
|
|
204
250
|
def set_home_directory(homedir)
|
205
251
|
full_homedir = File.expand_path(homedir)
|
206
|
-
# if !Dir.
|
252
|
+
# if !Dir.exist?(full_homedir)
|
207
253
|
# print_red_alert "Directory not found: #{full_homedir}"
|
208
254
|
# exit 1
|
209
255
|
# end
|
@@ -293,7 +339,7 @@ module Morpheus
|
|
293
339
|
# out << "Options:\n"
|
294
340
|
out << optparse.to_s
|
295
341
|
out << "\n"
|
296
|
-
out << "For more information, see https://
|
342
|
+
out << "For more information, see https://clidocs.morpheusdata.com"
|
297
343
|
out << "\n"
|
298
344
|
out
|
299
345
|
end
|
@@ -330,6 +376,10 @@ module Morpheus
|
|
330
376
|
# $stdin.gets(*args)
|
331
377
|
# end
|
332
378
|
|
379
|
+
def readline(*args)
|
380
|
+
# todo: one prompt to rule them all
|
381
|
+
end
|
382
|
+
|
333
383
|
# protected
|
334
384
|
|
335
385
|
def execute(input)
|
@@ -397,7 +447,7 @@ module Morpheus
|
|
397
447
|
set_home_directory(@use_home_directory)
|
398
448
|
# re-initialize some variables
|
399
449
|
# startup script
|
400
|
-
if File.
|
450
|
+
if File.exist? Morpheus::Cli::DotFile.morpheus_profile_filename
|
401
451
|
@profile_dot_file = Morpheus::Cli::DotFile.new(Morpheus::Cli::DotFile.morpheus_profile_filename)
|
402
452
|
else
|
403
453
|
@profile_dot_file = nil
|
@@ -414,7 +464,7 @@ module Morpheus
|
|
414
464
|
|
415
465
|
|
416
466
|
if @profile_dot_file && !@profile_dot_file_has_run
|
417
|
-
if !noprofile && File.
|
467
|
+
if !noprofile && File.exist?(@profile_dot_file.filename)
|
418
468
|
execute_profile_script()
|
419
469
|
end
|
420
470
|
end
|
@@ -466,14 +516,13 @@ module Morpheus
|
|
466
516
|
# return 127, nil
|
467
517
|
# end
|
468
518
|
|
469
|
-
if @benchmarking || args.include?('-B') || args.include?('--benchmark')
|
519
|
+
if (defined?(@benchmarking) && @benchmarking) || args.include?('-B') || args.include?('--benchmark')
|
470
520
|
benchmark_name = "morpheus #{formatted_cmd}"
|
471
521
|
benchmark_name.sub!(' -B', '')
|
472
522
|
benchmark_name.sub!(' --benchmark', '')
|
473
523
|
#benchmark_name << " -B"
|
474
524
|
start_benchmark(benchmark_name)
|
475
525
|
end
|
476
|
-
|
477
526
|
# shell is a Singleton command class
|
478
527
|
if args[0] == "shell"
|
479
528
|
require 'morpheus/cli/commands/shell'
|
data/lib/morpheus.rb
CHANGED
data/morpheus-cli.gemspec
CHANGED
@@ -0,0 +1,68 @@
|
|
1
|
+
require 'morpheus_test'
|
2
|
+
|
3
|
+
# Tests for Morpheus::ContainersInterface
|
4
|
+
class MorpheusTest::ContainersInterfaceTest < MorpheusTest::TestCase
|
5
|
+
|
6
|
+
include MorpheusTest::TestDataHelper
|
7
|
+
|
8
|
+
def setup()
|
9
|
+
super
|
10
|
+
#load_container_test_data()
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_get
|
14
|
+
container_id = find_first_container_id()
|
15
|
+
response = client.containers.get(container_id)
|
16
|
+
assert response['container'].is_a?(Hash)
|
17
|
+
assert_equal response['container']['id'], container_id
|
18
|
+
end
|
19
|
+
|
20
|
+
# todo: need to wait and refresh status for this to work well
|
21
|
+
|
22
|
+
=begin
|
23
|
+
def test_stop
|
24
|
+
response = client.containers.stop(@id, {})
|
25
|
+
assert_equal response['success'], true
|
26
|
+
end
|
27
|
+
|
28
|
+
def test_start
|
29
|
+
response = client.containers.start(@id, {})
|
30
|
+
assert_equal response['success'], true
|
31
|
+
end
|
32
|
+
|
33
|
+
def test_restart
|
34
|
+
response = client.containers.restart(@id, {})
|
35
|
+
assert_equal response['success'], true
|
36
|
+
end
|
37
|
+
|
38
|
+
def test_suspend
|
39
|
+
response = client.containers.suspend(@id, {})
|
40
|
+
assert_equal response['success'], true
|
41
|
+
end
|
42
|
+
|
43
|
+
def test_eject
|
44
|
+
response = client.containers.eject(@id, {})
|
45
|
+
assert_equal response['success'], true
|
46
|
+
end
|
47
|
+
|
48
|
+
def test_available_actions
|
49
|
+
response = client.containers.available_actions(@id)
|
50
|
+
assert response['actions'].is_a?(Array)
|
51
|
+
end
|
52
|
+
|
53
|
+
def test_action
|
54
|
+
response = client.containers.action(@id, {})
|
55
|
+
assert_equal response['success'], true
|
56
|
+
end
|
57
|
+
|
58
|
+
def test_import
|
59
|
+
response = client.containers.import(@id, {})
|
60
|
+
assert_equal response['success'], true
|
61
|
+
end
|
62
|
+
|
63
|
+
def test_clone_image
|
64
|
+
response = client.containers.clone_image(@id, {})
|
65
|
+
assert_equal response['success'], true
|
66
|
+
end
|
67
|
+
=end
|
68
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
require 'morpheus_test'
|
2
|
+
|
3
|
+
# Tests for Morpheus::DocInterface
|
4
|
+
class MorpheusTest::DocInterfaceTest < MorpheusTest::TestCase
|
5
|
+
|
6
|
+
def test_doc_list
|
7
|
+
@doc_interface = client.doc
|
8
|
+
response = @doc_interface.list()
|
9
|
+
assert_equal response['links'].class, Array
|
10
|
+
end
|
11
|
+
|
12
|
+
def test_doc_get
|
13
|
+
@doc_interface = client.doc
|
14
|
+
response = @doc_interface.openapi()
|
15
|
+
assert_equal response['openapi'], '3.0.3'
|
16
|
+
# todo: fix this, can be cached and fail
|
17
|
+
#assert_equal response['version'], Morpheus::Cli::Remote.load_remote(@config.remote_name)[:build_version]
|
18
|
+
end
|
19
|
+
|
20
|
+
def test_doc_get_yaml
|
21
|
+
@doc_interface = client.doc
|
22
|
+
response = @doc_interface.openapi({'format' => "yaml"})
|
23
|
+
assert response.body
|
24
|
+
assert YAML.load(response.body)
|
25
|
+
end
|
26
|
+
|
27
|
+
# def test_doc_download
|
28
|
+
# @doc_interface = client.doc
|
29
|
+
# response = @doc_interface.download_openapi('/path/to/openapi.json')
|
30
|
+
# yaml_content = response.body
|
31
|
+
# yaml_data = YAML.load(yaml_content)
|
32
|
+
# assert_not_nil yaml_data
|
33
|
+
# end
|
34
|
+
|
35
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'morpheus_test'
|
2
|
+
|
3
|
+
# Tests for Morpheus::InstancesInterface
|
4
|
+
class MorpheusTest::InstancesInterfaceTest < MorpheusTest::TestCase
|
5
|
+
|
6
|
+
def test_instances_interface
|
7
|
+
@instances_interface = client.instances
|
8
|
+
response = @instances_interface.list()
|
9
|
+
instances = response['instances']
|
10
|
+
assert instances.is_a?(Array)
|
11
|
+
if !instances.empty?
|
12
|
+
response = @instances_interface.get(instances[0]['id'])
|
13
|
+
instance = response['instance']
|
14
|
+
assert instance.is_a?(Hash)
|
15
|
+
assert_equal instance['id'], instances[0]['id']
|
16
|
+
else
|
17
|
+
#puts "No instances found in this environment"
|
18
|
+
end
|
19
|
+
#todo: create and delete
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
require 'morpheus_test'
|
2
|
+
|
3
|
+
# Tests for Morpheus::WhoamiInterface
|
4
|
+
class MorpheusTest::WhoamiInterfaceTest < MorpheusTest::TestCase
|
5
|
+
|
6
|
+
def test_whoami_interface
|
7
|
+
@whoami_interface = client.whoami
|
8
|
+
response = @whoami_interface.get()
|
9
|
+
assert_equal response['user']['username'], @config.username
|
10
|
+
# todo: fix this, can be cached and fail
|
11
|
+
#assert_equal response['appliance']['buildVersion'], Morpheus::Cli::Remote.load_remote(@config.remote_name)[:build_version]
|
12
|
+
end
|
13
|
+
|
14
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require 'morpheus_test'
|
2
|
+
|
3
|
+
# Tests for Morpheus::Cli::AccessTokenCommand
|
4
|
+
class MorpheusTest::AccessTokenTest < MorpheusTest::TestCase
|
5
|
+
|
6
|
+
def test_access_token
|
7
|
+
assert_execute("access-token")
|
8
|
+
assert_execute("access-token get")
|
9
|
+
assert_equal(is_logged_in(), true, "is_logged_in() should be true after access-token refresh")
|
10
|
+
end
|
11
|
+
|
12
|
+
def test_access_token_details
|
13
|
+
assert_execute("access-token details")
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_access_token_refresh
|
17
|
+
previous_token = get_access_token()
|
18
|
+
without_authentication do
|
19
|
+
login()
|
20
|
+
assert_execute("access-token refresh -y")
|
21
|
+
assert_equal(is_logged_in(), true, "is_logged_in() should be true after access-token refresh")
|
22
|
+
new_token = get_access_token()
|
23
|
+
assert_not_equal(previous_token, new_token, "Access token should have changed")
|
24
|
+
assert_error("login --test --token #{previous_token} ", "Old token should no longer be valid after refresh")
|
25
|
+
assert_execute("login --token #{new_token} ", "New token should be valid after refresh")
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def test_access_token_unauthenticated
|
30
|
+
without_authentication do
|
31
|
+
assert_error("access-token")
|
32
|
+
assert_error("access-token get")
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
@@ -0,0 +1,82 @@
|
|
1
|
+
require 'morpheus_test'
|
2
|
+
|
3
|
+
# Tests for login and logout
|
4
|
+
class MorpheusTest::AuthTest < MorpheusTest::TestCase
|
5
|
+
|
6
|
+
def requires_authentication
|
7
|
+
false
|
8
|
+
end
|
9
|
+
|
10
|
+
def test_login
|
11
|
+
assert_execute %(login "#{escape_arg @config.username}" "#{escape_arg @config.password_decrypted}")
|
12
|
+
assert is_logged_in()
|
13
|
+
end
|
14
|
+
|
15
|
+
def test_login_bad_credentials
|
16
|
+
assert_error %(login "#{escape_arg @config.username}" "invalid_password")
|
17
|
+
assert !is_logged_in()
|
18
|
+
end
|
19
|
+
|
20
|
+
def test_login_test_option
|
21
|
+
without_authentication do
|
22
|
+
assert_equal(is_logged_in(), false, "begin as logged out")
|
23
|
+
assert_execute(%(login --test "#{escape_arg @config.username}" "#{escape_arg @config.password_decrypted}"))
|
24
|
+
assert_equal(is_logged_in(), false, "should still be logged out")
|
25
|
+
end
|
26
|
+
|
27
|
+
with_authentication do
|
28
|
+
assert is_logged_in()
|
29
|
+
assert_error %(login --test "#{escape_arg @config.username}" "invalid_password")
|
30
|
+
assert is_logged_in(), "should still be logged in"
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def test_logout
|
35
|
+
with_authentication do
|
36
|
+
assert_execute %(logout)
|
37
|
+
assert !is_logged_in()
|
38
|
+
end
|
39
|
+
without_authentication do
|
40
|
+
assert_execute %(logout)
|
41
|
+
assert !is_logged_in()
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def test_login_prompt
|
46
|
+
with_input @config.username.to_s, @config.password_decrypted do
|
47
|
+
assert_execute %(login)
|
48
|
+
end
|
49
|
+
with_input @config.username.to_s, "invalid_password" do
|
50
|
+
assert_error %(login --test)
|
51
|
+
end
|
52
|
+
without_authentication do
|
53
|
+
with_input @config.username, @config.password_decrypted do
|
54
|
+
assert_execute %(instances list)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
def test_login_adhoc
|
60
|
+
assert_execute %(login "#{escape_arg @config.username}" "#{escape_arg @config.password_decrypted}")
|
61
|
+
assert is_logged_in()
|
62
|
+
assert_execute %(login "#{escape_arg @config.username}" "#{escape_arg @config.password_decrypted}")
|
63
|
+
assert is_logged_in()
|
64
|
+
assert_execute("logout")
|
65
|
+
assert !is_logged_in()
|
66
|
+
|
67
|
+
# a bit meta, but let's test our helper methods here..
|
68
|
+
# login()
|
69
|
+
# assert_equal(is_logged_in(), true, "should be logged in")
|
70
|
+
# logout()
|
71
|
+
# assert_equal(is_logged_in(), false, "should be logged out")
|
72
|
+
# login_if_needed()
|
73
|
+
# assert_equal(is_logged_in(), true, "should be logged in")
|
74
|
+
# logout_if_needed()
|
75
|
+
# assert_equal(is_logged_in(), false, "should be logged out")
|
76
|
+
# logout()
|
77
|
+
# assert_equal(is_logged_in(), false, "should be logged out")
|
78
|
+
# login_if_needed()
|
79
|
+
# assert_equal(is_logged_in(), true, "should be logged in")
|
80
|
+
end
|
81
|
+
|
82
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
require 'morpheus_test'
|
2
|
+
|
3
|
+
# Tests for top level CLI functionality
|
4
|
+
class MorpheusTest::CliTest < MorpheusTest::TestCase
|
5
|
+
|
6
|
+
def requires_remote
|
7
|
+
false
|
8
|
+
end
|
9
|
+
|
10
|
+
def requires_authentication
|
11
|
+
false
|
12
|
+
end
|
13
|
+
|
14
|
+
def test_cli_no_arguments
|
15
|
+
assert_error("")
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_cli_unknown_command
|
19
|
+
assert_error("unknown_command")
|
20
|
+
end
|
21
|
+
|
22
|
+
def test_cli_unknown_subcommand
|
23
|
+
assert_error("instances unknown_subcommand")
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_cli_version_option
|
27
|
+
assert_execute("-v")
|
28
|
+
assert_execute("--version")
|
29
|
+
end
|
30
|
+
|
31
|
+
def test_cli_nocolor
|
32
|
+
assert_execute("version -C")
|
33
|
+
assert_execute("echo -C \"disable coloring with the -C option\"")
|
34
|
+
# todo: fix bug here that makes this persist for all subsequent terminal commands
|
35
|
+
# this re-enavbles it for remainder of tests
|
36
|
+
# assert_execute("coloring on?")
|
37
|
+
assert_execute("coloring off?")
|
38
|
+
assert_execute("coloring")
|
39
|
+
end
|
40
|
+
|
41
|
+
# HelpTest handles this now..
|
42
|
+
# def test_help
|
43
|
+
# assert_execute("help")
|
44
|
+
# assert_execute("-h")
|
45
|
+
# assert_execute("--help")
|
46
|
+
# end
|
47
|
+
|
48
|
+
end
|
@@ -0,0 +1,92 @@
|
|
1
|
+
require 'morpheus_test'
|
2
|
+
require 'test_data_helper'
|
3
|
+
|
4
|
+
# Tests for Morpheus::Cli::Containers
|
5
|
+
class MorpheusTest::ContainersTest < MorpheusTest::TestCase
|
6
|
+
|
7
|
+
include MorpheusTest::TestDataHelper
|
8
|
+
|
9
|
+
def setup()
|
10
|
+
super
|
11
|
+
#load_container_test_data()
|
12
|
+
end
|
13
|
+
|
14
|
+
def test_containers_get
|
15
|
+
id = find_first_container_id()
|
16
|
+
assert_execute %(containers get #{id})
|
17
|
+
end
|
18
|
+
|
19
|
+
# todo: need to wait and refresh status for this to work well
|
20
|
+
|
21
|
+
=begin
|
22
|
+
def test_containers_get_many
|
23
|
+
ids = find_many_container_ids().take(5)
|
24
|
+
assert_execute %(containers get #{ids.join(' ')})
|
25
|
+
end
|
26
|
+
|
27
|
+
def test_containers_stop
|
28
|
+
with_input ["n", "y"] do
|
29
|
+
assert_execute %(containers stop #{@id}), exit_code: 9
|
30
|
+
assert_execute %(containers stop #{@id})
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def test_containers_start
|
35
|
+
with_input ["n", "y"] do
|
36
|
+
assert_execute %(containers start #{@id}), exit_code: 9
|
37
|
+
assert_execute %(containers start #{@id})
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def test_containers_restart
|
42
|
+
with_input ["n", "y"] do
|
43
|
+
assert_execute %(containers restart #{@id}), exit_code: 9
|
44
|
+
assert_execute %(containers restart #{@id})
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def test_containers_suspend
|
49
|
+
with_input ["n", "y"] do
|
50
|
+
assert_execute %(containers suspend #{@id}), exit_code: 9
|
51
|
+
assert_execute %(containers suspend #{@id})
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
def test_containers_eject
|
56
|
+
with_input ["n", "y"] do
|
57
|
+
assert_execute %(containers eject #{@id}), exit_code: 9
|
58
|
+
assert_execute %(containers eject #{@id})
|
59
|
+
end
|
60
|
+
end
|
61
|
+
=end
|
62
|
+
|
63
|
+
def test_containers_actions
|
64
|
+
@id = find_first_container_id()
|
65
|
+
assert_execute %(containers actions #{@id})
|
66
|
+
end
|
67
|
+
|
68
|
+
=begin
|
69
|
+
# do not run random actions for now
|
70
|
+
# def test_containers_action
|
71
|
+
# #action_code = "docker-remove-node"
|
72
|
+
# action = client.containers.available_actions(@id)['actions'].first
|
73
|
+
# assert action.is_a?(Hash), "Expected to find an action to run"
|
74
|
+
# action_code = action['code']
|
75
|
+
# assert_execute %(containers action #{@id} -a #{action_code} -y)
|
76
|
+
# end
|
77
|
+
|
78
|
+
def test_containers_import
|
79
|
+
with_input ["n", "y"] do
|
80
|
+
assert_execute %(containers import #{@id} -N), exit_code: 9
|
81
|
+
assert_execute %(containers import #{@id} -N)
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
def test_containers_clone_image
|
86
|
+
with_input ["n", "y"] do
|
87
|
+
assert_execute %(containers clone-image #{@id} -N), exit_code: 9
|
88
|
+
assert_execute %(containers clone-image #{@id} -N)
|
89
|
+
end
|
90
|
+
end
|
91
|
+
=end
|
92
|
+
end
|