bosh_cli 1.3202.0 → 1.3213.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/client/director.rb +36 -13
- data/lib/cli/commands/deployment.rb +4 -65
- data/lib/cli/commands/deployment_diff.rb +2 -1
- data/lib/cli/commands/release/inspect_release.rb +18 -6
- data/lib/cli/commands/runtime_config.rb +34 -0
- data/lib/cli/commands/task.rb +6 -4
- data/lib/cli/errors.rb +1 -0
- data/lib/cli/job_property_validator.rb +5 -5
- data/lib/cli/runtime_config.rb +10 -0
- data/lib/cli/version.rb +1 -1
- metadata +10 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4d71ef21dc5730f51080af4a6a321428c098779d
|
4
|
+
data.tar.gz: 6358116553ae88c116dccf01e748a50c41f20b53
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d1166bcbe2ef187d5d72836935a281b4220e831187e8e1d5ee816fad44e6857b3faf82c667b61732d5eb6e66677173a0704b8b5ab8de5d9ecd24a8bae4922e9c
|
7
|
+
data.tar.gz: e1326d025425c8a866cfbe9b9612e919d8bfe19466be13a9f986b2746b0b2cca6fccf0bf52be0fe3fc2089ee3f684376467bb2d54fc02a82b4e14759f725f8ff
|
data/lib/cli/client/director.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
require 'cli/core_ext'
|
2
2
|
require 'cli/errors'
|
3
3
|
require 'cli/cloud_config'
|
4
|
+
require 'cli/runtime_config'
|
4
5
|
|
5
6
|
require 'json'
|
6
7
|
require 'httpclient'
|
@@ -127,12 +128,20 @@ module Bosh
|
|
127
128
|
get_json("/deployments/#{deployment_name}/errands")
|
128
129
|
end
|
129
130
|
|
130
|
-
def list_running_tasks(verbose = 1)
|
131
|
-
|
131
|
+
def list_running_tasks(verbose = 1, deployment_name = nil)
|
132
|
+
if deployment_name
|
133
|
+
get_json("/tasks?state=processing,cancelling,queued&verbose=#{verbose}&deployment=#{deployment_name}")
|
134
|
+
else
|
135
|
+
get_json("/tasks?state=processing,cancelling,queued&verbose=#{verbose}")
|
136
|
+
end
|
132
137
|
end
|
133
138
|
|
134
|
-
def list_recent_tasks(count = 30, verbose = 1)
|
135
|
-
|
139
|
+
def list_recent_tasks(count = 30, verbose = 1, deployment_name = nil)
|
140
|
+
if deployment_name
|
141
|
+
get_json("/tasks?limit=#{count}&verbose=#{verbose}&deployment=#{deployment_name}")
|
142
|
+
else
|
143
|
+
get_json("/tasks?limit=#{count}&verbose=#{verbose}")
|
144
|
+
end
|
136
145
|
end
|
137
146
|
|
138
147
|
def get_release(name)
|
@@ -266,12 +275,15 @@ module Bosh
|
|
266
275
|
request_and_track(:post, add_query_string(url, extras), options)
|
267
276
|
end
|
268
277
|
|
269
|
-
def diff_deployment(name, manifest_yaml)
|
270
|
-
|
278
|
+
def diff_deployment(name, manifest_yaml, no_redact = false)
|
279
|
+
redact_param = no_redact ? '?redact=false' : ''
|
280
|
+
uri = "/deployments/#{name}/diff#{redact_param}"
|
281
|
+
status, body = post(uri, 'text/yaml', manifest_yaml)
|
282
|
+
|
271
283
|
if status == 200
|
272
284
|
JSON.parse(body)
|
273
285
|
else
|
274
|
-
err(parse_error_message(status, body))
|
286
|
+
err(parse_error_message(status, body, uri))
|
275
287
|
end
|
276
288
|
end
|
277
289
|
|
@@ -545,12 +557,7 @@ module Bosh
|
|
545
557
|
body = nil if response_code == 416
|
546
558
|
end
|
547
559
|
|
548
|
-
|
549
|
-
if response_code == 204 && log_type == 'cpi'
|
550
|
-
get_task_output(task_id, offset, 'soap')
|
551
|
-
else
|
552
|
-
[body, new_offset]
|
553
|
-
end
|
560
|
+
[body, new_offset]
|
554
561
|
end
|
555
562
|
|
556
563
|
def cancel_task(task_id)
|
@@ -669,6 +676,22 @@ module Bosh
|
|
669
676
|
status == 201
|
670
677
|
end
|
671
678
|
|
679
|
+
def get_runtime_config
|
680
|
+
_, runtime_configs = get_json_with_status('/runtime_configs?limit=1')
|
681
|
+
latest = runtime_configs.first
|
682
|
+
|
683
|
+
if !latest.nil?
|
684
|
+
Bosh::Cli::RuntimeConfig.new(
|
685
|
+
properties: latest["properties"],
|
686
|
+
created_at: latest["created_at"])
|
687
|
+
end
|
688
|
+
end
|
689
|
+
|
690
|
+
def update_runtime_config(runtime_config_yaml)
|
691
|
+
status, _ = post('/runtime_configs', 'text/yaml', runtime_config_yaml)
|
692
|
+
status == 201
|
693
|
+
end
|
694
|
+
|
672
695
|
def cleanup(config = {})
|
673
696
|
options = {}
|
674
697
|
options[:payload] = JSON.generate('config' => config)
|
@@ -82,13 +82,15 @@ module Bosh::Cli::Command
|
|
82
82
|
desc 'Deploy according to the currently selected deployment manifest'
|
83
83
|
option '--recreate', 'Recreate all VMs in deployment'
|
84
84
|
option '--redact-diff', 'Redact manifest value changes in deployment'
|
85
|
+
option '--no-redact', 'do not redact'
|
85
86
|
option '--skip-drain [job1,job2]', String, 'Skip drain script for either specific or all jobs'
|
86
87
|
def perform
|
87
88
|
auth_required
|
88
89
|
recreate = !!options[:recreate]
|
89
90
|
redact_diff = !!options[:redact_diff]
|
90
|
-
|
91
|
+
no_redact = !options[:no_redact].nil?
|
91
92
|
manifest = build_manifest
|
93
|
+
|
92
94
|
if manifest.hash['releases']
|
93
95
|
manifest.hash['releases'].each do |release|
|
94
96
|
if release['url'].blank?
|
@@ -138,7 +140,7 @@ module Bosh::Cli::Command
|
|
138
140
|
|
139
141
|
manifest = prepare_deployment_manifest(resolve_properties: true, show_state: true)
|
140
142
|
|
141
|
-
context = DeploymentDiff.new(director, manifest).print({redact_diff: redact_diff})
|
143
|
+
context = DeploymentDiff.new(director, manifest).print({redact_diff: redact_diff, no_redact: no_redact})
|
142
144
|
say('Please review all changes carefully'.make_yellow) if interactive?
|
143
145
|
|
144
146
|
header('Deploying')
|
@@ -188,69 +190,6 @@ module Bosh::Cli::Command
|
|
188
190
|
end
|
189
191
|
end
|
190
192
|
|
191
|
-
# bosh validate jobs
|
192
|
-
usage 'validate jobs'
|
193
|
-
desc 'Validates all jobs in the current release using current ' +
|
194
|
-
'deployment manifest as the source of properties'
|
195
|
-
def validate_jobs
|
196
|
-
check_if_release_dir
|
197
|
-
manifest = prepare_deployment_manifest(:resolve_properties => true, show_state: true)
|
198
|
-
|
199
|
-
if manifest.hash['release']
|
200
|
-
release_name = manifest.hash['release']['name']
|
201
|
-
elsif manifest.hash['releases'].count > 1
|
202
|
-
err('Cannot validate a deployment manifest with more than 1 release')
|
203
|
-
else
|
204
|
-
release_name = manifest.hash['releases'].first['name']
|
205
|
-
end
|
206
|
-
if release_name == release.dev_name || release_name == release.final_name
|
207
|
-
nl
|
208
|
-
say('Analyzing release directory...'.make_yellow)
|
209
|
-
else
|
210
|
-
err('This release was not found in deployment manifest')
|
211
|
-
end
|
212
|
-
|
213
|
-
say(' - discovering packages')
|
214
|
-
packages = Bosh::Cli::Resources::Package.discover(work_dir)
|
215
|
-
|
216
|
-
say(' - discovering jobs')
|
217
|
-
jobs = Bosh::Cli::Resources::Job.discover(
|
218
|
-
work_dir,
|
219
|
-
# TODO: be sure this is covered in integration
|
220
|
-
packages.map {|package| package['name']}
|
221
|
-
)
|
222
|
-
|
223
|
-
say(' - validating properties')
|
224
|
-
validator = Bosh::Cli::JobPropertyValidator.new(jobs, manifest.hash)
|
225
|
-
validator.validate
|
226
|
-
|
227
|
-
unless validator.jobs_without_properties.empty?
|
228
|
-
nl
|
229
|
-
say('Legacy jobs (no properties defined): '.make_yellow)
|
230
|
-
validator.jobs_without_properties.sort { |a, b|
|
231
|
-
a.name <=> b.name
|
232
|
-
}.each do |job|
|
233
|
-
say(" - #{job.name}")
|
234
|
-
end
|
235
|
-
end
|
236
|
-
|
237
|
-
if validator.template_errors.empty?
|
238
|
-
nl
|
239
|
-
say('No template errors found'.make_green)
|
240
|
-
else
|
241
|
-
nl
|
242
|
-
say('Template errors: '.make_yellow)
|
243
|
-
validator.template_errors.each do |error|
|
244
|
-
nl
|
245
|
-
path = Pathname.new(error.template_path)
|
246
|
-
rel_path = path.relative_path_from(Pathname.new(release.dir))
|
247
|
-
|
248
|
-
say(" - #{rel_path}:")
|
249
|
-
say(" line #{error.line}:".make_yellow + " #{error.exception.to_s}")
|
250
|
-
end
|
251
|
-
end
|
252
|
-
end
|
253
|
-
|
254
193
|
# bosh deployments
|
255
194
|
usage 'deployments'
|
256
195
|
desc 'Show the list of available deployments'
|
@@ -7,7 +7,8 @@ module Bosh::Cli::Command
|
|
7
7
|
|
8
8
|
def print(options)
|
9
9
|
begin
|
10
|
-
|
10
|
+
no_redact = options[:no_redact]
|
11
|
+
changes = @director.diff_deployment(@manifest.name, @manifest.yaml, no_redact)
|
11
12
|
diff = changes['diff']
|
12
13
|
|
13
14
|
header('Detecting deployment changes')
|
@@ -24,17 +24,29 @@ module Bosh::Cli::Command
|
|
24
24
|
say(packages_table.render)
|
25
25
|
end
|
26
26
|
|
27
|
+
private
|
28
|
+
|
27
29
|
def build_jobs_table(release)
|
28
30
|
table do |t|
|
29
|
-
t.headings = 'Job', 'Fingerprint', 'Blobstore ID', 'SHA1'
|
30
|
-
|
31
|
+
t.headings = 'Job', 'Fingerprint', 'Blobstore ID', 'SHA1', 'Links Consumed', 'Links Provided'
|
32
|
+
|
33
|
+
release['jobs'].each_with_index do |job, index|
|
34
|
+
|
35
|
+
consumed_links = (job['consumes'].nil? ? '' : YAML.dump(job['consumes']).sub("---\n", ''))
|
36
|
+
provided_links = (job['provides'].nil? ? '' : YAML.dump(job['provides']).sub("---\n", ''))
|
37
|
+
|
38
|
+
color = (index.even? ? :yellow : :green)
|
39
|
+
|
31
40
|
row = [
|
32
|
-
job['name'].
|
33
|
-
job['fingerprint'].
|
34
|
-
job['blobstore_id'].
|
35
|
-
job['sha1'].
|
41
|
+
job['name'].make_color(color),
|
42
|
+
job['fingerprint'].make_color(color),
|
43
|
+
job['blobstore_id'].make_color(color),
|
44
|
+
job['sha1'].make_color(color),
|
45
|
+
consumed_links.make_color(color),
|
46
|
+
provided_links.make_color(color)]
|
36
47
|
t << row
|
37
48
|
end
|
49
|
+
|
38
50
|
end
|
39
51
|
end
|
40
52
|
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require 'cli/core_ext'
|
2
|
+
|
3
|
+
module Bosh::Cli::Command
|
4
|
+
class RuntimeConfig < Base
|
5
|
+
usage 'runtime-config'
|
6
|
+
desc 'Download the current runtime config for the director'
|
7
|
+
|
8
|
+
def show
|
9
|
+
auth_required
|
10
|
+
show_current_state
|
11
|
+
|
12
|
+
config = director.get_runtime_config
|
13
|
+
if !config.nil?
|
14
|
+
say(config.properties)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
usage 'update runtime-config'
|
19
|
+
desc 'Update the current runtime config for the director'
|
20
|
+
|
21
|
+
def update(runtime_config_path)
|
22
|
+
auth_required
|
23
|
+
show_current_state
|
24
|
+
|
25
|
+
runtime_config_yaml = read_yaml_file(runtime_config_path)
|
26
|
+
|
27
|
+
if director.update_runtime_config(runtime_config_yaml)
|
28
|
+
say("Successfully updated runtime config")
|
29
|
+
else
|
30
|
+
err("Failed to update runtime config")
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
data/lib/cli/commands/task.rb
CHANGED
@@ -66,11 +66,12 @@ module Bosh::Cli::Command
|
|
66
66
|
usage "tasks"
|
67
67
|
desc "Show running tasks"
|
68
68
|
option "--no-filter", INCLUDE_ALL
|
69
|
+
option "--deployment DEPLOYMENT_NAME", "Show tasks for given deployment"
|
69
70
|
def list_running
|
70
71
|
auth_required
|
71
72
|
show_current_state
|
72
73
|
use_filter = !options.key?(:no_filter)
|
73
|
-
tasks = director.list_running_tasks(get_verbose_level(use_filter))
|
74
|
+
tasks = director.list_running_tasks(get_verbose_level(use_filter), options[:deployment])
|
74
75
|
err("No running tasks") if tasks.empty?
|
75
76
|
show_tasks_table(tasks.sort_by { |t| t["id"].to_i * -1 })
|
76
77
|
say("Total tasks running now: %d" % [tasks.size])
|
@@ -80,11 +81,12 @@ module Bosh::Cli::Command
|
|
80
81
|
usage "tasks recent"
|
81
82
|
desc "Show <number> recent tasks"
|
82
83
|
option "--no-filter", INCLUDE_ALL
|
84
|
+
option "--deployment DEPLOYMENT_NAME", "Show tasks for given deployment"
|
83
85
|
def list_recent(count = 30)
|
84
86
|
auth_required
|
85
87
|
show_current_state
|
86
88
|
use_filter = !options.key?(:no_filter)
|
87
|
-
tasks = director.list_recent_tasks(count, get_verbose_level(use_filter))
|
89
|
+
tasks = director.list_recent_tasks(count, get_verbose_level(use_filter), options[:deployment])
|
88
90
|
err("No recent tasks") if tasks.empty?
|
89
91
|
show_tasks_table(tasks)
|
90
92
|
say("Showing #{tasks.size} recent #{tasks.size == 1 ? "task" : "tasks"}")
|
@@ -117,9 +119,9 @@ module Bosh::Cli::Command
|
|
117
119
|
def show_tasks_table(tasks)
|
118
120
|
return if tasks.empty?
|
119
121
|
tasks_table = table do |t|
|
120
|
-
t.headings = "#", "State", "Timestamp", "User", "Description", "Result"
|
122
|
+
t.headings = "#", "State", "Timestamp", "User", "Deployment", "Description", "Result"
|
121
123
|
tasks.map do |task|
|
122
|
-
t << [task["id"], task["state"], Time.at(task["timestamp"]).utc, task["user"],
|
124
|
+
t << [task["id"], task["state"], Time.at(task["timestamp"]).utc, task["user"], task["deployment"],
|
123
125
|
task["description"].to_s, task["result"].to_s.truncate(80)]
|
124
126
|
end
|
125
127
|
end
|
data/lib/cli/errors.rb
CHANGED
@@ -49,6 +49,7 @@ module Bosh
|
|
49
49
|
class InvalidManifest < CliError; error_code(514); end
|
50
50
|
class PropertyMismatch < CliError; error_code(515); end
|
51
51
|
class InvalidPropertyMapping < CliError; error_code(516); end
|
52
|
+
class InvalidLinks < CliError; error_code(517); end
|
52
53
|
|
53
54
|
class ReleaseVersionError < CliError; error_code(600); end
|
54
55
|
end
|
@@ -28,23 +28,23 @@ module Bosh::Cli
|
|
28
28
|
end
|
29
29
|
|
30
30
|
unless @manifest["jobs"].is_a?(Array)
|
31
|
-
bad_manifest("Invalid
|
31
|
+
bad_manifest("Invalid instance groups format in deployment " +
|
32
32
|
"manifest, Array expected, #{@manifest["jobs"].class} given")
|
33
33
|
end
|
34
34
|
|
35
35
|
@manifest["jobs"].each do |job|
|
36
36
|
unless job.is_a?(Hash)
|
37
|
-
bad_manifest("Invalid
|
37
|
+
bad_manifest("Invalid instance group spec in the manifest " +
|
38
38
|
"Hash expected, #{job.class} given")
|
39
39
|
end
|
40
40
|
|
41
41
|
job_name = job["name"]
|
42
42
|
if job_name.nil?
|
43
|
-
bad_manifest("Manifest contains at least one
|
43
|
+
bad_manifest("Manifest contains at least one instance group without name")
|
44
44
|
end
|
45
45
|
|
46
46
|
if job["template"].nil?
|
47
|
-
bad_manifest("
|
47
|
+
bad_manifest("Instance group '#{job_name}' doesn't have a job")
|
48
48
|
end
|
49
49
|
end
|
50
50
|
|
@@ -68,7 +68,7 @@ module Bosh::Cli
|
|
68
68
|
built_job = @built_jobs[job_spec["template"]]
|
69
69
|
|
70
70
|
if built_job.nil?
|
71
|
-
raise CliError, "
|
71
|
+
raise CliError, "Instance group '#{job_spec["template"]}' has not been built"
|
72
72
|
end
|
73
73
|
|
74
74
|
collection = JobPropertyCollection.new(
|
data/lib/cli/version.rb
CHANGED
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.
|
4
|
+
version: 1.3213.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- VMware
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-03-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.
|
19
|
+
version: 1.3213.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.
|
26
|
+
version: 1.3213.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.
|
33
|
+
version: 1.3213.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.
|
40
|
+
version: 1.3213.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.
|
131
|
+
version: 1.3213.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.
|
138
|
+
version: 1.3213.0
|
139
139
|
- !ruby/object:Gem::Dependency
|
140
140
|
name: net-ssh
|
141
141
|
requirement: !ruby/object:Gem::Requirement
|
@@ -384,6 +384,7 @@ files:
|
|
384
384
|
- lib/cli/commands/release/upload_release.rb
|
385
385
|
- lib/cli/commands/release/verify_release.rb
|
386
386
|
- lib/cli/commands/restore.rb
|
387
|
+
- lib/cli/commands/runtime_config.rb
|
387
388
|
- lib/cli/commands/snapshot.rb
|
388
389
|
- lib/cli/commands/ssh.rb
|
389
390
|
- lib/cli/commands/stemcell.rb
|
@@ -427,6 +428,7 @@ files:
|
|
427
428
|
- lib/cli/resources/package.rb
|
428
429
|
- lib/cli/resurrection.rb
|
429
430
|
- lib/cli/runner.rb
|
431
|
+
- lib/cli/runtime_config.rb
|
430
432
|
- lib/cli/sorted_release_archiver.rb
|
431
433
|
- lib/cli/source_control/git_ignore.rb
|
432
434
|
- lib/cli/ssh_session.rb
|