bosh_cli 1.3178.0 → 1.3181.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 +12 -1
- data/lib/cli/commands/deployment.rb +2 -6
- data/lib/cli/commands/deployment_diff.rb +52 -0
- data/lib/cli/config.rb +8 -0
- data/lib/cli/core_ext.rb +1 -5
- data/lib/cli/deployment_helper.rb +6 -4
- data/lib/cli/deployment_manifest.rb +13 -0
- data/lib/cli/job_state.rb +3 -3
- data/lib/cli/manifest.rb +1 -14
- data/lib/cli/release_archiver.rb +4 -13
- data/lib/cli/release_tarball.rb +32 -7
- data/lib/cli/sorted_release_archiver.rb +28 -0
- data/lib/cli/version.rb +1 -1
- data/lib/cli.rb +1 -0
- 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: f3752794136b632c019fbc30d74f20d9b2af6dd9
|
4
|
+
data.tar.gz: 0c09ce0323b35eedae508812a396f79c6f5da9e6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1b2a7a5b96cb7d59a1581e0b4a736729ddedc03bc0e379d7c601cf29478a5fbbae51c6595ba7cc5df918a68c5f210796236439704f534709c885198ea05200da
|
7
|
+
data.tar.gz: 452bad4c0109afb3953bce13352ef59f43fcca822a7b71609f7d8d2249f825babcd23fca16fe9cf023c51b5e5921bec0e7cf4a8d19de9fc89c7fcbeacd796d1a
|
data/lib/cli/client/director.rb
CHANGED
@@ -248,18 +248,29 @@ module Bosh
|
|
248
248
|
|
249
249
|
recreate = options.delete(:recreate)
|
250
250
|
skip_drain = options.delete(:skip_drain)
|
251
|
+
context = options.delete(:context)
|
251
252
|
options[:content_type] = 'text/yaml'
|
252
253
|
options[:payload] = manifest_yaml
|
253
254
|
|
254
255
|
url = '/deployments'
|
255
256
|
|
256
257
|
extras = []
|
257
|
-
extras << ['recreate', 'true']
|
258
|
+
extras << ['recreate', 'true'] if recreate
|
259
|
+
extras << ['context', JSON.dump(context)] if context
|
258
260
|
extras << ['skip_drain', skip_drain] if skip_drain
|
259
261
|
|
260
262
|
request_and_track(:post, add_query_string(url, extras), options)
|
261
263
|
end
|
262
264
|
|
265
|
+
def diff_deployment(name, manifest_yaml)
|
266
|
+
status, body = post("/deployments/#{name}/diff", 'text/yaml', manifest_yaml)
|
267
|
+
if status == 200
|
268
|
+
JSON.parse(body)
|
269
|
+
else
|
270
|
+
err(parse_error_message(status, body))
|
271
|
+
end
|
272
|
+
end
|
273
|
+
|
263
274
|
def setup_ssh(deployment_name, job, id, user,
|
264
275
|
public_key, password, options = {})
|
265
276
|
options = options.dup
|
@@ -138,11 +138,7 @@ module Bosh::Cli::Command
|
|
138
138
|
|
139
139
|
manifest = prepare_deployment_manifest(resolve_properties: true, show_state: true)
|
140
140
|
|
141
|
-
|
142
|
-
manifest.hash,
|
143
|
-
interactive: interactive?,
|
144
|
-
redact_diff: redact_diff
|
145
|
-
)
|
141
|
+
context = DeploymentDiff.new(director, manifest).print({redact_diff: redact_diff})
|
146
142
|
say('Please review all changes carefully'.make_yellow) if interactive?
|
147
143
|
|
148
144
|
header('Deploying')
|
@@ -151,7 +147,7 @@ module Bosh::Cli::Command
|
|
151
147
|
cancel_deployment
|
152
148
|
end
|
153
149
|
|
154
|
-
deploy_options = { recreate: recreate }
|
150
|
+
deploy_options = { recreate: recreate, context: context }
|
155
151
|
|
156
152
|
if options.has_key?(:skip_drain)
|
157
153
|
# when key is present but no jobs specified OptionParser
|
@@ -0,0 +1,52 @@
|
|
1
|
+
module Bosh::Cli::Command
|
2
|
+
class DeploymentDiff < Base
|
3
|
+
def initialize(director, manifest)
|
4
|
+
@director = director
|
5
|
+
@manifest = manifest
|
6
|
+
end
|
7
|
+
|
8
|
+
def print(options)
|
9
|
+
begin
|
10
|
+
changes = @director.diff_deployment(@manifest.name, @manifest.yaml)
|
11
|
+
diff = changes['diff']
|
12
|
+
|
13
|
+
header('Detecting deployment changes')
|
14
|
+
|
15
|
+
diff.each do |line_diff|
|
16
|
+
formatted_line_diff, state = line_diff
|
17
|
+
|
18
|
+
# colorization explicitly disabled
|
19
|
+
if Bosh::Cli::Config.use_color?
|
20
|
+
case state
|
21
|
+
when 'added'
|
22
|
+
say(formatted_line_diff.make_green)
|
23
|
+
when 'removed'
|
24
|
+
say(formatted_line_diff.make_red)
|
25
|
+
else
|
26
|
+
say(formatted_line_diff)
|
27
|
+
end
|
28
|
+
|
29
|
+
else
|
30
|
+
case state
|
31
|
+
when 'added'
|
32
|
+
say('+ ' + formatted_line_diff)
|
33
|
+
when 'removed'
|
34
|
+
say('- ' + formatted_line_diff)
|
35
|
+
else
|
36
|
+
say(' ' + formatted_line_diff)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
changes['context']
|
42
|
+
rescue Bosh::Cli::ResourceNotFound
|
43
|
+
inspect_deployment_changes(
|
44
|
+
@manifest,
|
45
|
+
redact_diff: options[:redact_diff]
|
46
|
+
)
|
47
|
+
|
48
|
+
nil
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
data/lib/cli/config.rb
CHANGED
@@ -39,6 +39,14 @@ module Bosh::Cli
|
|
39
39
|
@commands[command.usage] = command
|
40
40
|
end
|
41
41
|
|
42
|
+
def self.use_color?
|
43
|
+
# colorization explicitly enabled, or output is tty
|
44
|
+
return false if Bosh::Cli::Config.colorize == false
|
45
|
+
|
46
|
+
# colorization explicitly enabled, or output is tty
|
47
|
+
Bosh::Cli::Config.colorize || Bosh::Cli::Config.output.tty?
|
48
|
+
end
|
49
|
+
|
42
50
|
def initialize(filename, work_dir = Dir.pwd)
|
43
51
|
@filename = File.expand_path(filename || Bosh::Cli::DEFAULT_CONFIG_PATH)
|
44
52
|
@work_dir = work_dir
|
data/lib/cli/core_ext.rb
CHANGED
@@ -140,11 +140,7 @@ module BoshStringExtensions
|
|
140
140
|
# output disabled
|
141
141
|
return self if !Bosh::Cli::Config.output
|
142
142
|
|
143
|
-
|
144
|
-
return self if Bosh::Cli::Config.colorize == false
|
145
|
-
|
146
|
-
# colorization explicitly enabled, or output is tty
|
147
|
-
if Bosh::Cli::Config.colorize || Bosh::Cli::Config.output.tty?
|
143
|
+
if Bosh::Cli::Config.use_color?
|
148
144
|
"#{COLOR_CODES[color_code]}#{self}\e[0m"
|
149
145
|
else
|
150
146
|
self
|
@@ -46,12 +46,14 @@ module Bosh::Cli
|
|
46
46
|
# a meaningful return value.
|
47
47
|
# @return Boolean Were there any changes in deployment manifest?
|
48
48
|
def inspect_deployment_changes(manifest, options = {})
|
49
|
+
manifest.resolve_release_aliases
|
50
|
+
manifest.resolve_stemcell_aliases
|
51
|
+
|
49
52
|
show_empty_changeset = options.fetch(:show_empty_changeset, true)
|
50
|
-
interactive = options.fetch(:interactive, false)
|
51
53
|
redact_diff = options.fetch(:redact_diff, false)
|
52
54
|
|
53
|
-
|
54
|
-
current_deployment = director.get_deployment(
|
55
|
+
manifest_hash = manifest.hash.dup
|
56
|
+
current_deployment = director.get_deployment(manifest_hash['name'])
|
55
57
|
|
56
58
|
# We cannot retrieve current manifest until there was at least one
|
57
59
|
# successful deployment. There used to be a warning about that
|
@@ -65,7 +67,7 @@ module Bosh::Cli
|
|
65
67
|
end
|
66
68
|
|
67
69
|
diff = Bosh::Cli::HashChangeset.new
|
68
|
-
diff.add_hash(normalize_deployment_manifest(
|
70
|
+
diff.add_hash(normalize_deployment_manifest(manifest_hash), :new)
|
69
71
|
diff.add_hash(normalize_deployment_manifest(current_manifest), :old)
|
70
72
|
@_diff_key_visited = { 'name' => 1, 'director_uuid' => 1 }
|
71
73
|
|
@@ -9,6 +9,19 @@ module Bosh::Cli
|
|
9
9
|
def normalize
|
10
10
|
normalized = Bosh::Common::DeepCopy.copy(manifest_hash)
|
11
11
|
|
12
|
+
# for backwards compatibility, new directors always convert stemcell and release versions to string
|
13
|
+
if normalized['resource_pools']
|
14
|
+
normalized['resource_pools'].each do |rp|
|
15
|
+
rp['stemcell']['version'] = rp['stemcell']['version'].to_s
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
if normalized['releases']
|
20
|
+
normalized['releases'].each do |release|
|
21
|
+
release['version'] = release['version'].to_s
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
12
25
|
%w(releases networks jobs resource_pools disk_pools).each do |section|
|
13
26
|
normalized[section] ||= []
|
14
27
|
|
data/lib/cli/job_state.rb
CHANGED
@@ -46,7 +46,7 @@ module Bosh::Cli
|
|
46
46
|
def change_job_state(new_state, job, index_or_id, operation_desc, force)
|
47
47
|
@command.say("You are about to #{operation_desc.make_green}")
|
48
48
|
|
49
|
-
check_if_manifest_changed(
|
49
|
+
check_if_manifest_changed(force)
|
50
50
|
unless @command.confirmed?("#{operation_desc.capitalize}?")
|
51
51
|
@command.cancel_deployment
|
52
52
|
end
|
@@ -57,8 +57,8 @@ module Bosh::Cli
|
|
57
57
|
end
|
58
58
|
|
59
59
|
|
60
|
-
def check_if_manifest_changed(
|
61
|
-
other_changes_present = @command.inspect_deployment_changes(
|
60
|
+
def check_if_manifest_changed(force)
|
61
|
+
other_changes_present = @command.inspect_deployment_changes(@manifest, show_empty_changeset: false)
|
62
62
|
|
63
63
|
if other_changes_present && !force
|
64
64
|
@command.err("Cannot perform job management when other deployment changes are present. Please use `--force' to override.")
|
data/lib/cli/manifest.rb
CHANGED
@@ -62,16 +62,13 @@ module Bosh::Cli
|
|
62
62
|
"please add 'release' or 'releases' section")
|
63
63
|
end
|
64
64
|
|
65
|
-
resolve_release_aliases
|
66
|
-
resolve_stemcell_aliases
|
67
|
-
|
68
65
|
report_manifest_warnings
|
69
66
|
|
70
67
|
@hash
|
71
68
|
end
|
72
69
|
|
73
70
|
def yaml
|
74
|
-
|
71
|
+
Psych.dump(@hash)
|
75
72
|
end
|
76
73
|
|
77
74
|
# @param [Hash] manifest Deployment manifest (will be modified)
|
@@ -89,12 +86,6 @@ module Bosh::Cli
|
|
89
86
|
if latest_version.nil?
|
90
87
|
err("Latest version for stemcell `#{stemcell['name']}' is unknown")
|
91
88
|
end
|
92
|
-
# Avoiding {Float,Fixnum} -> String noise in diff
|
93
|
-
if latest_version.to_s == latest_version.to_f.to_s
|
94
|
-
latest_version = latest_version.to_f
|
95
|
-
elsif latest_version.to_s == latest_version.to_i.to_s
|
96
|
-
latest_version = latest_version.to_i
|
97
|
-
end
|
98
89
|
stemcell['version'] = latest_version
|
99
90
|
end
|
100
91
|
end
|
@@ -132,10 +123,6 @@ module Bosh::Cli
|
|
132
123
|
end
|
133
124
|
release['version'] = latest_release_version
|
134
125
|
end
|
135
|
-
|
136
|
-
if release['version'].to_i.to_s == release['version']
|
137
|
-
release['version'] = release['version'].to_i
|
138
|
-
end
|
139
126
|
end
|
140
127
|
end
|
141
128
|
|
data/lib/cli/release_archiver.rb
CHANGED
@@ -41,23 +41,14 @@ module Bosh::Cli
|
|
41
41
|
end
|
42
42
|
end
|
43
43
|
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
end
|
49
|
-
say("Generated #{filepath.make_green}")
|
50
|
-
say("Release size: #{pretty_size(filepath).make_green}")
|
51
|
-
end
|
44
|
+
SortedReleaseArchiver.new(build_dir).archive(filepath)
|
45
|
+
|
46
|
+
say("Generated #{filepath.make_green}")
|
47
|
+
say("Release size: #{pretty_size(filepath).make_green}")
|
52
48
|
end
|
53
49
|
|
54
50
|
private
|
55
51
|
|
56
52
|
attr_reader :manifest, :packages, :jobs, :license, :build_dir
|
57
|
-
|
58
|
-
def in_build_dir(&block)
|
59
|
-
Dir.chdir(build_dir) { yield }
|
60
|
-
end
|
61
|
-
|
62
53
|
end
|
63
54
|
end
|
data/lib/cli/release_tarball.rb
CHANGED
@@ -28,6 +28,9 @@ module Bosh::Cli
|
|
28
28
|
def unpack_jobs
|
29
29
|
return @unpacked_jobs unless @unpacked_jobs.nil?
|
30
30
|
exit_success = safe_fast_unpack('./jobs/')
|
31
|
+
unless all_release_jobs_unpacked?
|
32
|
+
exit_success = safe_unpack('./jobs/')
|
33
|
+
end
|
31
34
|
@unpacked_jobs = !!exit_success
|
32
35
|
end
|
33
36
|
|
@@ -48,6 +51,15 @@ module Bosh::Cli
|
|
48
51
|
exit_status
|
49
52
|
end
|
50
53
|
|
54
|
+
def safe_unpack(target)
|
55
|
+
exit_status = raw_unpack(target)
|
56
|
+
if !exit_status
|
57
|
+
processed_target = handle_dot_slash_prefix(target)
|
58
|
+
exit_status = raw_unpack(processed_target)
|
59
|
+
end
|
60
|
+
exit_status
|
61
|
+
end
|
62
|
+
|
51
63
|
# This will [add or remove] the './' when trying to extract a specific file from archive
|
52
64
|
def handle_dot_slash_prefix(target)
|
53
65
|
if target =~ /^\.\/.*/
|
@@ -64,16 +76,29 @@ module Bosh::Cli
|
|
64
76
|
when /.*gnu.*/i
|
65
77
|
Kernel.system("tar", "-C", @unpack_dir, "-xzf", @tarball_path, "--occurrence", "#{target}", out: "/dev/null", err: "/dev/null")
|
66
78
|
when /.*bsd.*/i
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
79
|
+
if target[-1, 1] == "/"
|
80
|
+
raw_unpack(target)
|
81
|
+
else
|
82
|
+
Kernel.system("tar", "-C", @unpack_dir, "--fast-read", "-xzf", @tarball_path, "#{target}", out: "/dev/null", err: "/dev/null")
|
83
|
+
end
|
72
84
|
else
|
73
|
-
|
85
|
+
raw_unpack(target)
|
74
86
|
end
|
75
87
|
end
|
76
88
|
|
89
|
+
def raw_unpack(target)
|
90
|
+
Kernel.system("tar", "-C", @unpack_dir, "-xzf", @tarball_path, "#{target}", out: "/dev/null", err: "/dev/null")
|
91
|
+
end
|
92
|
+
|
93
|
+
# verifies that all jobs in release manifest were unpacked
|
94
|
+
def all_release_jobs_unpacked?
|
95
|
+
return false if manifest_yaml['jobs'].nil?
|
96
|
+
|
97
|
+
manifest_job_names = manifest_yaml['jobs'].map { |j| j['name'] }.sort
|
98
|
+
unpacked_job_file_names = Dir.glob(File.join(@unpack_dir, 'jobs', '*')).map { |f| File.basename(f, '.*') }.sort
|
99
|
+
unpacked_job_file_names == manifest_job_names
|
100
|
+
end
|
101
|
+
|
77
102
|
# Unpacks tarball to @unpack_dir, returns true if succeeded, false if failed
|
78
103
|
def unpack
|
79
104
|
return @unpacked unless @unpacked.nil?
|
@@ -84,7 +109,7 @@ module Bosh::Cli
|
|
84
109
|
# Creates a new tarball from the current contents of @unpack_dir
|
85
110
|
def create_from_unpacked(target_path)
|
86
111
|
raise "Not unpacked yet!" unless @unpacked
|
87
|
-
|
112
|
+
SortedReleaseArchiver.new(@unpack_dir).archive(File.expand_path(target_path))
|
88
113
|
end
|
89
114
|
|
90
115
|
def exists?
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module Bosh::Cli
|
2
|
+
class SortedReleaseArchiver
|
3
|
+
def initialize(dir)
|
4
|
+
@dir = dir
|
5
|
+
end
|
6
|
+
|
7
|
+
def archive(destination_file)
|
8
|
+
Dir.chdir(@dir) do
|
9
|
+
success = Kernel.system('tar', '-C', @dir, '-pczf', destination_file, *ordered_release_files, out: '/dev/null', err: '/dev/null')
|
10
|
+
if !success
|
11
|
+
raise InvalidRelease, 'Cannot create release tarball'
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
private
|
17
|
+
|
18
|
+
def ordered_release_files
|
19
|
+
ordered_release_files = ['./release.MF']
|
20
|
+
license_files = (Dir.entries('.') & ['LICENSE', 'NOTICE']).sort
|
21
|
+
unless license_files.empty?
|
22
|
+
ordered_release_files += license_files.map { |filename| "./#{filename}" }
|
23
|
+
end
|
24
|
+
ordered_release_files += ['./jobs', './packages']
|
25
|
+
ordered_release_files
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
data/lib/cli/version.rb
CHANGED
data/lib/cli.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.3181.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-01-
|
11
|
+
date: 2016-01-19 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.3181.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.3181.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.3181.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.3181.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.3181.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.3181.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/deployment_diff.rb
|
362
363
|
- lib/cli/commands/disks.rb
|
363
364
|
- lib/cli/commands/errand.rb
|
364
365
|
- lib/cli/commands/help.rb
|
@@ -426,6 +427,7 @@ files:
|
|
426
427
|
- lib/cli/resources/package.rb
|
427
428
|
- lib/cli/resurrection.rb
|
428
429
|
- lib/cli/runner.rb
|
430
|
+
- lib/cli/sorted_release_archiver.rb
|
429
431
|
- lib/cli/source_control/git_ignore.rb
|
430
432
|
- lib/cli/ssh_session.rb
|
431
433
|
- lib/cli/stemcell.rb
|