bosh_cli 1.0.3 → 1.5.0.pre.1113
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/bin/bosh +0 -9
- data/lib/cli.rb +69 -64
- data/lib/cli/backup_destination_path.rb +33 -0
- data/lib/cli/base_command.rb +57 -56
- data/lib/cli/blob_manager.rb +12 -12
- data/lib/cli/changeset_helper.rb +6 -7
- data/lib/cli/client/director.rb +724 -0
- data/lib/cli/command_handler.rb +6 -7
- data/lib/cli/commands/backup.rb +39 -0
- data/lib/cli/commands/biff.rb +42 -21
- data/lib/cli/commands/blob_management.rb +1 -1
- data/lib/cli/commands/cloudcheck.rb +11 -13
- data/lib/cli/commands/deployment.rb +53 -37
- data/lib/cli/commands/help.rb +3 -2
- data/lib/cli/commands/job_management.rb +67 -103
- data/lib/cli/commands/job_rename.rb +6 -8
- data/lib/cli/commands/log_management.rb +78 -55
- data/lib/cli/commands/maintenance.rb +36 -30
- data/lib/cli/commands/misc.rb +72 -51
- data/lib/cli/commands/package.rb +2 -2
- data/lib/cli/commands/property_management.rb +10 -12
- data/lib/cli/commands/release.rb +236 -133
- data/lib/cli/commands/snapshot.rb +93 -0
- data/lib/cli/commands/ssh.rb +216 -213
- data/lib/cli/commands/stemcell.rb +46 -34
- data/lib/cli/commands/task.rb +2 -2
- data/lib/cli/commands/user.rb +27 -3
- data/lib/cli/commands/vm.rb +28 -0
- data/lib/cli/commands/vms.rb +81 -23
- data/lib/cli/config.rb +6 -2
- data/lib/cli/core_ext.rb +31 -30
- data/lib/cli/deployment_helper.rb +134 -159
- data/lib/cli/deployment_manifest.rb +66 -0
- data/lib/cli/deployment_manifest_compiler.rb +0 -3
- data/lib/cli/event_log_renderer.rb +10 -10
- data/lib/cli/file_with_progress_bar.rb +52 -0
- data/lib/cli/job_builder.rb +1 -1
- data/lib/cli/job_command_args.rb +23 -0
- data/lib/cli/job_property_collection.rb +4 -7
- data/lib/cli/job_property_validator.rb +22 -12
- data/lib/cli/job_state.rb +54 -0
- data/lib/cli/line_wrap.rb +54 -0
- data/lib/cli/packaging_helper.rb +10 -10
- data/lib/cli/release.rb +18 -15
- data/lib/cli/release_builder.rb +9 -4
- data/lib/cli/release_compiler.rb +9 -9
- data/lib/cli/release_tarball.rb +3 -6
- data/lib/cli/resurrection.rb +31 -0
- data/lib/cli/runner.rb +56 -30
- data/lib/cli/stemcell.rb +25 -10
- data/lib/cli/task_log_renderer.rb +1 -1
- data/lib/cli/task_tracker.rb +10 -9
- data/lib/cli/validation.rb +3 -1
- data/lib/cli/version.rb +1 -1
- data/lib/cli/version_calc.rb +5 -18
- data/lib/cli/versions_index.rb +1 -1
- data/lib/cli/vm_state.rb +43 -0
- data/lib/cli/yaml_helper.rb +26 -35
- metadata +75 -208
- data/Rakefile +0 -56
- data/lib/cli/director.rb +0 -628
- data/spec/assets/biff/bad_gateway_config.yml +0 -28
- data/spec/assets/biff/good_simple_config.yml +0 -63
- data/spec/assets/biff/good_simple_golden_config.yml +0 -63
- data/spec/assets/biff/good_simple_template.erb +0 -69
- data/spec/assets/biff/ip_out_of_range.yml +0 -63
- data/spec/assets/biff/multiple_subnets_config.yml +0 -40
- data/spec/assets/biff/network_only_template.erb +0 -34
- data/spec/assets/biff/no_cc_config.yml +0 -27
- data/spec/assets/biff/no_range_config.yml +0 -27
- data/spec/assets/biff/no_subnet_config.yml +0 -16
- data/spec/assets/biff/ok_network_config.yml +0 -30
- data/spec/assets/biff/properties_template.erb +0 -6
- data/spec/assets/config/atmos/config/final.yml +0 -6
- data/spec/assets/config/atmos/config/private.yml +0 -4
- data/spec/assets/config/bad-providers/config/final.yml +0 -5
- data/spec/assets/config/bad-providers/config/private.yml +0 -4
- data/spec/assets/config/deprecation/config/final.yml +0 -5
- data/spec/assets/config/deprecation/config/private.yml +0 -2
- data/spec/assets/config/local/config/final.yml +0 -5
- data/spec/assets/config/local/config/private.yml +0 -1
- data/spec/assets/config/s3/config/final.yml +0 -5
- data/spec/assets/config/s3/config/private.yml +0 -5
- data/spec/assets/config/swift-hp/config/final.yml +0 -6
- data/spec/assets/config/swift-hp/config/private.yml +0 -7
- data/spec/assets/config/swift-rackspace/config/final.yml +0 -6
- data/spec/assets/config/swift-rackspace/config/private.yml +0 -6
- data/spec/assets/deployment.MF +0 -0
- data/spec/assets/plugins/bosh/cli/commands/echo.rb +0 -43
- data/spec/assets/plugins/bosh/cli/commands/ruby.rb +0 -24
- data/spec/assets/release/jobs/cacher.tgz +0 -0
- data/spec/assets/release/jobs/cacher/config/file1.conf +0 -0
- data/spec/assets/release/jobs/cacher/config/file2.conf +0 -0
- data/spec/assets/release/jobs/cacher/job.MF +0 -6
- data/spec/assets/release/jobs/cacher/monit +0 -1
- data/spec/assets/release/jobs/cleaner.tgz +0 -0
- data/spec/assets/release/jobs/cleaner/job.MF +0 -4
- data/spec/assets/release/jobs/cleaner/monit +0 -1
- data/spec/assets/release/jobs/sweeper.tgz +0 -0
- data/spec/assets/release/jobs/sweeper/config/test.conf +0 -1
- data/spec/assets/release/jobs/sweeper/job.MF +0 -5
- data/spec/assets/release/jobs/sweeper/monit +0 -1
- data/spec/assets/release/packages/mutator.tar.gz +0 -0
- data/spec/assets/release/packages/stuff.tgz +0 -0
- data/spec/assets/release/release.MF +0 -17
- data/spec/assets/release_invalid_checksum.tgz +0 -0
- data/spec/assets/release_invalid_jobs.tgz +0 -0
- data/spec/assets/release_no_name.tgz +0 -0
- data/spec/assets/release_no_version.tgz +0 -0
- data/spec/assets/stemcell/image +0 -1
- data/spec/assets/stemcell/stemcell.MF +0 -6
- data/spec/assets/stemcell_invalid_mf.tgz +0 -0
- data/spec/assets/stemcell_no_image.tgz +0 -0
- data/spec/assets/valid_release.tgz +0 -0
- data/spec/assets/valid_stemcell.tgz +0 -0
- data/spec/spec_helper.rb +0 -28
- data/spec/unit/base_command_spec.rb +0 -87
- data/spec/unit/biff_spec.rb +0 -172
- data/spec/unit/blob_manager_spec.rb +0 -288
- data/spec/unit/cache_spec.rb +0 -36
- data/spec/unit/cli_commands_spec.rb +0 -356
- data/spec/unit/config_spec.rb +0 -125
- data/spec/unit/core_ext_spec.rb +0 -81
- data/spec/unit/dependency_helper_spec.rb +0 -52
- data/spec/unit/deployment_manifest_compiler_spec.rb +0 -63
- data/spec/unit/deployment_manifest_spec.rb +0 -153
- data/spec/unit/director_spec.rb +0 -471
- data/spec/unit/director_task_spec.rb +0 -48
- data/spec/unit/event_log_renderer_spec.rb +0 -171
- data/spec/unit/hash_changeset_spec.rb +0 -73
- data/spec/unit/job_builder_spec.rb +0 -455
- data/spec/unit/job_property_collection_spec.rb +0 -111
- data/spec/unit/job_property_validator_spec.rb +0 -7
- data/spec/unit/job_rename_spec.rb +0 -200
- data/spec/unit/package_builder_spec.rb +0 -593
- data/spec/unit/release_builder_spec.rb +0 -120
- data/spec/unit/release_spec.rb +0 -173
- data/spec/unit/release_tarball_spec.rb +0 -29
- data/spec/unit/runner_spec.rb +0 -7
- data/spec/unit/ssh_spec.rb +0 -84
- data/spec/unit/stemcell_spec.rb +0 -17
- data/spec/unit/task_tracker_spec.rb +0 -131
- data/spec/unit/version_calc_spec.rb +0 -27
- data/spec/unit/versions_index_spec.rb +0 -144
|
@@ -1,111 +0,0 @@
|
|
|
1
|
-
# Copyright (c) 2009-2012 VMware, Inc.
|
|
2
|
-
|
|
3
|
-
require "spec_helper"
|
|
4
|
-
|
|
5
|
-
describe Bosh::Cli::JobPropertyCollection do
|
|
6
|
-
|
|
7
|
-
def make_job(properties)
|
|
8
|
-
mock(Bosh::Cli::JobBuilder, :properties => properties)
|
|
9
|
-
end
|
|
10
|
-
|
|
11
|
-
def make(job_builder, global_properties, job_properties = {}, mappings = {})
|
|
12
|
-
Bosh::Cli::JobPropertyCollection.new(
|
|
13
|
-
job_builder, global_properties, job_properties, mappings)
|
|
14
|
-
end
|
|
15
|
-
|
|
16
|
-
it "copies all properties from the manifest if no properties are defined" do
|
|
17
|
-
manifest_properties = {
|
|
18
|
-
"cc" => {
|
|
19
|
-
"token" => "deadbeef",
|
|
20
|
-
"foo" => %w(bar baz zaz)
|
|
21
|
-
},
|
|
22
|
-
"router" => {
|
|
23
|
-
"token" => "zbb"
|
|
24
|
-
},
|
|
25
|
-
"empty" => {}
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
job_properties = {
|
|
29
|
-
"cc" => {
|
|
30
|
-
"secret" => "22"
|
|
31
|
-
},
|
|
32
|
-
"foo" => "bar"
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
pc = make(make_job({}), manifest_properties, job_properties)
|
|
36
|
-
|
|
37
|
-
pc.to_hash.should == {
|
|
38
|
-
"cc" => {
|
|
39
|
-
"token" => "deadbeef",
|
|
40
|
-
"foo" => %w(bar baz zaz),
|
|
41
|
-
"secret" => "22"
|
|
42
|
-
},
|
|
43
|
-
"router" => {
|
|
44
|
-
"token" => "zbb"
|
|
45
|
-
},
|
|
46
|
-
"empty" => {},
|
|
47
|
-
"foo" => "bar"
|
|
48
|
-
}
|
|
49
|
-
end
|
|
50
|
-
|
|
51
|
-
it "copies only needed properties if job properties are defined" do
|
|
52
|
-
property_defs = {
|
|
53
|
-
"cc.foo" => {},
|
|
54
|
-
"router.token" => {},
|
|
55
|
-
"router.user" => {"default" => "admin"}
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
manifest_properties = {
|
|
59
|
-
"cc" => {
|
|
60
|
-
"token" => "deadbeef",
|
|
61
|
-
"foo" => %w(bar baz zaz)
|
|
62
|
-
},
|
|
63
|
-
"router" => {
|
|
64
|
-
"token" => "zbb"
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
job_properties = {
|
|
69
|
-
"cc" => {"foo" => "bar"}
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
pc = make(make_job(property_defs), manifest_properties, job_properties)
|
|
73
|
-
|
|
74
|
-
pc.to_hash.should == {
|
|
75
|
-
"cc" => {"foo" => "bar"},
|
|
76
|
-
"router" => {"token" => "zbb", "user" => "admin"}
|
|
77
|
-
}
|
|
78
|
-
end
|
|
79
|
-
|
|
80
|
-
it "supports property mappings" do
|
|
81
|
-
property_defs = {
|
|
82
|
-
"db.user" => {},
|
|
83
|
-
"db.password" => {},
|
|
84
|
-
"token" => {}
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
properties = {
|
|
88
|
-
"ccdb" => {
|
|
89
|
-
"user" => "admin",
|
|
90
|
-
"password" => "secret"
|
|
91
|
-
},
|
|
92
|
-
"router" => {"token" => "deadbeef"}
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
mappings = {
|
|
96
|
-
"db" => "ccdb",
|
|
97
|
-
"token" => "router.token"
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
pc = make(make_job(property_defs), properties, {}, mappings)
|
|
101
|
-
|
|
102
|
-
pc.to_hash.should == {
|
|
103
|
-
"db" => {
|
|
104
|
-
"user" => "admin",
|
|
105
|
-
"password" => "secret"
|
|
106
|
-
},
|
|
107
|
-
"token" => "deadbeef"
|
|
108
|
-
}
|
|
109
|
-
end
|
|
110
|
-
|
|
111
|
-
end
|
|
@@ -1,200 +0,0 @@
|
|
|
1
|
-
# Copyright (c) 2009-2012 VMware, Inc.
|
|
2
|
-
|
|
3
|
-
require "spec_helper"
|
|
4
|
-
|
|
5
|
-
describe Bosh::Cli::Command::Base do
|
|
6
|
-
|
|
7
|
-
# TODO: this spec is not in line with the rest of them: it's testing command,
|
|
8
|
-
# not the rename behavior. Logic should probably be extracted into JobRenamer
|
|
9
|
-
# or something like that.
|
|
10
|
-
describe Bosh::Cli::Command::JobRename do
|
|
11
|
-
it "should rename the job" do
|
|
12
|
-
mock_director = mock(Object)
|
|
13
|
-
mock_director.should_receive(:rename_job).and_return([:done, ""])
|
|
14
|
-
Bosh::Cli::Director.should_receive(:new).and_return(mock_director)
|
|
15
|
-
|
|
16
|
-
job_rename = Bosh::Cli::Command::JobRename.new
|
|
17
|
-
job_rename.stub(:confirmed?).and_return(true)
|
|
18
|
-
job_rename.stub(:auth_required)
|
|
19
|
-
job_rename.stub(:prepare_deployment_manifest).and_return(old_manifest_yaml)
|
|
20
|
-
job_rename.stub(:sanity_check_job_rename)
|
|
21
|
-
job_rename.rename("old_name", "new_name")
|
|
22
|
-
end
|
|
23
|
-
|
|
24
|
-
it "should raise exception on additional changes to manifest" do
|
|
25
|
-
mock_director = mock(Object)
|
|
26
|
-
mock_director.stub(:get_deployment) { { "manifest" => old_manifest_yaml } }
|
|
27
|
-
Bosh::Cli::Director.should_receive(:new).and_return(mock_director)
|
|
28
|
-
|
|
29
|
-
job_rename = Bosh::Cli::Command::JobRename.new
|
|
30
|
-
|
|
31
|
-
lambda {
|
|
32
|
-
job_rename.sanity_check_job_rename(
|
|
33
|
-
new_extra_changes_manifest, "old_job", "new_job")
|
|
34
|
-
}.should raise_error(Bosh::Cli::CliError, /cannot have any other changes/)
|
|
35
|
-
end
|
|
36
|
-
|
|
37
|
-
it "should raise exception if new manifest removed some properties" do
|
|
38
|
-
mock_director = mock(Object)
|
|
39
|
-
mock_director.stub(:get_deployment) { { "manifest" => old_manifest_yaml } }
|
|
40
|
-
Bosh::Cli::Director.should_receive(:new).and_return(mock_director)
|
|
41
|
-
|
|
42
|
-
job_rename = Bosh::Cli::Command::JobRename.new
|
|
43
|
-
|
|
44
|
-
lambda {
|
|
45
|
-
job_rename.sanity_check_job_rename(new_manifest_with_some_deletions, "old_job", "new_job")
|
|
46
|
-
}.should raise_error(Bosh::Cli::CliError, /cannot have any other changes/)
|
|
47
|
-
end
|
|
48
|
-
|
|
49
|
-
it "should raise exception if deployment is not updated with new job name" do
|
|
50
|
-
job_rename = Bosh::Cli::Command::JobRename.new
|
|
51
|
-
|
|
52
|
-
lambda {
|
|
53
|
-
job_rename.sanity_check_job_rename(new_missing_new_job, "old_job", "new_job")
|
|
54
|
-
}.should raise_error(Bosh::Cli::CliError, /include the new job/)
|
|
55
|
-
end
|
|
56
|
-
|
|
57
|
-
it "should raise exception if old job name does not exist in manifest" do
|
|
58
|
-
mock_director = mock(Object)
|
|
59
|
-
mock_director.stub(:get_deployment) { { "manifest" => old_manifest_yaml } }
|
|
60
|
-
Bosh::Cli::Director.should_receive(:new).and_return(mock_director)
|
|
61
|
-
|
|
62
|
-
job_rename = Bosh::Cli::Command::JobRename.new
|
|
63
|
-
|
|
64
|
-
lambda {
|
|
65
|
-
job_rename.sanity_check_job_rename(new_extra_changes_manifest, "non_existent_job", "new_job")
|
|
66
|
-
}.should raise_error(Bosh::Cli::CliError, /non existent job/)
|
|
67
|
-
end
|
|
68
|
-
|
|
69
|
-
it "should raise exception if 2 jobs are changed in manifest" do
|
|
70
|
-
mock_director = mock(Object)
|
|
71
|
-
mock_director.stub(:get_deployment) { { "manifest" => old_manifest_yaml } }
|
|
72
|
-
Bosh::Cli::Director.should_receive(:new).and_return(mock_director)
|
|
73
|
-
|
|
74
|
-
job_rename = Bosh::Cli::Command::JobRename.new
|
|
75
|
-
|
|
76
|
-
lambda {
|
|
77
|
-
job_rename.sanity_check_job_rename(new_extra_job_rename_manifest, "old_job", "new_job")
|
|
78
|
-
}.should raise_error(Bosh::Cli::CliError, /Cannot rename more than one job/)
|
|
79
|
-
end
|
|
80
|
-
|
|
81
|
-
def old_manifest_yaml
|
|
82
|
-
<<-eos
|
|
83
|
-
---
|
|
84
|
-
name: test
|
|
85
|
-
resource_pools:
|
|
86
|
-
- name: rp
|
|
87
|
-
networks:
|
|
88
|
-
- name: default
|
|
89
|
-
jobs:
|
|
90
|
-
- name: job1
|
|
91
|
-
template: xyz
|
|
92
|
-
networks:
|
|
93
|
-
- name: default
|
|
94
|
-
- name: old_job
|
|
95
|
-
template: xyz
|
|
96
|
-
networks:
|
|
97
|
-
- name: default
|
|
98
|
-
eos
|
|
99
|
-
end
|
|
100
|
-
|
|
101
|
-
def new_manifest_with_some_deletions
|
|
102
|
-
<<-eos
|
|
103
|
-
---
|
|
104
|
-
name: test
|
|
105
|
-
resource_pools:
|
|
106
|
-
- name: rp
|
|
107
|
-
networks:
|
|
108
|
-
- name: default
|
|
109
|
-
jobs:
|
|
110
|
-
- name: job1
|
|
111
|
-
networks:
|
|
112
|
-
- name: default
|
|
113
|
-
- name: new_job
|
|
114
|
-
template: xyz
|
|
115
|
-
networks:
|
|
116
|
-
- name: default
|
|
117
|
-
eos
|
|
118
|
-
end
|
|
119
|
-
|
|
120
|
-
def new_manifest_yaml
|
|
121
|
-
<<-eos
|
|
122
|
-
---
|
|
123
|
-
name: test
|
|
124
|
-
networks:
|
|
125
|
-
- name: default
|
|
126
|
-
resource_pools:
|
|
127
|
-
- name: rp
|
|
128
|
-
jobs:
|
|
129
|
-
- name: job1
|
|
130
|
-
template: xyz
|
|
131
|
-
networks:
|
|
132
|
-
- name: default
|
|
133
|
-
- name: new_job
|
|
134
|
-
template: xyz
|
|
135
|
-
networks:
|
|
136
|
-
- name: default
|
|
137
|
-
eos
|
|
138
|
-
end
|
|
139
|
-
|
|
140
|
-
def new_extra_changes_manifest
|
|
141
|
-
<<-eos
|
|
142
|
-
---
|
|
143
|
-
name: test
|
|
144
|
-
networks:
|
|
145
|
-
- name: default
|
|
146
|
-
resource_pools:
|
|
147
|
-
- name: rp
|
|
148
|
-
jobs:
|
|
149
|
-
- name: job1
|
|
150
|
-
template: xyz
|
|
151
|
-
networks:
|
|
152
|
-
- name: default
|
|
153
|
-
- name: new_job
|
|
154
|
-
template: changed_templated_causing_failure
|
|
155
|
-
networks:
|
|
156
|
-
- name: default
|
|
157
|
-
eos
|
|
158
|
-
end
|
|
159
|
-
|
|
160
|
-
def new_extra_job_rename_manifest
|
|
161
|
-
<<-eos
|
|
162
|
-
---
|
|
163
|
-
name: test
|
|
164
|
-
networks:
|
|
165
|
-
- name: default
|
|
166
|
-
resource_pools:
|
|
167
|
-
- name: rp
|
|
168
|
-
jobs:
|
|
169
|
-
- name: new_job1
|
|
170
|
-
template: xyz
|
|
171
|
-
networks:
|
|
172
|
-
- name: default
|
|
173
|
-
- name: new_job
|
|
174
|
-
template: changed_templated_causing_failure
|
|
175
|
-
networks:
|
|
176
|
-
- name: default
|
|
177
|
-
eos
|
|
178
|
-
end
|
|
179
|
-
|
|
180
|
-
def new_missing_new_job
|
|
181
|
-
<<-eos
|
|
182
|
-
---
|
|
183
|
-
name: test
|
|
184
|
-
networks:
|
|
185
|
-
- name: default
|
|
186
|
-
resource_pools:
|
|
187
|
-
- name: rp
|
|
188
|
-
jobs:
|
|
189
|
-
- name: job1
|
|
190
|
-
template: xyz
|
|
191
|
-
networks:
|
|
192
|
-
- name: default
|
|
193
|
-
- name: old_job
|
|
194
|
-
template: xyz
|
|
195
|
-
networks:
|
|
196
|
-
- name: default
|
|
197
|
-
eos
|
|
198
|
-
end
|
|
199
|
-
end
|
|
200
|
-
end
|
|
@@ -1,593 +0,0 @@
|
|
|
1
|
-
# Copyright (c) 2009-2012 VMware, Inc.
|
|
2
|
-
|
|
3
|
-
require "spec_helper"
|
|
4
|
-
|
|
5
|
-
describe Bosh::Cli::PackageBuilder, "dev build" do
|
|
6
|
-
|
|
7
|
-
before(:each) do
|
|
8
|
-
@release_dir = Dir.mktmpdir
|
|
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)
|
|
21
|
-
end
|
|
22
|
-
end
|
|
23
|
-
|
|
24
|
-
def remove_file(dir, path)
|
|
25
|
-
FileUtils.rm(File.join(@release_dir, dir, path))
|
|
26
|
-
end
|
|
27
|
-
|
|
28
|
-
def add_files(dir, names)
|
|
29
|
-
names.each { |name| add_file(dir, name) }
|
|
30
|
-
end
|
|
31
|
-
|
|
32
|
-
def remove_files(dir, names)
|
|
33
|
-
names.each { |name| remove_file(dir, name) }
|
|
34
|
-
end
|
|
35
|
-
|
|
36
|
-
def make_builder(name, files, dependencies = [], sources_dir = nil)
|
|
37
|
-
blobstore = mock("blobstore")
|
|
38
|
-
spec = {
|
|
39
|
-
"name" => name,
|
|
40
|
-
"files" => files,
|
|
41
|
-
"dependencies" => dependencies
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
Bosh::Cli::PackageBuilder.new(spec, @release_dir,
|
|
45
|
-
false, blobstore, sources_dir)
|
|
46
|
-
end
|
|
47
|
-
|
|
48
|
-
it "whines on missing name" do
|
|
49
|
-
lambda {
|
|
50
|
-
make_builder(" ", [])
|
|
51
|
-
}.should raise_error(Bosh::Cli::InvalidPackage, "Package name is missing")
|
|
52
|
-
end
|
|
53
|
-
|
|
54
|
-
it "whines on funny characters in name" do
|
|
55
|
-
lambda {
|
|
56
|
-
make_builder("@#!", [])
|
|
57
|
-
}.should raise_error(Bosh::Cli::InvalidPackage,
|
|
58
|
-
"Package name should be a valid BOSH identifier")
|
|
59
|
-
end
|
|
60
|
-
|
|
61
|
-
it "whines on empty files" do
|
|
62
|
-
lambda {
|
|
63
|
-
make_builder("aa", [])
|
|
64
|
-
}.should raise_error(Bosh::Cli::InvalidPackage,
|
|
65
|
-
"Package 'aa' doesn't include any files")
|
|
66
|
-
end
|
|
67
|
-
|
|
68
|
-
it "whines on metadata file having the same name as one of package files" do
|
|
69
|
-
lambda {
|
|
70
|
-
builder = make_builder("aa", %w(*.rb packaging))
|
|
71
|
-
|
|
72
|
-
add_files("src", %w(1.rb packaging))
|
|
73
|
-
|
|
74
|
-
builder.glob_matches.size.should == 2
|
|
75
|
-
add_file("packages", "aa/packaging", "make install")
|
|
76
|
-
|
|
77
|
-
builder.copy_files
|
|
78
|
-
}.should raise_error(Bosh::Cli::InvalidPackage,
|
|
79
|
-
"Package 'aa' has 'packaging' file which " +
|
|
80
|
-
"conflicts with BOSH packaging")
|
|
81
|
-
end
|
|
82
|
-
|
|
83
|
-
it "whines on globs not yielding any file names" do
|
|
84
|
-
add_files("src", %w(lib/1.rb lib/2.rb baz))
|
|
85
|
-
builder = make_builder("foo", %w(lib/*.rb baz bar))
|
|
86
|
-
|
|
87
|
-
lambda {
|
|
88
|
-
builder.build
|
|
89
|
-
}.should raise_error(Bosh::Cli::InvalidPackage,
|
|
90
|
-
"Package `foo' has a glob that resolves " +
|
|
91
|
-
"to an empty file list: bar")
|
|
92
|
-
end
|
|
93
|
-
|
|
94
|
-
it "has no way to calculate checksum for not yet generated package" do
|
|
95
|
-
lambda {
|
|
96
|
-
builder = make_builder("aa", %w(*.rb packaging))
|
|
97
|
-
add_files("src", %w(1.rb packaging))
|
|
98
|
-
builder.checksum
|
|
99
|
-
}.should raise_error(RuntimeError,
|
|
100
|
-
"cannot read checksum for not yet " +
|
|
101
|
-
"generated package/job")
|
|
102
|
-
end
|
|
103
|
-
|
|
104
|
-
it "has a checksum for a generated package" do
|
|
105
|
-
builder = make_builder("aa", %w(*.rb))
|
|
106
|
-
add_files("src", %w(1.rb 2.rb))
|
|
107
|
-
builder.build
|
|
108
|
-
builder.checksum.should =~ /[0-9a-f]+/
|
|
109
|
-
end
|
|
110
|
-
|
|
111
|
-
it "is created with name and globs" do
|
|
112
|
-
builder = make_builder("aa", %w(1 */*))
|
|
113
|
-
builder.name.should == "aa"
|
|
114
|
-
builder.globs.should == %w(1 */*)
|
|
115
|
-
end
|
|
116
|
-
|
|
117
|
-
it "resolves globs and generates fingerprint" do
|
|
118
|
-
add_files("src", %w(lib/1.rb lib/2.rb lib/README.txt README.2 README.md))
|
|
119
|
-
|
|
120
|
-
builder = make_builder("A", %w(lib/*.rb README.*))
|
|
121
|
-
builder.glob_matches.size.should == 4
|
|
122
|
-
builder.fingerprint.should == "397a99ccd267ebc9bcc632b746db2cd5b29db050"
|
|
123
|
-
end
|
|
124
|
-
|
|
125
|
-
it "has stable fingerprint" do
|
|
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.*))
|
|
128
|
-
s1 = builder.fingerprint
|
|
129
|
-
|
|
130
|
-
builder.reload.fingerprint.should == s1
|
|
131
|
-
end
|
|
132
|
-
|
|
133
|
-
it "changes fingerprint when new file that matches glob is added" do
|
|
134
|
-
add_files("src", %w(lib/1.rb lib/2.rb lib/README.txt README.2 README.md))
|
|
135
|
-
|
|
136
|
-
builder = make_builder("A", %w(lib/*.rb README.*))
|
|
137
|
-
s1 = builder.fingerprint
|
|
138
|
-
add_files("src", %w(lib/3.rb))
|
|
139
|
-
builder.reload.fingerprint.should_not == s1
|
|
140
|
-
|
|
141
|
-
remove_files("src", %w(lib/3.rb))
|
|
142
|
-
builder.reload.fingerprint.should == s1
|
|
143
|
-
end
|
|
144
|
-
|
|
145
|
-
it "changes fingerprint when one of the matched files changes" do
|
|
146
|
-
add_files("src", %w(lib/2.rb lib/README.txt README.2 README.md))
|
|
147
|
-
add_file("src", "lib/1.rb", "1")
|
|
148
|
-
|
|
149
|
-
builder = make_builder("A", %w(lib/*.rb README.*))
|
|
150
|
-
s1 = builder.fingerprint
|
|
151
|
-
|
|
152
|
-
add_file("src", "lib/1.rb", "2")
|
|
153
|
-
builder.reload.fingerprint.should_not == s1
|
|
154
|
-
|
|
155
|
-
add_file("src", "lib/1.rb", "1")
|
|
156
|
-
builder.reload.fingerprint.should == s1
|
|
157
|
-
end
|
|
158
|
-
|
|
159
|
-
it "changes fingerprint when empty directory added/removed" do
|
|
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"))
|
|
163
|
-
|
|
164
|
-
s1 = builder.fingerprint
|
|
165
|
-
|
|
166
|
-
FileUtils.mkdir_p(File.join(@release_dir, "src", "bar", "zb2"))
|
|
167
|
-
s2 = builder.reload.fingerprint
|
|
168
|
-
s2.should_not == s1
|
|
169
|
-
|
|
170
|
-
FileUtils.rm_rf(File.join(@release_dir, "src", "bar", "zb2"))
|
|
171
|
-
builder.reload.fingerprint.should == s1
|
|
172
|
-
end
|
|
173
|
-
|
|
174
|
-
it "doesn't change fingerprint when files that doesn't match glob is added" do
|
|
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.*))
|
|
177
|
-
s1 = builder.fingerprint
|
|
178
|
-
|
|
179
|
-
add_file("src", "lib/a.out")
|
|
180
|
-
builder.reload.fingerprint.should == s1
|
|
181
|
-
end
|
|
182
|
-
|
|
183
|
-
it "changes fingerprint when dependencies change" do
|
|
184
|
-
add_files("src", %w(lib/1.rb lib/2.rb lib/README.txt README.2 README.md))
|
|
185
|
-
|
|
186
|
-
builder1 = make_builder("A", %w(lib/*.rb README.*), %w(foo bar))
|
|
187
|
-
s1 = builder1.fingerprint
|
|
188
|
-
builder2 = make_builder("A", %w(lib/*.rb README.*), %w(bar foo))
|
|
189
|
-
s2 = builder2.fingerprint
|
|
190
|
-
s1.should == s2 # Order doesn't matter
|
|
191
|
-
|
|
192
|
-
builder3 = make_builder("A", %w(lib/*.rb README.*), %w(bar foo baz))
|
|
193
|
-
s3 = builder3.fingerprint
|
|
194
|
-
s3.should_not == s1 # Set does matter
|
|
195
|
-
end
|
|
196
|
-
|
|
197
|
-
it "copies files to build directory" do
|
|
198
|
-
add_files("src", %w(foo/foo.rb foo/lib/1.rb foo/lib/2.rb foo/README baz))
|
|
199
|
-
globs = %w(foo/**/* baz)
|
|
200
|
-
|
|
201
|
-
builder = make_builder("bar", globs)
|
|
202
|
-
builder.copy_files.should == 5
|
|
203
|
-
|
|
204
|
-
builder2 = make_builder("bar", globs, [], builder.build_dir)
|
|
205
|
-
|
|
206
|
-
# Also turned out to be a nice test for directory portability
|
|
207
|
-
builder.fingerprint.should == builder2.fingerprint
|
|
208
|
-
end
|
|
209
|
-
|
|
210
|
-
it "generates tarball" do
|
|
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))
|
|
213
|
-
builder.generate_tarball.should be_true
|
|
214
|
-
end
|
|
215
|
-
|
|
216
|
-
it "can point to either dev or a final version of a package" do
|
|
217
|
-
add_files("src", %w(foo/foo.rb foo/lib/1.rb foo/lib/2.rb foo/README baz))
|
|
218
|
-
globs = %w(foo/**/* baz)
|
|
219
|
-
|
|
220
|
-
fingerprint = "86e8d5f5530a89659f588f5884fe8c13e639d94b"
|
|
221
|
-
|
|
222
|
-
final_versions = Bosh::Cli::VersionsIndex.new(
|
|
223
|
-
File.join(@release_dir, ".final_builds", "packages", "bar"))
|
|
224
|
-
dev_versions = Bosh::Cli::VersionsIndex.new(
|
|
225
|
-
File.join(@release_dir, ".dev_builds", "packages", "bar"))
|
|
226
|
-
|
|
227
|
-
final_versions.add_version(fingerprint,
|
|
228
|
-
{ "version" => "4", "blobstore_id" => "12321" },
|
|
229
|
-
get_tmp_file_path("payload"))
|
|
230
|
-
dev_versions.add_version(fingerprint,
|
|
231
|
-
{ "version" => "0.7-dev" },
|
|
232
|
-
get_tmp_file_path("dev_payload"))
|
|
233
|
-
|
|
234
|
-
builder = make_builder("bar", globs)
|
|
235
|
-
builder.fingerprint.should == fingerprint
|
|
236
|
-
|
|
237
|
-
builder.use_final_version
|
|
238
|
-
builder.version.should == "4"
|
|
239
|
-
builder.tarball_path.should == File.join(
|
|
240
|
-
@release_dir, ".final_builds", "packages", "bar", "4.tgz")
|
|
241
|
-
|
|
242
|
-
builder.use_dev_version
|
|
243
|
-
builder.version.should == "0.7-dev"
|
|
244
|
-
builder.tarball_path.should == File.join(
|
|
245
|
-
@release_dir, ".dev_builds", "packages", "bar", "0.7-dev.tgz")
|
|
246
|
-
end
|
|
247
|
-
|
|
248
|
-
it "creates a new version tarball" do
|
|
249
|
-
add_files("src", %w(foo/foo.rb foo/lib/1.rb foo/lib/2.rb foo/README baz))
|
|
250
|
-
globs = %w(foo/**/* baz)
|
|
251
|
-
builder = make_builder("bar", globs)
|
|
252
|
-
|
|
253
|
-
File.exists?(@release_dir + "/.dev_builds/packages/bar/0.1-dev.tgz").
|
|
254
|
-
should be_false
|
|
255
|
-
builder.build
|
|
256
|
-
File.exists?(@release_dir + "/.dev_builds/packages/bar/0.1-dev.tgz").
|
|
257
|
-
should be_true
|
|
258
|
-
|
|
259
|
-
builder = make_builder("bar", globs)
|
|
260
|
-
builder.build
|
|
261
|
-
v1_fingerprint = builder.fingerprint
|
|
262
|
-
|
|
263
|
-
File.exists?(@release_dir + "/.dev_builds/packages/bar/0.1-dev.tgz").
|
|
264
|
-
should be_true
|
|
265
|
-
File.exists?(@release_dir + "/.dev_builds/packages/bar/0.2-dev.tgz").
|
|
266
|
-
should be_false
|
|
267
|
-
|
|
268
|
-
add_file("src", "foo/3.rb")
|
|
269
|
-
builder = make_builder("bar", globs)
|
|
270
|
-
builder.build
|
|
271
|
-
|
|
272
|
-
File.exists?(@release_dir + "/.dev_builds/packages/bar/0.1-dev.tgz").
|
|
273
|
-
should be_true
|
|
274
|
-
File.exists?(@release_dir + "/.dev_builds/packages/bar/0.2-dev.tgz").
|
|
275
|
-
should be_true
|
|
276
|
-
|
|
277
|
-
remove_file("src", "foo/3.rb")
|
|
278
|
-
builder = make_builder("bar", globs)
|
|
279
|
-
builder.build
|
|
280
|
-
builder.version.should == "0.1-dev"
|
|
281
|
-
|
|
282
|
-
builder.fingerprint.should == v1_fingerprint
|
|
283
|
-
|
|
284
|
-
File.exists?(@release_dir + "/.dev_builds/packages/bar/0.1-dev.tgz").
|
|
285
|
-
should be_true
|
|
286
|
-
File.exists?(@release_dir + "/.dev_builds/packages/bar/0.2-dev.tgz").
|
|
287
|
-
should be_true
|
|
288
|
-
File.exists?(@release_dir + "/.dev_builds/packages/bar/0.3-dev.tgz").
|
|
289
|
-
should be_false
|
|
290
|
-
|
|
291
|
-
# Now add packaging
|
|
292
|
-
add_file("packages", "bar/packaging", "make install")
|
|
293
|
-
builder = make_builder("bar", globs)
|
|
294
|
-
builder.build
|
|
295
|
-
builder.version.should == "0.3-dev"
|
|
296
|
-
|
|
297
|
-
# Add prepackaging
|
|
298
|
-
add_file("packages", "bar/pre_packaging", "exit 0")
|
|
299
|
-
builder = make_builder("bar", globs)
|
|
300
|
-
builder.build
|
|
301
|
-
|
|
302
|
-
File.exists?(@release_dir + "/.dev_builds/packages/bar/0.3-dev.tgz").
|
|
303
|
-
should be_true
|
|
304
|
-
|
|
305
|
-
# And remove all
|
|
306
|
-
builder = make_builder("bar", globs)
|
|
307
|
-
builder.build
|
|
308
|
-
builder.version.should == "0.4-dev"
|
|
309
|
-
File.exists?(@release_dir + "/.dev_builds/packages/bar/0.4-dev.tgz").
|
|
310
|
-
should be_true
|
|
311
|
-
File.exists?(@release_dir + "/.dev_builds/packages/bar/0.5-dev.tgz").
|
|
312
|
-
should be_false
|
|
313
|
-
end
|
|
314
|
-
|
|
315
|
-
it "stops if pre_packaging fails" do
|
|
316
|
-
add_files("src", %w(foo/foo.rb foo/lib/1.rb foo/lib/2.rb foo/README baz))
|
|
317
|
-
globs = %w(foo/**/* baz)
|
|
318
|
-
|
|
319
|
-
builder = make_builder("bar", globs)
|
|
320
|
-
add_file("packages", "bar/pre_packaging", "exit 1")
|
|
321
|
-
|
|
322
|
-
lambda {
|
|
323
|
-
builder.build
|
|
324
|
-
}.should raise_error(Bosh::Cli::InvalidPackage,
|
|
325
|
-
"`bar' pre-packaging failed")
|
|
326
|
-
end
|
|
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
|
-
|
|
340
|
-
it "bumps major dev version in sync with final version" do
|
|
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)
|
|
345
|
-
builder = make_builder("bar", globs)
|
|
346
|
-
builder.build
|
|
347
|
-
|
|
348
|
-
builder.version.should == "0.1-dev"
|
|
349
|
-
|
|
350
|
-
blobstore = mock("blobstore")
|
|
351
|
-
blobstore.should_receive(:create).and_return("object_id")
|
|
352
|
-
final_builder = Bosh::Cli::PackageBuilder.new({ "name" => "bar",
|
|
353
|
-
"files" => globs },
|
|
354
|
-
@release_dir,
|
|
355
|
-
true, blobstore)
|
|
356
|
-
final_builder.build
|
|
357
|
-
final_builder.version.should == 1
|
|
358
|
-
|
|
359
|
-
add_file("src", "foo/foo15.rb")
|
|
360
|
-
builder2 = make_builder("bar", globs)
|
|
361
|
-
builder2.build
|
|
362
|
-
builder2.version.should == "1.1-dev"
|
|
363
|
-
end
|
|
364
|
-
|
|
365
|
-
it "uses the appropriate final version for bumping a dev version" do
|
|
366
|
-
add_files("src", %w(foo/foo.rb foo/lib/1.rb foo/lib/2.rb foo/README baz))
|
|
367
|
-
globs = %w(foo/**/* baz)
|
|
368
|
-
builder = make_builder("bar", globs)
|
|
369
|
-
final_builds_dir = File.join(@release_dir,
|
|
370
|
-
".final_builds", "packages", "bar")
|
|
371
|
-
builder.build
|
|
372
|
-
|
|
373
|
-
final_index = Bosh::Cli::VersionsIndex.new(final_builds_dir)
|
|
374
|
-
final_index.add_version("deadbeef",
|
|
375
|
-
{ "version" => 34 },
|
|
376
|
-
get_tmp_file_path("payload"))
|
|
377
|
-
|
|
378
|
-
add_file("src", "foo/foo14.rb")
|
|
379
|
-
builder.reload.build
|
|
380
|
-
builder.version.should == "34.1-dev"
|
|
381
|
-
|
|
382
|
-
final_index.add_version("deadbeef2",
|
|
383
|
-
{ "version" => 37 },
|
|
384
|
-
get_tmp_file_path("payload"))
|
|
385
|
-
|
|
386
|
-
add_file("src", "foo/foo15.rb")
|
|
387
|
-
builder.reload.build
|
|
388
|
-
builder.version.should == "37.1-dev"
|
|
389
|
-
|
|
390
|
-
add_file("src", "foo/foo16.rb")
|
|
391
|
-
builder.reload.build
|
|
392
|
-
builder.version.should == "37.2-dev"
|
|
393
|
-
|
|
394
|
-
FileUtils.rm_rf(final_builds_dir)
|
|
395
|
-
final_index = Bosh::Cli::VersionsIndex.new(final_builds_dir)
|
|
396
|
-
final_index.add_version("deadbeef3",
|
|
397
|
-
{ "version" => 34 },
|
|
398
|
-
get_tmp_file_path("payload"))
|
|
399
|
-
|
|
400
|
-
add_file("src", "foo/foo17.rb")
|
|
401
|
-
builder.reload.build
|
|
402
|
-
builder.version.should == "34.2-dev"
|
|
403
|
-
end
|
|
404
|
-
|
|
405
|
-
it "whines on attempt to create final build if not matched " +
|
|
406
|
-
"by existing final or dev build" do
|
|
407
|
-
FileUtils.rm_rf(File.join(@release_dir, "src_alt"))
|
|
408
|
-
|
|
409
|
-
add_files("src", %w(foo/foo.rb foo/lib/1.rb foo/lib/2.rb foo/README baz))
|
|
410
|
-
globs = %w(foo/**/* baz)
|
|
411
|
-
|
|
412
|
-
blobstore = mock("blobstore")
|
|
413
|
-
blobstore.should_receive(:create).and_return("object_id")
|
|
414
|
-
|
|
415
|
-
final_builder = Bosh::Cli::PackageBuilder.new(
|
|
416
|
-
{ "name" => "bar", "files" => globs }, @release_dir, true, blobstore)
|
|
417
|
-
lambda {
|
|
418
|
-
final_builder.build
|
|
419
|
-
}.should raise_error(Bosh::Cli::CliError)
|
|
420
|
-
|
|
421
|
-
builder = make_builder("bar", globs)
|
|
422
|
-
builder.build
|
|
423
|
-
|
|
424
|
-
builder.version.should == "0.1-dev"
|
|
425
|
-
|
|
426
|
-
final_builder2 = Bosh::Cli::PackageBuilder.new(
|
|
427
|
-
{ "name" => "bar", "files" => globs }, @release_dir, true, blobstore)
|
|
428
|
-
final_builder2.build
|
|
429
|
-
final_builder2.version.should == 1
|
|
430
|
-
|
|
431
|
-
add_file("src", "foo/foo15.rb")
|
|
432
|
-
final_builder3 = Bosh::Cli::PackageBuilder.new(
|
|
433
|
-
{ "name" => "bar", "files" => globs }, @release_dir, true, blobstore)
|
|
434
|
-
lambda {
|
|
435
|
-
final_builder3.build
|
|
436
|
-
}.should raise_error(Bosh::Cli::CliError)
|
|
437
|
-
end
|
|
438
|
-
|
|
439
|
-
it "includes dotfiles in a fingerprint" do
|
|
440
|
-
add_files("src", %w(lib/1.rb lib/2.rb lib/README.txt README.2 README.md))
|
|
441
|
-
|
|
442
|
-
builder = make_builder("A", %w(lib/*.rb README.*))
|
|
443
|
-
builder.glob_matches.size.should == 4
|
|
444
|
-
builder.fingerprint.should == "397a99ccd267ebc9bcc632b746db2cd5b29db050"
|
|
445
|
-
|
|
446
|
-
add_file("src", "lib/.zb.rb")
|
|
447
|
-
builder.reload
|
|
448
|
-
|
|
449
|
-
builder.glob_matches.size.should == 5
|
|
450
|
-
builder.fingerprint.should == "351b3bb8dc430e58a3264bcfb5c9c19c06ece4af"
|
|
451
|
-
|
|
452
|
-
remove_file("src", "lib/.zb.rb")
|
|
453
|
-
builder.reload
|
|
454
|
-
|
|
455
|
-
builder.glob_matches.size.should == 4
|
|
456
|
-
builder.fingerprint.should == "397a99ccd267ebc9bcc632b746db2cd5b29db050"
|
|
457
|
-
end
|
|
458
|
-
|
|
459
|
-
it "supports dry run" do
|
|
460
|
-
FileUtils.rm_rf(File.join(@release_dir, "src_alt"))
|
|
461
|
-
|
|
462
|
-
add_files("src", %w(foo/foo.rb foo/lib/1.rb foo/lib/2.rb foo/README baz))
|
|
463
|
-
globs = %w(foo/**/* baz)
|
|
464
|
-
builder = make_builder("bar", globs)
|
|
465
|
-
builder.dry_run = true
|
|
466
|
-
builder.build
|
|
467
|
-
|
|
468
|
-
builder.version.should == "0.1-dev"
|
|
469
|
-
File.exists?(@release_dir + "/.dev_builds/packages/bar/0.1-dev.tgz").
|
|
470
|
-
should be_false
|
|
471
|
-
|
|
472
|
-
builder.dry_run = false
|
|
473
|
-
builder.reload.build
|
|
474
|
-
builder.version.should == "0.1-dev"
|
|
475
|
-
File.exists?(@release_dir + "/.dev_builds/packages/bar/0.1-dev.tgz").
|
|
476
|
-
should be_true
|
|
477
|
-
|
|
478
|
-
blobstore = mock("blobstore")
|
|
479
|
-
blobstore.should_not_receive(:create)
|
|
480
|
-
final_builder = Bosh::Cli::PackageBuilder.new(
|
|
481
|
-
{ "name" => "bar", "files" => globs }, @release_dir, true, blobstore)
|
|
482
|
-
final_builder.dry_run = true
|
|
483
|
-
final_builder.build
|
|
484
|
-
|
|
485
|
-
# Hasn't been promoted b/c of dry run
|
|
486
|
-
final_builder.version.should == "0.1-dev"
|
|
487
|
-
|
|
488
|
-
add_file("src", "foo/foo15.rb")
|
|
489
|
-
builder2 = make_builder("bar", globs)
|
|
490
|
-
builder2.dry_run = true
|
|
491
|
-
builder2.build
|
|
492
|
-
builder2.version.should == "0.2-dev"
|
|
493
|
-
File.exists?(@release_dir + "/.dev_builds/packages/bar/0.1-dev.tgz").
|
|
494
|
-
should be_true
|
|
495
|
-
File.exists?(@release_dir + "/.dev_builds/packages/bar/0.2-dev.tgz").
|
|
496
|
-
should be_false
|
|
497
|
-
end
|
|
498
|
-
|
|
499
|
-
it "uses blobs directory to look up files as well" do
|
|
500
|
-
add_files("src", %w(lib/1.rb lib/2.rb))
|
|
501
|
-
add_files("blobs", %w(lib/README.txt README.2 README.md))
|
|
502
|
-
|
|
503
|
-
builder = make_builder("A", %w(lib/*.rb README.*))
|
|
504
|
-
builder.glob_matches.size.should == 4
|
|
505
|
-
builder.fingerprint.should == "397a99ccd267ebc9bcc632b746db2cd5b29db050"
|
|
506
|
-
end
|
|
507
|
-
|
|
508
|
-
it "moving files to blobs directory doesn't change fingerprint" do
|
|
509
|
-
add_file("src", "README.txt", "README contents")
|
|
510
|
-
add_file("src", "README.md", "README contents 2")
|
|
511
|
-
add_file("src", "lib/1.rb", "puts 'Hello world'")
|
|
512
|
-
add_file("src", "lib/2.rb", "puts 'Bye world'")
|
|
513
|
-
|
|
514
|
-
builder = make_builder("A", %w(lib/*.rb README.*))
|
|
515
|
-
s1 = builder.fingerprint
|
|
516
|
-
|
|
517
|
-
FileUtils.mkdir_p(File.join(@release_dir, "blobs", "lib"))
|
|
518
|
-
|
|
519
|
-
FileUtils.mv(File.join(@release_dir, "src", "lib", "1.rb"),
|
|
520
|
-
File.join(@release_dir, "blobs", "lib", "1.rb"))
|
|
521
|
-
|
|
522
|
-
s2 = builder.reload.fingerprint
|
|
523
|
-
s2.should == s1
|
|
524
|
-
end
|
|
525
|
-
|
|
526
|
-
it "supports alternative src directory" do
|
|
527
|
-
add_file("src", "README.txt", "README contents")
|
|
528
|
-
add_file("src", "lib/1.rb", "puts 'Hello world'")
|
|
529
|
-
add_file("src", "lib/2.rb", "puts 'Goodbye world'")
|
|
530
|
-
|
|
531
|
-
builder = make_builder("A", %w(lib/*.rb README.*))
|
|
532
|
-
s1 = builder.fingerprint
|
|
533
|
-
|
|
534
|
-
add_file("src_alt", "README.txt", "README contents")
|
|
535
|
-
add_file("src_alt", "lib/1.rb", "puts 'Hello world'")
|
|
536
|
-
add_file("src_alt", "lib/2.rb", "puts 'Goodbye world'")
|
|
537
|
-
|
|
538
|
-
remove_files("src", %w(lib/1.rb))
|
|
539
|
-
builder.reload.fingerprint.should == s1
|
|
540
|
-
end
|
|
541
|
-
|
|
542
|
-
it "checks if glob top level dir is present in src_alt but doesn't match" do
|
|
543
|
-
add_file("src", "README.txt", "README contents")
|
|
544
|
-
add_file("src", "lib/1.rb", "puts 'Hello world'")
|
|
545
|
-
add_file("src", "lib/2.rb", "puts 'Goodbye world'")
|
|
546
|
-
|
|
547
|
-
builder = make_builder("A", %w(lib/*.rb README.*))
|
|
548
|
-
|
|
549
|
-
FileUtils.mkdir(File.join(@release_dir, "src_alt", "lib"))
|
|
550
|
-
|
|
551
|
-
lambda {
|
|
552
|
-
builder.fingerprint
|
|
553
|
-
}.should raise_error("Package `A' has a glob that doesn't match " +
|
|
554
|
-
"in `src_alt' but matches in `src'. However " +
|
|
555
|
-
"`src_alt/lib' exists, so this might be an error.")
|
|
556
|
-
end
|
|
557
|
-
|
|
558
|
-
it "doesn't allow glob to match files under more than one source directory" do
|
|
559
|
-
add_file("src", "README.txt", "README contents")
|
|
560
|
-
add_file("src", "lib/1.rb", "puts 'Hello world'")
|
|
561
|
-
|
|
562
|
-
builder = make_builder("A", %w(lib/*.rb README.*))
|
|
563
|
-
lambda {
|
|
564
|
-
builder.fingerprint
|
|
565
|
-
}.should_not raise_error
|
|
566
|
-
|
|
567
|
-
add_file("src_alt", "README.txt", "README contents")
|
|
568
|
-
remove_files("src", %w(README.txt lib/1.rb))
|
|
569
|
-
|
|
570
|
-
lambda {
|
|
571
|
-
builder.reload.fingerprint
|
|
572
|
-
}.should raise_error("Package `A' has a glob that resolves to " +
|
|
573
|
-
"an empty file list: lib/*.rb")
|
|
574
|
-
end
|
|
575
|
-
|
|
576
|
-
it "doesn't include the same path twice" do
|
|
577
|
-
add_file("src", "test/foo/README.txt", "README contents")
|
|
578
|
-
add_file("src", "test/foo/NOTICE.txt", "NOTICE contents")
|
|
579
|
-
|
|
580
|
-
fp1 = make_builder("A", %w(test/**/*)).fingerprint
|
|
581
|
-
|
|
582
|
-
remove_file("src", "test/foo/NOTICE.txt")
|
|
583
|
-
add_file("blobs", "test/foo/NOTICE.txt", "NOTICE contents")
|
|
584
|
-
|
|
585
|
-
File.directory?(File.join(@release_dir, "src", "test", "foo")).
|
|
586
|
-
should be_true
|
|
587
|
-
|
|
588
|
-
fp2 = make_builder("A", %w(test/**/*)).fingerprint
|
|
589
|
-
|
|
590
|
-
fp1.should == fp2
|
|
591
|
-
end
|
|
592
|
-
|
|
593
|
-
end
|