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.
- data/bin/bosh +7 -4
- data/lib/cli.rb +2 -0
- data/lib/cli/commands/base.rb +1 -18
- data/lib/cli/commands/biff.rb +3 -7
- data/lib/cli/commands/cloudcheck.rb +1 -0
- data/lib/cli/commands/deployment.rb +10 -6
- data/lib/cli/commands/job_rename.rb +116 -0
- data/lib/cli/commands/stemcell.rb +3 -3
- data/lib/cli/commands/task.rb +52 -143
- data/lib/cli/commands/vms.rb +2 -2
- data/lib/cli/config.rb +1 -0
- data/lib/cli/deployment_helper.rb +62 -22
- data/lib/cli/director.rb +85 -196
- data/lib/cli/director_task.rb +4 -4
- data/lib/cli/event_log_renderer.rb +5 -1
- data/lib/cli/null_renderer.rb +19 -0
- data/lib/cli/package_builder.rb +91 -62
- data/lib/cli/packaging_helper.rb +1 -1
- data/lib/cli/release_builder.rb +47 -13
- data/lib/cli/runner.rb +21 -39
- data/lib/cli/task_log_renderer.rb +9 -0
- data/lib/cli/task_tracker.rb +168 -0
- data/lib/cli/templates/help_message.erb +1 -0
- data/lib/cli/version.rb +1 -1
- data/lib/cli/versions_index.rb +3 -3
- data/spec/unit/biff_spec.rb +5 -0
- data/spec/unit/director_spec.rb +96 -192
- data/spec/unit/job_rename_spec.rb +195 -0
- data/spec/unit/package_builder_spec.rb +188 -186
- data/spec/unit/release_builder_spec.rb +27 -9
- data/spec/unit/runner_spec.rb +0 -25
- data/spec/unit/task_tracker_spec.rb +154 -0
- metadata +11 -4
@@ -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
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
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
|
37
|
-
File.join(@release_dir,
|
24
|
+
def remove_file(dir, path)
|
25
|
+
FileUtils.rm(File.join(@release_dir, dir, path))
|
38
26
|
end
|
39
27
|
|
40
|
-
def
|
41
|
-
|
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
|
49
|
-
|
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 = {
|
57
|
-
|
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",
|
85
|
-
|
86
|
-
|
70
|
+
builder = make_builder("aa", %w(*.rb packaging))
|
71
|
+
|
72
|
+
add_files("src", %w(1.rb packaging))
|
87
73
|
|
88
|
-
|
89
|
-
|
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
|
-
|
100
|
-
builder = make_builder("foo",
|
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",
|
112
|
-
|
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",
|
121
|
-
|
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",
|
112
|
+
builder = make_builder("aa", %w(1 */*))
|
128
113
|
builder.name.should == "aa"
|
129
|
-
builder.globs.should ==
|
114
|
+
builder.globs.should == %w(1 */*)
|
130
115
|
end
|
131
116
|
|
132
117
|
it "resolves globs and generates fingerprint" do
|
133
|
-
|
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",
|
137
|
-
builder.
|
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
|
-
|
144
|
-
|
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
|
-
|
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",
|
136
|
+
builder = make_builder("A", %w(lib/*.rb README.*))
|
156
137
|
s1 = builder.fingerprint
|
157
|
-
|
138
|
+
add_files("src", %w(lib/3.rb))
|
158
139
|
builder.reload.fingerprint.should_not == s1
|
159
140
|
|
160
|
-
|
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
|
-
|
166
|
-
|
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",
|
149
|
+
builder = make_builder("A", %w(lib/*.rb README.*))
|
170
150
|
s1 = builder.fingerprint
|
171
151
|
|
172
|
-
|
173
|
-
|
152
|
+
add_file("src", "lib/1.rb", "2")
|
174
153
|
builder.reload.fingerprint.should_not == s1
|
175
154
|
|
176
|
-
|
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
|
-
|
182
|
-
builder = make_builder("foo",
|
183
|
-
FileUtils.mkdir_p(@release_dir
|
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
|
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
|
-
|
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
|
-
|
198
|
-
|
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
|
-
|
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
|
-
|
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",
|
186
|
+
builder1 = make_builder("A", %w(lib/*.rb README.*), %w(foo bar))
|
211
187
|
s1 = builder1.fingerprint
|
212
|
-
builder2 = make_builder("A",
|
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
|
-
|
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
|
-
|
224
|
-
|
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
|
-
|
238
|
-
|
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
|
-
|
247
|
-
|
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
|
-
|
280
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
352
|
-
|
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
|
-
|
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
|
-
|
368
|
-
|
369
|
-
|
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
|
-
|
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
|
-
|
393
|
-
|
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
|
-
|
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
|
-
|
382
|
+
add_file("src", "foo/foo15.rb")
|
410
383
|
builder.reload.build
|
411
384
|
builder.version.should == "37.1-dev"
|
412
385
|
|
413
|
-
|
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
|
-
|
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
|
-
|
429
|
-
|
430
|
-
|
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
|
-
|
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
|
-
|
425
|
+
add_file("src", "foo/foo15.rb")
|
452
426
|
final_builder3 = Bosh::Cli::PackageBuilder.new(
|
453
|
-
|
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
|
-
|
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
|
-
|
440
|
+
add_file("src", "lib/.zb.rb")
|
470
441
|
builder.reload
|
471
442
|
|
472
|
-
builder.
|
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
|
-
|
446
|
+
remove_file("src", "lib/.zb.rb")
|
477
447
|
builder.reload
|
478
448
|
|
479
|
-
builder.
|
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
|
-
|
486
|
-
|
487
|
-
|
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
|
-
|
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
|
-
|
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 "
|
524
|
-
|
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",
|
527
|
-
builder.
|
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 "
|
533
|
-
|
534
|
-
|
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
|
-
|
511
|
+
FileUtils.mkdir_p(File.join(@release_dir, "blobs", "lib"))
|
537
512
|
|
538
|
-
|
539
|
-
|
540
|
-
|
541
|
-
|
542
|
-
|
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 "
|
546
|
-
|
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
|
-
|
549
|
-
|
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
|
-
|
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
|
-
|
566
|
+
fp1.should == fp2
|
565
567
|
end
|
566
568
|
|
567
|
-
end
|
569
|
+
end
|