bosh_cli 1.3033.0 → 1.3039.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: 72475f73ad031da70342f0bb1212875b8564c673
4
- data.tar.gz: 8d5c7f7e0180ad6de866b90310dcfbab33ede00f
3
+ metadata.gz: 39b0415133fae5b37514f70649163d3f856a9818
4
+ data.tar.gz: b21f0d0f0326a90915458b758c89316fbd069ade
5
5
  SHA512:
6
- metadata.gz: 98683233f763ab298a59fe043e8de16611b7143ba76c61ef61181bbbfbad2d2aad089a9ab2dc591242e671aa6975d401b998e557e1618d326a6553cc91f105db
7
- data.tar.gz: 060fe37ba625f7b1bac8c529fcb2217ed301e6a82b0087f359bccf16eefe1ed8db34dbdbc70c7df309ed208809f58186d5552871cb05a96187836d8f5c125916
6
+ metadata.gz: 0ea19816f2b52adbc1fdf1492488d3197910e0949e9ec67c896baa7edcb00dea59c111737c5eaa213b5478029c7f42413088996e5439b6a49e5b0d9b8031698e
7
+ data.tar.gz: 689a7cd6b64bd18ad5e2effba90d6357f2339f9ad54bf84c7406cf7768f5be5b263647d0fc0bc1fb0a91630722373c9ad563871c553d7419915a89c9daaa61c5
data/bin/bosh CHANGED
@@ -1,4 +1,7 @@
1
1
  #!/usr/bin/env ruby
2
+ require_relative '../bin/optionally_run_with_bundler'
3
+ OptionallyRunWithBundler.run(ENV)
4
+
2
5
  require 'benchmark'
3
6
  require_cli_time = Benchmark.realtime { require "cli" }
4
7
 
@@ -0,0 +1,36 @@
1
+ # #!/usr/bin/env ruby
2
+
3
+ class OptionallyRunWithBundler
4
+ def self.run(env)
5
+ if env['BOSH_USE_BUNDLER']
6
+ gemfile_path = File.join(File.dirname(__FILE__), 'run_bosh_with_bundler.Gemfile')
7
+
8
+ if File.exists?(gemfile_path)
9
+ rubyopt = [env['RUBYOPT']].compact
10
+
11
+ if rubyopt.empty? || rubyopt.first !~ /-rbundler\/setup/
12
+ rubyopt.unshift('-rbundler/setup')
13
+
14
+ env['BUNDLE_GEMFILE'] = gemfile_path
15
+ env['RUBYOPT'] = rubyopt.join(' ')
16
+
17
+ kernel_exec_current_command
18
+ end
19
+ else
20
+ require "fileutils"
21
+ FileUtils.mkdir_p(File.dirname(gemfile_path))
22
+ File.write(gemfile_path, "gem 'bosh_cli'")
23
+
24
+ print "\nOptimizing gem configuration...\n\n"
25
+
26
+ env['BUNDLE_GEMFILE'] = gemfile_path
27
+
28
+ require 'bundler/setup'
29
+ end
30
+ end
31
+ end
32
+
33
+ def self.kernel_exec_current_command
34
+ Kernel.exec($0, *ARGV)
35
+ end
36
+ end
@@ -137,6 +137,15 @@ module Bosh
137
137
  get_json("/releases/#{name}")
138
138
  end
139
139
 
140
+ def inspect_release(name, version)
141
+ url = "/releases/#{name}"
142
+
143
+ extras = []
144
+ extras << ['version', version]
145
+
146
+ get_json(add_query_string(url, extras))
147
+ end
148
+
140
149
  def match_packages(manifest_yaml)
141
150
  url = '/packages/matches'
142
151
  status, body = post(url, 'text/yaml', manifest_yaml)
@@ -216,13 +225,15 @@ module Bosh
216
225
  options = options.dup
217
226
 
218
227
  recreate = options.delete(:recreate)
228
+ skip_drain = options.delete(:skip_drain)
219
229
  options[:content_type] = 'text/yaml'
220
230
  options[:payload] = manifest_yaml
221
231
 
222
232
  url = '/deployments'
223
233
 
224
234
  extras = []
225
- extras << ['recreate', 'true'] if recreate
235
+ extras << ['recreate', 'true'] if recreate
236
+ extras << ['skip_drain', skip_drain] if skip_drain
226
237
 
227
238
  request_and_track(:post, add_query_string(url, extras), options)
228
239
  end
@@ -278,9 +289,12 @@ module Bosh
278
289
  job_name, index, new_state, options = {})
279
290
  options = options.dup
280
291
 
292
+ skip_drain = !!options.delete(:skip_drain)
293
+
281
294
  url = "/deployments/#{deployment_name}/jobs/#{job_name}"
282
295
  url += "/#{index}" if index
283
296
  url += "?state=#{new_state}"
297
+ url += "&skip_drain=true" if skip_drain
284
298
 
285
299
  options[:payload] = manifest_yaml
286
300
  options[:content_type] = 'text/yaml'
@@ -79,8 +79,9 @@ module Bosh::Cli::Command
79
79
  # bosh deploy
80
80
  usage "deploy"
81
81
  desc "Deploy according to the currently selected deployment manifest"
82
- option "--recreate", "recreate all VMs in deployment"
83
- option "--redact-diff", "redact manifest value changes in deployment"
82
+ option "--recreate", "Recreate all VMs in deployment"
83
+ option "--redact-diff", "Redact manifest value changes in deployment"
84
+ option "--skip-drain [job1,job2]", String, "Skip drain script for either specific or all jobs"
84
85
  def perform
85
86
  auth_required
86
87
  recreate = !!options[:recreate]
@@ -101,7 +102,16 @@ module Bosh::Cli::Command
101
102
  cancel_deployment
102
103
  end
103
104
 
104
- status, task_id = director.deploy(manifest.yaml, :recreate => recreate)
105
+ deploy_options = { recreate: recreate }
106
+
107
+ if options.has_key?(:skip_drain)
108
+ # when key is present but no jobs specified OptionParser
109
+ # adds a key with nil value, in that case we want to
110
+ # skip drain for all jobs
111
+ deploy_options[:skip_drain] = options[:skip_drain].nil? ? '*' : options[:skip_drain]
112
+ end
113
+
114
+ status, task_id = director.deploy(manifest.yaml, deploy_options)
105
115
 
106
116
  task_report(status, task_id, "Deployed `#{manifest.name.make_green}' to `#{target_name.make_green}'")
107
117
  end
@@ -0,0 +1,119 @@
1
+ # Copyright (c) 2009-2012 VMware, Inc.
2
+
3
+ module Bosh::Cli::Command
4
+ class Instances < Base
5
+ usage 'instances'
6
+ desc 'List all instances in a deployment'
7
+ option '--details', 'Return detailed instance information'
8
+ option '--dns', 'Return instance DNS A records'
9
+ option '--vitals', 'Return instance vitals information'
10
+ def list()
11
+ auth_required
12
+ deployment_required
13
+ manifest = Bosh::Cli::Manifest.new(deployment, director)
14
+ manifest.load
15
+ deployment_name = manifest.name
16
+
17
+ deps = director.list_deployments
18
+ selected = deps.select { |dep| dep['name'] == deployment_name }
19
+ err("The deployment '#{deployment_name}' doesn't exist") if selected.size == 0
20
+
21
+ show_current_state(deployment_name)
22
+ no_track_unsupported
23
+
24
+ if deployment_name.nil?
25
+ else
26
+ show_deployment deployment_name, options
27
+ end
28
+ end
29
+
30
+ def show_deployment(name, options={})
31
+ instances = director.fetch_vm_state(name)
32
+
33
+ if instances.empty?
34
+ nl
35
+ say('No instances')
36
+ nl
37
+ return
38
+ end
39
+
40
+ sorted = instances.sort do |a, b|
41
+ s = a['job_name'].to_s <=> b['job_name'].to_s
42
+ s = a['index'].to_i <=> b['index'].to_i if s == 0
43
+ s = a['resource_pool'].to_s <=> b['resource_pool'].to_s if s == 0
44
+ s
45
+ end
46
+
47
+ instances_table = table do |t|
48
+ headings = ['Instance', 'State', 'Resource Pool', 'IPs']
49
+ if options[:details]
50
+ headings += ['CID', 'Agent ID', 'Resurrection']
51
+ end
52
+ if options[:dns]
53
+ headings += ['DNS A records']
54
+ end
55
+ if options[:vitals]
56
+ headings += [{:value => "Load\n(avg01, avg05, avg15)", :alignment => :center}]
57
+ headings += ["CPU\nUser", "CPU\nSys", "CPU\nWait"]
58
+ headings += ['Memory Usage', 'Swap Usage']
59
+ headings += ["System\nDisk Usage", "Ephemeral\nDisk Usage", "Persistent\nDisk Usage"]
60
+ end
61
+ t.headings = headings
62
+
63
+ sorted.each do |instance|
64
+ job = "#{instance['job_name'] || 'unknown'}/#{instance['index'] || 'unknown'}"
65
+ ips = Array(instance['ips']).join("\n")
66
+ dns_records = Array(instance['dns']).join("\n")
67
+ vitals = instance['vitals']
68
+
69
+ row = [job, instance['job_state'], instance['resource_pool'], ips]
70
+
71
+ if options[:details]
72
+ row += [instance['vm_cid'], instance['agent_id'], instance['resurrection_paused'] ? 'paused' : 'active']
73
+ end
74
+
75
+ if options[:dns]
76
+ row += [dns_records.empty? ? 'n/a' : dns_records]
77
+ end
78
+
79
+ if options[:vitals]
80
+ if vitals
81
+ cpu = vitals['cpu']
82
+ mem = vitals['mem']
83
+ swap = vitals['swap']
84
+ disk = vitals['disk']
85
+
86
+ row << vitals['load'].join(', ')
87
+ row << "#{cpu['user']}%"
88
+ row << "#{cpu['sys']}%"
89
+ row << "#{cpu['wait']}%"
90
+ row << "#{mem['percent']}% (#{pretty_size(mem['kb'].to_i * 1024)})"
91
+ row << "#{swap['percent']}% (#{pretty_size(swap['kb'].to_i * 1024)})"
92
+ row << "#{disk['system']['percent']}%"
93
+ if disk['ephemeral'].nil?
94
+ row << 'n/a'
95
+ else
96
+ row << "#{disk['ephemeral']['percent']}%"
97
+ end
98
+ if disk['persistent'].nil?
99
+ row << 'n/a'
100
+ else
101
+ row << "#{disk['persistent']['percent']}%"
102
+ end
103
+ else
104
+ 9.times { row << 'n/a' }
105
+ end
106
+ end
107
+
108
+ t << row
109
+ end
110
+ end
111
+
112
+ nl
113
+ say(instances_table)
114
+ nl
115
+ say('Instances total: %d' % instances.size)
116
+ end
117
+
118
+ end
119
+ end
@@ -6,6 +6,7 @@ module Bosh::Cli
6
6
  module Command
7
7
  class JobManagement < Base
8
8
  FORCE = 'Proceed even when there are other manifest changes'
9
+ SKIP_DRAIN = 'Skip running drain script'
9
10
 
10
11
  # bosh start
11
12
  usage 'start'
@@ -21,6 +22,7 @@ module Bosh::Cli
21
22
  option '--soft', 'Stop process only'
22
23
  option '--hard', 'Power off VM'
23
24
  option '--force', FORCE
25
+ option '--skip-drain', SKIP_DRAIN
24
26
  def stop_job(job, index = nil)
25
27
  if hard?
26
28
  change_job_state(:detach, job, index)
@@ -33,6 +35,7 @@ module Bosh::Cli
33
35
  usage 'restart'
34
36
  desc 'Restart job/instance (soft stop + start)'
35
37
  option '--force', FORCE
38
+ option '--skip-drain', SKIP_DRAIN
36
39
  def restart_job(job, index = nil)
37
40
  change_job_state(:restart, job, index)
38
41
  end
@@ -41,6 +44,7 @@ module Bosh::Cli
41
44
  usage 'recreate'
42
45
  desc 'Recreate job/instance (hard stop + start)'
43
46
  option '--force', FORCE
47
+ option '--skip-drain', SKIP_DRAIN
44
48
  def recreate_job(job, index = nil)
45
49
  change_job_state(:recreate, job, index)
46
50
  end
@@ -53,21 +57,25 @@ module Bosh::Cli
53
57
 
54
58
  index = valid_index_for(manifest.hash, job, index)
55
59
  vm_state = VmState.new(self, manifest, force?)
56
- job_state = JobState.new(self, vm_state)
60
+ job_state = JobState.new(self, vm_state, skip_drain: skip_drain?)
57
61
  status, task_id, completion_desc = job_state.change(state, job, index)
58
62
  task_report(status, task_id, completion_desc)
59
63
  end
60
64
 
61
65
  def hard?
62
- options[:hard]
66
+ !!options[:hard]
63
67
  end
64
68
 
65
69
  def soft?
66
- options[:soft]
70
+ !!options[:soft]
67
71
  end
68
72
 
69
73
  def force?
70
- options[:force]
74
+ !!options[:force]
75
+ end
76
+
77
+ def skip_drain?
78
+ !!options[:skip_drain]
71
79
  end
72
80
 
73
81
  def parse_manifest(operation, job)
@@ -0,0 +1,73 @@
1
+ module Bosh::Cli::Command
2
+ module Release
3
+ class InspectRelease < Base
4
+
5
+ usage 'inspect release'
6
+ desc 'List all jobs, packages, and compiled packages associated with a release. Release must be in the form {name}/{version}'
7
+ def inspect(release)
8
+ auth_required
9
+ show_current_state
10
+
11
+ release = Bosh::Cli::NameVersionPair.parse(release)
12
+
13
+ response = director.inspect_release(release.name, release.version)
14
+ if !reasonable_response?(response)
15
+ raise Bosh::Cli::DirectorError,
16
+ 'Response from director does not include expected information. Is your director version 1.3034.0 or newer?'
17
+ end
18
+
19
+ templates_table = build_jobs_table(response)
20
+ say(templates_table.render)
21
+ nl
22
+
23
+ packages_table = build_packages_table(response)
24
+ say(packages_table.render)
25
+ end
26
+
27
+ def build_jobs_table(release)
28
+ table do |t|
29
+ t.headings = 'Job', 'Fingerprint', 'Blobstore ID', 'SHA1'
30
+ release['jobs'].each do |job|
31
+ row = [
32
+ job['name'].make_yellow,
33
+ job['fingerprint'].make_yellow,
34
+ job['blobstore_id'].make_yellow,
35
+ job['sha1'].make_yellow]
36
+ t << row
37
+ end
38
+ end
39
+ end
40
+
41
+ def build_packages_table(release)
42
+ table do |t|
43
+ t.headings = 'Package', 'Fingerprint', 'Compiled For', 'Blobstore ID', 'SHA1'
44
+ release['packages'].each do |package|
45
+ src_pkg_row = [
46
+ package['name'].make_yellow,
47
+ package['fingerprint'].make_yellow,
48
+ package['blobstore_id'].nil? ? '(no source)'.make_red : '(source)'.make_yellow,
49
+ package['blobstore_id'].nil? ? "" : package['blobstore_id'].make_yellow,
50
+ package['sha1'].nil? ? "" : package['sha1'].make_yellow]
51
+ t << src_pkg_row
52
+
53
+ package['compiled_packages'].each do |compiled|
54
+ comp_pkg_row = [
55
+ '',
56
+ '',
57
+ compiled['stemcell'].make_green,
58
+ compiled['blobstore_id'].make_green,
59
+ compiled['sha1'].make_green]
60
+ t << comp_pkg_row
61
+ end
62
+ end
63
+ end
64
+ end
65
+
66
+ # older directors return an incorrect response for the request we make (they ignore the version parameter).
67
+ # this method checks for that condition so we can give a helpful error message.
68
+ def reasonable_response?(response)
69
+ !response.has_key?('versions')
70
+ end
71
+ end
72
+ end
73
+ end
data/lib/cli/job_state.rb CHANGED
@@ -24,9 +24,10 @@ module Bosh::Cli
24
24
  recreate: '%s has been recreated'
25
25
  }
26
26
 
27
- def initialize(command, vm_state)
27
+ def initialize(command, vm_state, options)
28
28
  @command = command
29
29
  @vm_state = vm_state
30
+ @options = options
30
31
  end
31
32
 
32
33
  def change(state, job, index)
@@ -48,7 +49,7 @@ module Bosh::Cli
48
49
  end
49
50
 
50
51
  def perform_vm_state_change(job, index, new_state, operation_desc)
51
- vm_state.change(job, index, new_state, operation_desc)
52
+ vm_state.change(job, index, new_state, operation_desc, @options)
52
53
  end
53
54
  end
54
55
  end
@@ -30,7 +30,7 @@ module Bosh::Cli::TaskTracking
30
30
  end
31
31
 
32
32
  def update_with_event(event)
33
- new_task = Task.new(self, event['task'], event['progress'], @callbacks)
33
+ new_task = Task.new(self, event['task'], event['index'], event['progress'], @callbacks)
34
34
  unless found_task = @tasks.find { |s| s == new_task }
35
35
  found_task = new_task
36
36
  @tasks << new_task
@@ -112,14 +112,15 @@ module Bosh::Cli::TaskTracking
112
112
  end
113
113
 
114
114
  class Task
115
- attr_reader :stage, :name, :state, :progress, :error
115
+ attr_reader :stage, :name, :index, :state, :progress, :error
116
116
 
117
117
  extend Forwardable
118
118
  def_delegators :@total_duration, :duration, :started_at, :finished_at
119
119
 
120
- def initialize(stage, name, progress, callbacks)
120
+ def initialize(stage, name, index, progress, callbacks)
121
121
  @stage = stage
122
122
  @name = name
123
+ @index = index
123
124
  @progress = progress
124
125
  @callbacks = callbacks
125
126
  @total_duration = TotalDuration.new
@@ -138,7 +139,7 @@ module Bosh::Cli::TaskTracking
138
139
 
139
140
  def ==(other)
140
141
  return false unless other.is_a?(Task)
141
- [stage, name] == [other.stage, other.name]
142
+ [stage, index, name] == [other.stage, other.index, other.name]
142
143
  end
143
144
 
144
145
  def done?
data/lib/cli/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  module Bosh
2
2
  module Cli
3
- VERSION = '1.3033.0'
3
+ VERSION = '1.3039.0'
4
4
  end
5
5
  end
data/lib/cli/vm_state.rb CHANGED
@@ -6,7 +6,7 @@ module Bosh::Cli
6
6
  @force = force
7
7
  end
8
8
 
9
- def change(job, index, new_state, operation_desc)
9
+ def change(job, index, new_state, operation_desc, options = {})
10
10
  command.say("You are about to #{operation_desc.make_green}")
11
11
 
12
12
  check_if_manifest_changed(@manifest.hash)
@@ -17,7 +17,14 @@ module Bosh::Cli
17
17
 
18
18
  command.nl
19
19
  command.say("Performing `#{operation_desc}'...")
20
- command.director.change_job_state(@manifest.name, @manifest.yaml, job, index, new_state)
20
+ command.director.change_job_state(
21
+ @manifest.name,
22
+ @manifest.yaml,
23
+ job,
24
+ index,
25
+ new_state,
26
+ options
27
+ )
21
28
  end
22
29
 
23
30
  private
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.3033.0
4
+ version: 1.3039.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-08-04 00:00:00.000000000 Z
11
+ date: 2015-08-13 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.3033.0
19
+ version: 1.3039.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.3033.0
26
+ version: 1.3039.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.3033.0
33
+ version: 1.3039.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.3033.0
40
+ version: 1.3039.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.3033.0
131
+ version: 1.3039.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.3033.0
138
+ version: 1.3039.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
- 2c1c13
309
+ e8cf4e
310
310
  email: support@cloudfoundry.com
311
311
  executables:
312
312
  - bosh
@@ -314,6 +314,7 @@ extensions: []
314
314
  extra_rdoc_files: []
315
315
  files:
316
316
  - bin/bosh
317
+ - bin/optionally_run_with_bundler.rb
317
318
  - lib/cli.rb
318
319
  - lib/cli/archive_builder.rb
319
320
  - lib/cli/archive_repository.rb
@@ -351,6 +352,7 @@ files:
351
352
  - lib/cli/commands/export_compiled_packages.rb
352
353
  - lib/cli/commands/help.rb
353
354
  - lib/cli/commands/import_compiled_packages.rb
355
+ - lib/cli/commands/instances.rb
354
356
  - lib/cli/commands/job.rb
355
357
  - lib/cli/commands/job_management.rb
356
358
  - lib/cli/commands/job_rename.rb
@@ -366,6 +368,7 @@ files:
366
368
  - lib/cli/commands/release/export_release.rb
367
369
  - lib/cli/commands/release/finalize_release.rb
368
370
  - lib/cli/commands/release/init_release.rb
371
+ - lib/cli/commands/release/inspect_release.rb
369
372
  - lib/cli/commands/release/list_releases.rb
370
373
  - lib/cli/commands/release/reset_release.rb
371
374
  - lib/cli/commands/release/upload_release.rb