bosh_cli 1.3160.0 → 1.3163.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/cli/base_command.rb +1 -1
- data/lib/cli/client/director.rb +38 -14
- data/lib/cli/commands/deployment.rb +57 -57
- data/lib/cli/commands/disks.rb +63 -0
- data/lib/cli/commands/instances.rb +99 -49
- data/lib/cli/commands/job_management.rb +11 -11
- data/lib/cli/commands/log_management.rb +9 -11
- data/lib/cli/commands/maintenance.rb +16 -40
- data/lib/cli/commands/snapshot.rb +14 -5
- data/lib/cli/commands/ssh.rb +12 -12
- data/lib/cli/commands/vm.rb +5 -5
- data/lib/cli/commands/vms.rb +36 -9
- data/lib/cli/core_ext.rb +1 -1
- data/lib/cli/deployment_helper.rb +11 -5
- data/lib/cli/job_command_args.rb +8 -12
- data/lib/cli/job_state.rb +8 -8
- data/lib/cli/logs_downloader.rb +2 -2
- data/lib/cli/resources/job.rb +2 -2
- data/lib/cli/version.rb +1 -1
- metadata +9 -8
@@ -1,5 +1,3 @@
|
|
1
|
-
# Copyright (c) 2009-2012 VMware, Inc.
|
2
|
-
|
3
1
|
module Bosh::Cli::Command
|
4
2
|
class Instances < Base
|
5
3
|
usage 'instances'
|
@@ -9,7 +7,7 @@ module Bosh::Cli::Command
|
|
9
7
|
option '--vitals', 'Return instance vitals information'
|
10
8
|
option '--ps', "Return instance process information"
|
11
9
|
option '--failing', "Only show failing ones"
|
12
|
-
def list
|
10
|
+
def list
|
13
11
|
auth_required
|
14
12
|
deployment_required
|
15
13
|
manifest = Bosh::Cli::Manifest.new(deployment, director)
|
@@ -30,7 +28,6 @@ module Bosh::Cli::Command
|
|
30
28
|
|
31
29
|
def show_deployment(name, options={})
|
32
30
|
instances = director.fetch_vm_state(name)
|
33
|
-
instance_count = instances.size
|
34
31
|
|
35
32
|
if instances.empty?
|
36
33
|
nl
|
@@ -39,43 +36,58 @@ module Bosh::Cli::Command
|
|
39
36
|
return
|
40
37
|
end
|
41
38
|
|
42
|
-
sorted = instances
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
39
|
+
sorted = sort(instances)
|
40
|
+
|
41
|
+
instances_table, row_count = construct_table_to_display(options, sorted)
|
42
|
+
|
43
|
+
if options[:failing] && row_count == 0
|
44
|
+
nl
|
45
|
+
say('No failing instances')
|
46
|
+
nl
|
47
|
+
return
|
47
48
|
end
|
48
49
|
|
50
|
+
legend = '(*) Bootstrap node'
|
51
|
+
|
52
|
+
nl
|
53
|
+
say(instances_table)
|
54
|
+
nl
|
55
|
+
say(legend)
|
56
|
+
nl
|
57
|
+
say('Instances total: %d' % row_count)
|
58
|
+
end
|
59
|
+
|
60
|
+
private
|
61
|
+
|
62
|
+
def construct_table_to_display(options, instances)
|
49
63
|
row_count = 0
|
50
|
-
has_disk_cid = instances
|
64
|
+
has_disk_cid = instances.any? {|instance| instance.has_key?('disk_cid') }
|
65
|
+
has_az = instances.any? {|instance| instance.has_key?('az') }
|
51
66
|
has_uptime = instances[0]['processes'] && instances[0]['processes'].size > 0 && instances[0]['processes'][0].has_key?('uptime')
|
52
67
|
has_cpu = instances[0]['processes'] && instances[0]['processes'].size > 0 && instances[0]['processes'][0].has_key?('cpu')
|
68
|
+
instance_count = instances.size
|
69
|
+
|
70
|
+
result = table do |display_table|
|
53
71
|
|
54
|
-
|
55
|
-
|
72
|
+
headings = ['Instance', 'State']
|
73
|
+
if has_az
|
74
|
+
headings << 'AZ'
|
75
|
+
end
|
76
|
+
headings += ['VM Type', 'IPs']
|
56
77
|
if options[:details]
|
78
|
+
headings << 'VM CID'
|
57
79
|
if has_disk_cid
|
58
|
-
headings += ['
|
59
|
-
else
|
60
|
-
headings += ['VM CID', 'Agent ID', 'Resurrection']
|
80
|
+
headings += ['Disk CID']
|
61
81
|
end
|
82
|
+
headings += ['Agent ID', 'Resurrection']
|
62
83
|
end
|
63
84
|
|
64
85
|
if options[:dns]
|
65
86
|
headings += ['DNS A records']
|
66
87
|
end
|
67
88
|
|
68
|
-
|
69
|
-
|
70
|
-
headings += [{:value => "Load\n(avg01, avg05, avg15)", :alignment => :center}]
|
71
|
-
headings += [{:value => "CPU %\n(User, Sys, Wait)", :alignment => :center}]
|
72
|
-
headings += ["CPU %"] if options[:ps] && has_cpu
|
73
|
-
headings += ['Memory Usage', 'Swap Usage']
|
74
|
-
headings += ["System\nDisk Usage", "Ephemeral\nDisk Usage", "Persistent\nDisk Usage"]
|
75
|
-
end
|
76
|
-
|
77
|
-
last_job = ''
|
78
|
-
sorted.each do |instance|
|
89
|
+
instances_to_show = []
|
90
|
+
instances.each do |instance|
|
79
91
|
if options[:failing]
|
80
92
|
if options[:ps]
|
81
93
|
instance['processes'].keep_if { |p| p['state'] != 'running' }
|
@@ -91,15 +103,56 @@ module Bosh::Cli::Command
|
|
91
103
|
end
|
92
104
|
end
|
93
105
|
|
106
|
+
instances_to_show << instance
|
107
|
+
end
|
108
|
+
|
109
|
+
if options[:vitals]
|
110
|
+
show_total = instance_count > 1 || instances_to_show[0]['processes'].size > 0
|
111
|
+
|
112
|
+
headings += [{:value => 'Uptime', :alignment => :center}] if options[:ps] && has_uptime && show_total
|
113
|
+
headings += [{:value => "Load\n(avg01, avg05, avg15)", :alignment => :center}]
|
114
|
+
headings += [{:value => "CPU %\n(User, Sys, Wait)", :alignment => :center}]
|
115
|
+
headings += ['CPU %'] if options[:ps] && has_cpu && show_total
|
116
|
+
headings += ['Memory Usage', 'Swap Usage']
|
117
|
+
headings += ["System\nDisk Usage", "Ephemeral\nDisk Usage", "Persistent\nDisk Usage"]
|
118
|
+
end
|
119
|
+
display_table.headings = headings
|
120
|
+
|
121
|
+
last_job = ''
|
122
|
+
instances_to_show.each do |instance|
|
94
123
|
row_count += 1
|
95
124
|
|
96
|
-
|
125
|
+
job_name = instance['job_name'] || 'unknown'
|
126
|
+
index = instance['index'] || 'unknown'
|
127
|
+
job = if instance.has_key?('id')
|
128
|
+
bootstrap = instance.fetch('bootstrap', false)
|
129
|
+
if bootstrap
|
130
|
+
"#{job_name}/#{index} (#{instance['id']})*"
|
131
|
+
else
|
132
|
+
"#{job_name}/#{index} (#{instance['id']})"
|
133
|
+
end
|
134
|
+
else
|
135
|
+
"#{job_name}/#{index}"
|
136
|
+
end
|
97
137
|
ips = Array(instance['ips']).join("\n")
|
98
138
|
dns_records = Array(instance['dns']).join("\n")
|
99
139
|
vitals = instance['vitals']
|
140
|
+
az = instance['az'].nil? ? 'n/a' : instance['az']
|
141
|
+
|
142
|
+
row = [job, instance['job_state']]
|
143
|
+
if has_az
|
144
|
+
row << az
|
145
|
+
end
|
100
146
|
|
101
|
-
|
102
|
-
|
147
|
+
if instance['resource_pool']
|
148
|
+
row << instance['resource_pool']
|
149
|
+
else
|
150
|
+
row << instance['vm_type']
|
151
|
+
end
|
152
|
+
|
153
|
+
row << ips
|
154
|
+
|
155
|
+
display_table << :separator if row_count.between?(2, instance_count) && (options[:ps] || last_job != '' && instance['job_name'] != last_job)
|
103
156
|
|
104
157
|
if options[:details]
|
105
158
|
if has_disk_cid
|
@@ -115,8 +168,8 @@ module Bosh::Cli::Command
|
|
115
168
|
|
116
169
|
if options[:vitals]
|
117
170
|
if vitals
|
118
|
-
cpu =
|
119
|
-
mem =
|
171
|
+
cpu = vitals['cpu']
|
172
|
+
mem = vitals['mem']
|
120
173
|
swap = vitals['swap']
|
121
174
|
disk = vitals['disk']
|
122
175
|
|
@@ -140,7 +193,7 @@ module Bosh::Cli::Command
|
|
140
193
|
else
|
141
194
|
9.times { row << 'n/a' }
|
142
195
|
end
|
143
|
-
|
196
|
+
display_table << row
|
144
197
|
|
145
198
|
if options[:ps] && instance['processes']
|
146
199
|
instance['processes'].each do |process|
|
@@ -149,6 +202,7 @@ module Bosh::Cli::Command
|
|
149
202
|
prow += ['','','']
|
150
203
|
prow << '' if has_disk_cid
|
151
204
|
end
|
205
|
+
prow << '' if has_az
|
152
206
|
if has_uptime
|
153
207
|
if process['uptime'] && process['uptime']['secs']
|
154
208
|
uptime = Integer(process['uptime']['secs'])
|
@@ -165,41 +219,37 @@ module Bosh::Cli::Command
|
|
165
219
|
prow << (process['cpu'] ? "#{process['cpu']['total']}%":'') if has_cpu
|
166
220
|
prow << (process['mem'] ? "#{process['mem']['percent']}% (#{pretty_size(process['mem']['kb'].to_i * 1024)})":'')
|
167
221
|
4.times { prow << '' }
|
168
|
-
|
222
|
+
display_table << prow
|
169
223
|
end
|
170
224
|
end
|
171
225
|
else
|
172
|
-
|
226
|
+
display_table << row
|
173
227
|
if options[:ps] && instance['processes']
|
174
228
|
instance['processes'].each do |process|
|
175
229
|
name = process['name']
|
176
230
|
state = process['state']
|
177
231
|
process_row = [" #{name}", "#{state}"]
|
178
232
|
(headings.size - 2).times { process_row << '' }
|
179
|
-
|
233
|
+
display_table << process_row
|
180
234
|
end
|
181
235
|
end
|
182
236
|
end
|
183
237
|
|
184
238
|
last_job = instance['job_name'] || 'unknown'
|
185
|
-
if instance['processes'].size == 0 && instance_count == 1
|
186
|
-
headings.delete_at(4)
|
187
|
-
headings.delete_at(6)
|
188
|
-
end
|
189
239
|
end
|
190
|
-
|
240
|
+
display_table.headings = headings
|
191
241
|
end
|
192
242
|
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
243
|
+
return result, row_count
|
244
|
+
end
|
245
|
+
|
246
|
+
def sort(instances)
|
247
|
+
instances.sort do |instance1, instance2|
|
248
|
+
comparison = instance1['job_name'].to_s <=> instance2['job_name'].to_s
|
249
|
+
comparison = instance1['az'].to_s <=> instance2['az'].to_s if comparison == 0
|
250
|
+
comparison = instance1['index'].to_i <=> instance2['index'].to_i if comparison == 0
|
251
|
+
comparison
|
198
252
|
end
|
199
|
-
nl
|
200
|
-
say(instances_table)
|
201
|
-
nl
|
202
|
-
say('Instances total: %d' % row_count )
|
203
253
|
end
|
204
254
|
end
|
205
255
|
end
|
@@ -11,8 +11,8 @@ module Bosh::Cli
|
|
11
11
|
usage 'start'
|
12
12
|
desc 'Start all jobs/job/instance'
|
13
13
|
option '--force', FORCE
|
14
|
-
def start_job(job = '*',
|
15
|
-
change_job_state(:start, job,
|
14
|
+
def start_job(job = '*', index_or_id = nil)
|
15
|
+
change_job_state(:start, job, index_or_id)
|
16
16
|
end
|
17
17
|
|
18
18
|
# bosh stop
|
@@ -22,11 +22,11 @@ module Bosh::Cli
|
|
22
22
|
option '--hard', 'Power off VM'
|
23
23
|
option '--force', FORCE
|
24
24
|
option '--skip-drain', SKIP_DRAIN
|
25
|
-
def stop_job(job = '*',
|
25
|
+
def stop_job(job = '*', index_or_id = nil)
|
26
26
|
if hard?
|
27
|
-
change_job_state(:detach, job,
|
27
|
+
change_job_state(:detach, job, index_or_id)
|
28
28
|
else
|
29
|
-
change_job_state(:stop, job,
|
29
|
+
change_job_state(:stop, job, index_or_id)
|
30
30
|
end
|
31
31
|
end
|
32
32
|
|
@@ -35,8 +35,8 @@ module Bosh::Cli
|
|
35
35
|
desc 'Restart all jobs/job/instance (soft stop + start)'
|
36
36
|
option '--force', FORCE
|
37
37
|
option '--skip-drain', SKIP_DRAIN
|
38
|
-
def restart_job(job = '*',
|
39
|
-
change_job_state(:restart, job,
|
38
|
+
def restart_job(job = '*', index_or_id = nil)
|
39
|
+
change_job_state(:restart, job, index_or_id)
|
40
40
|
end
|
41
41
|
|
42
42
|
# bosh recreate
|
@@ -44,17 +44,17 @@ module Bosh::Cli
|
|
44
44
|
desc 'Recreate all jobs/job/instance (hard stop + start)'
|
45
45
|
option '--force', FORCE
|
46
46
|
option '--skip-drain', SKIP_DRAIN
|
47
|
-
def recreate_job(job = '*',
|
48
|
-
change_job_state(:recreate, job,
|
47
|
+
def recreate_job(job = '*', index_or_id = nil)
|
48
|
+
change_job_state(:recreate, job, index_or_id)
|
49
49
|
end
|
50
50
|
|
51
51
|
private
|
52
52
|
|
53
|
-
def change_job_state(state, job,
|
53
|
+
def change_job_state(state, job, index_or_id = nil)
|
54
54
|
auth_required
|
55
55
|
manifest = parse_manifest(state)
|
56
56
|
job_state = JobState.new(self, manifest, skip_drain: skip_drain?)
|
57
|
-
status, task_id, completion_desc = job_state.change(state, job,
|
57
|
+
status, task_id, completion_desc = job_state.change(state, job, index_or_id, force?)
|
58
58
|
task_report(status, task_id, completion_desc)
|
59
59
|
end
|
60
60
|
|
@@ -11,28 +11,28 @@ module Bosh::Cli::Command
|
|
11
11
|
option '--dir destination_directory', String, 'download directory'
|
12
12
|
option '--all', 'deprecated'
|
13
13
|
|
14
|
-
def fetch_logs(job,
|
14
|
+
def fetch_logs(job, index_or_id)
|
15
15
|
auth_required
|
16
16
|
|
17
17
|
manifest = prepare_deployment_manifest(show_state: true)
|
18
|
-
check_arguments
|
18
|
+
check_arguments
|
19
19
|
|
20
20
|
logs_downloader = Bosh::Cli::LogsDownloader.new(director, self)
|
21
21
|
|
22
|
-
resource_id = fetch_log_resource_id(manifest.name,
|
23
|
-
logs_path = logs_downloader.build_destination_path(job,
|
22
|
+
resource_id = fetch_log_resource_id(manifest.name, index_or_id, job)
|
23
|
+
logs_path = logs_downloader.build_destination_path(job, index_or_id, options[:dir] || Dir.pwd)
|
24
24
|
logs_downloader.download(resource_id, logs_path)
|
25
25
|
end
|
26
26
|
|
27
|
-
|
28
|
-
|
27
|
+
private
|
28
|
+
|
29
|
+
def fetch_log_resource_id(deployment_name, index_or_id, job)
|
30
|
+
resource_id = director.fetch_logs(deployment_name, job, index_or_id, log_type, filters)
|
29
31
|
err('Error retrieving logs') if resource_id.nil?
|
30
32
|
|
31
33
|
resource_id
|
32
34
|
end
|
33
35
|
|
34
|
-
private
|
35
|
-
|
36
36
|
def agent_logs_wanted?
|
37
37
|
options[:agent]
|
38
38
|
end
|
@@ -41,11 +41,9 @@ module Bosh::Cli::Command
|
|
41
41
|
options[:job]
|
42
42
|
end
|
43
43
|
|
44
|
-
def check_arguments
|
44
|
+
def check_arguments
|
45
45
|
no_track_unsupported
|
46
46
|
|
47
|
-
err('Job index is expected to be a positive integer') if index !~ /^\d+$/
|
48
|
-
|
49
47
|
if agent_logs_wanted? && options[:only]
|
50
48
|
err('Custom filtering is not supported for agent logs')
|
51
49
|
end
|
@@ -1,5 +1,3 @@
|
|
1
|
-
# Copyright (c) 2009-2012 VMware, Inc.
|
2
|
-
|
3
1
|
module Bosh::Cli::Command
|
4
2
|
class Maintenance < Base
|
5
3
|
|
@@ -17,34 +15,18 @@ module Bosh::Cli::Command
|
|
17
15
|
|
18
16
|
remove_all = !!options[:all]
|
19
17
|
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
and #{stemcell_wording.make_green} of each stemcell will be kept.
|
33
|
-
|
34
|
-
Releases and stemcells that are in use will not be affected.
|
35
|
-
EOS
|
36
|
-
|
37
|
-
nl
|
38
|
-
say(desc)
|
39
|
-
nl
|
40
|
-
|
41
|
-
err('Cleanup canceled') unless confirmed?
|
42
|
-
|
43
|
-
nl
|
44
|
-
cleanup_stemcells(stemcells_to_keep)
|
45
|
-
nl
|
46
|
-
cleanup_releases(releases_to_keep)
|
47
|
-
|
18
|
+
num_releases_to_keep = remove_all ? 0 : RELEASES_TO_KEEP
|
19
|
+
num_stemcells_to_keep = remove_all ? 0 : STEMCELLS_TO_KEEP
|
20
|
+
|
21
|
+
begin
|
22
|
+
director.cleanup({'remove_all' => remove_all})
|
23
|
+
rescue Bosh::Cli::ResourceNotFound
|
24
|
+
# old directors won't have `cleanup` endpoint, therefore use legacy endpoints
|
25
|
+
nl
|
26
|
+
cleanup_stemcells(num_stemcells_to_keep)
|
27
|
+
nl
|
28
|
+
cleanup_releases(num_releases_to_keep)
|
29
|
+
end
|
48
30
|
nl
|
49
31
|
say('Cleanup complete'.make_green)
|
50
32
|
end
|
@@ -86,16 +68,10 @@ module Bosh::Cli::Command
|
|
86
68
|
|
87
69
|
director.list_releases.each do |release|
|
88
70
|
name = release['name']
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
select { |release_version| release_version['currently_deployed'] }.
|
94
|
-
map{ |release_version| release_version['version'] }
|
95
|
-
else
|
96
|
-
versions = release['versions']
|
97
|
-
currently_deployed = release['in_use']
|
98
|
-
end
|
71
|
+
versions = release['release_versions'].map { |release_version| release_version['version'] }
|
72
|
+
currently_deployed = release['release_versions']
|
73
|
+
.select { |release_version| release_version['currently_deployed'] }
|
74
|
+
.map { |release_version| release_version['version'] }
|
99
75
|
|
100
76
|
version_tuples = versions.map do |v|
|
101
77
|
{
|
@@ -1,5 +1,3 @@
|
|
1
|
-
# Copyright (c) 2009-2013 VMware, Inc.
|
2
|
-
|
3
1
|
module Bosh::Cli::Command
|
4
2
|
class Snapshot < Base
|
5
3
|
usage 'snapshots'
|
@@ -11,18 +9,29 @@ module Bosh::Cli::Command
|
|
11
9
|
|
12
10
|
snapshots = director.list_snapshots(deployment_name, job, index)
|
13
11
|
|
12
|
+
if snapshots.empty?
|
13
|
+
nl
|
14
|
+
say('No snapshots')
|
15
|
+
nl
|
16
|
+
return
|
17
|
+
end
|
18
|
+
|
14
19
|
sorted = snapshots.sort do |a, b|
|
15
20
|
s = a['job'].to_s <=> b['job'].to_s
|
16
|
-
|
21
|
+
if a['uuid']
|
22
|
+
s = a['uuid'].to_i <=> b['uuid'].to_i if s == 0
|
23
|
+
else
|
24
|
+
s = a['index'].to_i <=> b['index'].to_i if s == 0
|
25
|
+
end
|
17
26
|
s = a['created_at'].to_s <=> b['created_at'].to_s if s == 0
|
18
27
|
s
|
19
28
|
end
|
20
29
|
|
21
30
|
snapshots_table = table do |t|
|
22
|
-
t.headings = ['Job/
|
31
|
+
t.headings = ['Job/ID', 'Snapshot CID', 'Created at', 'Clean']
|
23
32
|
|
24
33
|
sorted.each do |snapshot|
|
25
|
-
job = "#{snapshot['job'] || 'unknown'}/#{snapshot['index'] || 'unknown'}"
|
34
|
+
job = "#{snapshot['job'] || 'unknown'}/#{snapshot['uuid'] || 'unknown'} (#{snapshot['index'] || 'unknown'})"
|
26
35
|
t << [job, snapshot['snapshot_cid'], snapshot['created_at'], snapshot['clean']]
|
27
36
|
end
|
28
37
|
end
|