bosh_cli 1.0.3 → 1.5.0.pre.1113

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