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.
Files changed (144) hide show
  1. data/bin/bosh +0 -9
  2. data/lib/cli.rb +69 -64
  3. data/lib/cli/backup_destination_path.rb +33 -0
  4. data/lib/cli/base_command.rb +57 -56
  5. data/lib/cli/blob_manager.rb +12 -12
  6. data/lib/cli/changeset_helper.rb +6 -7
  7. data/lib/cli/client/director.rb +724 -0
  8. data/lib/cli/command_handler.rb +6 -7
  9. data/lib/cli/commands/backup.rb +39 -0
  10. data/lib/cli/commands/biff.rb +42 -21
  11. data/lib/cli/commands/blob_management.rb +1 -1
  12. data/lib/cli/commands/cloudcheck.rb +11 -13
  13. data/lib/cli/commands/deployment.rb +53 -37
  14. data/lib/cli/commands/help.rb +3 -2
  15. data/lib/cli/commands/job_management.rb +67 -103
  16. data/lib/cli/commands/job_rename.rb +6 -8
  17. data/lib/cli/commands/log_management.rb +78 -55
  18. data/lib/cli/commands/maintenance.rb +36 -30
  19. data/lib/cli/commands/misc.rb +72 -51
  20. data/lib/cli/commands/package.rb +2 -2
  21. data/lib/cli/commands/property_management.rb +10 -12
  22. data/lib/cli/commands/release.rb +236 -133
  23. data/lib/cli/commands/snapshot.rb +93 -0
  24. data/lib/cli/commands/ssh.rb +216 -213
  25. data/lib/cli/commands/stemcell.rb +46 -34
  26. data/lib/cli/commands/task.rb +2 -2
  27. data/lib/cli/commands/user.rb +27 -3
  28. data/lib/cli/commands/vm.rb +28 -0
  29. data/lib/cli/commands/vms.rb +81 -23
  30. data/lib/cli/config.rb +6 -2
  31. data/lib/cli/core_ext.rb +31 -30
  32. data/lib/cli/deployment_helper.rb +134 -159
  33. data/lib/cli/deployment_manifest.rb +66 -0
  34. data/lib/cli/deployment_manifest_compiler.rb +0 -3
  35. data/lib/cli/event_log_renderer.rb +10 -10
  36. data/lib/cli/file_with_progress_bar.rb +52 -0
  37. data/lib/cli/job_builder.rb +1 -1
  38. data/lib/cli/job_command_args.rb +23 -0
  39. data/lib/cli/job_property_collection.rb +4 -7
  40. data/lib/cli/job_property_validator.rb +22 -12
  41. data/lib/cli/job_state.rb +54 -0
  42. data/lib/cli/line_wrap.rb +54 -0
  43. data/lib/cli/packaging_helper.rb +10 -10
  44. data/lib/cli/release.rb +18 -15
  45. data/lib/cli/release_builder.rb +9 -4
  46. data/lib/cli/release_compiler.rb +9 -9
  47. data/lib/cli/release_tarball.rb +3 -6
  48. data/lib/cli/resurrection.rb +31 -0
  49. data/lib/cli/runner.rb +56 -30
  50. data/lib/cli/stemcell.rb +25 -10
  51. data/lib/cli/task_log_renderer.rb +1 -1
  52. data/lib/cli/task_tracker.rb +10 -9
  53. data/lib/cli/validation.rb +3 -1
  54. data/lib/cli/version.rb +1 -1
  55. data/lib/cli/version_calc.rb +5 -18
  56. data/lib/cli/versions_index.rb +1 -1
  57. data/lib/cli/vm_state.rb +43 -0
  58. data/lib/cli/yaml_helper.rb +26 -35
  59. metadata +75 -208
  60. data/Rakefile +0 -56
  61. data/lib/cli/director.rb +0 -628
  62. data/spec/assets/biff/bad_gateway_config.yml +0 -28
  63. data/spec/assets/biff/good_simple_config.yml +0 -63
  64. data/spec/assets/biff/good_simple_golden_config.yml +0 -63
  65. data/spec/assets/biff/good_simple_template.erb +0 -69
  66. data/spec/assets/biff/ip_out_of_range.yml +0 -63
  67. data/spec/assets/biff/multiple_subnets_config.yml +0 -40
  68. data/spec/assets/biff/network_only_template.erb +0 -34
  69. data/spec/assets/biff/no_cc_config.yml +0 -27
  70. data/spec/assets/biff/no_range_config.yml +0 -27
  71. data/spec/assets/biff/no_subnet_config.yml +0 -16
  72. data/spec/assets/biff/ok_network_config.yml +0 -30
  73. data/spec/assets/biff/properties_template.erb +0 -6
  74. data/spec/assets/config/atmos/config/final.yml +0 -6
  75. data/spec/assets/config/atmos/config/private.yml +0 -4
  76. data/spec/assets/config/bad-providers/config/final.yml +0 -5
  77. data/spec/assets/config/bad-providers/config/private.yml +0 -4
  78. data/spec/assets/config/deprecation/config/final.yml +0 -5
  79. data/spec/assets/config/deprecation/config/private.yml +0 -2
  80. data/spec/assets/config/local/config/final.yml +0 -5
  81. data/spec/assets/config/local/config/private.yml +0 -1
  82. data/spec/assets/config/s3/config/final.yml +0 -5
  83. data/spec/assets/config/s3/config/private.yml +0 -5
  84. data/spec/assets/config/swift-hp/config/final.yml +0 -6
  85. data/spec/assets/config/swift-hp/config/private.yml +0 -7
  86. data/spec/assets/config/swift-rackspace/config/final.yml +0 -6
  87. data/spec/assets/config/swift-rackspace/config/private.yml +0 -6
  88. data/spec/assets/deployment.MF +0 -0
  89. data/spec/assets/plugins/bosh/cli/commands/echo.rb +0 -43
  90. data/spec/assets/plugins/bosh/cli/commands/ruby.rb +0 -24
  91. data/spec/assets/release/jobs/cacher.tgz +0 -0
  92. data/spec/assets/release/jobs/cacher/config/file1.conf +0 -0
  93. data/spec/assets/release/jobs/cacher/config/file2.conf +0 -0
  94. data/spec/assets/release/jobs/cacher/job.MF +0 -6
  95. data/spec/assets/release/jobs/cacher/monit +0 -1
  96. data/spec/assets/release/jobs/cleaner.tgz +0 -0
  97. data/spec/assets/release/jobs/cleaner/job.MF +0 -4
  98. data/spec/assets/release/jobs/cleaner/monit +0 -1
  99. data/spec/assets/release/jobs/sweeper.tgz +0 -0
  100. data/spec/assets/release/jobs/sweeper/config/test.conf +0 -1
  101. data/spec/assets/release/jobs/sweeper/job.MF +0 -5
  102. data/spec/assets/release/jobs/sweeper/monit +0 -1
  103. data/spec/assets/release/packages/mutator.tar.gz +0 -0
  104. data/spec/assets/release/packages/stuff.tgz +0 -0
  105. data/spec/assets/release/release.MF +0 -17
  106. data/spec/assets/release_invalid_checksum.tgz +0 -0
  107. data/spec/assets/release_invalid_jobs.tgz +0 -0
  108. data/spec/assets/release_no_name.tgz +0 -0
  109. data/spec/assets/release_no_version.tgz +0 -0
  110. data/spec/assets/stemcell/image +0 -1
  111. data/spec/assets/stemcell/stemcell.MF +0 -6
  112. data/spec/assets/stemcell_invalid_mf.tgz +0 -0
  113. data/spec/assets/stemcell_no_image.tgz +0 -0
  114. data/spec/assets/valid_release.tgz +0 -0
  115. data/spec/assets/valid_stemcell.tgz +0 -0
  116. data/spec/spec_helper.rb +0 -28
  117. data/spec/unit/base_command_spec.rb +0 -87
  118. data/spec/unit/biff_spec.rb +0 -172
  119. data/spec/unit/blob_manager_spec.rb +0 -288
  120. data/spec/unit/cache_spec.rb +0 -36
  121. data/spec/unit/cli_commands_spec.rb +0 -356
  122. data/spec/unit/config_spec.rb +0 -125
  123. data/spec/unit/core_ext_spec.rb +0 -81
  124. data/spec/unit/dependency_helper_spec.rb +0 -52
  125. data/spec/unit/deployment_manifest_compiler_spec.rb +0 -63
  126. data/spec/unit/deployment_manifest_spec.rb +0 -153
  127. data/spec/unit/director_spec.rb +0 -471
  128. data/spec/unit/director_task_spec.rb +0 -48
  129. data/spec/unit/event_log_renderer_spec.rb +0 -171
  130. data/spec/unit/hash_changeset_spec.rb +0 -73
  131. data/spec/unit/job_builder_spec.rb +0 -455
  132. data/spec/unit/job_property_collection_spec.rb +0 -111
  133. data/spec/unit/job_property_validator_spec.rb +0 -7
  134. data/spec/unit/job_rename_spec.rb +0 -200
  135. data/spec/unit/package_builder_spec.rb +0 -593
  136. data/spec/unit/release_builder_spec.rb +0 -120
  137. data/spec/unit/release_spec.rb +0 -173
  138. data/spec/unit/release_tarball_spec.rb +0 -29
  139. data/spec/unit/runner_spec.rb +0 -7
  140. data/spec/unit/ssh_spec.rb +0 -84
  141. data/spec/unit/stemcell_spec.rb +0 -17
  142. data/spec/unit/task_tracker_spec.rb +0 -131
  143. data/spec/unit/version_calc_spec.rb +0 -27
  144. 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
@@ -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