bosh_cli 0.19.3 → 0.19.4
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/lib/cli/commands/release.rb +11 -27
- data/lib/cli/release_compiler.rb +50 -13
- data/lib/cli/release_tarball.rb +18 -9
- data/lib/cli/version.rb +1 -1
- data/spec/unit/release_tarball_spec.rb +2 -3
- metadata +4 -4
data/lib/cli/commands/release.rb
CHANGED
@@ -107,33 +107,19 @@ module Bosh::Cli::Command
|
|
107
107
|
end
|
108
108
|
end
|
109
109
|
|
110
|
-
def get_remote_packages(manifest_yaml, remote_release)
|
111
|
-
remote_packages_sha1 = match_remote_packages(manifest_yaml)
|
112
|
-
|
113
|
-
# Older directors may not match packages. For such
|
114
|
-
# cases we select packages from the existing release.
|
115
|
-
if remote_packages_sha1.size == 0 && remote_release
|
116
|
-
remote_packages_sha1 = remote_release["packages"].map do |pkg|
|
117
|
-
pkg["sha1"]
|
118
|
-
end
|
119
|
-
end
|
120
|
-
remote_packages_sha1
|
121
|
-
end
|
122
|
-
|
123
110
|
def upload_manifest(manifest_path)
|
124
111
|
manifest = load_yaml_file(manifest_path)
|
125
112
|
remote_release = get_remote_release(manifest["name"]) rescue nil
|
126
|
-
|
127
|
-
|
128
|
-
remote_release)
|
113
|
+
package_matches = match_remote_packages(File.read(manifest_path))
|
114
|
+
|
129
115
|
blobstore = release.blobstore
|
130
116
|
tmpdir = Dir.mktmpdir
|
131
117
|
|
132
118
|
at_exit { FileUtils.rm_rf(tmpdir) }
|
133
119
|
|
134
|
-
compiler =
|
135
|
-
|
136
|
-
|
120
|
+
compiler =
|
121
|
+
Bosh::Cli::ReleaseCompiler.new(manifest_path, blobstore,
|
122
|
+
remote_release, package_matches)
|
137
123
|
need_repack = true
|
138
124
|
|
139
125
|
unless compiler.exists?
|
@@ -159,19 +145,17 @@ module Bosh::Cli::Command
|
|
159
145
|
|
160
146
|
begin
|
161
147
|
remote_release = get_remote_release(tarball.release_name) rescue nil
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
remote_jobs = remote_release["jobs"]
|
148
|
+
|
149
|
+
if remote_release &&
|
150
|
+
remote_release["versions"].include?(tarball.version)
|
151
|
+
err("This release version has already been uploaded")
|
167
152
|
end
|
168
153
|
|
169
154
|
if repack
|
170
|
-
|
171
|
-
remote_release)
|
155
|
+
package_matches = match_remote_packages(tarball.manifest)
|
172
156
|
|
173
157
|
say("Checking if can repack release for faster upload...")
|
174
|
-
repacked_path = tarball.repack(
|
158
|
+
repacked_path = tarball.repack(remote_release, package_matches)
|
175
159
|
if repacked_path.nil?
|
176
160
|
say("Uploading the whole release".green)
|
177
161
|
else
|
data/lib/cli/release_compiler.rb
CHANGED
@@ -10,28 +10,45 @@ module Bosh::Cli
|
|
10
10
|
new(manifest_file, blobstore).compile
|
11
11
|
end
|
12
12
|
|
13
|
-
|
14
|
-
|
13
|
+
# @param [String] manifest_file Release manifest path
|
14
|
+
# @param [Bosh::Blobstore::Client] blobstore Blobstore client
|
15
|
+
# @param [Hash] remote_release Remote release info from director
|
16
|
+
# @param [Array] package_matches List of package checksums that director
|
17
|
+
# can match
|
18
|
+
# @param [String] release_dir Release directory
|
19
|
+
def initialize(manifest_file, blobstore, remote_release = nil,
|
20
|
+
package_matches = [], release_dir = nil)
|
21
|
+
|
22
|
+
@blobstore = blobstore
|
23
|
+
@release_dir = release_dir || Dir.pwd
|
24
|
+
@manifest_file = File.expand_path(manifest_file, @release_dir)
|
25
|
+
@tarball_path = nil
|
26
|
+
|
15
27
|
@build_dir = Dir.mktmpdir
|
16
28
|
@jobs_dir = File.join(@build_dir, "jobs")
|
17
29
|
@packages_dir = File.join(@build_dir, "packages")
|
18
|
-
|
19
|
-
@
|
20
|
-
@remote_packages_sha1 = remote_packages_sha1
|
30
|
+
|
31
|
+
@package_matches = Set.new(package_matches)
|
21
32
|
|
22
33
|
at_exit { FileUtils.rm_rf(@build_dir) }
|
23
34
|
|
24
35
|
FileUtils.mkdir_p(@jobs_dir)
|
25
36
|
FileUtils.mkdir_p(@packages_dir)
|
26
37
|
|
27
|
-
@manifest_file = File.expand_path(manifest_file, @release_dir)
|
28
38
|
@manifest = load_yaml_file(manifest_file)
|
29
39
|
|
30
|
-
if
|
31
|
-
|
40
|
+
if remote_release
|
41
|
+
# TODO: instead of OpenStruct conversion we should probably
|
42
|
+
# introduce proper abstractions for things below
|
43
|
+
@remote_packages = remote_release["packages"].map do |pkg|
|
44
|
+
OpenStruct.new(pkg)
|
45
|
+
end
|
46
|
+
|
47
|
+
@remote_jobs = remote_release["jobs"].map do |job|
|
32
48
|
OpenStruct.new(job)
|
33
49
|
end
|
34
50
|
else
|
51
|
+
@remote_packages = []
|
35
52
|
@remote_jobs = []
|
36
53
|
end
|
37
54
|
|
@@ -53,7 +70,7 @@ module Bosh::Cli
|
|
53
70
|
header("Copying packages")
|
54
71
|
@packages.each do |package|
|
55
72
|
say("#{package.name} (#{package.version})".ljust(30), " ")
|
56
|
-
if
|
73
|
+
if remote_package_exists?(package)
|
57
74
|
say("SKIP".yellow)
|
58
75
|
next
|
59
76
|
end
|
@@ -69,7 +86,7 @@ module Bosh::Cli
|
|
69
86
|
header("Copying jobs")
|
70
87
|
@jobs.each do |job|
|
71
88
|
say("#{job.name} (#{job.version})".ljust(30), " ")
|
72
|
-
if
|
89
|
+
if remote_job_exists?(job)
|
73
90
|
say("SKIP".yellow)
|
74
91
|
next
|
75
92
|
end
|
@@ -163,10 +180,30 @@ module Bosh::Cli
|
|
163
180
|
raise BlobstoreError, "Blobstore error: #{e}"
|
164
181
|
end
|
165
182
|
|
166
|
-
|
167
|
-
|
183
|
+
# Checks if local package is already known remotely
|
184
|
+
# @param [#name, #version] local_package
|
185
|
+
# @return [Boolean]
|
186
|
+
def remote_package_exists?(local_package)
|
187
|
+
# If checksum is known to director we can always match it
|
188
|
+
return true if @package_matches.include?(local_package.sha1)
|
189
|
+
|
190
|
+
remote_object_exists?(@remote_packages, local_package)
|
191
|
+
end
|
192
|
+
|
193
|
+
# Checks if local job is already known remotely
|
194
|
+
# @param [#name, #version] local_job
|
195
|
+
# @return [Boolean]
|
196
|
+
def remote_job_exists?(local_job)
|
197
|
+
remote_object_exists?(@remote_jobs, local_job)
|
198
|
+
end
|
199
|
+
|
200
|
+
# @param [Enumerable] remote_objects Remote object collection
|
201
|
+
# @param [#name, #version] local_object
|
202
|
+
# @return [Boolean]
|
203
|
+
def remote_object_exists?(remote_objects, local_object)
|
204
|
+
remote_objects.any? do |remote_object|
|
168
205
|
remote_object.name == local_object.name &&
|
169
|
-
|
206
|
+
remote_object.version.to_s == local_object.version.to_s
|
170
207
|
end
|
171
208
|
end
|
172
209
|
|
data/lib/cli/release_tarball.rb
CHANGED
@@ -32,11 +32,9 @@ module Bosh::Cli
|
|
32
32
|
|
33
33
|
# Repacks tarball according to the structure of remote release
|
34
34
|
# Return path to repackaged tarball or nil if repack has failed
|
35
|
-
def repack(
|
35
|
+
def repack(remote_release = nil, package_matches = [])
|
36
36
|
return nil unless valid?
|
37
37
|
unpack
|
38
|
-
remote_jobs ||= []
|
39
|
-
remote_packages_sha1 ||= []
|
40
38
|
|
41
39
|
tmpdir = Dir.mktmpdir
|
42
40
|
repacked_path = File.join(tmpdir, "release-repack.tgz")
|
@@ -45,30 +43,41 @@ module Bosh::Cli
|
|
45
43
|
|
46
44
|
manifest = load_yaml_file(File.join(@unpack_dir, "release.MF"))
|
47
45
|
|
48
|
-
|
46
|
+
# Remote release could be not-existent, then package matches are supposed
|
47
|
+
# to satisfy everything
|
48
|
+
remote_release ||= {"jobs" => [], "packages" => []}
|
49
|
+
|
50
|
+
local_packages = manifest["packages"]
|
49
51
|
local_jobs = manifest["jobs"]
|
52
|
+
remote_packages = remote_release["packages"]
|
53
|
+
remote_jobs = remote_release["jobs"]
|
50
54
|
|
51
55
|
@skipped = 0
|
52
56
|
|
53
57
|
Dir.chdir(@unpack_dir) do
|
58
|
+
# TODO: this code can be dried up a little bit (as it is somewhat
|
59
|
+
# similar to what's going on in ReleaseCompiler)
|
60
|
+
|
54
61
|
local_packages.each do |package|
|
55
|
-
say("#{package[
|
56
|
-
if
|
62
|
+
say("#{package["name"]} (#{package["version"]})".ljust(30), " ")
|
63
|
+
if package_matches.include?(package["sha1"]) ||
|
64
|
+
remote_packages.any? { |rp| package["name"] == rp["name"] &&
|
65
|
+
package["version"].to_s == rp["version"].to_s }
|
57
66
|
say("SKIP".green)
|
58
67
|
@skipped += 1
|
59
|
-
FileUtils.rm_rf(File.join("packages", "#{package[
|
68
|
+
FileUtils.rm_rf(File.join("packages", "#{package["name"]}.tgz"))
|
60
69
|
else
|
61
70
|
say("UPLOAD".red)
|
62
71
|
end
|
63
72
|
end
|
64
73
|
|
65
74
|
local_jobs.each do |job|
|
66
|
-
say("#{job[
|
75
|
+
say("#{job["name"]} (#{job["version"]})".ljust(30), " ")
|
67
76
|
if remote_jobs.any? { |rj| job["name"] == rj["name"] &&
|
68
77
|
job["version"].to_s == rj["version"].to_s }
|
69
78
|
say("SKIP".green)
|
70
79
|
@skipped += 1
|
71
|
-
FileUtils.rm_rf(File.join("jobs", "#{job[
|
80
|
+
FileUtils.rm_rf(File.join("jobs", "#{job["name"]}.tgz"))
|
72
81
|
else
|
73
82
|
say("UPLOAD".red)
|
74
83
|
end
|
data/lib/cli/version.rb
CHANGED
@@ -17,9 +17,8 @@ describe Bosh::Cli::ReleaseTarball do
|
|
17
17
|
"jobs" => [{ "name" => "cacher", "version" => "1" },
|
18
18
|
{ "name" => "sweeper", "version" => "1" }]
|
19
19
|
}
|
20
|
-
|
21
|
-
repacked_tarball_path = tarball.repack(remote_release
|
22
|
-
remote_packages_sha1)
|
20
|
+
package_matches = ["86bd8b15562cde007f030a303fa64779af5fa4e7"]
|
21
|
+
repacked_tarball_path = tarball.repack(remote_release, package_matches)
|
23
22
|
|
24
23
|
tarball.skipped.should == 2
|
25
24
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bosh_cli
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.19.
|
4
|
+
version: 0.19.4
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-06-
|
12
|
+
date: 2012-06-22 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: json_pure
|
@@ -317,7 +317,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
317
317
|
version: '0'
|
318
318
|
segments:
|
319
319
|
- 0
|
320
|
-
hash:
|
320
|
+
hash: 1823880374092927602
|
321
321
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
322
322
|
none: false
|
323
323
|
requirements:
|
@@ -326,7 +326,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
326
326
|
version: '0'
|
327
327
|
segments:
|
328
328
|
- 0
|
329
|
-
hash:
|
329
|
+
hash: 1823880374092927602
|
330
330
|
requirements: []
|
331
331
|
rubyforge_project:
|
332
332
|
rubygems_version: 1.8.23
|