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.
@@ -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