bosh_cli 1.3160.0 → 1.3163.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: cf12c78c9d77c3d537b7adb8ecb7af2b32212fbf
4
- data.tar.gz: 85d06b153cec7e1ca6fcd6062e64d234ff691edf
3
+ metadata.gz: 9bcf51bb65be3f043bb997bca2e36565fc389ef1
4
+ data.tar.gz: 5f9c4117351b0bc8776a37afe92609ed3af980c4
5
5
  SHA512:
6
- metadata.gz: a244138c9f3b4402a2cdca38dbddfaca37d21ebdff16794c50aa30db065d43670f0edf178cd045d1567ee3abde1b4622fb51f9ec3d836d60d7fa0c1f9e86e3d8
7
- data.tar.gz: e6b7794000d93b7f510db0440e00fedc044cb2e8401381e55b9c57d6639dba4d67b3b044a1b63ab680dbbbd1a7c29e74c77293701e796d44d8b69952ccd948df
6
+ metadata.gz: 20f34ebd95c481e8f9721da66a745fa199fd4465c68e66db9a5b80b756c1d93941191fbdf8f3395ea7bf4e3ac9323a4b3ef417fd6a9fd11600a424a8b0894347
7
+ data.tar.gz: ffc3ab67f387aa7f7a752d821f18e3c4f468ffd7c2123d11ac8d021e6929700bd65b8d9dd81b0282c7aa866d1b3cdc3d935b3b2043d72483ed43a0d23070bf60
@@ -277,7 +277,7 @@ module Bosh::Cli
277
277
  uri.port = DEFAULT_DIRECTOR_PORT
278
278
  uri.to_s
279
279
  end
280
+ end
280
281
  end
281
282
  end
282
283
  end
283
- end
@@ -180,6 +180,15 @@ module Bosh
180
180
  body
181
181
  end
182
182
 
183
+ def delete_orphan_disk_by_disk_cid(orphan_disk_cid)
184
+ request_and_track(:delete, "/disks/#{orphan_disk_cid}")
185
+ end
186
+
187
+ def list_orphan_disks
188
+ _, body = get_json_with_status('/disks')
189
+ body
190
+ end
191
+
183
192
  def upload_release(filename, options = {})
184
193
  options = options.dup
185
194
  options[:content_type] = 'application/x-compressed'
@@ -251,7 +260,7 @@ module Bosh
251
260
  request_and_track(:post, add_query_string(url, extras), options)
252
261
  end
253
262
 
254
- def setup_ssh(deployment_name, job, index, user,
263
+ def setup_ssh(deployment_name, job, id, user,
255
264
  public_key, password, options = {})
256
265
  options = options.dup
257
266
 
@@ -262,7 +271,8 @@ module Bosh
262
271
  'deployment_name' => deployment_name,
263
272
  'target' => {
264
273
  'job' => job,
265
- 'indexes' => [index].compact
274
+ 'indexes' => [id].compact, # for backwards compatibility with old director
275
+ 'ids' => [id].compact,
266
276
  },
267
277
  'params' => {
268
278
  'user' => user,
@@ -277,7 +287,7 @@ module Bosh
277
287
  request_and_track(:post, url, options)
278
288
  end
279
289
 
280
- def cleanup_ssh(deployment_name, job, user_regex, indexes, options = {})
290
+ def cleanup_ssh(deployment_name, job, user_regex, id, options = {})
281
291
  options = options.dup
282
292
 
283
293
  url = "/deployments/#{deployment_name}/ssh"
@@ -287,7 +297,8 @@ module Bosh
287
297
  'deployment_name' => deployment_name,
288
298
  'target' => {
289
299
  'job' => job,
290
- 'indexes' => (indexes || []).compact
300
+ 'indexes' => (id || []).compact,
301
+ 'ids' => (id || []).compact,
291
302
  },
292
303
  'params' => { 'user_regex' => user_regex }
293
304
  }
@@ -300,13 +311,13 @@ module Bosh
300
311
  end
301
312
 
302
313
  def change_job_state(deployment_name, manifest_yaml,
303
- job, index, new_state, options = {})
314
+ job, index_or_id, new_state, options = {})
304
315
  options = options.dup
305
316
 
306
317
  skip_drain = !!options.delete(:skip_drain)
307
318
 
308
319
  url = "/deployments/#{deployment_name}/jobs/#{job}"
309
- url += "/#{index}" if index
320
+ url += "/#{index_or_id}" if index_or_id
310
321
  url += "?state=#{new_state}"
311
322
  url += "&skip_drain=true" if skip_drain
312
323
 
@@ -357,22 +368,28 @@ module Bosh
357
368
  get_task_result(task_id)
358
369
  end
359
370
 
360
- def fetch_vm_state(deployment_name, options = {})
371
+ def fetch_vm_state(deployment_name, options = {}, full = true)
361
372
  options = options.dup
362
373
 
363
- url = "/deployments/#{deployment_name}/vms?format=full"
374
+ url = "/deployments/#{deployment_name}/vms"
364
375
 
365
- status, task_id = request_and_track(:get, url, options)
376
+ if full
377
+ status, task_id = request_and_track(:get, "#{url}?format=full", options)
366
378
 
367
- if status != :done
368
- raise DirectorError, 'Failed to fetch VMs information from director'
369
- end
379
+ raise DirectorError, 'Failed to fetch VMs information from director' if status != :done
370
380
 
371
- output = get_task_result_log(task_id)
381
+ output = get_task_result_log(task_id)
382
+ else
383
+ status, output, _ = get(url, nil, nil, {}, options)
384
+
385
+ raise DirectorError, 'Failed to fetch VMs information from director' if status != 200
386
+ end
372
387
 
373
- output.to_s.split("\n").map do |vm_state|
388
+ output = output.to_s.split("\n").map do |vm_state|
374
389
  JSON.parse(vm_state)
375
390
  end
391
+
392
+ output.flatten
376
393
  end
377
394
 
378
395
  def download_resource(id)
@@ -617,6 +634,13 @@ module Bosh
617
634
  status == 201
618
635
  end
619
636
 
637
+ def cleanup(config = {})
638
+ options = {}
639
+ options[:payload] = JSON.generate('config' => config)
640
+ options[:content_type] = 'application/json'
641
+ request_and_track(:post, '/cleanup', options)
642
+ end
643
+
620
644
  def post(uri, content_type = nil, payload = nil, headers = {}, options = {})
621
645
  request(:post, uri, content_type, payload, headers, options)
622
646
  end
@@ -2,8 +2,8 @@
2
2
  module Bosh::Cli::Command
3
3
  class Deployment < Base
4
4
  # bosh deployment
5
- usage "deployment"
6
- desc "Get/set current deployment"
5
+ usage 'deployment'
6
+ desc 'Get/set current deployment'
7
7
  def set_current(filename = nil)
8
8
  if filename.nil?
9
9
  show_current
@@ -19,34 +19,34 @@ module Bosh::Cli::Command
19
19
  manifest = load_yaml_file(manifest_filename)
20
20
 
21
21
  unless manifest.is_a?(Hash)
22
- err("Invalid manifest format")
22
+ err('Invalid manifest format')
23
23
  end
24
24
 
25
- unless manifest["target"].blank?
25
+ unless manifest['target'].blank?
26
26
  err(Bosh::Cli::Manifest::MANIFEST_TARGET_UPGRADE_NOTICE)
27
27
  end
28
28
 
29
- if manifest["director_uuid"].blank?
30
- err("Director UUID is not defined in deployment manifest")
29
+ if manifest['director_uuid'].blank?
30
+ err('Director UUID is not defined in deployment manifest')
31
31
  end
32
32
 
33
33
  if target
34
34
  old_director = Bosh::Cli::Client::Director.new(target, credentials, ca_cert: config.ca_cert)
35
- old_director_uuid = old_director.get_status["uuid"] rescue nil
35
+ old_director_uuid = old_director.get_status['uuid'] rescue nil
36
36
  else
37
37
  old_director_uuid = nil
38
38
  end
39
39
 
40
- new_director_uuid = manifest["director_uuid"]
40
+ new_director_uuid = manifest['director_uuid']
41
41
 
42
42
  if old_director_uuid != new_director_uuid
43
43
  new_target_url = config.resolve_alias(:target, new_director_uuid)
44
44
 
45
45
  if new_target_url.blank?
46
- err("This manifest references director with UUID " +
46
+ err('This manifest references director with UUID ' +
47
47
  "#{new_director_uuid}.\n" +
48
48
  "You've never targeted it before.\n" +
49
- "Please find your director IP or hostname and target it first.")
49
+ 'Please find your director IP or hostname and target it first.')
50
50
  end
51
51
 
52
52
  target_ca_cert = config.ca_cert(new_target_url)
@@ -56,10 +56,10 @@ module Bosh::Cli::Command
56
56
  status = new_director.get_status
57
57
 
58
58
  config.target = new_target_url
59
- config.target_name = status["name"]
60
- config.target_version = status["version"]
61
- config.target_uuid = status["uuid"]
62
- say("#{"WARNING!".make_red} Your target has been " +
59
+ config.target_name = status['name']
60
+ config.target_version = status['version']
61
+ config.target_uuid = status['uuid']
62
+ say("#{'WARNING!'.make_red} Your target has been " +
63
63
  "changed to `#{target.make_red}'!")
64
64
  end
65
65
 
@@ -69,20 +69,20 @@ module Bosh::Cli::Command
69
69
  end
70
70
 
71
71
  # bosh edit deployment
72
- usage "edit deployment"
73
- desc "Edit current deployment manifest"
72
+ usage 'edit deployment'
73
+ desc 'Edit current deployment manifest'
74
74
  def edit
75
75
  deployment_required
76
- editor = ENV['EDITOR'] || "vi"
76
+ editor = ENV['EDITOR'] || 'vi'
77
77
  system("#{editor} #{deployment}")
78
78
  end
79
79
 
80
80
  # bosh deploy
81
- usage "deploy"
82
- desc "Deploy according to the currently selected deployment manifest"
83
- option "--recreate", "Recreate all VMs in deployment"
84
- option "--redact-diff", "Redact manifest value changes in deployment"
85
- option "--skip-drain [job1,job2]", String, "Skip drain script for either specific or all jobs"
81
+ usage 'deploy'
82
+ desc 'Deploy according to the currently selected deployment manifest'
83
+ option '--recreate', 'Recreate all VMs in deployment'
84
+ option '--redact-diff', 'Redact manifest value changes in deployment'
85
+ option '--skip-drain [job1,job2]', String, 'Skip drain script for either specific or all jobs'
86
86
  def perform
87
87
  auth_required
88
88
  recreate = !!options[:recreate]
@@ -166,9 +166,9 @@ module Bosh::Cli::Command
166
166
  end
167
167
 
168
168
  # bosh delete deployment
169
- usage "delete deployment"
170
- desc "Delete deployment"
171
- option "--force", "ignore errors while deleting"
169
+ usage 'delete deployment'
170
+ desc 'Delete deployment'
171
+ option '--force', 'ignore errors while deleting'
172
172
  def delete(deployment_name)
173
173
  auth_required
174
174
  show_current_state(deployment_name)
@@ -180,7 +180,7 @@ module Bosh::Cli::Command
180
180
  say("THIS IS A VERY DESTRUCTIVE OPERATION AND IT CANNOT BE UNDONE!\n".make_red)
181
181
 
182
182
  unless confirmed?
183
- say("Canceled deleting deployment".make_green)
183
+ say('Canceled deleting deployment'.make_green)
184
184
  return
185
185
  end
186
186
 
@@ -193,44 +193,44 @@ module Bosh::Cli::Command
193
193
  end
194
194
 
195
195
  # bosh validate jobs
196
- usage "validate jobs"
197
- desc "Validates all jobs in the current release using current " +
198
- "deployment manifest as the source of properties"
196
+ usage 'validate jobs'
197
+ desc 'Validates all jobs in the current release using current ' +
198
+ 'deployment manifest as the source of properties'
199
199
  def validate_jobs
200
200
  check_if_release_dir
201
201
  manifest = prepare_deployment_manifest(:resolve_properties => true, show_state: true)
202
202
 
203
- if manifest.hash["release"]
204
- release_name = manifest.hash["release"]["name"]
205
- elsif manifest.hash["releases"].count > 1
206
- err("Cannot validate a deployment manifest with more than 1 release")
203
+ if manifest.hash['release']
204
+ release_name = manifest.hash['release']['name']
205
+ elsif manifest.hash['releases'].count > 1
206
+ err('Cannot validate a deployment manifest with more than 1 release')
207
207
  else
208
- release_name = manifest.hash["releases"].first["name"]
208
+ release_name = manifest.hash['releases'].first['name']
209
209
  end
210
210
  if release_name == release.dev_name || release_name == release.final_name
211
211
  nl
212
- say("Analyzing release directory...".make_yellow)
212
+ say('Analyzing release directory...'.make_yellow)
213
213
  else
214
- err("This release was not found in deployment manifest")
214
+ err('This release was not found in deployment manifest')
215
215
  end
216
216
 
217
- say(" - discovering packages")
217
+ say(' - discovering packages')
218
218
  packages = Bosh::Cli::Resources::Package.discover(work_dir)
219
219
 
220
- say(" - discovering jobs")
220
+ say(' - discovering jobs')
221
221
  jobs = Bosh::Cli::Resources::Job.discover(
222
222
  work_dir,
223
223
  # TODO: be sure this is covered in integration
224
224
  packages.map {|package| package['name']}
225
225
  )
226
226
 
227
- say(" - validating properties")
227
+ say(' - validating properties')
228
228
  validator = Bosh::Cli::JobPropertyValidator.new(jobs, manifest.hash)
229
229
  validator.validate
230
230
 
231
231
  unless validator.jobs_without_properties.empty?
232
232
  nl
233
- say("Legacy jobs (no properties defined): ".make_yellow)
233
+ say('Legacy jobs (no properties defined): '.make_yellow)
234
234
  validator.jobs_without_properties.sort { |a, b|
235
235
  a.name <=> b.name
236
236
  }.each do |job|
@@ -240,10 +240,10 @@ module Bosh::Cli::Command
240
240
 
241
241
  if validator.template_errors.empty?
242
242
  nl
243
- say("No template errors found".make_green)
243
+ say('No template errors found'.make_green)
244
244
  else
245
245
  nl
246
- say("Template errors: ".make_yellow)
246
+ say('Template errors: '.make_yellow)
247
247
  validator.template_errors.each do |error|
248
248
  nl
249
249
  path = Pathname.new(error.template_path)
@@ -256,15 +256,15 @@ module Bosh::Cli::Command
256
256
  end
257
257
 
258
258
  # bosh deployments
259
- usage "deployments"
260
- desc "Show the list of available deployments"
259
+ usage 'deployments'
260
+ desc 'Show the list of available deployments'
261
261
  def list
262
262
  auth_required
263
263
  show_current_state
264
264
 
265
265
  deployments = director.list_deployments
266
266
 
267
- err("No deployments") if deployments.empty?
267
+ err('No deployments') if deployments.empty?
268
268
 
269
269
  deployments_table = table do |t|
270
270
  t.headings = ['Name', 'Release(s)', 'Stemcell(s)', 'Cloud Config']
@@ -277,30 +277,30 @@ module Bosh::Cli::Command
277
277
  nl
278
278
  say(deployments_table)
279
279
  nl
280
- say("Deployments total: %d" % deployments.size)
280
+ say('Deployments total: %d' % deployments.size)
281
281
  end
282
282
 
283
283
  # bosh download manifest
284
- usage "download manifest"
285
- desc "Download deployment manifest locally"
284
+ usage 'download manifest'
285
+ desc 'Download deployment manifest locally'
286
286
  def download_manifest(deployment_name, save_as = nil)
287
287
  auth_required
288
288
  show_current_state(deployment_name)
289
289
 
290
290
  if save_as && File.exists?(save_as) &&
291
291
  !confirmed?("Overwrite `#{save_as}'?")
292
- err("Please choose another file to save the manifest to")
292
+ err('Please choose another file to save the manifest to')
293
293
  end
294
294
 
295
295
  deployment = director.get_deployment(deployment_name)
296
296
 
297
297
  if save_as
298
- File.open(save_as, "w") do |f|
299
- f.write(deployment["manifest"])
298
+ File.open(save_as, 'w') do |f|
299
+ f.write(deployment['manifest'])
300
300
  end
301
301
  say("Deployment manifest saved to `#{save_as}'".make_green)
302
302
  else
303
- say(deployment["manifest"])
303
+ say(deployment['manifest'])
304
304
  end
305
305
  end
306
306
 
@@ -314,20 +314,20 @@ module Bosh::Cli::Command
314
314
  say(config.deployment)
315
315
  end
316
316
  else
317
- err("Deployment not set")
317
+ err('Deployment not set')
318
318
  end
319
319
  end
320
320
 
321
321
  def row_for_deployments_table(deployment)
322
- stemcells = names_and_versions_from(deployment["stemcells"])
323
- releases = names_and_versions_from(deployment["releases"])
322
+ stemcells = names_and_versions_from(deployment['stemcells'])
323
+ releases = names_and_versions_from(deployment['releases'])
324
324
 
325
- [deployment["name"], releases.join("\n"), stemcells.join("\n"), deployment.fetch("cloud_config", "none")]
325
+ [deployment['name'], releases.join("\n"), stemcells.join("\n"), deployment.fetch('cloud_config', 'none')]
326
326
  end
327
327
 
328
328
  def names_and_versions_from(arr)
329
329
  arr.map { |hash|
330
- hash.values_at("name", "version").join("/")
330
+ hash.values_at('name', 'version').join('/')
331
331
  }.sort
332
332
  end
333
333
 
@@ -0,0 +1,63 @@
1
+ module Bosh::Cli::Command
2
+ class Disks < Base
3
+ usage 'disks'
4
+ desc 'List all orphaned disks in a deployment (requires --orphaned option)'
5
+ option '--orphaned', 'Return orphaned disks'
6
+
7
+ def list
8
+ auth_required
9
+ unless options[:orphaned]
10
+ err('Only `bosh disks --orphaned` is supported')
11
+ end
12
+
13
+ disks = sort(director.list_orphan_disks)
14
+ if disks.empty?
15
+ nl
16
+ say('No orphaned disks')
17
+ nl
18
+ return
19
+ end
20
+
21
+ disks_table = table do |table|
22
+ table.headings = 'Disk CID',
23
+ 'Size (MiB)',
24
+ 'Deployment Name',
25
+ 'Instance Name',
26
+ 'AZ',
27
+ 'Orphaned At'
28
+
29
+ disks.each do |disk|
30
+ table << [
31
+ disk['disk_cid'],
32
+ disk['size'] || 'n/a',
33
+ disk['deployment_name'],
34
+ disk['instance_name'],
35
+ disk['az'] || 'n/a',
36
+ disk['orphaned_at']
37
+ ]
38
+ end
39
+ end
40
+
41
+ nl
42
+ say(disks_table)
43
+ end
44
+
45
+ usage 'delete disk'
46
+ desc 'Deletes an orphaned disk'
47
+ def delete(orphan_disk_cid)
48
+ auth_required
49
+
50
+ status, result = director.delete_orphan_disk_by_disk_cid(orphan_disk_cid)
51
+
52
+ task_report(status, result, "Deleted orphaned disk #{orphan_disk_cid}")
53
+ end
54
+
55
+ private
56
+
57
+ def sort(disks)
58
+ disks.sort do |a, b|
59
+ Time.parse(b['orphaned_at']).to_i <=> Time.parse(a['orphaned_at']).to_i
60
+ end
61
+ end
62
+ end
63
+ end