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
@@ -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
|