bosh_cli 1.2950.0 → 1.2957.0

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: f727dbd9afbf9d8be9252cea9c0254281a0a71e3
4
- data.tar.gz: 8e10c4f49edf71767d9ce958357558c01a70adc0
3
+ metadata.gz: c4c43e590bd60e19d51b6f40052a5e25552712a0
4
+ data.tar.gz: 730712d500e6fd5ba18029aff88faa046c65751d
5
5
  SHA512:
6
- metadata.gz: 392fe73728e5288f25fb66ce992ed02b12b63460e46fbd83c1a5ad72680b1edd04f76418cb975769d1e8747d3650055bf206647c7827bcd04011556db72fd512
7
- data.tar.gz: 2f5a1da34ea92805da6ec255fa021fdd8738cb93a5195a29b57970b9353ad1d1fc185122cccb9873c90620272c866867c9fa857bbc324c0cdd409bc18332c257
6
+ metadata.gz: fb127e885dfe3d743023318b5f8c06d89604987196171d107b5382566be403e0d372458797023fac29a3003bca12ea0f972476e37fad496aa416ebdc3bf03928
7
+ data.tar.gz: bd75913d2e3bb252325fc4ab647ff81a8afa2632e40434dda861870f865207e06112bb6769186dbd283b3d2c729b66f03f289439c1d49b91173bfab618da0889
@@ -1,6 +1,8 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../../release_print_helper.rb')
1
2
  module Bosh::Cli::Command
2
3
  module Release
3
4
  class CreateRelease < Base
5
+ include ReleasePrintHelper
4
6
  include Bosh::Cli::DependencyHelper
5
7
 
6
8
  DEFAULT_RELEASE_NAME = 'bosh-release'
@@ -236,63 +238,6 @@ module Bosh::Cli::Command
236
238
  release.save_config
237
239
  end
238
240
 
239
- def show_summary(builder)
240
- packages_table = table do |t|
241
- t.headings = %w(Name Version Notes)
242
- builder.packages.each do |package_artifact|
243
- t << artifact_summary(package_artifact)
244
- end
245
- end
246
-
247
- jobs_table = table do |t|
248
- t.headings = %w(Name Version Notes)
249
- builder.jobs.each do |job_artifact|
250
- t << artifact_summary(job_artifact)
251
- end
252
- end
253
-
254
- if builder.license
255
- license_table = table do |t|
256
- t.headings = %w(Name Version Notes)
257
- t << artifact_summary(builder.license)
258
- end
259
-
260
- say('License')
261
- say(license_table)
262
- nl
263
- end
264
-
265
- say('Packages')
266
- say(packages_table)
267
- nl
268
- say('Jobs')
269
- say(jobs_table)
270
-
271
- affected_jobs = builder.affected_jobs
272
-
273
- if affected_jobs.size > 0
274
- nl
275
- say('Jobs affected by changes in this release')
276
-
277
- affected_jobs_table = table do |t|
278
- t.headings = %w(Name Version)
279
- affected_jobs.each do |job|
280
- t << [job.name, job.version]
281
- end
282
- end
283
-
284
- say(affected_jobs_table)
285
- end
286
- end
287
-
288
- def artifact_summary(artifact)
289
- [
290
- artifact.name,
291
- artifact.version,
292
- artifact.new_version? ? 'new version' : '',
293
- ]
294
- end
295
-
296
241
  def commit_hash
297
242
  status = Bosh::Exec.sh('git show-ref --head --hash=8 2> /dev/null')
298
243
  status.output.split.first
@@ -0,0 +1,143 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../../release_print_helper.rb')
2
+ module Bosh::Cli::Command
3
+ module Release
4
+ class FinalizeRelease < Base
5
+ include ReleasePrintHelper
6
+ include Bosh::Cli::DependencyHelper
7
+
8
+ # bosh finalize release
9
+ usage 'finalize release'
10
+ desc 'Create final release from dev release tarball (assumes current directory to be a release repository)'
11
+ option '--dry-run', 'stop before writing release manifest'
12
+ option '--name NAME', 'specify a custom release name'
13
+ option '--version VERSION', 'specify a custom version number (ex: 1.0.0 or 1.0-beta.2+dev.10)'
14
+
15
+ def finalize(tarball_path)
16
+ options[:final] = true
17
+
18
+ # validate preconditions
19
+ check_if_release_dir
20
+
21
+ tarball = extract_and_validate_tarball(tarball_path)
22
+
23
+ manifest = Psych.load(tarball.manifest)
24
+
25
+ dev_release_name = manifest["name"]
26
+ dev_release_ver = manifest["version"]
27
+ final_release_name = options[:name] || dev_release_name
28
+
29
+ final_release_dir = File.join('releases', final_release_name)
30
+ @release_index = Bosh::Cli::Versions::VersionsIndex.new(final_release_dir)
31
+ final_release_ver = options[:version] || next_final_version
32
+
33
+ if options[:version] && @release_index.version_strings.include?(options[:version])
34
+ raise Bosh::Cli::ReleaseVersionError.new('Release version already exists')
35
+ end
36
+
37
+ check_if_blob_manager_is_dirty
38
+
39
+ @progress_renderer = Bosh::Cli::InteractiveProgressRenderer.new
40
+
41
+ if !options[:dry_run] then
42
+ release.blobstore # prime & validate blobstore config
43
+
44
+ manifest["version"] = final_release_ver
45
+ manifest["name"] = final_release_name
46
+
47
+ tarball.replace_manifest(manifest)
48
+
49
+ FileUtils.mkdir_p(final_release_dir)
50
+ final_release_manifest_path = File.absolute_path(File.join(final_release_dir, "#{final_release_name}-#{final_release_ver}.yml"))
51
+ File.open(final_release_manifest_path, 'w') do |release_manifest_file|
52
+ release_manifest_file.puts(tarball.manifest)
53
+ end
54
+
55
+ @release_index.add_version(SecureRandom.uuid, "version" => final_release_ver)
56
+
57
+ final_release_tarball_path = File.absolute_path(File.join(final_release_dir, "#{final_release_name}-#{final_release_ver}.tgz"))
58
+ tarball.create_from_unpacked(final_release_tarball_path)
59
+
60
+ upload_package_and_job_blobs(manifest, tarball)
61
+
62
+ nl
63
+ say("Creating final release #{final_release_name}/#{final_release_ver} from dev release #{dev_release_name}/#{dev_release_ver}")
64
+
65
+ release.latest_release_filename = final_release_manifest_path
66
+ release.save_config
67
+
68
+ header('Release summary')
69
+ show_summary(tarball)
70
+ nl
71
+
72
+ say("Release name: #{final_release_name.make_green}")
73
+ say("Release version: #{final_release_ver.to_s.make_green}")
74
+ say("Release manifest: #{release.latest_release_filename.make_green}")
75
+ say("Release tarball (#{pretty_size(final_release_tarball_path)}): " + final_release_tarball_path.make_green)
76
+ end
77
+ end
78
+
79
+ def upload_package_and_job_blobs(manifest, tarball)
80
+ manifest['packages'].each do |package|
81
+ upload_to_blobstore(package, 'packages', tarball.package_tarball_path(package['name']))
82
+ end
83
+
84
+ manifest['jobs'].each do |job|
85
+ upload_to_blobstore(job, 'jobs', tarball.job_tarball_path(job['name']))
86
+ end
87
+
88
+ if manifest['license']
89
+ license_metadata = manifest['license'].clone
90
+ license_metadata['name'] = 'license'
91
+ upload_to_blobstore(license_metadata, '', tarball.license_tarball_path)
92
+ end
93
+ end
94
+
95
+ def extract_and_validate_tarball(tarball_path)
96
+ tarball = Bosh::Cli::ReleaseTarball.new(tarball_path)
97
+ err("Cannot find release tarball #{tarball_path}") if !tarball.exists?
98
+
99
+ err("#{tarball_path} is not a valid release tarball") if !tarball.valid?(:print_release_info => false)
100
+ tarball
101
+ end
102
+
103
+ def check_if_blob_manager_is_dirty
104
+ nl
105
+ blob_manager.sync
106
+ if blob_manager.dirty?
107
+ blob_manager.print_status
108
+ err("Please use '--force' or upload new blobs")
109
+ end
110
+ end
111
+
112
+ def next_final_version
113
+ latest_final_version = Bosh::Cli::Versions::ReleaseVersionsIndex.new(@release_index).latest_version
114
+ latest_final_version ||= Bosh::Common::Version::ReleaseVersion.parse('0')
115
+ latest_final_version = latest_final_version.increment_release
116
+ latest_final_version.to_s
117
+ end
118
+
119
+ def upload_to_blobstore(artifact, plural_type, artifact_path)
120
+ err("Cannot find artifact complete information, please upgrade tarball to newer version") if !artifact['fingerprint']
121
+
122
+ final_builds_dir = File.join('.final_builds', plural_type, artifact['name']).to_s
123
+ FileUtils.mkdir_p(final_builds_dir)
124
+ final_builds_index = Bosh::Cli::Versions::VersionsIndex.new(final_builds_dir)
125
+
126
+ return artifact if final_builds_index[artifact['fingerprint']]
127
+
128
+ @progress_renderer.start(artifact['name'], "uploading...")
129
+ blobstore_id = nil
130
+ File.open(artifact_path, 'r') do |f|
131
+ blobstore_id = @release.blobstore.create(f)
132
+ end
133
+
134
+ final_builds_index.add_version(artifact['fingerprint'], {
135
+ 'version' => artifact['version'],
136
+ 'sha1' => artifact['sha1'],
137
+ 'blobstore_id' => blobstore_id
138
+ })
139
+ @progress_renderer.finish(artifact['name'], "uploaded")
140
+ end
141
+ end
142
+ end
143
+ end
@@ -0,0 +1,60 @@
1
+ module ReleasePrintHelper
2
+
3
+ private
4
+ def artifact_summary(artifact)
5
+ [
6
+ artifact.name,
7
+ artifact.version,
8
+ artifact.new_version? ? 'new version' : '',
9
+ ]
10
+ end
11
+
12
+ def show_summary(builder)
13
+ packages_table = table do |t|
14
+ t.headings = %w(Name Version Notes)
15
+ builder.packages.each do |package_artifact|
16
+ t << artifact_summary(package_artifact)
17
+ end
18
+ end
19
+
20
+ jobs_table = table do |t|
21
+ t.headings = %w(Name Version Notes)
22
+ builder.jobs.each do |job_artifact|
23
+ t << artifact_summary(job_artifact)
24
+ end
25
+ end
26
+
27
+ if builder.license
28
+ license_table = table do |t|
29
+ t.headings = %w(Name Version Notes)
30
+ t << artifact_summary(builder.license)
31
+ end
32
+
33
+ say('License')
34
+ say(license_table)
35
+ nl
36
+ end
37
+
38
+ say('Packages')
39
+ say(packages_table)
40
+ nl
41
+ say('Jobs')
42
+ say(jobs_table)
43
+
44
+ affected_jobs = builder.affected_jobs
45
+
46
+ if affected_jobs.size > 0
47
+ nl
48
+ say('Jobs affected by changes in this release')
49
+
50
+ affected_jobs_table = table do |t|
51
+ t.headings = %w(Name Version)
52
+ affected_jobs.each do |job|
53
+ t << [job.name, job.version]
54
+ end
55
+ end
56
+
57
+ say(affected_jobs_table)
58
+ end
59
+ end
60
+ end
@@ -4,7 +4,7 @@ module Bosh::Cli
4
4
  include DependencyHelper
5
5
 
6
6
  attr_reader :release_name, :jobs, :packages, :version
7
- attr_reader :skipped # Mostly for tests
7
+ attr_reader :skipped, :unpack_dir # Mostly for tests
8
8
 
9
9
  def initialize(tarball_path)
10
10
  @tarball_path = File.expand_path(tarball_path, Dir.pwd)
@@ -20,6 +20,13 @@ module Bosh::Cli
20
20
  @unpacked = $?.exitstatus == 0
21
21
  end
22
22
 
23
+ # Creates a new tarball from the current contents of @unpack_dir
24
+ def create_from_unpacked(target_path)
25
+ raise "Not unpacked yet!" unless @unpacked
26
+ `tar -C #{@unpack_dir} -pczf '#{File.expand_path(target_path)}' . 2>&1`
27
+ $?.exitstatus == 0
28
+ end
29
+
23
30
  def exists?
24
31
  File.exists?(@tarball_path) && File.readable?(@tarball_path)
25
32
  end
@@ -30,6 +37,35 @@ module Bosh::Cli
30
37
  File.read(File.join(@unpack_dir, "release.MF"))
31
38
  end
32
39
 
40
+ def replace_manifest(hash)
41
+ return nil unless valid?
42
+ unpack
43
+ write_yaml(hash, File.join(@unpack_dir, "release.MF"))
44
+ end
45
+
46
+ def job_tarball_path(name)
47
+ return nil unless valid?
48
+ unpack
49
+ File.join(@unpack_dir, 'jobs', "#{name}.tgz")
50
+ end
51
+
52
+ def package_tarball_path(name)
53
+ return nil unless valid?
54
+ unpack
55
+ File.join(@unpack_dir, 'packages', "#{name}.tgz")
56
+ end
57
+
58
+ def license_tarball_path
59
+ return nil unless valid?
60
+ unpack
61
+ l = Resources::License.new(@unpack_dir)
62
+ if l.files
63
+ l.files[0][0]
64
+ else
65
+ nil
66
+ end
67
+ end
68
+
33
69
  def convert_to_old_format
34
70
  step('Converting to old format',
35
71
  "Cannot extract tarball #{@tarball_path}", :fatal) do
@@ -95,10 +131,8 @@ module Bosh::Cli
95
131
  # and packages in place when we do validation. However for jobs and packages
96
132
  # that are present we still need to validate checksums
97
133
  def perform_validation(options = {})
98
- # CLEANUP this syntax
99
- allow_sparse = options.has_key?(:allow_sparse) ?
100
- !!options[:allow_sparse] :
101
- false
134
+ allow_sparse = options.fetch(:allow_sparse, false)
135
+ should_print_release_info = options.fetch(:print_release_info, true)
102
136
 
103
137
  step("File exists and readable",
104
138
  "Cannot find release file #{@tarball_path}", :fatal) do
@@ -252,7 +286,44 @@ module Bosh::Cli
252
286
  end
253
287
  end
254
288
 
255
- print_info(manifest)
289
+ print_info(manifest) if should_print_release_info
290
+ end
291
+
292
+ class TarballArtifact
293
+ def initialize(info)
294
+ @name = info['name']
295
+ @version = info['version']
296
+ end
297
+
298
+ attr_reader :name, :version
299
+
300
+ def new_version?
301
+ false
302
+ end
303
+ end
304
+
305
+ def license
306
+ m = Psych.load(manifest)
307
+ license = m['license']
308
+ return nil if !license
309
+ license['name'] = 'license'
310
+ TarballArtifact.new(license)
311
+ end
312
+
313
+ def packages
314
+ m = Psych.load(manifest)
315
+ packages = m['packages'] || []
316
+ packages.map { |pkg| TarballArtifact.new(pkg) }
317
+ end
318
+
319
+ def jobs
320
+ m = Psych.load(manifest)
321
+ jobs = m['jobs'] || []
322
+ jobs.map { |job| TarballArtifact.new(job) }
323
+ end
324
+
325
+ def affected_jobs
326
+ []
256
327
  end
257
328
 
258
329
  def print_info(manifest)
@@ -1,5 +1,5 @@
1
1
  module Bosh
2
2
  module Cli
3
- VERSION = '1.2950.0'
3
+ VERSION = '1.2957.0'
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bosh_cli
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2950.0
4
+ version: 1.2957.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - VMware
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-04-27 00:00:00.000000000 Z
11
+ date: 2015-04-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bosh_common
@@ -16,28 +16,28 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: 1.2950.0
19
+ version: 1.2957.0
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: 1.2950.0
26
+ version: 1.2957.0
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: bosh-template
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: 1.2950.0
33
+ version: 1.2957.0
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: 1.2950.0
40
+ version: 1.2957.0
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: cf-uaa-lib
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -128,14 +128,14 @@ dependencies:
128
128
  requirements:
129
129
  - - "~>"
130
130
  - !ruby/object:Gem::Version
131
- version: 1.2950.0
131
+ version: 1.2957.0
132
132
  type: :runtime
133
133
  prerelease: false
134
134
  version_requirements: !ruby/object:Gem::Requirement
135
135
  requirements:
136
136
  - - "~>"
137
137
  - !ruby/object:Gem::Version
138
- version: 1.2950.0
138
+ version: 1.2957.0
139
139
  - !ruby/object:Gem::Dependency
140
140
  name: net-ssh
141
141
  requirement: !ruby/object:Gem::Requirement
@@ -306,7 +306,7 @@ dependencies:
306
306
  version: '0'
307
307
  description: |-
308
308
  BOSH CLI
309
- f41407
309
+ c9cf4f
310
310
  email: support@cloudfoundry.com
311
311
  executables:
312
312
  - bosh
@@ -361,6 +361,7 @@ files:
361
361
  - lib/cli/commands/property_management.rb
362
362
  - lib/cli/commands/release/create_release.rb
363
363
  - lib/cli/commands/release/delete_release.rb
364
+ - lib/cli/commands/release/finalize_release.rb
364
365
  - lib/cli/commands/release/init_release.rb
365
366
  - lib/cli/commands/release/list_releases.rb
366
367
  - lib/cli/commands/release/reset_release.rb
@@ -401,6 +402,7 @@ files:
401
402
  - lib/cli/release_archiver.rb
402
403
  - lib/cli/release_builder.rb
403
404
  - lib/cli/release_compiler.rb
405
+ - lib/cli/release_print_helper.rb
404
406
  - lib/cli/release_tarball.rb
405
407
  - lib/cli/resources/job.rb
406
408
  - lib/cli/resources/license.rb