bosh_cli 1.3202.0 → 1.3213.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 +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
|