bosh_cli 1.0.3 → 1.5.0.pre.1113
Sign up to get free protection for your applications and to get access to all the features.
- data/bin/bosh +0 -9
- data/lib/cli.rb +69 -64
- data/lib/cli/backup_destination_path.rb +33 -0
- data/lib/cli/base_command.rb +57 -56
- data/lib/cli/blob_manager.rb +12 -12
- data/lib/cli/changeset_helper.rb +6 -7
- data/lib/cli/client/director.rb +724 -0
- data/lib/cli/command_handler.rb +6 -7
- data/lib/cli/commands/backup.rb +39 -0
- data/lib/cli/commands/biff.rb +42 -21
- data/lib/cli/commands/blob_management.rb +1 -1
- data/lib/cli/commands/cloudcheck.rb +11 -13
- data/lib/cli/commands/deployment.rb +53 -37
- data/lib/cli/commands/help.rb +3 -2
- data/lib/cli/commands/job_management.rb +67 -103
- data/lib/cli/commands/job_rename.rb +6 -8
- data/lib/cli/commands/log_management.rb +78 -55
- data/lib/cli/commands/maintenance.rb +36 -30
- data/lib/cli/commands/misc.rb +72 -51
- data/lib/cli/commands/package.rb +2 -2
- data/lib/cli/commands/property_management.rb +10 -12
- data/lib/cli/commands/release.rb +236 -133
- data/lib/cli/commands/snapshot.rb +93 -0
- data/lib/cli/commands/ssh.rb +216 -213
- data/lib/cli/commands/stemcell.rb +46 -34
- data/lib/cli/commands/task.rb +2 -2
- data/lib/cli/commands/user.rb +27 -3
- data/lib/cli/commands/vm.rb +28 -0
- data/lib/cli/commands/vms.rb +81 -23
- data/lib/cli/config.rb +6 -2
- data/lib/cli/core_ext.rb +31 -30
- data/lib/cli/deployment_helper.rb +134 -159
- data/lib/cli/deployment_manifest.rb +66 -0
- data/lib/cli/deployment_manifest_compiler.rb +0 -3
- data/lib/cli/event_log_renderer.rb +10 -10
- data/lib/cli/file_with_progress_bar.rb +52 -0
- data/lib/cli/job_builder.rb +1 -1
- data/lib/cli/job_command_args.rb +23 -0
- data/lib/cli/job_property_collection.rb +4 -7
- data/lib/cli/job_property_validator.rb +22 -12
- data/lib/cli/job_state.rb +54 -0
- data/lib/cli/line_wrap.rb +54 -0
- data/lib/cli/packaging_helper.rb +10 -10
- data/lib/cli/release.rb +18 -15
- data/lib/cli/release_builder.rb +9 -4
- data/lib/cli/release_compiler.rb +9 -9
- data/lib/cli/release_tarball.rb +3 -6
- data/lib/cli/resurrection.rb +31 -0
- data/lib/cli/runner.rb +56 -30
- data/lib/cli/stemcell.rb +25 -10
- data/lib/cli/task_log_renderer.rb +1 -1
- data/lib/cli/task_tracker.rb +10 -9
- data/lib/cli/validation.rb +3 -1
- data/lib/cli/version.rb +1 -1
- data/lib/cli/version_calc.rb +5 -18
- data/lib/cli/versions_index.rb +1 -1
- data/lib/cli/vm_state.rb +43 -0
- data/lib/cli/yaml_helper.rb +26 -35
- metadata +75 -208
- data/Rakefile +0 -56
- data/lib/cli/director.rb +0 -628
- data/spec/assets/biff/bad_gateway_config.yml +0 -28
- data/spec/assets/biff/good_simple_config.yml +0 -63
- data/spec/assets/biff/good_simple_golden_config.yml +0 -63
- data/spec/assets/biff/good_simple_template.erb +0 -69
- data/spec/assets/biff/ip_out_of_range.yml +0 -63
- data/spec/assets/biff/multiple_subnets_config.yml +0 -40
- data/spec/assets/biff/network_only_template.erb +0 -34
- data/spec/assets/biff/no_cc_config.yml +0 -27
- data/spec/assets/biff/no_range_config.yml +0 -27
- data/spec/assets/biff/no_subnet_config.yml +0 -16
- data/spec/assets/biff/ok_network_config.yml +0 -30
- data/spec/assets/biff/properties_template.erb +0 -6
- data/spec/assets/config/atmos/config/final.yml +0 -6
- data/spec/assets/config/atmos/config/private.yml +0 -4
- data/spec/assets/config/bad-providers/config/final.yml +0 -5
- data/spec/assets/config/bad-providers/config/private.yml +0 -4
- data/spec/assets/config/deprecation/config/final.yml +0 -5
- data/spec/assets/config/deprecation/config/private.yml +0 -2
- data/spec/assets/config/local/config/final.yml +0 -5
- data/spec/assets/config/local/config/private.yml +0 -1
- data/spec/assets/config/s3/config/final.yml +0 -5
- data/spec/assets/config/s3/config/private.yml +0 -5
- data/spec/assets/config/swift-hp/config/final.yml +0 -6
- data/spec/assets/config/swift-hp/config/private.yml +0 -7
- data/spec/assets/config/swift-rackspace/config/final.yml +0 -6
- data/spec/assets/config/swift-rackspace/config/private.yml +0 -6
- data/spec/assets/deployment.MF +0 -0
- data/spec/assets/plugins/bosh/cli/commands/echo.rb +0 -43
- data/spec/assets/plugins/bosh/cli/commands/ruby.rb +0 -24
- data/spec/assets/release/jobs/cacher.tgz +0 -0
- data/spec/assets/release/jobs/cacher/config/file1.conf +0 -0
- data/spec/assets/release/jobs/cacher/config/file2.conf +0 -0
- data/spec/assets/release/jobs/cacher/job.MF +0 -6
- data/spec/assets/release/jobs/cacher/monit +0 -1
- data/spec/assets/release/jobs/cleaner.tgz +0 -0
- data/spec/assets/release/jobs/cleaner/job.MF +0 -4
- data/spec/assets/release/jobs/cleaner/monit +0 -1
- data/spec/assets/release/jobs/sweeper.tgz +0 -0
- data/spec/assets/release/jobs/sweeper/config/test.conf +0 -1
- data/spec/assets/release/jobs/sweeper/job.MF +0 -5
- data/spec/assets/release/jobs/sweeper/monit +0 -1
- data/spec/assets/release/packages/mutator.tar.gz +0 -0
- data/spec/assets/release/packages/stuff.tgz +0 -0
- data/spec/assets/release/release.MF +0 -17
- data/spec/assets/release_invalid_checksum.tgz +0 -0
- data/spec/assets/release_invalid_jobs.tgz +0 -0
- data/spec/assets/release_no_name.tgz +0 -0
- data/spec/assets/release_no_version.tgz +0 -0
- data/spec/assets/stemcell/image +0 -1
- data/spec/assets/stemcell/stemcell.MF +0 -6
- data/spec/assets/stemcell_invalid_mf.tgz +0 -0
- data/spec/assets/stemcell_no_image.tgz +0 -0
- data/spec/assets/valid_release.tgz +0 -0
- data/spec/assets/valid_stemcell.tgz +0 -0
- data/spec/spec_helper.rb +0 -28
- data/spec/unit/base_command_spec.rb +0 -87
- data/spec/unit/biff_spec.rb +0 -172
- data/spec/unit/blob_manager_spec.rb +0 -288
- data/spec/unit/cache_spec.rb +0 -36
- data/spec/unit/cli_commands_spec.rb +0 -356
- data/spec/unit/config_spec.rb +0 -125
- data/spec/unit/core_ext_spec.rb +0 -81
- data/spec/unit/dependency_helper_spec.rb +0 -52
- data/spec/unit/deployment_manifest_compiler_spec.rb +0 -63
- data/spec/unit/deployment_manifest_spec.rb +0 -153
- data/spec/unit/director_spec.rb +0 -471
- data/spec/unit/director_task_spec.rb +0 -48
- data/spec/unit/event_log_renderer_spec.rb +0 -171
- data/spec/unit/hash_changeset_spec.rb +0 -73
- data/spec/unit/job_builder_spec.rb +0 -455
- data/spec/unit/job_property_collection_spec.rb +0 -111
- data/spec/unit/job_property_validator_spec.rb +0 -7
- data/spec/unit/job_rename_spec.rb +0 -200
- data/spec/unit/package_builder_spec.rb +0 -593
- data/spec/unit/release_builder_spec.rb +0 -120
- data/spec/unit/release_spec.rb +0 -173
- data/spec/unit/release_tarball_spec.rb +0 -29
- data/spec/unit/runner_spec.rb +0 -7
- data/spec/unit/ssh_spec.rb +0 -84
- data/spec/unit/stemcell_spec.rb +0 -17
- data/spec/unit/task_tracker_spec.rb +0 -131
- data/spec/unit/version_calc_spec.rb +0 -27
- data/spec/unit/versions_index_spec.rb +0 -144
data/spec/unit/config_spec.rb
DELETED
@@ -1,125 +0,0 @@
|
|
1
|
-
# Copyright (c) 2009-2012 VMware, Inc.
|
2
|
-
|
3
|
-
require "spec_helper"
|
4
|
-
|
5
|
-
describe Bosh::Cli::Config do
|
6
|
-
before :each do
|
7
|
-
@config = File.join(Dir.mktmpdir, "bosh_config")
|
8
|
-
@cache_dir = Dir.mktmpdir
|
9
|
-
end
|
10
|
-
|
11
|
-
def add_config(object)
|
12
|
-
File.open(@config, "w") do |f|
|
13
|
-
f.write(YAML.dump(object))
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
|
-
def create_config
|
18
|
-
Bosh::Cli::Config.new(@config)
|
19
|
-
end
|
20
|
-
|
21
|
-
it "should convert old deployment configs to the new config " +
|
22
|
-
"when set_deployment is called" do
|
23
|
-
add_config("target" => "localhost:8080", "deployment" => "test")
|
24
|
-
|
25
|
-
cfg = create_config
|
26
|
-
yaml_file = load_yaml_file(@config, nil)
|
27
|
-
yaml_file["deployment"].should == "test"
|
28
|
-
cfg.set_deployment("test2")
|
29
|
-
cfg.save
|
30
|
-
yaml_file = load_yaml_file(@config, nil)
|
31
|
-
yaml_file["deployment"].has_key?("localhost:8080").should be_true
|
32
|
-
yaml_file["deployment"]["localhost:8080"].should == "test2"
|
33
|
-
end
|
34
|
-
|
35
|
-
it "should convert old deployment configs to the new config " +
|
36
|
-
"when deployment is called" do
|
37
|
-
add_config("target" => "localhost:8080", "deployment" => "test")
|
38
|
-
|
39
|
-
cfg = create_config
|
40
|
-
yaml_file = load_yaml_file(@config, nil)
|
41
|
-
yaml_file["deployment"].should == "test"
|
42
|
-
cfg.deployment.should == "test"
|
43
|
-
yaml_file = load_yaml_file(@config, nil)
|
44
|
-
yaml_file["deployment"].has_key?("localhost:8080").should be_true
|
45
|
-
yaml_file["deployment"]["localhost:8080"].should == "test"
|
46
|
-
end
|
47
|
-
|
48
|
-
it "should save a deployment for each target" do
|
49
|
-
add_config({})
|
50
|
-
cfg = create_config
|
51
|
-
cfg.target = "localhost:1"
|
52
|
-
cfg.set_deployment("/path/to/deploy/1")
|
53
|
-
cfg.save
|
54
|
-
cfg.target = "localhost:2"
|
55
|
-
cfg.set_deployment("/path/to/deploy/2")
|
56
|
-
cfg.save
|
57
|
-
|
58
|
-
# Test that the file is written correctly.
|
59
|
-
yaml_file = load_yaml_file(@config, nil)
|
60
|
-
yaml_file["deployment"].has_key?("localhost:1").should be_true
|
61
|
-
yaml_file["deployment"].has_key?("localhost:2").should be_true
|
62
|
-
yaml_file["deployment"]["localhost:1"].should == "/path/to/deploy/1"
|
63
|
-
yaml_file["deployment"]["localhost:2"].should == "/path/to/deploy/2"
|
64
|
-
|
65
|
-
# Test that switching targets gives you the new deployment.
|
66
|
-
cfg.deployment.should == "/path/to/deploy/2"
|
67
|
-
cfg.target = "localhost:1"
|
68
|
-
cfg.deployment.should == "/path/to/deploy/1"
|
69
|
-
end
|
70
|
-
|
71
|
-
it "returns nil when the deployments key exists but has no value" do
|
72
|
-
add_config("target" => "localhost:8080", "deployment" => nil)
|
73
|
-
|
74
|
-
cfg = create_config
|
75
|
-
yaml_file = load_yaml_file(@config, nil)
|
76
|
-
yaml_file["deployment"].should == nil
|
77
|
-
cfg.deployment.should == nil
|
78
|
-
end
|
79
|
-
|
80
|
-
it "should throw MissingTarget when getting deployment without target set" do
|
81
|
-
add_config({})
|
82
|
-
cfg = create_config
|
83
|
-
expect { cfg.set_deployment("/path/to/deploy/1") }.
|
84
|
-
to raise_error(Bosh::Cli::MissingTarget)
|
85
|
-
end
|
86
|
-
|
87
|
-
it "whines on missing config file" do
|
88
|
-
lambda {
|
89
|
-
File.should_receive(:open).with(@config, "w").and_raise(Errno::EACCES)
|
90
|
-
create_config
|
91
|
-
}.should raise_error(Bosh::Cli::ConfigError)
|
92
|
-
end
|
93
|
-
|
94
|
-
|
95
|
-
it "effectively ignores config file if it is malformed" do
|
96
|
-
add_config([1, 2, 3])
|
97
|
-
cfg = create_config
|
98
|
-
|
99
|
-
cfg.target.should == nil
|
100
|
-
end
|
101
|
-
|
102
|
-
it "fetches auth information from the config file" do
|
103
|
-
config = {
|
104
|
-
"target" => "localhost:8080",
|
105
|
-
"deployment" => "test",
|
106
|
-
"auth" => {
|
107
|
-
"localhost:8080" => { "username" => "a", "password" => "b" },
|
108
|
-
"localhost:8081" => { "username" => "c", "password" => "d" }
|
109
|
-
}
|
110
|
-
}
|
111
|
-
|
112
|
-
add_config(config)
|
113
|
-
cfg = create_config
|
114
|
-
|
115
|
-
cfg.username("localhost:8080").should == "a"
|
116
|
-
cfg.password("localhost:8080").should == "b"
|
117
|
-
|
118
|
-
cfg.username("localhost:8081").should == "c"
|
119
|
-
cfg.password("localhost:8081").should == "d"
|
120
|
-
|
121
|
-
cfg.username("localhost:8083").should be_nil
|
122
|
-
cfg.password("localhost:8083").should be_nil
|
123
|
-
end
|
124
|
-
|
125
|
-
end
|
data/spec/unit/core_ext_spec.rb
DELETED
@@ -1,81 +0,0 @@
|
|
1
|
-
# Copyright (c) 2009-2012 VMware, Inc.
|
2
|
-
|
3
|
-
require "spec_helper"
|
4
|
-
|
5
|
-
describe String do
|
6
|
-
|
7
|
-
it "can tell valid bosh identifiers from invalid" do
|
8
|
-
%w(ruby ruby-1.8.7 mysql-2.3.5-alpha Apache_2.3).each do |id|
|
9
|
-
id.bosh_valid_id?.should be_true
|
10
|
-
end
|
11
|
-
|
12
|
-
["ruby 1.8", "ruby-1.8@b29", "#!@", "db/2", "ruby(1.8)"].each do |id|
|
13
|
-
id.bosh_valid_id?.should be_false
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
|
-
it "can tell blank string from non-blank" do
|
18
|
-
[" ", "\t\t", "\n", ""].each do |string|
|
19
|
-
string.should be_blank
|
20
|
-
end
|
21
|
-
|
22
|
-
["a", " a", "a ", " a ", "___", "z\tb"].each do |string|
|
23
|
-
string.should_not be_blank
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
27
|
-
it "has colorization helpers (but only if tty)" do
|
28
|
-
Bosh::Cli::Config.colorize = false
|
29
|
-
"string".red.should == "string"
|
30
|
-
"string".green.should == "string"
|
31
|
-
"string".colorize("a").should == "string"
|
32
|
-
"string".colorize(:green).should == "string"
|
33
|
-
|
34
|
-
Bosh::Cli::Config.colorize = true
|
35
|
-
Bosh::Cli::Config.output.stub(:tty?).and_return(true)
|
36
|
-
"string".red.should == "\e[0m\e[31mstring\e[0m"
|
37
|
-
"string".green.should == "\e[0m\e[32mstring\e[0m"
|
38
|
-
"string".colorize("a").should == "string"
|
39
|
-
"string".colorize(:green).should == "\e[0m\e[32mstring\e[0m"
|
40
|
-
|
41
|
-
Bosh::Cli::Config.output.stub(:tty?).and_return(false)
|
42
|
-
"string".green.should == "string"
|
43
|
-
end
|
44
|
-
end
|
45
|
-
|
46
|
-
describe Object do
|
47
|
-
|
48
|
-
it "has output helpers" do
|
49
|
-
s = StringIO.new
|
50
|
-
Bosh::Cli::Config.output = s
|
51
|
-
say("yea")
|
52
|
-
say("yea")
|
53
|
-
s.rewind
|
54
|
-
s.read.should == "yea\nyea\n"
|
55
|
-
|
56
|
-
s.rewind
|
57
|
-
header("test")
|
58
|
-
s.rewind
|
59
|
-
s.read.should == "\ntest\n----\n"
|
60
|
-
|
61
|
-
s.rewind
|
62
|
-
header("test", "a")
|
63
|
-
s.rewind
|
64
|
-
s.read.should == "\ntest\naaaa\n"
|
65
|
-
end
|
66
|
-
|
67
|
-
it "raises a special exception to signal a premature exit" do
|
68
|
-
lambda {
|
69
|
-
err("Done")
|
70
|
-
}.should raise_error(Bosh::Cli::CliError, "Done")
|
71
|
-
end
|
72
|
-
|
73
|
-
it "can tell if object is blank" do
|
74
|
-
o = Object.new
|
75
|
-
o.stub!(:to_s).and_return(" ")
|
76
|
-
o.should be_blank
|
77
|
-
o.stub!(:to_s).and_return("Object 1")
|
78
|
-
o.should_not be_blank
|
79
|
-
end
|
80
|
-
|
81
|
-
end
|
@@ -1,52 +0,0 @@
|
|
1
|
-
# Copyright (c) 2009-2012 VMware, Inc.
|
2
|
-
|
3
|
-
require "spec_helper"
|
4
|
-
|
5
|
-
describe Bosh::Cli::DependencyHelper do
|
6
|
-
|
7
|
-
def sorter
|
8
|
-
object = Object.new
|
9
|
-
class << object
|
10
|
-
include Bosh::Cli::DependencyHelper
|
11
|
-
end
|
12
|
-
object
|
13
|
-
end
|
14
|
-
|
15
|
-
def tsort_packages(*args)
|
16
|
-
sorter.tsort_packages(*args)
|
17
|
-
end
|
18
|
-
|
19
|
-
def partial_order_sort(*args)
|
20
|
-
sorter.partial_order_sort(*args)
|
21
|
-
end
|
22
|
-
|
23
|
-
it "resolves sorts simple dependencies" do
|
24
|
-
tsort_packages("A" => ["B"], "B" => ["C"], "C" => []).
|
25
|
-
should == ["C", "B", "A"]
|
26
|
-
end
|
27
|
-
|
28
|
-
it "whines on missing dependencies" do
|
29
|
-
lambda {
|
30
|
-
tsort_packages("A" => ["B"], "C" => ["D"])
|
31
|
-
}.should raise_error Bosh::Cli::MissingDependency,
|
32
|
-
"Package 'A' depends on missing package 'B'"
|
33
|
-
end
|
34
|
-
|
35
|
-
it "whines on circular dependencies" do
|
36
|
-
lambda {
|
37
|
-
tsort_packages("foo" => ["bar"], "bar" => ["baz"], "baz" => ["foo"])
|
38
|
-
}.should raise_error(Bosh::Cli::CircularDependency,
|
39
|
-
"Cannot resolve dependencies for 'bar': " +
|
40
|
-
"circular dependency with 'foo'")
|
41
|
-
end
|
42
|
-
|
43
|
-
it "can resolve nested dependencies" do
|
44
|
-
sorted = tsort_packages("A" => ["B", "C"], "B" => ["C", "D"],
|
45
|
-
"C" => ["D"], "D" => [], "E" => [])
|
46
|
-
sorted.index("B").should <= sorted.index("A")
|
47
|
-
sorted.index("C").should <= sorted.index("A")
|
48
|
-
sorted.index("D").should <= sorted.index("B")
|
49
|
-
sorted.index("D").should <= sorted.index("C")
|
50
|
-
end
|
51
|
-
|
52
|
-
end
|
@@ -1,63 +0,0 @@
|
|
1
|
-
# Copyright (c) 2009-2012 VMware, Inc.
|
2
|
-
|
3
|
-
require "spec_helper"
|
4
|
-
|
5
|
-
describe Bosh::Cli::DeploymentManifestCompiler do
|
6
|
-
|
7
|
-
def make_compiler(manifest, properties = {})
|
8
|
-
compiler = Bosh::Cli::DeploymentManifestCompiler.new(manifest)
|
9
|
-
compiler.properties = properties
|
10
|
-
compiler
|
11
|
-
end
|
12
|
-
|
13
|
-
it "substitutes properties in a raw manifest" do
|
14
|
-
raw_manifest = <<-MANIFEST.gsub(/^\s*/, "")
|
15
|
-
---
|
16
|
-
name: mycloud
|
17
|
-
properties:
|
18
|
-
dea:
|
19
|
-
max_memory: <%= property("dea.max_memory") %>
|
20
|
-
MANIFEST
|
21
|
-
|
22
|
-
compiler = make_compiler(raw_manifest, { "dea.max_memory" => 8192 })
|
23
|
-
|
24
|
-
compiler.result.should == <<-MANIFEST.gsub(/^\s*/, "")
|
25
|
-
---
|
26
|
-
name: mycloud
|
27
|
-
properties:
|
28
|
-
dea:
|
29
|
-
max_memory: 8192
|
30
|
-
MANIFEST
|
31
|
-
end
|
32
|
-
|
33
|
-
it "whines on missing deployment properties" do
|
34
|
-
raw_manifest = <<-MANIFEST.gsub(/^\s*/, "")
|
35
|
-
---
|
36
|
-
name: mycloud
|
37
|
-
properties:
|
38
|
-
dea:
|
39
|
-
max_memory: <%= property("missing.property") %>
|
40
|
-
MANIFEST
|
41
|
-
|
42
|
-
compiler = make_compiler(raw_manifest, { "dea.max_memory" => 8192 })
|
43
|
-
error_msg = "Cannot resolve deployment property `missing.property'"
|
44
|
-
|
45
|
-
lambda {
|
46
|
-
compiler.result
|
47
|
-
}.should raise_error(Bosh::Cli::UndefinedProperty, error_msg)
|
48
|
-
end
|
49
|
-
|
50
|
-
it "whines if manifest has syntax error (from ERB's point of view)" do
|
51
|
-
raw_manifest = <<-MANIFEST.gsub(/^\s*/, "")
|
52
|
-
properties: <%=
|
53
|
-
dea:
|
54
|
-
max_memory: <%= property("missing.property") %>
|
55
|
-
MANIFEST
|
56
|
-
|
57
|
-
compiler = make_compiler(raw_manifest, { "dea.max_memory" => 8192 })
|
58
|
-
|
59
|
-
lambda {
|
60
|
-
compiler.result
|
61
|
-
}.should raise_error(Bosh::Cli::MalformedManifest)
|
62
|
-
end
|
63
|
-
end
|
@@ -1,153 +0,0 @@
|
|
1
|
-
# Copyright (c) 2009-2012 VMware, Inc.
|
2
|
-
|
3
|
-
require "spec_helper"
|
4
|
-
|
5
|
-
describe Bosh::Cli::DeploymentHelper do
|
6
|
-
|
7
|
-
def make_cmd(options = {})
|
8
|
-
cmd = Bosh::Cli::Command::Base.new(options)
|
9
|
-
cmd.extend(Bosh::Cli::DeploymentHelper)
|
10
|
-
cmd
|
11
|
-
end
|
12
|
-
|
13
|
-
it "checks that actual director UUID matches the one in manifest" do
|
14
|
-
cmd = make_cmd
|
15
|
-
manifest = {
|
16
|
-
"name" => "mycloud",
|
17
|
-
"director_uuid" => "deadbeef"
|
18
|
-
}
|
19
|
-
|
20
|
-
manifest_file = Tempfile.new("manifest")
|
21
|
-
YAML.dump(manifest, manifest_file)
|
22
|
-
manifest_file.close
|
23
|
-
director = mock(Bosh::Cli::Director)
|
24
|
-
|
25
|
-
cmd.stub!(:deployment).and_return(manifest_file.path)
|
26
|
-
cmd.stub!(:director).and_return(director)
|
27
|
-
|
28
|
-
director.should_receive(:uuid).and_return("deadcafe")
|
29
|
-
|
30
|
-
expect {
|
31
|
-
cmd.prepare_deployment_manifest
|
32
|
-
}.to raise_error(/Target director UUID doesn't match/i)
|
33
|
-
end
|
34
|
-
|
35
|
-
it "resolves 'latest' release alias for multiple releases" do
|
36
|
-
cmd = make_cmd
|
37
|
-
manifest = {
|
38
|
-
"name" => "mycloud",
|
39
|
-
"director_uuid" => "deadbeef",
|
40
|
-
"releases" => [
|
41
|
-
{"name" => "foo", "version" => "latest"},
|
42
|
-
{"name" => "bar", "version" => "latest"},
|
43
|
-
{"name" => "baz", "version" => 3},
|
44
|
-
]
|
45
|
-
}
|
46
|
-
|
47
|
-
manifest_file = Tempfile.new("manifest")
|
48
|
-
YAML.dump(manifest, manifest_file)
|
49
|
-
manifest_file.close
|
50
|
-
director = mock(Bosh::Cli::Director, :uuid => "deadbeef")
|
51
|
-
|
52
|
-
cmd.stub!(:deployment).and_return(manifest_file.path)
|
53
|
-
cmd.stub!(:director).and_return(director)
|
54
|
-
|
55
|
-
releases = [
|
56
|
-
{"name" => "foo", "versions" => %w(1 3.5.7-dev 2 3.5.2-dev)},
|
57
|
-
{"name" => "bar", "versions" => %w(4 2 3 1 1.1-dev 3.99-dev)},
|
58
|
-
{"name" => "baz", "versions" => %w(1 2 3 4 5 6 7)}
|
59
|
-
]
|
60
|
-
|
61
|
-
director.should_receive(:list_releases).and_return(releases)
|
62
|
-
|
63
|
-
manifest = cmd.prepare_deployment_manifest
|
64
|
-
manifest["releases"][0]["version"].should == "3.5.7-dev"
|
65
|
-
manifest["releases"][1]["version"].should == 4 # cast to Integer!
|
66
|
-
manifest["releases"][2]["version"].should == 3
|
67
|
-
end
|
68
|
-
|
69
|
-
it "resolves 'latest' release alias for a single release" do
|
70
|
-
cmd = make_cmd
|
71
|
-
manifest = {
|
72
|
-
"name" => "mycloud",
|
73
|
-
"director_uuid" => "deadbeef",
|
74
|
-
"release" => {"name" => "foo", "version" => "latest"}
|
75
|
-
}
|
76
|
-
|
77
|
-
manifest_file = Tempfile.new("manifest")
|
78
|
-
YAML.dump(manifest, manifest_file)
|
79
|
-
manifest_file.close
|
80
|
-
director = mock(Bosh::Cli::Director, :uuid => "deadbeef")
|
81
|
-
|
82
|
-
cmd.stub!(:deployment).and_return(manifest_file.path)
|
83
|
-
cmd.stub!(:director).and_return(director)
|
84
|
-
|
85
|
-
releases = [
|
86
|
-
{"name" => "foo", "versions" => %w(1 3.5.7-dev 2 3.5.2-dev)},
|
87
|
-
]
|
88
|
-
|
89
|
-
director.should_receive(:list_releases).and_return(releases)
|
90
|
-
|
91
|
-
manifest = cmd.prepare_deployment_manifest
|
92
|
-
manifest["release"]["version"].should == "3.5.7-dev"
|
93
|
-
end
|
94
|
-
|
95
|
-
it "treats having both 'releases' and 'release' as error" do
|
96
|
-
cmd = make_cmd
|
97
|
-
manifest = {
|
98
|
-
"name" => "mycloud",
|
99
|
-
"director_uuid" => "deadbeef",
|
100
|
-
"release" => {"name" => "foo", "version" => "latest"},
|
101
|
-
"releases" => []
|
102
|
-
}
|
103
|
-
|
104
|
-
manifest_file = Tempfile.new("manifest")
|
105
|
-
YAML.dump(manifest, manifest_file)
|
106
|
-
manifest_file.close
|
107
|
-
director = mock(Bosh::Cli::Director, :uuid => "deadbeef")
|
108
|
-
|
109
|
-
cmd.stub!(:deployment).and_return(manifest_file.path)
|
110
|
-
cmd.stub!(:director).and_return(director)
|
111
|
-
|
112
|
-
expect {
|
113
|
-
cmd.prepare_deployment_manifest
|
114
|
-
}.to raise_error(/manifest has both `release' and `releases'/i)
|
115
|
-
end
|
116
|
-
|
117
|
-
it "resolves 'latest' release alias for multiple stemcells" do
|
118
|
-
cmd = make_cmd
|
119
|
-
manifest = {
|
120
|
-
"name" => "mycloud",
|
121
|
-
"director_uuid" => "deadbeef",
|
122
|
-
"release" => {"name" => "appcloud", "version" => 42},
|
123
|
-
"resource_pools" => [
|
124
|
-
{"stemcell" => {"name" => "foo", "version" => "latest"}},
|
125
|
-
{"stemcell" => {"name" => "foo", "version" => 22}},
|
126
|
-
{"stemcell" => {"name" => "bar", "version" => "latest"}},
|
127
|
-
]
|
128
|
-
}
|
129
|
-
|
130
|
-
manifest_file = Tempfile.new("manifest")
|
131
|
-
YAML.dump(manifest, manifest_file)
|
132
|
-
manifest_file.close
|
133
|
-
director = mock(Bosh::Cli::Director, :uuid => "deadbeef")
|
134
|
-
|
135
|
-
cmd.stub!(:deployment).and_return(manifest_file.path)
|
136
|
-
cmd.stub!(:director).and_return(director)
|
137
|
-
|
138
|
-
stemcells = [
|
139
|
-
{"name" => "foo", "version" => "22.6.4"},
|
140
|
-
{"name" => "foo", "version" => "22"},
|
141
|
-
{"name" => "bar", "version" => "4.0.8"},
|
142
|
-
{"name" => "bar", "version" => "4.1"}
|
143
|
-
]
|
144
|
-
|
145
|
-
director.should_receive(:list_stemcells).and_return(stemcells)
|
146
|
-
|
147
|
-
manifest = cmd.prepare_deployment_manifest
|
148
|
-
manifest["resource_pools"][0]["stemcell"]["version"].should == "22.6.4"
|
149
|
-
manifest["resource_pools"][1]["stemcell"]["version"].should == 22
|
150
|
-
manifest["resource_pools"][2]["stemcell"]["version"].should == 4.1
|
151
|
-
end
|
152
|
-
|
153
|
-
end
|