bosh_cli 1.3033.0 → 1.3039.0

Sign up to get free protection for your applications and to get access to all the features.
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