bosh_cli 0.18 → 0.19

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.
@@ -0,0 +1,195 @@
1
+ # Copyright (c) 2009-2012 VMware, Inc.
2
+
3
+ require "spec_helper"
4
+
5
+ describe Bosh::Cli::Command::Base do
6
+
7
+ describe Bosh::Cli::Command::JobRename do
8
+ it "should rename the job" do
9
+ mock_director = mock(Object)
10
+ mock_director.should_receive(:rename_job).and_return([:done, ""])
11
+ Bosh::Cli::Director.should_receive(:new).and_return(mock_director)
12
+
13
+ job_rename = Bosh::Cli::Command::JobRename.new
14
+ job_rename.stub(:auth_required)
15
+ job_rename.stub(:prepare_deployment_manifest).and_return(old_manifest_yaml)
16
+ job_rename.stub(:sanity_check_job_rename)
17
+ job_rename.rename("old_name", "new_name")
18
+ end
19
+
20
+ it "should raise exception on additional changes to manifest" do
21
+ mock_director = mock(Object)
22
+ mock_director.stub(:get_deployment) { { "manifest" => old_manifest_yaml } }
23
+ Bosh::Cli::Director.should_receive(:new).and_return(mock_director)
24
+
25
+ job_rename = Bosh::Cli::Command::JobRename.new
26
+
27
+ lambda {
28
+ job_rename.sanity_check_job_rename(new_extra_changes_manifest, "old_job", "new_job")
29
+ }.should raise_error(Bosh::Cli::CliExit, /cannot have any other changes/)
30
+ end
31
+
32
+ it "should raise exception if new manifest removed some properties" do
33
+ mock_director = mock(Object)
34
+ mock_director.stub(:get_deployment) { { "manifest" => old_manifest_yaml } }
35
+ Bosh::Cli::Director.should_receive(:new).and_return(mock_director)
36
+
37
+ job_rename = Bosh::Cli::Command::JobRename.new
38
+
39
+ lambda {
40
+ job_rename.sanity_check_job_rename(new_manifest_with_some_deletions, "old_job", "new_job")
41
+ }.should raise_error(Bosh::Cli::CliExit, /cannot have any other changes/)
42
+ end
43
+
44
+ it "should raise exception if deployment is not updated with new job name" do
45
+ job_rename = Bosh::Cli::Command::JobRename.new
46
+
47
+ lambda {
48
+ job_rename.sanity_check_job_rename(new_missing_new_job, "old_job", "new_job")
49
+ }.should raise_error(Bosh::Cli::CliExit, /include the new job/)
50
+ end
51
+
52
+ it "should raise exception if old job name does not exist in manifest" do
53
+ mock_director = mock(Object)
54
+ mock_director.stub(:get_deployment) { { "manifest" => old_manifest_yaml } }
55
+ Bosh::Cli::Director.should_receive(:new).and_return(mock_director)
56
+
57
+ job_rename = Bosh::Cli::Command::JobRename.new
58
+
59
+ lambda {
60
+ job_rename.sanity_check_job_rename(new_extra_changes_manifest, "non_existent_job", "new_job")
61
+ }.should raise_error(Bosh::Cli::CliExit, /non existent job/)
62
+ end
63
+
64
+ it "should raise exception if 2 jobs are changed in manifest" do
65
+ mock_director = mock(Object)
66
+ mock_director.stub(:get_deployment) { { "manifest" => old_manifest_yaml } }
67
+ Bosh::Cli::Director.should_receive(:new).and_return(mock_director)
68
+
69
+ job_rename = Bosh::Cli::Command::JobRename.new
70
+
71
+ lambda {
72
+ job_rename.sanity_check_job_rename(new_extra_job_rename_manifest, "old_job", "new_job")
73
+ }.should raise_error(Bosh::Cli::CliExit, /Cannot rename more than one job/)
74
+ end
75
+
76
+ def old_manifest_yaml
77
+ <<-eos
78
+ ---
79
+ name: test
80
+ resource_pools:
81
+ - name: rp
82
+ networks:
83
+ - name: default
84
+ jobs:
85
+ - name: job1
86
+ template: xyz
87
+ networks:
88
+ - name: default
89
+ - name: old_job
90
+ template: xyz
91
+ networks:
92
+ - name: default
93
+ eos
94
+ end
95
+
96
+ def new_manifest_with_some_deletions
97
+ <<-eos
98
+ ---
99
+ name: test
100
+ resource_pools:
101
+ - name: rp
102
+ networks:
103
+ - name: default
104
+ jobs:
105
+ - name: job1
106
+ networks:
107
+ - name: default
108
+ - name: new_job
109
+ template: xyz
110
+ networks:
111
+ - name: default
112
+ eos
113
+ end
114
+
115
+ def new_manifest_yaml
116
+ <<-eos
117
+ ---
118
+ name: test
119
+ networks:
120
+ - name: default
121
+ resource_pools:
122
+ - name: rp
123
+ jobs:
124
+ - name: job1
125
+ template: xyz
126
+ networks:
127
+ - name: default
128
+ - name: new_job
129
+ template: xyz
130
+ networks:
131
+ - name: default
132
+ eos
133
+ end
134
+
135
+ def new_extra_changes_manifest
136
+ <<-eos
137
+ ---
138
+ name: test
139
+ networks:
140
+ - name: default
141
+ resource_pools:
142
+ - name: rp
143
+ jobs:
144
+ - name: job1
145
+ template: xyz
146
+ networks:
147
+ - name: default
148
+ - name: new_job
149
+ template: changed_templated_causing_failure
150
+ networks:
151
+ - name: default
152
+ eos
153
+ end
154
+
155
+ def new_extra_job_rename_manifest
156
+ <<-eos
157
+ ---
158
+ name: test
159
+ networks:
160
+ - name: default
161
+ resource_pools:
162
+ - name: rp
163
+ jobs:
164
+ - name: new_job1
165
+ template: xyz
166
+ networks:
167
+ - name: default
168
+ - name: new_job
169
+ template: changed_templated_causing_failure
170
+ networks:
171
+ - name: default
172
+ eos
173
+ end
174
+
175
+ def new_missing_new_job
176
+ <<-eos
177
+ ---
178
+ name: test
179
+ networks:
180
+ - name: default
181
+ resource_pools:
182
+ - name: rp
183
+ jobs:
184
+ - name: job1
185
+ template: xyz
186
+ networks:
187
+ - name: default
188
+ - name: old_job
189
+ template: xyz
190
+ networks:
191
+ - name: default
192
+ eos
193
+ end
194
+ end
195
+ end
@@ -6,55 +6,41 @@ describe Bosh::Cli::PackageBuilder, "dev build" do
6
6
 
7
7
  before(:each) do
8
8
  @release_dir = Dir.mktmpdir
9
- @src_dir = FileUtils.mkdir(File.join(@release_dir, "src"))
10
- @blobs_dir = FileUtils.mkdir(File.join(@release_dir, "blobs"))
11
- end
12
-
13
- after(:each) do
14
- FileUtils.rm_rf(@src_dir)
15
- FileUtils.rm_rf(@blobs_dir)
16
- end
17
-
18
- def source_path(filename)
19
- File.join(@release_dir, "src", filename)
20
- end
21
-
22
- def add_sources(*files)
23
- files.each do |file|
24
- path = source_path(file)
25
- FileUtils.mkdir_p(File.dirname(path))
26
- FileUtils.touch(path)
27
- end
28
- end
29
-
30
- def remove_sources(*files)
31
- files.each do |file|
32
- FileUtils.rm(source_path(file))
9
+ FileUtils.mkdir(File.join(@release_dir, "src"))
10
+ FileUtils.mkdir(File.join(@release_dir, "blobs"))
11
+ FileUtils.mkdir(File.join(@release_dir, "src_alt"))
12
+ end
13
+
14
+ def add_file(dir, path, contents = nil)
15
+ full_path = File.join(@release_dir, dir, path)
16
+ FileUtils.mkdir_p(File.dirname(full_path))
17
+ if contents
18
+ File.open(full_path, "w") { |f| f.write(contents) }
19
+ else
20
+ FileUtils.touch(full_path)
33
21
  end
34
22
  end
35
23
 
36
- def blob_path(filename)
37
- File.join(@release_dir, "blobs", filename)
24
+ def remove_file(dir, path)
25
+ FileUtils.rm(File.join(@release_dir, dir, path))
38
26
  end
39
27
 
40
- def add_blobs(*files)
41
- files.each do |file|
42
- path = blob_path(file)
43
- FileUtils.mkdir_p(File.dirname(path))
44
- FileUtils.touch(path)
45
- end
28
+ def add_files(dir, names)
29
+ names.each { |name| add_file(dir, name) }
46
30
  end
47
31
 
48
- def remove_blobs(*files)
49
- files.each do |file|
50
- FileUtils.rm(blob_path(file))
51
- end
32
+ def remove_files(dir, names)
33
+ names.each { |name| remove_file(dir, name) }
52
34
  end
53
35
 
54
36
  def make_builder(name, files, dependencies = [], sources_dir = nil)
55
37
  blobstore = mock("blobstore")
56
- spec = { "name" => name, "files" => files,
57
- "dependencies" => dependencies }
38
+ spec = {
39
+ "name" => name,
40
+ "files" => files,
41
+ "dependencies" => dependencies
42
+ }
43
+
58
44
  Bosh::Cli::PackageBuilder.new(spec, @release_dir,
59
45
  false, blobstore, sources_dir)
60
46
  end
@@ -81,13 +67,12 @@ describe Bosh::Cli::PackageBuilder, "dev build" do
81
67
 
82
68
  it "whines on metadata file having the same name as one of package files" do
83
69
  lambda {
84
- builder = make_builder("aa", ["*.rb", "packaging"])
85
- add_sources("1.rb", "packaging")
86
- builder.source_files.include?("packaging").should be_true
70
+ builder = make_builder("aa", %w(*.rb packaging))
71
+
72
+ add_files("src", %w(1.rb packaging))
87
73
 
88
- File.open("#{@release_dir}/packages/aa/packaging", "w") do |f|
89
- f.puts("make install")
90
- end
74
+ builder.glob_matches.size.should == 2
75
+ add_file("packages", "aa/packaging", "make install")
91
76
 
92
77
  builder.copy_files
93
78
  }.should raise_error(Bosh::Cli::InvalidPackage,
@@ -96,8 +81,8 @@ describe Bosh::Cli::PackageBuilder, "dev build" do
96
81
  end
97
82
 
98
83
  it "whines on globs not yielding any file names" do
99
- add_sources("lib/1.rb", "lib/2.rb", "baz")
100
- builder = make_builder("foo", ["lib/*.rb", "baz", "bar"])
84
+ add_files("src", %w(lib/1.rb lib/2.rb baz))
85
+ builder = make_builder("foo", %w(lib/*.rb baz bar))
101
86
 
102
87
  lambda {
103
88
  builder.build
@@ -108,8 +93,8 @@ describe Bosh::Cli::PackageBuilder, "dev build" do
108
93
 
109
94
  it "has no way to calculate checksum for not yet generated package" do
110
95
  lambda {
111
- builder = make_builder("aa", ["*.rb", "packaging"])
112
- add_sources("1.rb", "packaging")
96
+ builder = make_builder("aa", %w(*.rb packaging))
97
+ add_files("src", %w(1.rb packaging))
113
98
  builder.checksum
114
99
  }.should raise_error(RuntimeError,
115
100
  "cannot read checksum for not yet " +
@@ -117,112 +102,101 @@ describe Bosh::Cli::PackageBuilder, "dev build" do
117
102
  end
118
103
 
119
104
  it "has a checksum for a generated package" do
120
- builder = make_builder("aa", ["*.rb"])
121
- add_sources("1.rb", "2.rb")
105
+ builder = make_builder("aa", %w(*.rb))
106
+ add_files("src", %w(1.rb 2.rb))
122
107
  builder.build
123
108
  builder.checksum.should =~ /[0-9a-f]+/
124
109
  end
125
110
 
126
111
  it "is created with name and globs" do
127
- builder = make_builder("aa", ["1", "*/*"])
112
+ builder = make_builder("aa", %w(1 */*))
128
113
  builder.name.should == "aa"
129
- builder.globs.should == ["1", "*/*"]
114
+ builder.globs.should == %w(1 */*)
130
115
  end
131
116
 
132
117
  it "resolves globs and generates fingerprint" do
133
- add_sources("lib/1.rb", "lib/2.rb", "lib/README.txt",
134
- "README.2", "README.md")
118
+ add_files("src", %w(lib/1.rb lib/2.rb lib/README.txt README.2 README.md))
135
119
 
136
- builder = make_builder("A", ["lib/*.rb", "README.*"])
137
- builder.source_files.should == ["lib/1.rb", "lib/2.rb",
138
- "README.2", "README.md"].sort
120
+ builder = make_builder("A", %w(lib/*.rb README.*))
121
+ builder.glob_matches.size.should == 4
139
122
  builder.fingerprint.should == "397a99ccd267ebc9bcc632b746db2cd5b29db050"
140
123
  end
141
124
 
142
125
  it "has stable fingerprint" do
143
- add_sources("lib/1.rb", "lib/2.rb", "lib/README.txt",
144
- "README.2", "README.md")
145
- builder = make_builder("A", ["lib/*.rb", "README.*"])
126
+ add_files("src", %w(lib/1.rb lib/2.rb lib/README.txt README.2 README.md))
127
+ builder = make_builder("A", %w(lib/*.rb README.*))
146
128
  s1 = builder.fingerprint
147
129
 
148
130
  builder.reload.fingerprint.should == s1
149
131
  end
150
132
 
151
133
  it "changes fingerprint when new file that matches glob is added" do
152
- add_sources("lib/1.rb", "lib/2.rb", "lib/README.txt",
153
- "README.2", "README.md")
134
+ add_files("src", %w(lib/1.rb lib/2.rb lib/README.txt README.2 README.md))
154
135
 
155
- builder = make_builder("A", ["lib/*.rb", "README.*"])
136
+ builder = make_builder("A", %w(lib/*.rb README.*))
156
137
  s1 = builder.fingerprint
157
- add_sources("lib/3.rb")
138
+ add_files("src", %w(lib/3.rb))
158
139
  builder.reload.fingerprint.should_not == s1
159
140
 
160
- remove_sources("lib/3.rb")
141
+ remove_files("src", %w(lib/3.rb))
161
142
  builder.reload.fingerprint.should == s1
162
143
  end
163
144
 
164
145
  it "changes fingerprint when one of the matched files changes" do
165
- add_sources("lib/1.rb", "lib/2.rb", "lib/README.txt",
166
- "README.2", "README.md")
167
- File.open("#{@release_dir}/src/lib/1.rb", "w") { |f| f.write("1") }
146
+ add_files("src", %w(lib/2.rb lib/README.txt README.2 README.md))
147
+ add_file("src", "lib/1.rb", "1")
168
148
 
169
- builder = make_builder("A", ["lib/*.rb", "README.*"])
149
+ builder = make_builder("A", %w(lib/*.rb README.*))
170
150
  s1 = builder.fingerprint
171
151
 
172
- File.open("#{@release_dir}/src/lib/1.rb", "w+") { |f| f.write("2") }
173
-
152
+ add_file("src", "lib/1.rb", "2")
174
153
  builder.reload.fingerprint.should_not == s1
175
154
 
176
- File.open("#{@release_dir}/src/lib/1.rb", "w") { |f| f.write("1") }
155
+ add_file("src", "lib/1.rb", "1")
177
156
  builder.reload.fingerprint.should == s1
178
157
  end
179
158
 
180
159
  it "changes fingerprint when empty directory added/removed" do
181
- add_sources("lib/1.rb", "lib/2.rb", "baz")
182
- builder = make_builder("foo", ["lib/*.rb", "baz", "bar/*"])
183
- FileUtils.mkdir_p(@release_dir + "/src/bar/zb")
160
+ add_files("src", %w(lib/1.rb lib/2.rb baz))
161
+ builder = make_builder("foo", %w(lib/*.rb baz bar/*))
162
+ FileUtils.mkdir_p(File.join(@release_dir, "src", "bar", "zb"))
184
163
 
185
164
  s1 = builder.fingerprint
186
165
 
187
- FileUtils.mkdir_p(@release_dir + "/src/bar/zb2")
166
+ FileUtils.mkdir_p(File.join(@release_dir, "src", "bar", "zb2"))
188
167
  s2 = builder.reload.fingerprint
189
168
  s2.should_not == s1
190
169
 
191
- builder.reload.fingerprint.should == s2
192
- FileUtils.rm_rf(@release_dir + "/src/bar/zb2")
170
+ FileUtils.rm_rf(File.join(@release_dir, "src", "bar", "zb2"))
193
171
  builder.reload.fingerprint.should == s1
194
172
  end
195
173
 
196
174
  it "doesn't change fingerprint when files that doesn't match glob is added" do
197
- add_sources("lib/1.rb", "lib/2.rb", "lib/README.txt",
198
- "README.2", "README.md")
199
-
200
- builder = make_builder("A", ["lib/*.rb", "README.*"])
175
+ add_files("src", %w(lib/1.rb lib/2.rb lib/README.txt README.2 README.md))
176
+ builder = make_builder("A", %w(lib/*.rb README.*))
201
177
  s1 = builder.fingerprint
202
- add_sources("lib/a.out")
178
+
179
+ add_file("src", "lib/a.out")
203
180
  builder.reload.fingerprint.should == s1
204
181
  end
205
182
 
206
183
  it "changes fingerprint when dependencies change" do
207
- add_sources("lib/1.rb", "lib/2.rb", "lib/README.txt",
208
- "README.2", "README.md")
184
+ add_files("src", %w(lib/1.rb lib/2.rb lib/README.txt README.2 README.md))
209
185
 
210
- builder1 = make_builder("A", ["lib/*.rb", "README.*"], ["foo", "bar"])
186
+ builder1 = make_builder("A", %w(lib/*.rb README.*), %w(foo bar))
211
187
  s1 = builder1.fingerprint
212
- builder2 = make_builder("A", ["lib/*.rb", "README.*"], ["bar", "foo"])
188
+ builder2 = make_builder("A", %w(lib/*.rb README.*), %w(bar foo))
213
189
  s2 = builder2.fingerprint
190
+ s1.should == s2 # Order doesn't matter
214
191
 
215
- s1.should == s2
216
- builder3 = make_builder("A", ["lib/*.rb", "README.*"],
217
- ["bar", "foo", "baz"])
192
+ builder3 = make_builder("A", %w(lib/*.rb README.*), %w(bar foo baz))
218
193
  s3 = builder3.fingerprint
219
- s3.should_not == s1
194
+ s3.should_not == s1 # Set does matter
220
195
  end
221
196
 
222
197
  it "copies files to build directory" do
223
- add_sources("foo/foo.rb", "foo/lib/1.rb", "foo/lib/2.rb",
224
- "foo/README", "baz")
225
- globs = ["foo/**/*", "baz"]
198
+ add_files("src", %w(foo/foo.rb foo/lib/1.rb foo/lib/2.rb foo/README baz))
199
+ globs = %w(foo/**/* baz)
226
200
 
227
201
  builder = make_builder("bar", globs)
228
202
  builder.copy_files.should == 5
@@ -234,18 +208,14 @@ describe Bosh::Cli::PackageBuilder, "dev build" do
234
208
  end
235
209
 
236
210
  it "generates tarball" do
237
- add_sources("foo/foo.rb", "foo/lib/1.rb", "foo/lib/2.rb",
238
- "foo/README", "baz")
239
- globs = ["foo/**/*", "baz"]
240
-
241
- builder = make_builder("bar", globs)
211
+ add_files("src", %w(foo/foo.rb foo/lib/1.rb foo/lib/2.rb foo/README baz))
212
+ builder = make_builder("bar", %w(foo/**/* baz))
242
213
  builder.generate_tarball.should be_true
243
214
  end
244
215
 
245
216
  it "can point to either dev or a final version of a package" do
246
- add_sources("foo/foo.rb", "foo/lib/1.rb", "foo/lib/2.rb",
247
- "foo/README", "baz")
248
- globs = ["foo/**/*", "baz"]
217
+ add_files("src", %w(foo/foo.rb foo/lib/1.rb foo/lib/2.rb foo/README baz))
218
+ globs = %w(foo/**/* baz)
249
219
 
250
220
  fingerprint = "86e8d5f5530a89659f588f5884fe8c13e639d94b"
251
221
 
@@ -276,9 +246,8 @@ describe Bosh::Cli::PackageBuilder, "dev build" do
276
246
  end
277
247
 
278
248
  it "creates a new version tarball" do
279
- add_sources("foo/foo.rb", "foo/lib/1.rb",
280
- "foo/lib/2.rb", "foo/README", "baz")
281
- globs = ["foo/**/*", "baz"]
249
+ add_files("src", %w(foo/foo.rb foo/lib/1.rb foo/lib/2.rb foo/README baz))
250
+ globs = %w(foo/**/* baz)
282
251
  builder = make_builder("bar", globs)
283
252
 
284
253
  File.exists?(@release_dir + "/.dev_builds/packages/bar/0.1-dev.tgz").
@@ -296,7 +265,7 @@ describe Bosh::Cli::PackageBuilder, "dev build" do
296
265
  File.exists?(@release_dir + "/.dev_builds/packages/bar/0.2-dev.tgz").
297
266
  should be_false
298
267
 
299
- add_sources("foo/3.rb")
268
+ add_file("src", "foo/3.rb")
300
269
  builder = make_builder("bar", globs)
301
270
  builder.build
302
271
 
@@ -305,7 +274,7 @@ describe Bosh::Cli::PackageBuilder, "dev build" do
305
274
  File.exists?(@release_dir + "/.dev_builds/packages/bar/0.2-dev.tgz").
306
275
  should be_true
307
276
 
308
- remove_sources("foo/3.rb")
277
+ remove_file("src", "foo/3.rb")
309
278
  builder = make_builder("bar", globs)
310
279
  builder.build
311
280
  builder.version.should == "0.1-dev"
@@ -320,17 +289,13 @@ describe Bosh::Cli::PackageBuilder, "dev build" do
320
289
  should be_false
321
290
 
322
291
  # Now add packaging
323
- File.open("#{@release_dir}/packages/bar/packaging", "w") do |f|
324
- f.puts("make install")
325
- end
292
+ add_file("packages", "bar/packaging", "make install")
326
293
  builder = make_builder("bar", globs)
327
294
  builder.build
328
295
  builder.version.should == "0.3-dev"
329
296
 
330
297
  # Add prepackaging
331
- File.open("#{@release_dir}/packages/bar/pre_packaging", "w") do |f|
332
- f.puts("exit 0")
333
- end
298
+ add_file("packages", "bar/pre_packaging", "exit 0")
334
299
  builder = make_builder("bar", globs)
335
300
  builder.build
336
301
 
@@ -348,14 +313,11 @@ describe Bosh::Cli::PackageBuilder, "dev build" do
348
313
  end
349
314
 
350
315
  it "stops if pre_packaging fails" do
351
- add_sources("foo/foo.rb", "foo/lib/1.rb", "foo/lib/2.rb",
352
- "foo/README", "baz")
353
- globs = ["foo/**/*", "baz"]
316
+ add_files("src", %w(foo/foo.rb foo/lib/1.rb foo/lib/2.rb foo/README baz))
317
+ globs = %w(foo/**/* baz)
354
318
 
355
319
  builder = make_builder("bar", globs)
356
- File.open("#{@release_dir}/packages/bar/pre_packaging", "w") do |f|
357
- f.puts("rake db:migrate")
358
- end
320
+ add_file("packages", "bar/pre_packaging", "exit 1")
359
321
 
360
322
  lambda {
361
323
  builder.build
@@ -363,10 +325,23 @@ describe Bosh::Cli::PackageBuilder, "dev build" do
363
325
  "`bar' pre-packaging failed")
364
326
  end
365
327
 
328
+ it "prevents building final version with src alt" do
329
+ spec = {
330
+ "name" => "bar",
331
+ "files" => "foo/**/*"
332
+ }
333
+
334
+ lambda {
335
+ Bosh::Cli::PackageBuilder.new(spec, @release_dir,
336
+ true, mock("blobstore"))
337
+ }.should raise_error(/Please remove `src_alt' first/)
338
+ end
339
+
366
340
  it "bumps major dev version in sync with final version" do
367
- add_sources("foo/foo.rb", "foo/lib/1.rb", "foo/lib/2.rb",
368
- "foo/README", "baz")
369
- globs = ["foo/**/*", "baz"]
341
+ FileUtils.rm_rf(File.join(@release_dir, "src_alt"))
342
+
343
+ add_files("src", %w(foo/foo.rb foo/lib/1.rb foo/lib/2.rb foo/README baz))
344
+ globs = %w(foo/**/* baz)
370
345
  builder = make_builder("bar", globs)
371
346
  builder.build
372
347
 
@@ -379,19 +354,17 @@ describe Bosh::Cli::PackageBuilder, "dev build" do
379
354
  @release_dir,
380
355
  true, blobstore)
381
356
  final_builder.build
382
-
383
357
  final_builder.version.should == 1
384
358
 
385
- add_sources("foo/foo15.rb")
359
+ add_file("src", "foo/foo15.rb")
386
360
  builder2 = make_builder("bar", globs)
387
361
  builder2.build
388
362
  builder2.version.should == "1.1-dev"
389
363
  end
390
364
 
391
365
  it "uses the appropriate final version for bumping a dev version" do
392
- add_sources("foo/foo.rb", "foo/lib/1.rb",
393
- "foo/lib/2.rb", "foo/README", "baz")
394
- globs = ["foo/**/*", "baz"]
366
+ add_files("src", %w(foo/foo.rb foo/lib/1.rb foo/lib/2.rb foo/README baz))
367
+ globs = %w(foo/**/* baz)
395
368
  builder = make_builder("bar", globs)
396
369
  final_builds_dir = File.join(@release_dir,
397
370
  ".final_builds", "packages", "bar")
@@ -400,17 +373,17 @@ describe Bosh::Cli::PackageBuilder, "dev build" do
400
373
  final_index = Bosh::Cli::VersionsIndex.new(final_builds_dir)
401
374
  final_index.add_version("deadbeef", { "version" => 34 }, "payload")
402
375
 
403
- add_sources("foo/foo14.rb")
376
+ add_file("src", "foo/foo14.rb")
404
377
  builder.reload.build
405
378
  builder.version.should == "34.1-dev"
406
379
 
407
380
  final_index.add_version("deadbeef2", { "version" => 37 }, "payload")
408
381
 
409
- add_sources("foo/foo15.rb")
382
+ add_file("src", "foo/foo15.rb")
410
383
  builder.reload.build
411
384
  builder.version.should == "37.1-dev"
412
385
 
413
- add_sources("foo/foo16.rb")
386
+ add_file("src", "foo/foo16.rb")
414
387
  builder.reload.build
415
388
  builder.version.should == "37.2-dev"
416
389
 
@@ -418,22 +391,23 @@ describe Bosh::Cli::PackageBuilder, "dev build" do
418
391
  final_index = Bosh::Cli::VersionsIndex.new(final_builds_dir)
419
392
  final_index.add_version("deadbeef3", { "version" => 34 }, "payload")
420
393
 
421
- add_sources("foo/foo17.rb")
394
+ add_file("src", "foo/foo17.rb")
422
395
  builder.reload.build
423
396
  builder.version.should == "34.2-dev"
424
397
  end
425
398
 
426
399
  it "whines on attempt to create final build if not matched " +
427
400
  "by existing final or dev build" do
428
- add_sources("foo/foo.rb", "foo/lib/1.rb",
429
- "foo/lib/2.rb", "foo/README", "baz")
430
- globs = ["foo/**/*", "baz"]
401
+ FileUtils.rm_rf(File.join(@release_dir, "src_alt"))
402
+
403
+ add_files("src", %w(foo/foo.rb foo/lib/1.rb foo/lib/2.rb foo/README baz))
404
+ globs = %w(foo/**/* baz)
431
405
 
432
406
  blobstore = mock("blobstore")
433
407
  blobstore.should_receive(:create).and_return("object_id")
434
408
 
435
409
  final_builder = Bosh::Cli::PackageBuilder.new(
436
- { "name" => "bar", "files" => globs }, @release_dir, true, blobstore)
410
+ { "name" => "bar", "files" => globs }, @release_dir, true, blobstore)
437
411
  lambda {
438
412
  final_builder.build
439
413
  }.should raise_error(Bosh::Cli::CliExit)
@@ -448,43 +422,39 @@ describe Bosh::Cli::PackageBuilder, "dev build" do
448
422
  final_builder2.build
449
423
  final_builder2.version.should == 1
450
424
 
451
- add_sources("foo/foo15.rb")
425
+ add_file("src", "foo/foo15.rb")
452
426
  final_builder3 = Bosh::Cli::PackageBuilder.new(
453
- { "name" => "bar", "files" => globs }, @release_dir, true, blobstore)
427
+ { "name" => "bar", "files" => globs }, @release_dir, true, blobstore)
454
428
  lambda {
455
429
  final_builder3.build
456
430
  }.should raise_error(Bosh::Cli::CliExit)
457
431
  end
458
432
 
459
433
  it "includes dotfiles in a fingerprint" do
460
- add_sources("lib/1.rb", "lib/2.rb",
461
- "lib/README.txt", "README.2", "README.md")
462
-
463
- builder = make_builder("A", ["lib/*.rb", "README.*"])
464
- builder.source_files.should == ["lib/1.rb", "lib/2.rb",
465
- "README.2", "README.md"].sort
434
+ add_files("src", %w(lib/1.rb lib/2.rb lib/README.txt README.2 README.md))
466
435
 
436
+ builder = make_builder("A", %w(lib/*.rb README.*))
437
+ builder.glob_matches.size.should == 4
467
438
  builder.fingerprint.should == "397a99ccd267ebc9bcc632b746db2cd5b29db050"
468
439
 
469
- add_sources("lib/.zb.rb")
440
+ add_file("src", "lib/.zb.rb")
470
441
  builder.reload
471
442
 
472
- builder.source_files.should == ["lib/.zb.rb", "lib/1.rb",
473
- "lib/2.rb", "README.2", "README.md"].sort
443
+ builder.glob_matches.size.should == 5
474
444
  builder.fingerprint.should == "351b3bb8dc430e58a3264bcfb5c9c19c06ece4af"
475
445
 
476
- remove_sources("lib/.zb.rb")
446
+ remove_file("src", "lib/.zb.rb")
477
447
  builder.reload
478
448
 
479
- builder.source_files.should == ["lib/1.rb", "lib/2.rb",
480
- "README.2", "README.md"].sort
449
+ builder.glob_matches.size.should == 4
481
450
  builder.fingerprint.should == "397a99ccd267ebc9bcc632b746db2cd5b29db050"
482
451
  end
483
452
 
484
453
  it "supports dry run" do
485
- add_sources("foo/foo.rb", "foo/lib/1.rb",
486
- "foo/lib/2.rb", "foo/README", "baz")
487
- globs = ["foo/**/*", "baz"]
454
+ FileUtils.rm_rf(File.join(@release_dir, "src_alt"))
455
+
456
+ add_files("src", %w(foo/foo.rb foo/lib/1.rb foo/lib/2.rb foo/README baz))
457
+ globs = %w(foo/**/* baz)
488
458
  builder = make_builder("bar", globs)
489
459
  builder.dry_run = true
490
460
  builder.build
@@ -502,14 +472,14 @@ describe Bosh::Cli::PackageBuilder, "dev build" do
502
472
  blobstore = mock("blobstore")
503
473
  blobstore.should_not_receive(:create)
504
474
  final_builder = Bosh::Cli::PackageBuilder.new(
505
- { "name" => "bar", "files" => globs }, @release_dir, true, blobstore)
475
+ { "name" => "bar", "files" => globs }, @release_dir, true, blobstore)
506
476
  final_builder.dry_run = true
507
477
  final_builder.build
508
478
 
509
479
  # Hasn't been promoted b/c of dry run
510
480
  final_builder.version.should == "0.1-dev"
511
481
 
512
- add_sources("foo/foo15.rb")
482
+ add_file("src", "foo/foo15.rb")
513
483
  builder2 = make_builder("bar", globs)
514
484
  builder2.dry_run = true
515
485
  builder2.build
@@ -520,48 +490,80 @@ describe Bosh::Cli::PackageBuilder, "dev build" do
520
490
  should be_false
521
491
  end
522
492
 
523
- it "resolves files using blob" do
524
- add_blobs("lib/1.rb", "lib/2.rb", "lib/README.txt", "README.2", "README.md")
493
+ it "uses blobs directory to look up files as well" do
494
+ add_files("src", %w(lib/1.rb lib/2.rb))
495
+ add_files("blobs", %w(lib/README.txt README.2 README.md))
525
496
 
526
- builder = make_builder("A", ["lib/*.rb", "README.*"])
527
- builder.blob_files.should == ["lib/1.rb", "lib/2.rb",
528
- "README.2", "README.md"].sort
497
+ builder = make_builder("A", %w(lib/*.rb README.*))
498
+ builder.glob_matches.size.should == 4
529
499
  builder.fingerprint.should == "397a99ccd267ebc9bcc632b746db2cd5b29db050"
530
500
  end
531
501
 
532
- it "resolves files using both blob and source" do
533
- add_sources("lib/1.rb", "lib/2.rb")
534
- add_blobs("lib/README.txt", "README.2", "README.md")
502
+ it "moving files to blobs directory doesn't change fingerprint" do
503
+ add_file("src", "README.txt", "README contents")
504
+ add_file("src", "README.md", "README contents 2")
505
+ add_file("src", "lib/1.rb", "puts 'Hello world'")
506
+ add_file("src", "lib/2.rb", "puts 'Bye world'")
507
+
508
+ builder = make_builder("A", %w(lib/*.rb README.*))
509
+ s1 = builder.fingerprint
535
510
 
536
- builder = make_builder("A", ["lib/*.rb", "README.*"])
511
+ FileUtils.mkdir_p(File.join(@release_dir, "blobs", "lib"))
537
512
 
538
- builder.source_files.should == ["lib/1.rb", "lib/2.rb"].sort
539
- builder.blob_files.should == ["README.2", "README.md"].sort
540
- builder.files.should == ["lib/1.rb", "lib/2.rb",
541
- "README.2", "README.md"].sort
542
- builder.fingerprint.should == "397a99ccd267ebc9bcc632b746db2cd5b29db050"
513
+ FileUtils.mv(File.join(@release_dir, "src", "lib", "1.rb"),
514
+ File.join(@release_dir, "blobs", "lib", "1.rb"))
515
+
516
+ s2 = builder.reload.fingerprint
517
+ s2.should == s1
543
518
  end
544
519
 
545
- it "should keep same fingerprint moving packages " +
546
- "from source_dir to blob_dir" do
520
+ it "supports alternative src directory" do
521
+ add_file("src", "README.txt", "README contents")
522
+ add_file("src", "lib/1.rb", "puts 'Hello world'")
523
+
524
+ builder = make_builder("A", %w(lib/*.rb README.*))
525
+ s1 = builder.fingerprint
526
+
527
+ add_file("src_alt", "README.txt", "README contents")
528
+ add_file("src_alt", "lib/1.rb", "puts 'Hello world'")
529
+
530
+ remove_files("src", %w(README.txt lib/1.rb))
531
+ builder.reload.fingerprint.should == s1
532
+ end
533
+
534
+ it "doesn't allow glob to match files under more than one source directory" do
535
+ add_file("src", "README.txt", "README contents")
536
+ add_file("src", "lib/1.rb", "puts 'Hello world'")
537
+
538
+ builder = make_builder("A", %w(lib/*.rb README.*))
539
+ lambda {
540
+ builder.fingerprint
541
+ }.should_not raise_error
542
+
543
+ add_file("src_alt", "README.txt", "README contents")
544
+ remove_files("src", %w(README.txt lib/1.rb))
545
+
546
+ lambda {
547
+ builder.reload.fingerprint
548
+ }.should raise_error("`A' has a glob that resolves to " +
549
+ "an empty file list: lib/*.rb")
550
+ end
551
+
552
+ it "doesn't include the same path twice" do
553
+ add_file("src", "test/foo/README.txt", "README contents")
554
+ add_file("src", "test/foo/NOTICE.txt", "NOTICE contents")
555
+
556
+ fp1 = make_builder("A", %w(test/**/*)).fingerprint
557
+
558
+ remove_file("src", "test/foo/NOTICE.txt")
559
+ add_file("blobs", "test/foo/NOTICE.txt", "NOTICE contents")
547
560
 
548
- # compute fingerprint when all the files are 'blob'
549
- add_blobs("lib/1.rb", "lib/2.rb", "lib/README.txt",
550
- "README.2", "README.md")
551
- builder = make_builder("A", ["lib/*.rb", "README.*"])
552
- blob_fingerprint = builder.fingerprint
553
- remove_blobs("lib/1.rb", "lib/2.rb", "lib/README.txt",
554
- "README.2", "README.md")
561
+ File.directory?(File.join(@release_dir, "src", "test", "foo")).
562
+ should be_true
555
563
 
556
- # compute fingerprint when all the files are in 'source'
557
- add_sources("lib/1.rb", "lib/2.rb", "lib/README.txt",
558
- "README.2", "README.md")
559
- builder = make_builder("A", ["lib/*.rb", "README.*"])
560
- blob_sources = builder.fingerprint
561
- remove_sources("lib/1.rb", "lib/2.rb", "lib/README.txt",
562
- "README.2", "README.md")
564
+ fp2 = make_builder("A", %w(test/**/*)).fingerprint
563
565
 
564
- builder.fingerprint.should == blob_fingerprint
566
+ fp1.should == fp2
565
567
  end
566
568
 
567
- end
569
+ end