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,288 +0,0 @@
|
|
|
1
|
-
# Copyright (c) 2009-2012 VMware, Inc.
|
|
2
|
-
|
|
3
|
-
require "spec_helper"
|
|
4
|
-
|
|
5
|
-
describe Bosh::Cli::BlobManager do
|
|
6
|
-
|
|
7
|
-
def make_manager(release)
|
|
8
|
-
Bosh::Cli::BlobManager.new(release)
|
|
9
|
-
end
|
|
10
|
-
|
|
11
|
-
before(:each) do
|
|
12
|
-
@blobstore = mock("blobstore")
|
|
13
|
-
@dir = Dir.mktmpdir
|
|
14
|
-
@src_dir = FileUtils.mkdir(File.join(@dir, "src"))
|
|
15
|
-
@config_dir = File.join(@dir, "config")
|
|
16
|
-
FileUtils.mkdir(@config_dir)
|
|
17
|
-
@blobs_dir = File.join(@dir, "blobs")
|
|
18
|
-
@release = mock("release", :dir => @dir, :blobstore => @blobstore)
|
|
19
|
-
end
|
|
20
|
-
|
|
21
|
-
describe "initialization" do
|
|
22
|
-
it "fails if 'src' directory is missing" do
|
|
23
|
-
FileUtils.rm_rf(@src_dir)
|
|
24
|
-
expect {
|
|
25
|
-
make_manager(@release)
|
|
26
|
-
}.to raise_error("`src' directory is missing")
|
|
27
|
-
end
|
|
28
|
-
|
|
29
|
-
it "fails if blobstore is not configured" do
|
|
30
|
-
@release.stub!(:blobstore).and_return(nil)
|
|
31
|
-
expect {
|
|
32
|
-
make_manager(@release)
|
|
33
|
-
}.to raise_error("Blobstore is not configured")
|
|
34
|
-
end
|
|
35
|
-
|
|
36
|
-
it "creates necessary directories in release dir" do
|
|
37
|
-
make_manager(@release)
|
|
38
|
-
File.directory?(File.join(@dir, "blobs")).should be_true
|
|
39
|
-
File.directory?(File.join(@dir, ".blobs")).should be_true
|
|
40
|
-
end
|
|
41
|
-
|
|
42
|
-
it "has dirty flag cleared and upload list empty" do
|
|
43
|
-
manager = make_manager(@release)
|
|
44
|
-
manager.dirty?.should be_false
|
|
45
|
-
manager.blobs_to_upload.should == []
|
|
46
|
-
end
|
|
47
|
-
|
|
48
|
-
it "doesn't like bad index file'" do
|
|
49
|
-
File.open(File.join(@config_dir, "blobs.yml"), "w") do |f|
|
|
50
|
-
YAML.dump("string", f)
|
|
51
|
-
end
|
|
52
|
-
expect {
|
|
53
|
-
make_manager(@release)
|
|
54
|
-
}.to raise_error(/Incorrect file format/)
|
|
55
|
-
end
|
|
56
|
-
|
|
57
|
-
it "migrates legacy index file" do
|
|
58
|
-
legacy_file = File.join(@release.dir, "blob_index.yml")
|
|
59
|
-
test_hash = { "foo" => "bar" }
|
|
60
|
-
|
|
61
|
-
File.open(legacy_file, "w") do |f|
|
|
62
|
-
YAML.dump({ "foo" => "bar" }, f)
|
|
63
|
-
end
|
|
64
|
-
|
|
65
|
-
make_manager(@release)
|
|
66
|
-
File.exists?(legacy_file).should be_false
|
|
67
|
-
YAML.load_file(File.join(@config_dir, "blobs.yml")).should == test_hash
|
|
68
|
-
end
|
|
69
|
-
end
|
|
70
|
-
|
|
71
|
-
describe "adding a blob" do
|
|
72
|
-
before(:each) do
|
|
73
|
-
@manager = make_manager(@release)
|
|
74
|
-
@blob = Tempfile.new("blob")
|
|
75
|
-
@blob.write("blob contents")
|
|
76
|
-
@blob.close
|
|
77
|
-
end
|
|
78
|
-
|
|
79
|
-
it "cannot add non-existing file" do
|
|
80
|
-
expect {
|
|
81
|
-
@manager.add_blob("tmp/foobar.tgz", "test")
|
|
82
|
-
}.to raise_error("File `tmp/foobar.tgz' not found")
|
|
83
|
-
end
|
|
84
|
-
|
|
85
|
-
it "cannot add directory" do
|
|
86
|
-
tmp_dir = Dir.mktmpdir
|
|
87
|
-
expect {
|
|
88
|
-
@manager.add_blob(tmp_dir, "test")
|
|
89
|
-
}.to raise_error("`#{tmp_dir}' is a directory")
|
|
90
|
-
end
|
|
91
|
-
|
|
92
|
-
it "cannot use absolute path as blob destination" do
|
|
93
|
-
expect {
|
|
94
|
-
@manager.add_blob(@blob.path, "/test")
|
|
95
|
-
}.to raise_error("Blob path should be a relative path")
|
|
96
|
-
end
|
|
97
|
-
|
|
98
|
-
it "cannot use 'blobs' prefix for blob destination" do
|
|
99
|
-
expect {
|
|
100
|
-
@manager.add_blob(@blob.path, "blobs/foo/bar")
|
|
101
|
-
}.to raise_error("Blob path should not start with `blobs/'")
|
|
102
|
-
end
|
|
103
|
-
|
|
104
|
-
it "cannot use directory as blob destination" do
|
|
105
|
-
foo_dir = File.join(@blobs_dir, "foo")
|
|
106
|
-
FileUtils.mkdir(foo_dir)
|
|
107
|
-
expect {
|
|
108
|
-
@manager.add_blob(@blob.path, "foo")
|
|
109
|
-
}.to raise_error("`#{foo_dir}' is a directory, " +
|
|
110
|
-
"please pick a different path")
|
|
111
|
-
end
|
|
112
|
-
|
|
113
|
-
it "adds blob to a blobs directory" do
|
|
114
|
-
blob_dst = File.join(@blobs_dir, "foo", "blob")
|
|
115
|
-
@manager.add_blob(@blob.path, "foo/blob")
|
|
116
|
-
File.exists?(blob_dst).should be_true
|
|
117
|
-
File.read(blob_dst).should == "blob contents"
|
|
118
|
-
File.symlink?(blob_dst).should be_false
|
|
119
|
-
File.stat(blob_dst).mode.to_s(8)[-4..-1].should == "0644"
|
|
120
|
-
File.exists?(@blob.path).should be_true # original still exists
|
|
121
|
-
|
|
122
|
-
@manager.process_blobs_directory
|
|
123
|
-
@manager.dirty?.should be_true
|
|
124
|
-
@manager.new_blobs.should == %w(foo/blob)
|
|
125
|
-
@manager.updated_blobs.should == []
|
|
126
|
-
end
|
|
127
|
-
|
|
128
|
-
it "prevents double adds of the same file" do
|
|
129
|
-
@manager.add_blob(@blob.path, "foo/blob")
|
|
130
|
-
expect {
|
|
131
|
-
@manager.add_blob(@blob.path, "foo/blob")
|
|
132
|
-
}.to raise_error(/Already tracking/)
|
|
133
|
-
end
|
|
134
|
-
|
|
135
|
-
it "updates blob" do
|
|
136
|
-
new_blob = Tempfile.new("new-blob")
|
|
137
|
-
new_blob.write("foobar")
|
|
138
|
-
new_blob.close
|
|
139
|
-
blob_dst = File.join(@blobs_dir, "foo", "blob")
|
|
140
|
-
@manager.add_blob(@blob.path, "foo/blob")
|
|
141
|
-
File.read(blob_dst).should == "blob contents"
|
|
142
|
-
@manager.add_blob(new_blob.path, "foo/blob")
|
|
143
|
-
File.read(blob_dst).should == "foobar"
|
|
144
|
-
end
|
|
145
|
-
end
|
|
146
|
-
|
|
147
|
-
describe "downloading a blob" do
|
|
148
|
-
it "cannot download blob if path is not in index" do
|
|
149
|
-
@manager = make_manager(@release)
|
|
150
|
-
|
|
151
|
-
expect {
|
|
152
|
-
@manager.download_blob("foo")
|
|
153
|
-
}.to raise_error(/Unknown blob path/)
|
|
154
|
-
end
|
|
155
|
-
|
|
156
|
-
it "downloads blob from blobstore" do
|
|
157
|
-
index = {
|
|
158
|
-
"foo" => {
|
|
159
|
-
"size" => "1000",
|
|
160
|
-
"object_id" => "deadbeef",
|
|
161
|
-
"sha" => Digest::SHA1.hexdigest("blob contents")
|
|
162
|
-
}
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
File.open(File.join(@config_dir, "blobs.yml"), "w") do |f|
|
|
166
|
-
YAML.dump(index, f)
|
|
167
|
-
end
|
|
168
|
-
|
|
169
|
-
@manager = make_manager(@release)
|
|
170
|
-
@blobstore.should_receive(:get).with("deadbeef",
|
|
171
|
-
an_instance_of(File)).
|
|
172
|
-
and_return { |_, f | f.write("blob contents") }
|
|
173
|
-
|
|
174
|
-
path = @manager.download_blob("foo")
|
|
175
|
-
File.read(path).should == "blob contents"
|
|
176
|
-
end
|
|
177
|
-
end
|
|
178
|
-
|
|
179
|
-
describe "uploading a blob" do
|
|
180
|
-
before(:each) do
|
|
181
|
-
@manager = make_manager(@release)
|
|
182
|
-
end
|
|
183
|
-
|
|
184
|
-
it "needs blob path to exist" do
|
|
185
|
-
expect {
|
|
186
|
-
@manager.upload_blob("foo")
|
|
187
|
-
}.to raise_error(/doesn't exist/)
|
|
188
|
-
end
|
|
189
|
-
|
|
190
|
-
it "doesn't follow symlinks" do
|
|
191
|
-
FileUtils.touch(File.join(@dir, "blob"))
|
|
192
|
-
FileUtils.ln_s(File.join(@dir, "blob"), File.join(@blobs_dir, "foo"))
|
|
193
|
-
expect {
|
|
194
|
-
@manager.upload_blob("foo")
|
|
195
|
-
}.to raise_error(/is a symlink/)
|
|
196
|
-
end
|
|
197
|
-
|
|
198
|
-
it "uploads file to a blobstore, updates index and symlinks blob" do
|
|
199
|
-
new_blob = File.join(@dir, "blob")
|
|
200
|
-
File.open(new_blob, "w") { |f| f.write("test blob") }
|
|
201
|
-
@manager.add_blob(new_blob, "foo")
|
|
202
|
-
|
|
203
|
-
@blobstore.should_receive(:create).and_return("deadbeef")
|
|
204
|
-
@manager.upload_blob("foo").should == "deadbeef"
|
|
205
|
-
|
|
206
|
-
blob_dst = File.join(@blobs_dir, "foo")
|
|
207
|
-
checksum = Digest::SHA1.hexdigest("test blob")
|
|
208
|
-
|
|
209
|
-
File.symlink?(blob_dst).should be_true
|
|
210
|
-
File.readlink(blob_dst).should == File.join(@dir, ".blobs", checksum)
|
|
211
|
-
File.read(blob_dst).should == "test blob"
|
|
212
|
-
end
|
|
213
|
-
end
|
|
214
|
-
|
|
215
|
-
describe "syncing blobs" do
|
|
216
|
-
it "includes several steps" do
|
|
217
|
-
@manager = make_manager(@release)
|
|
218
|
-
@manager.should_receive(:remove_symlinks).ordered
|
|
219
|
-
@manager.should_receive(:process_blobs_directory).ordered
|
|
220
|
-
@manager.should_receive(:process_index).ordered
|
|
221
|
-
@manager.sync
|
|
222
|
-
end
|
|
223
|
-
|
|
224
|
-
it "processes blobs directory" do
|
|
225
|
-
@manager = make_manager(@release)
|
|
226
|
-
@blobstore.stub!(:create).and_return("new-object-id")
|
|
227
|
-
|
|
228
|
-
new_blob = Tempfile.new("new-blob")
|
|
229
|
-
new_blob.write("test")
|
|
230
|
-
new_blob.close
|
|
231
|
-
|
|
232
|
-
@manager.add_blob(new_blob.path, "foo")
|
|
233
|
-
@manager.process_blobs_directory
|
|
234
|
-
@manager.new_blobs.should == %w(foo)
|
|
235
|
-
|
|
236
|
-
@manager.add_blob(new_blob.path, "bar")
|
|
237
|
-
@manager.process_blobs_directory
|
|
238
|
-
@manager.new_blobs.sort.should == %w(bar foo)
|
|
239
|
-
|
|
240
|
-
@manager.upload_blob("bar")
|
|
241
|
-
|
|
242
|
-
new_blob.open
|
|
243
|
-
new_blob.write("stuff")
|
|
244
|
-
new_blob.close
|
|
245
|
-
|
|
246
|
-
@manager.add_blob(new_blob.path, "bar")
|
|
247
|
-
@manager.process_blobs_directory
|
|
248
|
-
@manager.new_blobs.sort.should == %w(foo)
|
|
249
|
-
@manager.updated_blobs.sort.should == %w(bar)
|
|
250
|
-
end
|
|
251
|
-
|
|
252
|
-
it "downloads missing blobs" do
|
|
253
|
-
index = {
|
|
254
|
-
"foo" => {
|
|
255
|
-
"size" => 1000,
|
|
256
|
-
"sha" => Digest::SHA1.hexdigest("foo"),
|
|
257
|
-
"object_id" => "da-foo"
|
|
258
|
-
},
|
|
259
|
-
"bar" => {
|
|
260
|
-
"size" => 500,
|
|
261
|
-
"sha" => Digest::SHA1.hexdigest("bar"),
|
|
262
|
-
"object_id" => "da-bar"
|
|
263
|
-
}
|
|
264
|
-
}
|
|
265
|
-
|
|
266
|
-
File.open(File.join(@config_dir, "blobs.yml"), "w") do |f|
|
|
267
|
-
YAML.dump(index, f)
|
|
268
|
-
end
|
|
269
|
-
|
|
270
|
-
foo = Tempfile.new("foo")
|
|
271
|
-
foo.write("foo")
|
|
272
|
-
foo.close
|
|
273
|
-
|
|
274
|
-
bar = Tempfile.new("bar")
|
|
275
|
-
bar.write("bar")
|
|
276
|
-
bar.close
|
|
277
|
-
|
|
278
|
-
@manager = make_manager(@release)
|
|
279
|
-
@manager.should_receive(:download_blob).with("foo").and_return(foo.path)
|
|
280
|
-
@manager.should_receive(:download_blob).with("bar").and_return(bar.path)
|
|
281
|
-
|
|
282
|
-
@manager.process_index
|
|
283
|
-
|
|
284
|
-
File.read(File.join(@blobs_dir, "foo")).should == "foo"
|
|
285
|
-
File.read(File.join(@blobs_dir, "bar")).should == "bar"
|
|
286
|
-
end
|
|
287
|
-
end
|
|
288
|
-
end
|
data/spec/unit/cache_spec.rb
DELETED
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
# Copyright (c) 2009-2012 VMware, Inc.
|
|
2
|
-
|
|
3
|
-
require 'spec_helper'
|
|
4
|
-
require 'fileutils'
|
|
5
|
-
|
|
6
|
-
describe Bosh::Cli::Cache do
|
|
7
|
-
|
|
8
|
-
before :each do
|
|
9
|
-
@cache_dir = File.join(Dir.mktmpdir, "bosh_cache")
|
|
10
|
-
end
|
|
11
|
-
|
|
12
|
-
after :each do
|
|
13
|
-
FileUtils.rm_rf(@cache_dir)
|
|
14
|
-
end
|
|
15
|
-
|
|
16
|
-
it "whines if cache directory turned out to be a file" do
|
|
17
|
-
FileUtils.touch(@cache_dir)
|
|
18
|
-
lambda {
|
|
19
|
-
Bosh::Cli::Cache.new(@cache_dir)
|
|
20
|
-
}.should raise_error(Bosh::Cli::CacheDirectoryError)
|
|
21
|
-
end
|
|
22
|
-
|
|
23
|
-
it "creates cache directory" do
|
|
24
|
-
File.directory?(@cache_dir).should be_false
|
|
25
|
-
cache = Bosh::Cli::Cache.new(@cache_dir)
|
|
26
|
-
File.directory?(@cache_dir).should be_true
|
|
27
|
-
end
|
|
28
|
-
|
|
29
|
-
it "performs read/write in an expected way" do
|
|
30
|
-
cache = Bosh::Cli::Cache.new(@cache_dir)
|
|
31
|
-
cache.read("foo").should be_nil
|
|
32
|
-
cache.write("foo", "12321")
|
|
33
|
-
cache.read("foo").should == "12321"
|
|
34
|
-
end
|
|
35
|
-
|
|
36
|
-
end
|
|
@@ -1,356 +0,0 @@
|
|
|
1
|
-
# Copyright (c) 2009-2012 VMware, Inc.
|
|
2
|
-
|
|
3
|
-
require "spec_helper"
|
|
4
|
-
|
|
5
|
-
describe Bosh::Cli::Command::Base do
|
|
6
|
-
|
|
7
|
-
before :each do
|
|
8
|
-
tmpdir = Dir.mktmpdir
|
|
9
|
-
@config = File.join(tmpdir, "bosh_config")
|
|
10
|
-
@cache = File.join(tmpdir, "bosh_cache")
|
|
11
|
-
@director = mock(Bosh::Cli::Director)
|
|
12
|
-
Bosh::Cli::Director.stub!(:new).and_return(@director)
|
|
13
|
-
@director.stub!(:get_status).and_return("name" => "ZB")
|
|
14
|
-
end
|
|
15
|
-
|
|
16
|
-
describe Bosh::Cli::Command::Misc do
|
|
17
|
-
|
|
18
|
-
before :each do
|
|
19
|
-
@cmd = Bosh::Cli::Command::Misc.new
|
|
20
|
-
@cmd.add_option(:config, @config)
|
|
21
|
-
@cmd.add_option(:cache_dir, @cache)
|
|
22
|
-
@cmd.add_option(:non_interactive, true)
|
|
23
|
-
end
|
|
24
|
-
|
|
25
|
-
it "sets the target" do
|
|
26
|
-
@cmd.target.should be_nil
|
|
27
|
-
@cmd.set_target("http://example.com:232")
|
|
28
|
-
@cmd.target.should == "http://example.com:232"
|
|
29
|
-
end
|
|
30
|
-
|
|
31
|
-
it "normalizes target" do
|
|
32
|
-
@cmd.target.should be_nil
|
|
33
|
-
@cmd.set_target("test")
|
|
34
|
-
@cmd.target.should == "http://test:25555"
|
|
35
|
-
end
|
|
36
|
-
|
|
37
|
-
it "handles director errors when setting target" do
|
|
38
|
-
@director.should_receive(:get_status).and_raise(Bosh::Cli::DirectorError)
|
|
39
|
-
|
|
40
|
-
lambda {
|
|
41
|
-
@cmd.set_target("test")
|
|
42
|
-
}.should raise_error(Bosh::Cli::CliError, /cannot talk to director/i)
|
|
43
|
-
|
|
44
|
-
@cmd.target.should be_nil
|
|
45
|
-
end
|
|
46
|
-
|
|
47
|
-
it "sets target" do
|
|
48
|
-
@cmd.set_target("test")
|
|
49
|
-
@cmd.target.should == "http://test:25555"
|
|
50
|
-
end
|
|
51
|
-
|
|
52
|
-
it "supports named targets" do
|
|
53
|
-
@cmd.set_target("test", "mytarget")
|
|
54
|
-
@cmd.target.should == "http://test:25555"
|
|
55
|
-
|
|
56
|
-
@cmd.set_target("foo", "myfoo")
|
|
57
|
-
|
|
58
|
-
@cmd.set_target("mytarget")
|
|
59
|
-
@cmd.target.should == "http://test:25555"
|
|
60
|
-
|
|
61
|
-
@cmd.set_target("myfoo")
|
|
62
|
-
@cmd.target.should == "http://foo:25555"
|
|
63
|
-
end
|
|
64
|
-
|
|
65
|
-
it "logs user in" do
|
|
66
|
-
@director.should_receive(:authenticated?).and_return(true)
|
|
67
|
-
@director.should_receive(:user=).with("user")
|
|
68
|
-
@director.should_receive(:password=).with("pass")
|
|
69
|
-
@cmd.set_target("test")
|
|
70
|
-
@cmd.login("user", "pass")
|
|
71
|
-
@cmd.logged_in?.should be_true
|
|
72
|
-
@cmd.username.should == "user"
|
|
73
|
-
@cmd.password.should == "pass"
|
|
74
|
-
end
|
|
75
|
-
|
|
76
|
-
it "logs user out" do
|
|
77
|
-
@cmd.set_target("test")
|
|
78
|
-
@director.should_receive(:authenticated?).and_return(true)
|
|
79
|
-
@director.should_receive(:user=).with("user")
|
|
80
|
-
@director.should_receive(:password=).with("pass")
|
|
81
|
-
@cmd.login("user", "pass")
|
|
82
|
-
@cmd.logout
|
|
83
|
-
@cmd.logged_in?.should be_false
|
|
84
|
-
end
|
|
85
|
-
|
|
86
|
-
it "respects director checks option when logging in" do
|
|
87
|
-
@director.stub!(:get_status).
|
|
88
|
-
and_return({ "user" => "user", "name" => "ZB" })
|
|
89
|
-
@director.stub(:authenticated?).and_return(true)
|
|
90
|
-
|
|
91
|
-
@cmd.set_target("test")
|
|
92
|
-
@director.should_receive(:user=).with("user")
|
|
93
|
-
@director.should_receive(:password=).with("pass")
|
|
94
|
-
@cmd.login("user", "pass")
|
|
95
|
-
@cmd.logged_in?.should be_true
|
|
96
|
-
@cmd.username.should == "user"
|
|
97
|
-
@cmd.password.should == "pass"
|
|
98
|
-
end
|
|
99
|
-
end
|
|
100
|
-
|
|
101
|
-
describe Bosh::Cli::Command::Stemcell do
|
|
102
|
-
before :each do
|
|
103
|
-
@director = mock(Bosh::Cli::Director)
|
|
104
|
-
@director.stub(:list_stemcells).
|
|
105
|
-
and_return([{ "name" => "foo", "version" => "123" }])
|
|
106
|
-
@director.should_receive(:list_stemcells)
|
|
107
|
-
|
|
108
|
-
@cmd = Bosh::Cli::Command::Stemcell.new
|
|
109
|
-
@cmd.add_option(:non_interactive, true)
|
|
110
|
-
|
|
111
|
-
@cmd.stub!(:target).and_return("test")
|
|
112
|
-
@cmd.stub!(:username).and_return("user")
|
|
113
|
-
@cmd.stub!(:password).and_return("pass")
|
|
114
|
-
@cmd.stub!(:director).and_return(@director)
|
|
115
|
-
end
|
|
116
|
-
|
|
117
|
-
it "allows deleting the stemcell" do
|
|
118
|
-
@director.should_receive(:delete_stemcell).with("foo", "123")
|
|
119
|
-
@cmd.delete("foo", "123")
|
|
120
|
-
end
|
|
121
|
-
|
|
122
|
-
it "needs confirmation to delete stemcell" do
|
|
123
|
-
@cmd.remove_option(:non_interactive)
|
|
124
|
-
@director.should_not_receive(:delete_stemcell)
|
|
125
|
-
|
|
126
|
-
@cmd.stub!(:ask).and_return("")
|
|
127
|
-
@cmd.delete("foo", "123")
|
|
128
|
-
end
|
|
129
|
-
|
|
130
|
-
it "raises error when deleting if stemcell does not exist" do
|
|
131
|
-
@director.should_not_receive(:delete_stemcell)
|
|
132
|
-
|
|
133
|
-
@cmd.add_option(:non_interactive, true)
|
|
134
|
-
lambda {
|
|
135
|
-
@cmd.delete("foo", "111")
|
|
136
|
-
}.should raise_error(Bosh::Cli::CliError,
|
|
137
|
-
"Stemcell `foo/111' does not exist")
|
|
138
|
-
end
|
|
139
|
-
end
|
|
140
|
-
|
|
141
|
-
describe Bosh::Cli::Command::Deployment do
|
|
142
|
-
before :each do
|
|
143
|
-
@cmd = Bosh::Cli::Command::Deployment.new
|
|
144
|
-
@cmd.add_option(:non_interactive, true)
|
|
145
|
-
end
|
|
146
|
-
|
|
147
|
-
it "allows deleting the deployment" do
|
|
148
|
-
mock_director = mock(Bosh::Cli::Director)
|
|
149
|
-
mock_director.should_receive(:delete_deployment).
|
|
150
|
-
with("foo", :force => false)
|
|
151
|
-
|
|
152
|
-
@cmd.stub!(:interactive?).and_return(false)
|
|
153
|
-
@cmd.stub!(:target).and_return("test")
|
|
154
|
-
@cmd.stub!(:username).and_return("user")
|
|
155
|
-
@cmd.stub!(:password).and_return("pass")
|
|
156
|
-
@cmd.stub!(:director).and_return(mock_director)
|
|
157
|
-
@cmd.delete("foo")
|
|
158
|
-
end
|
|
159
|
-
|
|
160
|
-
it "needs confirmation to delete deployment" do
|
|
161
|
-
mock_director = mock(Bosh::Cli::Director)
|
|
162
|
-
mock_director.should_not_receive(:delete_deployment)
|
|
163
|
-
|
|
164
|
-
@cmd.remove_option(:non_interactive)
|
|
165
|
-
@cmd.stub!(:target).and_return("test")
|
|
166
|
-
@cmd.stub!(:username).and_return("user")
|
|
167
|
-
@cmd.stub!(:password).and_return("pass")
|
|
168
|
-
@cmd.stub!(:director).and_return(mock_director)
|
|
169
|
-
@cmd.stub!(:ask).and_return("")
|
|
170
|
-
@cmd.delete("foo")
|
|
171
|
-
end
|
|
172
|
-
end
|
|
173
|
-
|
|
174
|
-
describe Bosh::Cli::Command::Release do
|
|
175
|
-
before :each do
|
|
176
|
-
@director = mock(Bosh::Cli::Director)
|
|
177
|
-
|
|
178
|
-
@cmd = Bosh::Cli::Command::Release.new
|
|
179
|
-
@cmd.add_option(:non_interactive, true)
|
|
180
|
-
|
|
181
|
-
@cmd.stub!(:target).and_return("test")
|
|
182
|
-
@cmd.stub!(:username).and_return("user")
|
|
183
|
-
@cmd.stub!(:password).and_return("pass")
|
|
184
|
-
@cmd.stub!(:director).and_return(@director)
|
|
185
|
-
end
|
|
186
|
-
|
|
187
|
-
it "allows deleting the release (non-force)" do
|
|
188
|
-
@director.should_receive(:delete_release).
|
|
189
|
-
with("foo", :force => false, :version => nil)
|
|
190
|
-
|
|
191
|
-
@cmd.delete("foo")
|
|
192
|
-
end
|
|
193
|
-
|
|
194
|
-
it "allows deleting the release (force)" do
|
|
195
|
-
@director.should_receive(:delete_release).
|
|
196
|
-
with("foo", :force => true, :version => nil)
|
|
197
|
-
|
|
198
|
-
@cmd.add_option(:force, true)
|
|
199
|
-
@cmd.delete("foo")
|
|
200
|
-
end
|
|
201
|
-
|
|
202
|
-
it "allows deleting a particular release version (non-force)" do
|
|
203
|
-
@director.should_receive(:delete_release).
|
|
204
|
-
with("foo", :force => false, :version => "42")
|
|
205
|
-
|
|
206
|
-
@cmd.delete("foo", "42")
|
|
207
|
-
end
|
|
208
|
-
|
|
209
|
-
it "allows deleting a particular release version (force)" do
|
|
210
|
-
@director.should_receive(:delete_release).
|
|
211
|
-
with("foo", :force => true, :version => "42")
|
|
212
|
-
|
|
213
|
-
@cmd.add_option(:force, true)
|
|
214
|
-
@cmd.delete("foo", "42")
|
|
215
|
-
end
|
|
216
|
-
|
|
217
|
-
it "requires confirmation on deleting release" do
|
|
218
|
-
@director.should_not_receive(:delete_release)
|
|
219
|
-
@cmd.remove_option(:non_interactive)
|
|
220
|
-
|
|
221
|
-
@cmd.stub!(:ask).and_return("")
|
|
222
|
-
@cmd.delete("foo")
|
|
223
|
-
end
|
|
224
|
-
|
|
225
|
-
end
|
|
226
|
-
|
|
227
|
-
describe Bosh::Cli::Command::JobManagement do
|
|
228
|
-
before :each do
|
|
229
|
-
@manifest_path = spec_asset("deployment.MF")
|
|
230
|
-
@manifest_yaml = YAML.dump({ "name" => "foo" })
|
|
231
|
-
|
|
232
|
-
@cmd = Bosh::Cli::Command::JobManagement.new
|
|
233
|
-
@cmd.add_option(:non_interactive, true)
|
|
234
|
-
@cmd.stub!(:prepare_deployment_manifest).
|
|
235
|
-
with(:yaml => true).and_return(@manifest_yaml)
|
|
236
|
-
@cmd.stub!(:deployment).and_return(@manifest_path)
|
|
237
|
-
@cmd.stub!(:target).and_return("test.com")
|
|
238
|
-
@cmd.stub!(:target_name).and_return("dev2")
|
|
239
|
-
@cmd.stub!(:username).and_return("user")
|
|
240
|
-
@cmd.stub!(:password).and_return("pass")
|
|
241
|
-
@director = mock(Bosh::Cli::Director)
|
|
242
|
-
@cmd.stub!(:director).and_return(@director)
|
|
243
|
-
end
|
|
244
|
-
|
|
245
|
-
it "allows starting jobs" do
|
|
246
|
-
@director.should_receive(:change_job_state).
|
|
247
|
-
with("foo", @manifest_yaml, "dea", nil, "started")
|
|
248
|
-
@cmd.start_job("dea")
|
|
249
|
-
end
|
|
250
|
-
|
|
251
|
-
it "allows starting job instances" do
|
|
252
|
-
@director.should_receive(:change_job_state).
|
|
253
|
-
with("foo", @manifest_yaml, "dea", 3, "started")
|
|
254
|
-
@cmd.start_job("dea", 3)
|
|
255
|
-
end
|
|
256
|
-
|
|
257
|
-
it "allows stopping jobs" do
|
|
258
|
-
@director.should_receive(:change_job_state).
|
|
259
|
-
with("foo", @manifest_yaml, "dea", nil, "stopped")
|
|
260
|
-
@cmd.stop_job("dea")
|
|
261
|
-
end
|
|
262
|
-
|
|
263
|
-
it "allows stopping job instances" do
|
|
264
|
-
@director.should_receive(:change_job_state).
|
|
265
|
-
with("foo", @manifest_yaml, "dea", 3, "stopped")
|
|
266
|
-
@cmd.stop_job("dea", 3)
|
|
267
|
-
end
|
|
268
|
-
|
|
269
|
-
it "allows restarting jobs" do
|
|
270
|
-
@director.should_receive(:change_job_state).
|
|
271
|
-
with("foo", @manifest_yaml, "dea", nil, "restart")
|
|
272
|
-
@cmd.restart_job("dea")
|
|
273
|
-
end
|
|
274
|
-
|
|
275
|
-
it "allows restart job instances" do
|
|
276
|
-
@director.should_receive(:change_job_state).
|
|
277
|
-
with("foo", @manifest_yaml, "dea", 3, "restart")
|
|
278
|
-
@cmd.restart_job("dea", 3)
|
|
279
|
-
end
|
|
280
|
-
|
|
281
|
-
it "allows recreating jobs" do
|
|
282
|
-
@director.should_receive(:change_job_state).
|
|
283
|
-
with("foo", @manifest_yaml, "dea", nil, "recreate")
|
|
284
|
-
@cmd.recreate_job("dea")
|
|
285
|
-
end
|
|
286
|
-
|
|
287
|
-
it "allows recreating job instances" do
|
|
288
|
-
@director.should_receive(:change_job_state).
|
|
289
|
-
with("foo", @manifest_yaml, "dea", 3, "recreate")
|
|
290
|
-
@cmd.recreate_job("dea", 3)
|
|
291
|
-
end
|
|
292
|
-
|
|
293
|
-
it "allows hard stop" do
|
|
294
|
-
@director.should_receive(:change_job_state).
|
|
295
|
-
with("foo", @manifest_yaml, "dea", 3, "detached")
|
|
296
|
-
@cmd.add_option(:hard, true)
|
|
297
|
-
@cmd.stop_job("dea", 3)
|
|
298
|
-
end
|
|
299
|
-
|
|
300
|
-
it "allows soft stop (= regular stop)" do
|
|
301
|
-
@director.should_receive(:change_job_state).
|
|
302
|
-
with("foo", @manifest_yaml, "dea", 3, "stopped")
|
|
303
|
-
@cmd.add_option(:soft, true)
|
|
304
|
-
@cmd.stop_job("dea", 3)
|
|
305
|
-
end
|
|
306
|
-
|
|
307
|
-
end
|
|
308
|
-
|
|
309
|
-
describe Bosh::Cli::Command::BlobManagement do
|
|
310
|
-
before :each do
|
|
311
|
-
@cmd = Bosh::Cli::Command::BlobManagement.new
|
|
312
|
-
@cmd.add_option(:non_interactive, true)
|
|
313
|
-
|
|
314
|
-
@blob_manager = mock("blob manager")
|
|
315
|
-
@release = mock("release")
|
|
316
|
-
|
|
317
|
-
@cmd.should_receive(:check_if_release_dir)
|
|
318
|
-
Bosh::Cli::Release.stub!(:new).and_return(@release)
|
|
319
|
-
Bosh::Cli::BlobManager.stub!(:new).with(@release).
|
|
320
|
-
and_return(@blob_manager)
|
|
321
|
-
end
|
|
322
|
-
|
|
323
|
-
it "prints blobs status" do
|
|
324
|
-
@blob_manager.should_receive(:print_status)
|
|
325
|
-
@cmd.status
|
|
326
|
-
end
|
|
327
|
-
|
|
328
|
-
it "adds blob under provided directory" do
|
|
329
|
-
@blob_manager.should_receive(:add_blob).with("foo/bar.tgz", "bar/bar.tgz")
|
|
330
|
-
@cmd.add("foo/bar.tgz", "bar")
|
|
331
|
-
end
|
|
332
|
-
|
|
333
|
-
it "adds blob with no directory provided" do
|
|
334
|
-
@blob_manager.should_receive(:add_blob).with("foo/bar.tgz", "bar.tgz")
|
|
335
|
-
@cmd.add("foo/bar.tgz")
|
|
336
|
-
end
|
|
337
|
-
|
|
338
|
-
it "uploads blobs" do
|
|
339
|
-
@blob_manager.should_receive(:print_status)
|
|
340
|
-
@blob_manager.stub!(:blobs_to_upload).and_return(%w(foo bar baz))
|
|
341
|
-
@blob_manager.should_receive(:upload_blob).with("foo")
|
|
342
|
-
@blob_manager.should_receive(:upload_blob).with("bar")
|
|
343
|
-
@blob_manager.should_receive(:upload_blob).with("baz")
|
|
344
|
-
|
|
345
|
-
@cmd.should_receive(:confirmed?).exactly(3).times.and_return(true)
|
|
346
|
-
@cmd.upload
|
|
347
|
-
end
|
|
348
|
-
|
|
349
|
-
it "syncs blobs" do
|
|
350
|
-
@blob_manager.should_receive(:sync).ordered
|
|
351
|
-
@blob_manager.should_receive(:print_status).ordered
|
|
352
|
-
@cmd.sync
|
|
353
|
-
end
|
|
354
|
-
end
|
|
355
|
-
|
|
356
|
-
end
|