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.
@@ -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
- remote_jobs = remote_release["jobs"] if remote_release
127
- remote_packages_sha1 = get_remote_packages(File.read(manifest_path),
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 = Bosh::Cli::ReleaseCompiler.new(manifest_path, blobstore,
135
- remote_jobs,
136
- remote_packages_sha1)
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
- if remote_release
163
- if remote_release["versions"].include?(tarball.version)
164
- err("This release version has already been uploaded")
165
- end
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
- remote_packages_sha1 = get_remote_packages(tarball.manifest,
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(remote_jobs, remote_packages_sha1)
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
@@ -10,28 +10,45 @@ module Bosh::Cli
10
10
  new(manifest_file, blobstore).compile
11
11
  end
12
12
 
13
- def initialize(manifest_file, blobstore, remote_jobs = nil,
14
- remote_packages_sha1 = [], release_dir = nil)
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
- @blobstore = blobstore
19
- @release_dir = release_dir || Dir.pwd
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 remote_jobs
31
- @remote_jobs = remote_jobs.map do |job|
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 @remote_packages_sha1.any? { |sha1| sha1 == package.sha1 }
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 remote_object_exists?(@remote_jobs, job)
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
- def remote_object_exists?(collection, local_object)
167
- collection.any? do |remote_object|
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
- remote_object.version.to_s == local_object.version.to_s
206
+ remote_object.version.to_s == local_object.version.to_s
170
207
  end
171
208
  end
172
209
 
@@ -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(remote_jobs = nil, remote_packages_sha1 = nil)
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
- local_packages = manifest["packages"]
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['name']} (#{package['version']})".ljust(30), " ")
56
- if remote_packages_sha1.any? { |sha1| sha1 == package["sha1"] }
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['name']}.tgz"))
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['name']} (#{job['version']})".ljust(30), " ")
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['name']}.tgz"))
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
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Bosh
4
4
  module Cli
5
- VERSION = "0.19.3"
5
+ VERSION = "0.19.4"
6
6
  end
7
7
  end
@@ -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
- remote_packages_sha1 = ["86bd8b15562cde007f030a303fa64779af5fa4e7"]
21
- repacked_tarball_path = tarball.repack(remote_release["jobs"],
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.3
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-20 00:00:00.000000000 Z
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: 3443692206202112856
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: 3443692206202112856
329
+ hash: 1823880374092927602
330
330
  requirements: []
331
331
  rubyforge_project:
332
332
  rubygems_version: 1.8.23