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