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.
@@ -20,19 +20,19 @@ module Bosh::Cli
20
20
 
21
21
  def shell(*args)
22
22
  if args.size > 0
23
- job, index, command = JobCommandArgs.new(args).to_a
23
+ job, id, command = JobCommandArgs.new(args).to_a
24
24
  else
25
25
  command = ''
26
- job, index = prompt_for_job_and_index
26
+ job, id = prompt_for_job_and_index
27
27
  end
28
28
 
29
29
  manifest = prepare_deployment_manifest(show_state: true)
30
30
 
31
31
  if command.empty?
32
- setup_interactive_shell(manifest.name, job, index)
32
+ setup_interactive_shell(manifest.name, job, id)
33
33
  else
34
- say("Executing `#{command.join(' ')}' on #{job}/#{index}")
35
- perform_operation(:exec, manifest.name, job, index, command)
34
+ say("Executing `#{command.join(' ')}' on #{job}/#{id}")
35
+ perform_operation(:exec, manifest.name, job, id, command)
36
36
  end
37
37
  end
38
38
 
@@ -105,7 +105,7 @@ module Bosh::Cli
105
105
  # @param [String] job
106
106
  # @param [Integer] index
107
107
  # @param [optional,String] password
108
- def setup_ssh(deployment_name, job, index, password)
108
+ def setup_ssh(deployment_name, job, id, password)
109
109
 
110
110
  say("Target deployment is `#{deployment_name}'")
111
111
  nl
@@ -114,7 +114,7 @@ module Bosh::Cli
114
114
  ssh_session = SSHSession.new
115
115
 
116
116
  status, task_id = director.setup_ssh(
117
- deployment_name, job, index, ssh_session.user,
117
+ deployment_name, job, id, ssh_session.user,
118
118
  ssh_session.public_key, encrypt_password(password))
119
119
 
120
120
  unless status == :done
@@ -158,7 +158,7 @@ module Bosh::Cli
158
158
  nl
159
159
  say('Cleaning up ssh artifacts')
160
160
  ssh_session.cleanup
161
- indices = sessions.map { |session| session['index'] }
161
+ indices = sessions.map { |session| session['id'] || session['index'] }
162
162
  director.cleanup_ssh(deployment_name, job, "^#{ssh_session.user}$", indices)
163
163
  gateway.shutdown! if gateway
164
164
  end
@@ -166,17 +166,17 @@ module Bosh::Cli
166
166
 
167
167
  # @param [String] job Job name
168
168
  # @param [Integer] index Job index
169
- def setup_interactive_shell(deployment_name, job, index)
169
+ def setup_interactive_shell(deployment_name, job, id)
170
170
  password = options[:default_password] || ''
171
171
 
172
- setup_ssh(deployment_name, job, index, password) do |sessions, gateway, ssh_session|
172
+ setup_ssh(deployment_name, job, id, password) do |sessions, gateway, ssh_session|
173
173
  session = sessions.first
174
174
 
175
175
  unless session['status'] == 'success' && session['ip']
176
- err("Failed to set up SSH on #{job}/#{index}: #{session.inspect}")
176
+ err("Failed to set up SSH on #{job}/#{id}: #{session.inspect}")
177
177
  end
178
178
 
179
- say("Starting interactive shell on job #{job}/#{index}")
179
+ say("Starting interactive shell on job #{job}/#{id}")
180
180
 
181
181
  skip_strict_host_key_checking = options[:strict_host_key_checking] =~ (/(no|false)$/i) ?
182
182
  '-o StrictHostKeyChecking=no' : '-o StrictHostKeyChecking=yes'
@@ -6,21 +6,21 @@ module Bosh::Cli
6
6
  class Vm < Base
7
7
  usage 'vm resurrection'
8
8
  desc 'Enable/Disable resurrection for a given vm'
9
- def resurrection_state(job=nil, index=nil, new_state)
9
+ def resurrection_state(job=nil, index_or_id=nil, new_state)
10
10
  auth_required
11
11
 
12
- if job.nil? && index.nil?
12
+ if job.nil? && index_or_id.nil?
13
13
  resurrection = Resurrection.new(new_state)
14
14
  show_current_state
15
15
 
16
16
  director.change_vm_resurrection_for_all(resurrection.paused?)
17
17
  else
18
- job_args = JobCommandArgs.new([job, index])
19
- job, index, _ = job_args.to_a
18
+ job_args = JobCommandArgs.new([job, index_or_id])
19
+ job, index_or_id, _ = job_args.to_a
20
20
  resurrection = Resurrection.new(new_state)
21
21
 
22
22
  manifest = prepare_deployment_manifest(show_state: true)
23
- director.change_vm_resurrection(manifest.name, job, index, resurrection.paused?)
23
+ director.change_vm_resurrection(manifest.name, job, index_or_id, resurrection.paused?)
24
24
  end
25
25
  end
26
26
  end
@@ -34,15 +34,18 @@ module Bosh::Cli::Command
34
34
  return
35
35
  end
36
36
 
37
- sorted = vms.sort do |a, b|
38
- s = a['job_name'].to_s <=> b['job_name'].to_s
39
- s = a['index'].to_i <=> b['index'].to_i if s == 0
40
- s = a['resource_pool'].to_s <=> b['resource_pool'].to_s if s == 0
41
- s
42
- end
37
+ sorted = sort(vms)
38
+
39
+ has_az = vms.any? {|vm| vm.has_key? 'az' }
43
40
 
44
41
  vms_table = table do |t|
45
- headings = ['Job/index', 'State', 'Resource Pool', 'IPs']
42
+ headings = ['VM', 'State']
43
+
44
+ if has_az
45
+ headings << 'AZ'
46
+ end
47
+ headings += ['VM Type', 'IPs']
48
+
46
49
  if options[:details]
47
50
  headings += ['CID', 'Agent ID', 'Resurrection']
48
51
  end
@@ -58,12 +61,26 @@ module Bosh::Cli::Command
58
61
  t.headings = headings
59
62
 
60
63
  sorted.each do |vm|
61
- job = "#{vm['job_name'] || 'unknown'}/#{vm['index'] || 'unknown'}"
64
+ job_name = vm['job_name'] || 'unknown'
65
+ job_index = vm['index'] || 'unknown'
66
+ job = vm.has_key?('id') ? "#{job_name}/#{job_index} (#{vm['id']})" : "#{job_name}/#{job_index}"
62
67
  ips = Array(vm['ips']).join("\n")
63
68
  dns_records = Array(vm['dns']).join("\n")
64
69
  vitals = vm['vitals']
70
+ az = vm['az'].nil? ? 'n/a' : vm['az']
71
+
72
+ row = [job, vm['job_state']]
73
+ if has_az
74
+ row << az
75
+ end
76
+
77
+ if vm['resource_pool']
78
+ row << vm['resource_pool']
79
+ else
80
+ row << vm['vm_type']
81
+ end
65
82
 
66
- row = [job, vm['job_state'], vm['resource_pool'], ips]
83
+ row << ips
67
84
 
68
85
  if options[:details]
69
86
  row += [vm['vm_cid'], vm['agent_id'], vm['resurrection_paused'] ? 'paused' : 'active']
@@ -112,5 +129,15 @@ module Bosh::Cli::Command
112
129
  say('VMs total: %d' % vms.size)
113
130
  end
114
131
 
132
+ def sort(vms)
133
+ sorted = vms.sort do |a, b|
134
+ comparison = a['job_name'].to_s <=> b['job_name'].to_s
135
+ comparison = a['az'].to_s <=> b['az'].to_s if comparison == 0
136
+ comparison = a['index'].to_i <=> b['index'].to_i if comparison == 0
137
+ comparison
138
+ end
139
+ sorted
140
+ end
141
+
115
142
  end
116
143
  end
data/lib/cli/core_ext.rb CHANGED
@@ -5,7 +5,7 @@ module BoshExtensions
5
5
  def say(message, sep = "\n")
6
6
  return unless Bosh::Cli::Config.output && message
7
7
  message = message.dup.to_s
8
- sep = "" if message[-1..-1] == sep
8
+ sep = "" if message[-1] == sep
9
9
  Bosh::Cli::Config.output.print("#{$indent}#{message}#{sep}")
10
10
  end
11
11
 
@@ -129,14 +129,20 @@ module Bosh::Cli
129
129
  end
130
130
 
131
131
  def prompt_for_job_and_index
132
- jobs_list = jobs_and_indexes
133
-
134
- return jobs_list.first if jobs_list.size == 1
132
+ manifest = prepare_deployment_manifest
133
+ deployment_name = manifest.name
134
+ instances = director.fetch_vm_state(deployment_name, {}, false)
135
+ return [instances.first['job'], instances.first['index'] ] if instances.size == 1
135
136
 
136
137
  choose do |menu|
137
138
  menu.prompt = 'Choose an instance: '
138
- jobs_list.each do |job_name, index|
139
- menu.choice("#{job_name}/#{index}") { [job_name, index] }
139
+ instances.each do |instance|
140
+ job_name = instance['job']
141
+ index = instance['index']
142
+ id = instance['id']
143
+ name = "#{job_name}/#{index}"
144
+ name = "#{name} (#{id})" if id
145
+ menu.choice(name) { [job_name, index] }
140
146
  end
141
147
  end
142
148
  end
@@ -1,23 +1,19 @@
1
1
  module Bosh::Cli
2
- class JobCommandArgs < Struct.new(:job, :index, :args)
2
+ class JobCommandArgs < Struct.new(:job, :id, :args)
3
3
  def initialize(args)
4
4
  job = args.shift
5
5
  err('Please provide job name') if job.nil?
6
- job, index = job.split('/', 2)
6
+ job, id = job.split('/', 2)
7
7
 
8
- if index
9
- if index =~ /^\d+$/
10
- index = index.to_i
11
- else
12
- err('Invalid job index, integer number expected')
13
- end
14
- elsif args[0] =~ /^\d+$/
15
- index = args.shift.to_i
16
- end
8
+ id = args.shift if id.nil?
17
9
 
18
10
  self.job = job
19
- self.index = index
11
+ self.id = id
20
12
  self.args = args
21
13
  end
14
+
15
+ def index
16
+ id
17
+ end
22
18
  end
23
19
  end
data/lib/cli/job_state.rb CHANGED
@@ -30,19 +30,20 @@ module Bosh::Cli
30
30
  @options = options
31
31
  end
32
32
 
33
- def change(state, job, index, force)
34
- description = job_description(job, index)
33
+ def change(state, job, index_or_id, force)
34
+ job, index_or_id = job.split('/') if index_or_id.nil?
35
+ description = job_description(job, index_or_id)
35
36
  op_desc = OPERATION_DESCRIPTIONS.fetch(state) % description
36
37
  new_state = NEW_STATES.fetch(state)
37
38
  completion_desc = COMPLETION_DESCRIPTIONS.fetch(state) % description.make_green
38
- status, task_id = change_job_state(new_state, job, index, op_desc, force)
39
+ status, task_id = change_job_state(new_state, job, index_or_id, op_desc, force)
39
40
 
40
41
  [status, task_id, completion_desc]
41
42
  end
42
43
 
43
44
  private
44
45
 
45
- def change_job_state(new_state, job, index, operation_desc, force)
46
+ def change_job_state(new_state, job, index_or_id, operation_desc, force)
46
47
  @command.say("You are about to #{operation_desc.make_green}")
47
48
 
48
49
  check_if_manifest_changed(@manifest.hash, force)
@@ -52,7 +53,7 @@ module Bosh::Cli
52
53
 
53
54
  @command.nl
54
55
  @command.say("Performing `#{operation_desc}'...")
55
- @command.director.change_job_state(@manifest.name, @manifest.yaml, job, index, new_state, @options)
56
+ @command.director.change_job_state(@manifest.name, @manifest.yaml, job, index_or_id, new_state, @options)
56
57
  end
57
58
 
58
59
 
@@ -64,10 +65,9 @@ module Bosh::Cli
64
65
  end
65
66
  end
66
67
 
67
- def job_description(job, index)
68
+ def job_description(job, index_or_id)
68
69
  return 'all jobs' if job == '*'
69
- index ? "#{job}/#{index}" : "#{job}/*"
70
+ index_or_id ? "#{job}/#{index_or_id}" : "#{job}/*"
70
71
  end
71
-
72
72
  end
73
73
  end
@@ -5,9 +5,9 @@ module Bosh::Cli
5
5
  @ui = ui
6
6
  end
7
7
 
8
- def build_destination_path(job_name, job_index, directory)
8
+ def build_destination_path(job_name, job_index_or_id, directory)
9
9
  time = Time.now.strftime('%Y-%m-%d-%H-%M-%S')
10
- File.join(directory, "#{job_name}.#{job_index}.#{time}.tgz")
10
+ File.join(directory, "#{job_name}.#{job_index_or_id}.#{time}.tgz")
11
11
  end
12
12
 
13
13
  def download(resource_id, logs_destination_path)
@@ -59,7 +59,7 @@ module Bosh::Cli::Resources
59
59
  raise Bosh::Cli::InvalidJob, "'#{name}' is not a valid BOSH identifier"
60
60
  end
61
61
 
62
- unless spec['templates'].is_a?(Hash)
62
+ unless spec['templates'].nil? or spec['templates'].is_a?(Hash)
63
63
  raise Bosh::Cli::InvalidJob, "Incorrect templates section in '#{name}' job spec (Hash expected, #{spec['templates'].class} given)"
64
64
  end
65
65
 
@@ -138,7 +138,7 @@ module Bosh::Cli::Resources
138
138
  end
139
139
 
140
140
  def templates
141
- spec['templates'].keys
141
+ spec['templates'] ? spec['templates'].keys : []
142
142
  end
143
143
 
144
144
  def templates_dir
data/lib/cli/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  module Bosh
2
2
  module Cli
3
- VERSION = '1.3160.0'
3
+ VERSION = '1.3163.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.3160.0
4
+ version: 1.3163.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-12-18 00:00:00.000000000 Z
11
+ date: 2015-12-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.3160.0
19
+ version: 1.3163.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.3160.0
26
+ version: 1.3163.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.3160.0
33
+ version: 1.3163.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.3160.0
40
+ version: 1.3163.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.3160.0
131
+ version: 1.3163.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.3160.0
138
+ version: 1.3163.0
139
139
  - !ruby/object:Gem::Dependency
140
140
  name: net-ssh
141
141
  requirement: !ruby/object:Gem::Requirement
@@ -359,6 +359,7 @@ files:
359
359
  - lib/cli/commands/cloudcheck.rb
360
360
  - lib/cli/commands/complete.rb
361
361
  - lib/cli/commands/deployment.rb
362
+ - lib/cli/commands/disks.rb
362
363
  - lib/cli/commands/errand.rb
363
364
  - lib/cli/commands/help.rb
364
365
  - lib/cli/commands/instances.rb