bosh_cli 1.3112.0 → 1.3115.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: ba60ab5dc5440c8eed837deee9de75556c618117
4
- data.tar.gz: e6b55ec578ccdc53e735707ecb15bf8f7f76eb61
3
+ metadata.gz: dfd2d53b788b054d99bd8d7708453c81396f7c85
4
+ data.tar.gz: c3137783a4253dcaa07585072913d86884df6070
5
5
  SHA512:
6
- metadata.gz: eb36ca9acb95bddcd1af014f85343b1da61c0049d945ac84dcded6b9010a7c7099e65c911f0e4d35cd8241a4fb20a8a91ccd9f8d99ee28ad0508a147ad5fd4ac
7
- data.tar.gz: 8cab925642eb35845486f459fb5a9209382ec1864eea040d9b43f59c2286c82bd39a959f0c859ec467231853f1c2cbd83a28a5920085fe441f345066aea10af2
6
+ metadata.gz: 508628bc1637eb908b4b6b2c0e0150ab4dfaee34d7a5f8ec27a6960a3802b071901caa77339bba42daaca0cb14615e8e36b7f66b177bc56b5a870c102ae6bc23
7
+ data.tar.gz: a2585a85ad0c31c0f11554d439dd36e0b81557a7eb7414fed3d54ad6ec33e67b5b45344769712d004e2ee04c4ce8b42d7af16ae414279216f06521c6d394c43f
@@ -84,14 +84,10 @@ module Bosh::Cli::Command
84
84
  repack = upload_options[:repack]
85
85
  rebase = upload_options[:rebase]
86
86
 
87
- say("\nVerifying release...")
88
- tarball.validate(:allow_sparse => true)
87
+ say("\nVerifying manifest...")
88
+ tarball.validate_manifest
89
89
  nl
90
90
 
91
- unless tarball.valid?
92
- err('Release is invalid, please fix, verify and upload again')
93
- end
94
-
95
91
  if should_convert_to_old_format?(tarball.version)
96
92
  msg = "You are using CLI > 1.2579.0 with a director that doesn't support " +
97
93
  'the new version format you are using. Upgrade your ' +
@@ -112,6 +108,16 @@ module Bosh::Cli::Command
112
108
  package_matches = match_remote_packages(tarball.manifest)
113
109
  end
114
110
 
111
+ # if the director is an older version that doesn't support optimized unpack we
112
+ # have to upload everything
113
+ if tarball.upload_packages?(package_matches) || !director_supports_fast_unpack?
114
+ tarball.validate(:allow_sparse => true, :validate_manifest => false)
115
+ err('Release is invalid, please fix, verify and upload again') unless tarball.valid?
116
+ else
117
+ tarball.validate_jobs(:allow_sparse => true, :validate_job_packages => false)
118
+ tarball.print_manifest
119
+ end
120
+
115
121
  say('Checking if can repack release for faster upload...')
116
122
  repacked_path = tarball.repack(package_matches)
117
123
 
@@ -216,6 +222,13 @@ module Bosh::Cli::Command
216
222
  Bosh::Common::Version::BoshVersion.parse(director_version) >=
217
223
  Bosh::Common::Version::BoshVersion.parse(new_format_director_version)
218
224
  end
225
+
226
+ def director_supports_fast_unpack?
227
+ director_version = director.get_status['version']
228
+ new_format_director_version = '1.3100.0'
229
+ Bosh::Common::Version::BoshVersion.parse(director_version) >
230
+ Bosh::Common::Version::BoshVersion.parse(new_format_director_version)
231
+ end
219
232
  end
220
233
  end
221
234
  end
@@ -15,6 +15,8 @@ module Bosh::Cli
15
15
  'Use default ssh password (NOT RECOMMENDED)'
16
16
  option '--strict_host_key_checking <yes/no>',
17
17
  'Can use this flag to skip host key checking (NOT RECOMMENDED)'
18
+ option '--no_gateway',
19
+ 'Ignore gateway provided by the director'
18
20
 
19
21
  def shell(*args)
20
22
  if args.size > 0
@@ -46,6 +48,8 @@ module Bosh::Cli
46
48
  option '--gateway_host HOST', 'Gateway host'
47
49
  option '--gateway_user USER', 'Gateway user'
48
50
  option '--gateway_identity_file FILE', 'Gateway identity file'
51
+ option '--no_gateway',
52
+ 'Ignore gateway provided by the director'
49
53
 
50
54
  def scp(*args)
51
55
  job, index, args = JobCommandArgs.new(args).to_a
@@ -138,10 +142,11 @@ module Bosh::Cli
138
142
  ssh_session.set_host_session(sessions.first)
139
143
 
140
144
  begin
141
- if options[:gateway_host]
145
+ if options[:gateway_host] || (!options[:no_gateway] &&
146
+ sessions.first["gateway_host"])
142
147
  require 'net/ssh/gateway'
143
- gw_host = options[:gateway_host]
144
- gw_user = options[:gateway_user] || ENV['USER']
148
+ gw_host = options[:gateway_host] || sessions.first["gateway_host"]
149
+ gw_user = options[:gateway_user] || sessions.first["gateway_user"] || ENV['USER']
145
150
  gw_options = {}
146
151
  gw_options[:keys] = [options[:gateway_identity_file]] if options[:gateway_identity_file]
147
152
  begin
@@ -167,15 +172,7 @@ module Bosh::Cli
167
172
  # @param [String] job Job name
168
173
  # @param [Integer] index Job index
169
174
  def setup_interactive_shell(deployment_name, job, index)
170
- password = options[:default_password]
171
-
172
- if password.nil?
173
- password = ask(
174
- 'Enter password (use it to ' +
175
- 'sudo on remote host): ') { |q| q.echo = '*' }
176
-
177
- err('Please provide ssh password') if password.blank?
178
- end
175
+ password = options[:default_password] || ''
179
176
 
180
177
  setup_ssh(deployment_name, job, index, password) do |sessions, gateway, ssh_session|
181
178
  session = sessions.first
@@ -206,7 +203,9 @@ module Bosh::Cli
206
203
  end
207
204
 
208
205
  def perform_operation(operation, deployment_name, job, index, args)
209
- setup_ssh(deployment_name, job, index, options[:default_password]) do |sessions, gateway, ssh_session|
206
+ password = options[:default_password] || ''
207
+
208
+ setup_ssh(deployment_name, job, index, password) do |sessions, gateway, ssh_session|
210
209
  sessions.each do |session|
211
210
  unless session['status'] == 'success' && session['ip']
212
211
  err("Failed to set up SSH on #{job}/#{index}: #{session.inspect}")
data/lib/cli/release.rb CHANGED
@@ -73,9 +73,6 @@ module Bosh::Cli
73
73
  has_legacy_secret? ||
74
74
  has_blobstore_secrets?(bs, "simple", "user", "password") ||
75
75
  has_blobstore_secrets?(bs, "dav", "user", "password") ||
76
- has_blobstore_secrets?(bs, "swift", "rackspace") ||
77
- has_blobstore_secrets?(bs, "swift", "hp") ||
78
- has_blobstore_secrets?(bs, "swift", "openstack") ||
79
76
  has_blobstore_secrets?(bs, "s3", "access_key_id", "secret_access_key")
80
77
  end
81
78
 
@@ -19,6 +19,38 @@ module Bosh::Cli
19
19
  end
20
20
  end
21
21
 
22
+ def unpack_manifest
23
+ return @unpacked_manifest unless @unpacked_manifest.nil?
24
+ exit_success = fast_unpack('./release.MF')
25
+ @unpacked_manifest = !!exit_success
26
+ end
27
+
28
+ def unpack_jobs
29
+ return @unpacked_jobs unless @unpacked_jobs.nil?
30
+ exit_success = fast_unpack('./jobs/')
31
+ @unpacked_jobs = !!exit_success
32
+ end
33
+
34
+ def unpack_license
35
+ return @unpacked_license unless @unpacked_license.nil?
36
+ exit_success = fast_unpack('./license.tgz')
37
+ @unpacked_license = !!exit_success
38
+ end
39
+
40
+ def fast_unpack(target)
41
+ if RUBY_PLATFORM =~ /linux/
42
+ system("tar", "-C", @unpack_dir, "-xzf", @tarball_path, "--occurrence", "#{target}", out: "/dev/null", err: "/dev/null")
43
+ elsif RUBY_PLATFORM =~ /darwin/
44
+ if target[-1, 1] == "/"
45
+ system("tar", "-C", @unpack_dir, "-xzf", @tarball_path, "#{target}", out: "/dev/null", err: "/dev/null")
46
+ else
47
+ system("tar", "-C", @unpack_dir, "--fast-read", "-xzf", @tarball_path, "#{target}", out: "/dev/null", err: "/dev/null")
48
+ end
49
+ else
50
+ system("tar", "-C", @unpack_dir, "-xzf", @tarball_path, "#{target}", out: "/dev/null", err: "/dev/null")
51
+ end
52
+ end
53
+
22
54
  # Unpacks tarball to @unpack_dir, returns true if succeeded, false if failed
23
55
  def unpack
24
56
  return @unpacked unless @unpacked.nil?
@@ -38,13 +70,19 @@ module Bosh::Cli
38
70
 
39
71
  def manifest
40
72
  return nil unless valid?
41
- unpack
73
+ unpack_manifest
42
74
  File.read(File.join(@unpack_dir, "release.MF"))
43
75
  end
44
76
 
77
+ def manifest_yaml
78
+ return @manifest_yaml unless @manifest_yaml.nil?
79
+ unpack_manifest
80
+ manifest_file = File.expand_path("release.MF", @unpack_dir)
81
+ @manifest_yaml = load_yaml_file(manifest_file)
82
+ end
83
+
45
84
  def compiled_release?
46
- unpack
47
- File.exists?(File.expand_path("compiled_packages", @unpack_dir))
85
+ manifest_yaml.has_key?('compiled_packages')
48
86
  end
49
87
 
50
88
  def replace_manifest(hash)
@@ -91,11 +129,16 @@ module Bosh::Cli
91
129
  end
92
130
  end
93
131
 
132
+ def upload_packages?(package_matches = [])
133
+ return true if package_matches.nil?
134
+ package_matches.size != manifest_yaml[@packages_folder].size
135
+ end
136
+
94
137
  # Repacks tarball according to the structure of remote release
95
138
  # Return path to repackaged tarball or nil if repack has failed
96
139
  def repack(package_matches = [])
97
140
  return nil unless valid?
98
- unpack
141
+ unpack if upload_packages?(package_matches)
99
142
 
100
143
  tmpdir = Dir.mktmpdir
101
144
  repacked_path = File.join(tmpdir, "release-repack.tgz")
@@ -116,7 +159,7 @@ module Bosh::Cli
116
159
  package_matches.include?(package["fingerprint"]))
117
160
  say("SKIP".make_green)
118
161
  @skipped += 1
119
- FileUtils.rm_rf(File.join("packages", "#{package["name"]}.tgz"))
162
+ FileUtils.rm_rf(File.join(@packages_folder, "#{package["name"]}.tgz"))
120
163
  else
121
164
  say("UPLOAD".make_red)
122
165
  end
@@ -137,42 +180,50 @@ module Bosh::Cli
137
180
  # and packages in place when we do validation. However for jobs and packages
138
181
  # that are present we still need to validate checksums
139
182
  def perform_validation(options = {})
140
- allow_sparse = options.fetch(:allow_sparse, false)
141
- should_print_release_info = options.fetch(:print_release_info, true)
142
-
143
- step("File exists and readable",
144
- "Cannot find release file #{@tarball_path}", :fatal) do
183
+ step("File exists and readable", "Cannot find release file #{@tarball_path}", :fatal) do
145
184
  exists?
146
185
  end
147
186
 
148
- step("Extract tarball",
149
- "Cannot extract tarball #{@tarball_path}", :fatal) do
150
- unpack
187
+ validate_manifest if options.fetch(:validate_manifest, true)
188
+ validate_packages(options)
189
+ validate_jobs(options)
190
+
191
+ print_manifest if options.fetch(:print_release_info, true)
192
+ end
193
+
194
+ def validate_manifest
195
+ step("Extract manifest",
196
+ "Cannot extract manifest #{@tarball_path}", :fatal) do
197
+ unpack_manifest
151
198
  end
152
199
 
153
200
  manifest_file = File.expand_path("release.MF", @unpack_dir)
154
-
155
201
  step("Manifest exists", "Cannot find release manifest", :fatal) do
156
202
  File.exists?(manifest_file)
157
203
  end
158
204
 
159
- manifest = load_yaml_file(manifest_file)
205
+ @manifest_yaml = nil
160
206
 
161
207
  step("Release name/version",
162
208
  "Manifest doesn't contain release name and/or version") do
163
- manifest.is_a?(Hash) &&
164
- manifest.has_key?("name") &&
165
- manifest.has_key?("version")
209
+ manifest_yaml.is_a?(Hash) &&
210
+ manifest_yaml.has_key?("name") &&
211
+ manifest_yaml.has_key?("version")
166
212
  end
167
213
 
168
- @release_name = manifest["name"]
169
- @version = manifest["version"].to_s
214
+ @release_name = manifest_yaml["name"]
215
+ @version = manifest_yaml["version"].to_s
216
+ @validated = true
217
+ end
170
218
 
171
- # Check packages
172
- total_packages = manifest[@packages_folder].size
173
- available_packages = {}
219
+ def validate_packages(options = {})
220
+ allow_sparse = options.fetch(:allow_sparse, false)
221
+ unpack
222
+
223
+ total_packages = manifest_yaml[@packages_folder].size
224
+ @available_packages = {}
174
225
 
175
- manifest[@packages_folder].each_with_index do |package, i|
226
+ manifest_yaml[@packages_folder].each_with_index do |package, i|
176
227
  @packages << package
177
228
  name, version = package['name'], package['version']
178
229
 
@@ -185,7 +236,7 @@ module Bosh::Cli
185
236
  end
186
237
 
187
238
  if package_exists
188
- available_packages[name] = true
239
+ @available_packages[name] = true
189
240
  step("Package '#{name}' checksum",
190
241
  "Incorrect checksum for package '#{name}'") do
191
242
  Digest::SHA1.file(package_file).hexdigest == package["sha1"]
@@ -201,8 +252,8 @@ module Bosh::Cli
201
252
  step("Package dependencies",
202
253
  "Package dependencies couldn't be resolved") do
203
254
  begin
204
- tsort_packages(manifest[@packages_folder].inject({}) { |h, p|
205
- h[p["name"]] = p["dependencies"] || []; h })
255
+ tsort_packages(manifest_yaml[@packages_folder].inject({}) { |h, p|
256
+ h[p["name"]] = p["dependencies"] || []; h })
206
257
  true
207
258
  rescue Bosh::Cli::CircularDependency,
208
259
  Bosh::Cli::MissingDependency => e
@@ -211,26 +262,30 @@ module Bosh::Cli
211
262
  end
212
263
  end
213
264
  end
265
+ end
214
266
 
215
- # Check jobs
216
- total_jobs = manifest["jobs"].size
267
+ def validate_jobs(options = {})
268
+ allow_sparse = options.fetch(:allow_sparse, false)
269
+ unpack_jobs
270
+ unpack_license
271
+
272
+ total_jobs = manifest_yaml["jobs"].size
217
273
 
218
274
  step("Checking jobs format",
219
- "Jobs are not versioned, please re-create release " +
220
- "with current CLI version (or any CLI >= 0.4.4)", :fatal) do
221
- total_jobs > 0 && manifest["jobs"][0].is_a?(Hash)
275
+ "Jobs are not versioned, please re-create release with current CLI version (or any CLI >= 0.4.4)", :fatal) do
276
+ total_jobs > 0 && manifest_yaml["jobs"][0].is_a?(Hash)
222
277
  end
223
278
 
224
- manifest["jobs"].each_with_index do |job, i|
279
+ manifest_yaml["jobs"].each_with_index do |job, i|
225
280
  @jobs << job
281
+
226
282
  name = job["name"]
227
283
  version = job["version"]
228
284
 
229
285
  job_file = File.expand_path(name + ".tgz", @unpack_dir + "/jobs")
230
286
  job_exists = File.exists?(job_file)
231
287
 
232
- step("Read job '%s' (%d of %d), version %s" % [name, i+1, total_jobs,
233
- version],
288
+ step("Read job '%s' (%d of %d), version %s" % [name, i+1, total_jobs, version],
234
289
  "Job '#{name}' not found") do
235
290
  job_exists || allow_sparse
236
291
  end
@@ -265,32 +320,29 @@ module Bosh::Cli
265
320
  job_manifest["templates"].each_key do |template|
266
321
  step("Check template '#{template}' for '#{name}'",
267
322
  "No template named '#{template}' for '#{name}'") do
268
- File.exists?(File.expand_path(template,
269
- job_tmp_dir + "/templates"))
323
+ File.exists?(File.expand_path(template, job_tmp_dir + "/templates"))
270
324
  end
271
325
  end
272
326
  end
273
327
 
274
- if job_manifest_valid && job_manifest["packages"]
328
+ validate_job_packages = options.fetch(:validate_job_packages, true)
329
+
330
+ if validate_job_packages && job_manifest_valid && job_manifest["packages"]
275
331
  job_manifest["packages"].each do |package_name|
276
332
  step("Job '#{name}' needs '#{package_name}' package",
277
- "Job '#{name}' references missing package " +
278
- "'#{package_name}'") do
279
- available_packages[package_name] || allow_sparse
333
+ "Job '#{name}' references missing package '#{package_name}'") do
334
+ @available_packages[package_name] || allow_sparse
280
335
  end
281
336
  end
282
337
  end
283
338
 
284
339
  step("Monit file for '#{name}'",
285
340
  "Monit script missing for job '#{name}'") do
286
- File.exists?(File.expand_path("monit", job_tmp_dir)) ||
287
- Dir.glob("#{job_tmp_dir}/*.monit").size > 0
341
+ File.exists?(File.expand_path("monit", job_tmp_dir)) || Dir.glob("#{job_tmp_dir}/*.monit").size > 0
288
342
  end
289
343
  end
290
344
  end
291
345
  end
292
-
293
- print_info(manifest) if should_print_release_info
294
346
  end
295
347
 
296
348
  class TarballArtifact
@@ -330,7 +382,8 @@ module Bosh::Cli
330
382
  []
331
383
  end
332
384
 
333
- def print_info(manifest)
385
+ def print_manifest
386
+ manifest = manifest_yaml
334
387
  say("\nRelease info")
335
388
  say("------------")
336
389
 
@@ -363,6 +416,7 @@ module Bosh::Cli
363
416
  else
364
417
  say(" - license (#{manifest["license"]["version"]})")
365
418
  end
419
+ nl
366
420
  end
367
421
  end
368
422
  end
data/lib/cli/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  module Bosh
2
2
  module Cli
3
- VERSION = '1.3112.0'
3
+ VERSION = '1.3115.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.3112.0
4
+ version: 1.3115.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-10-21 00:00:00.000000000 Z
11
+ date: 2015-10-23 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.3112.0
19
+ version: 1.3115.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.3112.0
26
+ version: 1.3115.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.3112.0
33
+ version: 1.3115.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.3112.0
40
+ version: 1.3115.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.3112.0
131
+ version: 1.3115.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.3112.0
138
+ version: 1.3115.0
139
139
  - !ruby/object:Gem::Dependency
140
140
  name: net-ssh
141
141
  requirement: !ruby/object:Gem::Requirement