bosh_cli 0.18 → 0.19

Sign up to get free protection for your applications and to get access to all the features.
@@ -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