bosh_cli 1.0.3 → 1.5.0.pre.1113
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.
- 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
|
@@ -1,120 +0,0 @@
|
|
|
1
|
-
# Copyright (c) 2009-2012 VMware, Inc.
|
|
2
|
-
|
|
3
|
-
require "spec_helper"
|
|
4
|
-
|
|
5
|
-
describe Bosh::Cli::ReleaseBuilder do
|
|
6
|
-
|
|
7
|
-
before(:each) do
|
|
8
|
-
@release_dir = Dir.mktmpdir
|
|
9
|
-
FileUtils.mkdir_p(File.join(@release_dir, "config"))
|
|
10
|
-
@release = Bosh::Cli::Release.new(@release_dir)
|
|
11
|
-
end
|
|
12
|
-
|
|
13
|
-
def new_builder
|
|
14
|
-
Bosh::Cli::ReleaseBuilder.new(@release, [], [])
|
|
15
|
-
end
|
|
16
|
-
|
|
17
|
-
it "uses version 0.1-dev if no previous releases have been created" do
|
|
18
|
-
new_builder.version.should == "0.1-dev"
|
|
19
|
-
end
|
|
20
|
-
|
|
21
|
-
it "builds a release" do
|
|
22
|
-
builder = new_builder
|
|
23
|
-
builder.build
|
|
24
|
-
|
|
25
|
-
expected_tarball_path = File.join(@release_dir,
|
|
26
|
-
"dev_releases",
|
|
27
|
-
"bosh_release-0.1-dev.tgz")
|
|
28
|
-
|
|
29
|
-
builder.tarball_path.should == expected_tarball_path
|
|
30
|
-
File.file?(expected_tarball_path).should be_true
|
|
31
|
-
end
|
|
32
|
-
|
|
33
|
-
it "doesn't build a new release if nothing has changed" do
|
|
34
|
-
builder = new_builder
|
|
35
|
-
builder.build
|
|
36
|
-
builder.build
|
|
37
|
-
|
|
38
|
-
File.file?(File.join(@release_dir, "dev_releases",
|
|
39
|
-
"bosh_release-0.1-dev.tgz")).
|
|
40
|
-
should be_true
|
|
41
|
-
File.file?(File.join(@release_dir, "dev_releases",
|
|
42
|
-
"bosh_release-0.2-dev.tgz")).
|
|
43
|
-
should be_false
|
|
44
|
-
end
|
|
45
|
-
|
|
46
|
-
it "has a list of jobs affected by building this release" do
|
|
47
|
-
job1 = mock(:job, :new_version? => true,
|
|
48
|
-
:packages => %w(bar baz), :name => "job1")
|
|
49
|
-
job2 = mock(:job, :new_version? => false,
|
|
50
|
-
:packages => %w(foo baz), :name => "job2")
|
|
51
|
-
job3 = mock(:job, :new_version? => false,
|
|
52
|
-
:packages => %w(baz zb), :name => "job3")
|
|
53
|
-
job4 = mock(:job, :new_version? => false,
|
|
54
|
-
:packages => %w(bar baz), :name => "job4")
|
|
55
|
-
|
|
56
|
-
package1 = mock(:package, :name => "foo", :new_version? => true)
|
|
57
|
-
package2 = mock(:package, :name => "bar", :new_version? => false)
|
|
58
|
-
package3 = mock(:package, :name => "baz", :new_version? => false)
|
|
59
|
-
package4 = mock(:package, :name => "zb", :new_version? => true)
|
|
60
|
-
|
|
61
|
-
builder = Bosh::Cli::ReleaseBuilder.new(@release,
|
|
62
|
-
[package1, package2,
|
|
63
|
-
package3, package4],
|
|
64
|
-
[job1, job2, job3, job4])
|
|
65
|
-
builder.affected_jobs.should =~ [job1, job2, job3]
|
|
66
|
-
end
|
|
67
|
-
|
|
68
|
-
it "bumps dev version in sync with final version" do
|
|
69
|
-
final_index = Bosh::Cli::VersionsIndex.new(File.join(@release_dir,
|
|
70
|
-
"releases"))
|
|
71
|
-
|
|
72
|
-
final_index.add_version("deadbeef",
|
|
73
|
-
{ "version" => 2 },
|
|
74
|
-
get_tmp_file_path("payload"))
|
|
75
|
-
|
|
76
|
-
builder = new_builder
|
|
77
|
-
builder.version.should == "2.1-dev"
|
|
78
|
-
builder.build
|
|
79
|
-
|
|
80
|
-
final_index.add_version("deadbeef",
|
|
81
|
-
{ "version" => 7 },
|
|
82
|
-
get_tmp_file_path("payload"))
|
|
83
|
-
builder = new_builder
|
|
84
|
-
builder.version.should == "7.1-dev"
|
|
85
|
-
end
|
|
86
|
-
|
|
87
|
-
it "has packages and jobs fingerprints in spec" do
|
|
88
|
-
job = mock(
|
|
89
|
-
Bosh::Cli::JobBuilder,
|
|
90
|
-
:name => "job1",
|
|
91
|
-
:version => "1.1",
|
|
92
|
-
:new_version? => true,
|
|
93
|
-
:packages => %w(foo),
|
|
94
|
-
:fingerprint => "deadbeef",
|
|
95
|
-
:checksum => "cafebad"
|
|
96
|
-
)
|
|
97
|
-
|
|
98
|
-
package = mock(
|
|
99
|
-
Bosh::Cli::PackageBuilder,
|
|
100
|
-
:name => "foo",
|
|
101
|
-
:version => "42",
|
|
102
|
-
:new_version? => true,
|
|
103
|
-
:fingerprint => "deadcafe",
|
|
104
|
-
:checksum => "baddeed",
|
|
105
|
-
:dependencies => []
|
|
106
|
-
)
|
|
107
|
-
|
|
108
|
-
builder = Bosh::Cli::ReleaseBuilder.new(@release, [package], [job])
|
|
109
|
-
builder.should_receive(:copy_jobs)
|
|
110
|
-
builder.should_receive(:copy_packages)
|
|
111
|
-
|
|
112
|
-
builder.build
|
|
113
|
-
|
|
114
|
-
manifest = YAML.load_file(builder.manifest_path)
|
|
115
|
-
|
|
116
|
-
manifest["jobs"][0]["fingerprint"].should == "deadbeef"
|
|
117
|
-
manifest["packages"][0]["fingerprint"].should == "deadcafe"
|
|
118
|
-
end
|
|
119
|
-
|
|
120
|
-
end
|
data/spec/unit/release_spec.rb
DELETED
|
@@ -1,173 +0,0 @@
|
|
|
1
|
-
# Copyright (c) 2009-2012 VMware, Inc.
|
|
2
|
-
|
|
3
|
-
require "spec_helper"
|
|
4
|
-
|
|
5
|
-
describe Bosh::Cli::Release do
|
|
6
|
-
|
|
7
|
-
before :each do
|
|
8
|
-
@release_dir = Dir.mktmpdir
|
|
9
|
-
FileUtils.mkdir_p(File.join(@release_dir, "config"))
|
|
10
|
-
end
|
|
11
|
-
|
|
12
|
-
def new_release(dir)
|
|
13
|
-
Bosh::Cli::Release.new(@release_dir)
|
|
14
|
-
end
|
|
15
|
-
|
|
16
|
-
it "persists release attributes" do
|
|
17
|
-
r = new_release(@dir)
|
|
18
|
-
|
|
19
|
-
r.dev_name.should be_nil
|
|
20
|
-
r.final_name.should be_nil
|
|
21
|
-
r.min_cli_version.should be_nil
|
|
22
|
-
r.latest_release_filename.should be_nil
|
|
23
|
-
|
|
24
|
-
r.dev_name = "dev-release"
|
|
25
|
-
r.final_name = "prod-release"
|
|
26
|
-
r.min_cli_version = "0.5.2"
|
|
27
|
-
r.latest_release_filename = "foobar"
|
|
28
|
-
r.save_config
|
|
29
|
-
|
|
30
|
-
r2 = new_release(@release_dir)
|
|
31
|
-
r.dev_name.should == "dev-release"
|
|
32
|
-
r.final_name.should == "prod-release"
|
|
33
|
-
r.min_cli_version.should == "0.5.2"
|
|
34
|
-
r.latest_release_filename.should == "foobar"
|
|
35
|
-
end
|
|
36
|
-
|
|
37
|
-
it "has attributes persisted in bosh user config" do
|
|
38
|
-
r = new_release(@release_dir)
|
|
39
|
-
r.dev_name = "dev-release"
|
|
40
|
-
r.final_name = "prod-release"
|
|
41
|
-
r.min_cli_version = "0.5.2"
|
|
42
|
-
r.save_config
|
|
43
|
-
|
|
44
|
-
FileUtils.rm_rf(File.join(@release_dir, "config", "dev.yml"))
|
|
45
|
-
|
|
46
|
-
r = new_release(@release_dir)
|
|
47
|
-
r.dev_name.should be_nil
|
|
48
|
-
r.final_name.should == "prod-release"
|
|
49
|
-
r.min_cli_version.should == "0.5.2"
|
|
50
|
-
end
|
|
51
|
-
|
|
52
|
-
it "has attributes persisted in public release config" do
|
|
53
|
-
r = new_release(@release_dir)
|
|
54
|
-
r.dev_name = "dev-release"
|
|
55
|
-
r.final_name = "prod-release"
|
|
56
|
-
r.min_cli_version = "0.5.2"
|
|
57
|
-
r.save_config
|
|
58
|
-
|
|
59
|
-
FileUtils.rm_rf(File.join(@release_dir, "config", "final.yml"))
|
|
60
|
-
|
|
61
|
-
r = new_release(@release_dir)
|
|
62
|
-
r.dev_name.should == "dev-release"
|
|
63
|
-
r.final_name.should be_nil
|
|
64
|
-
r.min_cli_version.should be_nil
|
|
65
|
-
end
|
|
66
|
-
|
|
67
|
-
describe "merging final.yml with private.yml" do
|
|
68
|
-
it "should print a warning when it contains blobstore_secret" do
|
|
69
|
-
r = Bosh::Cli::Release.new(spec_asset("config/deprecation"))
|
|
70
|
-
opts = {
|
|
71
|
-
:uid => "bosh",
|
|
72
|
-
:secret => "bar"
|
|
73
|
-
}
|
|
74
|
-
Bosh::Blobstore::Client.should_receive(:create).with("atmos", opts)
|
|
75
|
-
r.should_receive(:say)
|
|
76
|
-
|
|
77
|
-
r.blobstore
|
|
78
|
-
end
|
|
79
|
-
|
|
80
|
-
it "should detect blobstore secrets for deprecated options" do
|
|
81
|
-
r = Bosh::Cli::Release.new(spec_asset("config/deprecation"))
|
|
82
|
-
r.has_blobstore_secret?.should be_true
|
|
83
|
-
end
|
|
84
|
-
|
|
85
|
-
it "should merge s3 secrets into options" do
|
|
86
|
-
r = Bosh::Cli::Release.new(spec_asset("config/s3"))
|
|
87
|
-
opts = {
|
|
88
|
-
:bucket_name => "test",
|
|
89
|
-
:secret_access_key => "foo",
|
|
90
|
-
:access_key_id => "bar"
|
|
91
|
-
}
|
|
92
|
-
Bosh::Blobstore::Client.should_receive(:create).with("s3", opts)
|
|
93
|
-
r.blobstore
|
|
94
|
-
end
|
|
95
|
-
|
|
96
|
-
it "should detect blobstore secrets for s3 options" do
|
|
97
|
-
r = Bosh::Cli::Release.new(spec_asset("config/s3"))
|
|
98
|
-
r.has_blobstore_secret?.should be_true
|
|
99
|
-
end
|
|
100
|
-
|
|
101
|
-
it "should merge atmos secrets into options" do
|
|
102
|
-
r = Bosh::Cli::Release.new(spec_asset("config/atmos"))
|
|
103
|
-
opts = {
|
|
104
|
-
:uid => "bosh",
|
|
105
|
-
:secret => "bar"
|
|
106
|
-
}
|
|
107
|
-
Bosh::Blobstore::Client.should_receive(:create).with("atmos", opts)
|
|
108
|
-
r.blobstore
|
|
109
|
-
end
|
|
110
|
-
|
|
111
|
-
it "should detect blobstore secrets for atmos options" do
|
|
112
|
-
r = Bosh::Cli::Release.new(spec_asset("config/atmos"))
|
|
113
|
-
r.has_blobstore_secret?.should be_true
|
|
114
|
-
end
|
|
115
|
-
|
|
116
|
-
it "should merge swift (HP) secrets into options" do
|
|
117
|
-
r = Bosh::Cli::Release.new(spec_asset("config/swift-hp"))
|
|
118
|
-
opts = {
|
|
119
|
-
:container_name => "test",
|
|
120
|
-
:swift_provider => "hp",
|
|
121
|
-
:hp => {
|
|
122
|
-
:hp_account_id => "foo",
|
|
123
|
-
:hp_secret_key => "bar",
|
|
124
|
-
:hp_tenant_id => "foo"
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
Bosh::Blobstore::Client.should_receive(:create).with("swift", opts)
|
|
128
|
-
r.blobstore
|
|
129
|
-
end
|
|
130
|
-
|
|
131
|
-
it "should detect blobstore secrets for swift (HP) options" do
|
|
132
|
-
r = Bosh::Cli::Release.new(spec_asset("config/swift-hp"))
|
|
133
|
-
r.has_blobstore_secret?.should be_true
|
|
134
|
-
end
|
|
135
|
-
|
|
136
|
-
it "should merge swift (Rackspace) secrets into options" do
|
|
137
|
-
r = Bosh::Cli::Release.new(spec_asset("config/swift-rackspace"))
|
|
138
|
-
opts = {
|
|
139
|
-
:container_name => "test",
|
|
140
|
-
:swift_provider => "rackspace",
|
|
141
|
-
:rackspace => {
|
|
142
|
-
:rackspace_username => "foo",
|
|
143
|
-
:rackspace_api_key => "bar"
|
|
144
|
-
}
|
|
145
|
-
}
|
|
146
|
-
Bosh::Blobstore::Client.should_receive(:create).with("swift", opts)
|
|
147
|
-
r.blobstore
|
|
148
|
-
end
|
|
149
|
-
|
|
150
|
-
it "should detect blobstore secrets for swift (Rackspace) options" do
|
|
151
|
-
r = Bosh::Cli::Release.new(spec_asset("config/swift-rackspace"))
|
|
152
|
-
r.has_blobstore_secret?.should be_true
|
|
153
|
-
end
|
|
154
|
-
|
|
155
|
-
it "should not throw an error when merging empty secrets into options" do
|
|
156
|
-
r = Bosh::Cli::Release.new(spec_asset("config/local"))
|
|
157
|
-
opts = {
|
|
158
|
-
:blobstore_path => "/tmp/blobstore"
|
|
159
|
-
}
|
|
160
|
-
Bosh::Blobstore::Client.should_receive(:create).with("local", opts)
|
|
161
|
-
r.blobstore
|
|
162
|
-
end
|
|
163
|
-
|
|
164
|
-
it "throws an error when blobstore providers does not match" do
|
|
165
|
-
r = Bosh::Cli::Release.new(spec_asset("config/bad-providers"))
|
|
166
|
-
expect {
|
|
167
|
-
r.blobstore
|
|
168
|
-
}.to raise_error(Bosh::Cli::CliError, "blobstore private provider " +
|
|
169
|
-
"does not match final provider")
|
|
170
|
-
|
|
171
|
-
end
|
|
172
|
-
end
|
|
173
|
-
end
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
# Copyright (c) 2009-2012 VMware, Inc.
|
|
2
|
-
|
|
3
|
-
require "spec_helper"
|
|
4
|
-
|
|
5
|
-
describe Bosh::Cli::ReleaseTarball do
|
|
6
|
-
|
|
7
|
-
describe "verifying a release" do
|
|
8
|
-
it "verifies and reports a valid release" do
|
|
9
|
-
tarball = Bosh::Cli::ReleaseTarball.new(spec_asset("valid_release.tgz"))
|
|
10
|
-
tarball.should be_valid
|
|
11
|
-
end
|
|
12
|
-
|
|
13
|
-
it "verifies repacked release if appropriate option is set" do
|
|
14
|
-
tarball = Bosh::Cli::ReleaseTarball.new(spec_asset("valid_release.tgz"))
|
|
15
|
-
package_matches = ["86bd8b15562cde007f030a303fa64779af5fa4e7"]
|
|
16
|
-
repacked_tarball_path = tarball.repack(package_matches)
|
|
17
|
-
|
|
18
|
-
tarball.skipped.should == 1
|
|
19
|
-
|
|
20
|
-
repacked_tarball = Bosh::Cli::ReleaseTarball.new(repacked_tarball_path)
|
|
21
|
-
repacked_tarball.valid?.should be_false
|
|
22
|
-
repacked_tarball.reset_validation
|
|
23
|
-
repacked_tarball.valid?(:allow_sparse => true).should be_true
|
|
24
|
-
end
|
|
25
|
-
end
|
|
26
|
-
|
|
27
|
-
# TODO: add whining on potential errors
|
|
28
|
-
|
|
29
|
-
end
|
data/spec/unit/runner_spec.rb
DELETED
data/spec/unit/ssh_spec.rb
DELETED
|
@@ -1,84 +0,0 @@
|
|
|
1
|
-
# Copyright (c) 2009-2012 VMware, Inc.
|
|
2
|
-
|
|
3
|
-
require "spec_helper"
|
|
4
|
-
|
|
5
|
-
describe Bosh::Cli::Command::Base do
|
|
6
|
-
# TODO: the whole spec needs to be rewritten
|
|
7
|
-
|
|
8
|
-
before :all do
|
|
9
|
-
@public_key = File.join(Dir.mktmpdir, "public_key")
|
|
10
|
-
File.open(@public_key, "w+") do |f|
|
|
11
|
-
f.write("PUBLIC_KEY")
|
|
12
|
-
end
|
|
13
|
-
end
|
|
14
|
-
|
|
15
|
-
describe Bosh::Cli::Command::Ssh do
|
|
16
|
-
it "should get the public key" do
|
|
17
|
-
ssh = Bosh::Cli::Command::Ssh.new
|
|
18
|
-
ssh.add_option(:public_key, @public_key)
|
|
19
|
-
public_key = ssh.send(:get_public_key)
|
|
20
|
-
public_key.should == "PUBLIC_KEY"
|
|
21
|
-
end
|
|
22
|
-
|
|
23
|
-
it "should get the public key from users home directory " +
|
|
24
|
-
"or raise exception" do
|
|
25
|
-
ssh = Bosh::Cli::Command::Ssh.new
|
|
26
|
-
public_key = nil
|
|
27
|
-
begin
|
|
28
|
-
public_key = ssh.send(:get_public_key)
|
|
29
|
-
rescue Bosh::Cli::CliError
|
|
30
|
-
public_key = "SOMETHING"
|
|
31
|
-
end
|
|
32
|
-
public_key.should_not be_nil
|
|
33
|
-
end
|
|
34
|
-
|
|
35
|
-
it "should contact director to setup ssh on the job" do
|
|
36
|
-
mock_director = mock(Object)
|
|
37
|
-
mock_director.stub(:setup_ssh).and_return([:done, 42])
|
|
38
|
-
|
|
39
|
-
mock_director.stub(:get_task_result_log).with(42).
|
|
40
|
-
and_return(JSON.generate(
|
|
41
|
-
[{ "status" => "success", "ip" => "127.0.0.1" }]))
|
|
42
|
-
mock_director.stub(:cleanup_ssh)
|
|
43
|
-
Bosh::Cli::Director.should_receive(:new).and_return(mock_director)
|
|
44
|
-
ssh = Bosh::Cli::Command::Ssh.new
|
|
45
|
-
ssh.stub(:prepare_deployment_manifest).and_return("test")
|
|
46
|
-
ssh.stub(:cleanup_ssh)
|
|
47
|
-
ssh.stub(:get_public_key).and_return("PUBKEY")
|
|
48
|
-
ssh.send(
|
|
49
|
-
:setup_ssh, "dea", 0, "temp_pass") do |results, _, _|
|
|
50
|
-
results.each do |result|
|
|
51
|
-
result["status"].should == "success"
|
|
52
|
-
result["ip"].should == "127.0.0.1"
|
|
53
|
-
end
|
|
54
|
-
end
|
|
55
|
-
end
|
|
56
|
-
|
|
57
|
-
it "should try to setup interactive shell when a job index is given" do
|
|
58
|
-
ssh = Bosh::Cli::Command::Ssh.new
|
|
59
|
-
@interactive_shell = false
|
|
60
|
-
@execute_command = false
|
|
61
|
-
ssh.stub(:setup_interactive_shell) { @interactive_shell = true }
|
|
62
|
-
ssh.stub(:execute_command) { @execute_command = true }
|
|
63
|
-
ssh.shell("dea", "0")
|
|
64
|
-
@interactive_shell.should == true && @execute_command.should == false
|
|
65
|
-
end
|
|
66
|
-
|
|
67
|
-
it "should fail to setup interactive shell when a job index is not given" do
|
|
68
|
-
ssh = Bosh::Cli::Command::Ssh.new
|
|
69
|
-
lambda {
|
|
70
|
-
ssh.shell("dea")
|
|
71
|
-
}.should raise_error(Bosh::Cli::CliError)
|
|
72
|
-
end
|
|
73
|
-
|
|
74
|
-
it "should try to execute given command remotely" do
|
|
75
|
-
ssh = Bosh::Cli::Command::Ssh.new
|
|
76
|
-
@interactive_shell = false
|
|
77
|
-
@execute_command = false
|
|
78
|
-
ssh.stub(:setup_interactive_shell) { @interactive_shell = true }
|
|
79
|
-
ssh.stub(:perform_operation) { @execute_command = true }
|
|
80
|
-
ssh.shell("dea", "ls -l")
|
|
81
|
-
@interactive_shell.should == false && @execute_command.should == true
|
|
82
|
-
end
|
|
83
|
-
end
|
|
84
|
-
end
|
data/spec/unit/stemcell_spec.rb
DELETED
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
# Copyright (c) 2009-2012 VMware, Inc.
|
|
2
|
-
|
|
3
|
-
require "spec_helper"
|
|
4
|
-
|
|
5
|
-
describe Bosh::Cli::Stemcell do
|
|
6
|
-
|
|
7
|
-
describe "verifying a stemcell" do
|
|
8
|
-
it "verifies and reports a valid stemcell" do
|
|
9
|
-
sc = Bosh::Cli::Stemcell.new(spec_asset("valid_stemcell.tgz"),
|
|
10
|
-
Bosh::Cli::Cache.new(Dir.mktmpdir))
|
|
11
|
-
sc.should be_valid
|
|
12
|
-
end
|
|
13
|
-
end
|
|
14
|
-
|
|
15
|
-
# TODO: add whining on potential errors
|
|
16
|
-
|
|
17
|
-
end
|
|
@@ -1,131 +0,0 @@
|
|
|
1
|
-
# Copyright (c) 2009-2012 VMware, Inc.
|
|
2
|
-
|
|
3
|
-
require "spec_helper"
|
|
4
|
-
|
|
5
|
-
describe Bosh::Cli::TaskTracker do
|
|
6
|
-
|
|
7
|
-
before(:each) do
|
|
8
|
-
@cache = mock("cache")
|
|
9
|
-
@director = mock("director", :uuid => "deadbeef",
|
|
10
|
-
:get_time_difference => 0.5)
|
|
11
|
-
Bosh::Cli::Config.cache = @cache
|
|
12
|
-
end
|
|
13
|
-
|
|
14
|
-
def make_tracker(task_id, options)
|
|
15
|
-
tracker = Bosh::Cli::TaskTracker.new(@director, task_id, options)
|
|
16
|
-
tracker.stub!(:sleep)
|
|
17
|
-
tracker
|
|
18
|
-
end
|
|
19
|
-
|
|
20
|
-
it "tracks director task event log" do
|
|
21
|
-
tracker = make_tracker("42", {})
|
|
22
|
-
@director.should_receive(:get_time_difference).and_return(0.5)
|
|
23
|
-
|
|
24
|
-
@cache.should_receive(:read).with("task/deadbeef/42/event").and_return(nil)
|
|
25
|
-
|
|
26
|
-
@director.should_receive(:get_task_state).with("42").
|
|
27
|
-
and_return("queued", "queued", "processing", "processing", "done")
|
|
28
|
-
|
|
29
|
-
@director.should_receive(:get_task_output).with("42", 0, "event").
|
|
30
|
-
and_return(["", nil], ["", nil], ["foo\nbar", 8])
|
|
31
|
-
|
|
32
|
-
@director.should_receive(:get_task_output).with("42", 8, "event").
|
|
33
|
-
and_return(["\nba", 12])
|
|
34
|
-
|
|
35
|
-
@director.should_receive(:get_task_output).with("42", 12, "event").
|
|
36
|
-
and_return(["z", 13])
|
|
37
|
-
|
|
38
|
-
@cache.should_receive(:write).
|
|
39
|
-
with("task/deadbeef/42/event", "foo\nbar\nbaz\n")
|
|
40
|
-
|
|
41
|
-
tracker.should_receive(:sleep).with(1).exactly(4).times
|
|
42
|
-
|
|
43
|
-
tracker.track.should == :done
|
|
44
|
-
end
|
|
45
|
-
|
|
46
|
-
it "used cached task result if available" do
|
|
47
|
-
tracker = make_tracker("42", { :log_type => "debug" })
|
|
48
|
-
|
|
49
|
-
@cache.should_receive(:read).with("task/deadbeef/42/debug").
|
|
50
|
-
and_return("foo\nbar\nbaz\n")
|
|
51
|
-
|
|
52
|
-
@director.should_receive(:get_task_state).with("42").and_return("cancelled")
|
|
53
|
-
|
|
54
|
-
tracker.track.should == :cancelled
|
|
55
|
-
end
|
|
56
|
-
|
|
57
|
-
it "uses appropriate renderer" do
|
|
58
|
-
renderer = mock("renderer", :duration_known? => false)
|
|
59
|
-
Bosh::Cli::TaskLogRenderer.should_receive(:create_for_log_type).
|
|
60
|
-
with("foobar").and_return(renderer)
|
|
61
|
-
|
|
62
|
-
tracker = make_tracker("42", { :log_type => "foobar" })
|
|
63
|
-
|
|
64
|
-
@cache.should_receive(:read).with("task/deadbeef/42/foobar").and_return(nil)
|
|
65
|
-
|
|
66
|
-
@director.should_receive(:get_task_state).with("42").
|
|
67
|
-
and_return("queued", "processing", "done")
|
|
68
|
-
|
|
69
|
-
@director.should_receive(:get_task_output).with("42", 0, "foobar").
|
|
70
|
-
and_return(["", nil], ["foo\nbar", 8])
|
|
71
|
-
|
|
72
|
-
@director.should_receive(:get_task_output).with("42", 8, "foobar").
|
|
73
|
-
and_return(["\nbaz", 12])
|
|
74
|
-
|
|
75
|
-
renderer.should_receive(:time_adjustment=).with(0.5)
|
|
76
|
-
renderer.should_receive(:add_output).with("foo\n").ordered
|
|
77
|
-
renderer.should_receive(:add_output).with("bar\n").ordered
|
|
78
|
-
renderer.should_receive(:add_output).with("baz\n").ordered
|
|
79
|
-
renderer.should_receive(:refresh).exactly(3).times
|
|
80
|
-
renderer.should_receive(:finish).with(:done)
|
|
81
|
-
|
|
82
|
-
tracker.should_receive(:sleep).with(1).exactly(2).times
|
|
83
|
-
|
|
84
|
-
@cache.should_receive(:write).
|
|
85
|
-
with("task/deadbeef/42/foobar", "foo\nbar\nbaz\n")
|
|
86
|
-
|
|
87
|
-
tracker.track.should == :done
|
|
88
|
-
end
|
|
89
|
-
|
|
90
|
-
it "treats error and cancelled states as finished states" do
|
|
91
|
-
%w(error cancelled).each do |state|
|
|
92
|
-
tracker = make_tracker("42", { :log_type => "foobar",
|
|
93
|
-
:use_cache => false })
|
|
94
|
-
|
|
95
|
-
@director.should_receive(:get_task_state).with("42").
|
|
96
|
-
and_return("queued", "processing", state)
|
|
97
|
-
|
|
98
|
-
@director.should_receive(:get_task_output).with("42", 0, "foobar").
|
|
99
|
-
and_return(["", nil], ["foo\nbar", 8])
|
|
100
|
-
|
|
101
|
-
@director.should_receive(:get_task_output).with("42", 8, "foobar").
|
|
102
|
-
and_return(["\nbaz", 12])
|
|
103
|
-
|
|
104
|
-
tracker.should_receive(:sleep).with(1).exactly(2).times
|
|
105
|
-
|
|
106
|
-
tracker.track.should == state.to_sym
|
|
107
|
-
end
|
|
108
|
-
end
|
|
109
|
-
|
|
110
|
-
it "prompts for task cancel on interrupt (if in interactive mode)" do
|
|
111
|
-
tracker = make_tracker("42", { :log_type => "foobar",
|
|
112
|
-
:use_cache => false })
|
|
113
|
-
|
|
114
|
-
tracker.stub!(:interactive?).and_return(true)
|
|
115
|
-
|
|
116
|
-
@director.should_receive(:get_task_state).with("42").and_raise(Interrupt)
|
|
117
|
-
@director.should_receive(:get_task_state).with("42").and_return("cancelled")
|
|
118
|
-
@director.should_receive(:get_task_output).with("42", 0, "foobar").
|
|
119
|
-
and_return(["", nil])
|
|
120
|
-
|
|
121
|
-
tracker.should_receive(:ask).and_return("yes")
|
|
122
|
-
@director.should_receive(:cancel_task).with("42")
|
|
123
|
-
|
|
124
|
-
tracker.track.should == :cancelled
|
|
125
|
-
end
|
|
126
|
-
|
|
127
|
-
it "accepts alternate :renderer option" do
|
|
128
|
-
tracker = make_tracker("42", {:renderer => "I'm a renderer"})
|
|
129
|
-
tracker.renderer.should == "I'm a renderer"
|
|
130
|
-
end
|
|
131
|
-
end
|