bosh-director 1.3215.3.0 → 1.3215.4.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/db/migrations/director/20160210201838_denormalize_compiled_package_stemcell_id_to_stemcell_name_and_version.rb +9 -7
- data/lib/bosh/director/api/controllers/deployments_controller.rb +9 -16
- data/lib/bosh/director/deployment_plan/update_config.rb +1 -1
- data/lib/bosh/director/jobs/export_release.rb +1 -3
- data/lib/bosh/director/jobs/release/release_job.rb +22 -7
- data/lib/bosh/director/jobs/update_release.rb +20 -10
- data/lib/bosh/director/manifest/changeset.rb +42 -88
- data/lib/bosh/director/manifest/manifest.rb +1 -1
- data/lib/bosh/director/models/release_version.rb +1 -3
- data/lib/bosh/director/validation_helper.rb +1 -1
- data/lib/bosh/director/version.rb +1 -1
- metadata +16 -18
- data/db/migrations/director/20160329201256_set_instances_with_nil_serial_to_false.rb +0 -15
- data/db/migrations/director/20160331225404_backfill_stemcell_os.rb +0 -9
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: faf6283449ed9e2f917191f99c686b67dca177af
|
|
4
|
+
data.tar.gz: 53ccfd5747076bf4105787ab11568471ddfbf5cc
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 431bd32c3d55f3f581ea2c068ee69d20c86e49de4645bd758a331fd43e7fc15cd207e854569f2e883e2f82f9cf5e06edfe839141afaa8c1c82ab0b40cc380dc9
|
|
7
|
+
data.tar.gz: 3ccbba5d34e8b4ba95508c91c13cb741ba241a7aeb25c9faaaef998d70a353182c0ae6fff743c6bb20008d7b3593e8ae37b61e4cd19541aa6a3424342f8f2b0b
|
|
@@ -23,23 +23,25 @@ Sequel.migration do
|
|
|
23
23
|
stemcell_foreign_key_name = stemcell_foreign_keys.first.fetch(:name)
|
|
24
24
|
|
|
25
25
|
build_indexes = indexes(:compiled_packages).select { |_, value| value.fetch(:columns) == [:package_id, :stemcell_id, :build] }
|
|
26
|
+
raise 'Failed to run migration, found more than 1 build index' if build_indexes.size != 1
|
|
27
|
+
# build_indexes is an array, where each element is an array with first element being the name of index
|
|
28
|
+
build_index = build_indexes.first.first
|
|
29
|
+
|
|
30
|
+
stemcell_indexes = indexes(:compiled_packages).select { |_, value| value.fetch(:columns) == [:package_id, :stemcell_id, :dependency_key_sha1]}
|
|
31
|
+
raise 'Failed to run migration, found more than 1 stemcell_id index' if stemcell_indexes.size != 1
|
|
32
|
+
# stemcell_indexes is an array, where each element is an array with first element being the name of index
|
|
33
|
+
stemcell_index = stemcell_indexes.first.first
|
|
34
|
+
|
|
26
35
|
if [:mysql2, :mysql].include?(adapter_scheme)
|
|
27
|
-
raise 'Failed to run migration, found more than 1 build index' if build_indexes.size != 1
|
|
28
|
-
# build_indexes is an array, where each element is an array with first element being the name of index
|
|
29
|
-
build_index = build_indexes.first.first
|
|
30
36
|
alter_table(:compiled_packages) do
|
|
31
37
|
drop_index(nil, name: build_index)
|
|
32
38
|
end
|
|
33
39
|
elsif [:postgres].include?(adapter_scheme)
|
|
34
|
-
build_index = build_indexes.empty? ? 'compiled_packages_package_id_stemcell_id_build_key' : build_indexes.first.first
|
|
35
40
|
alter_table(:compiled_packages) do
|
|
36
41
|
drop_constraint(build_index)
|
|
37
42
|
end
|
|
38
43
|
end
|
|
39
44
|
|
|
40
|
-
stemcell_indexes = indexes(:compiled_packages).select { |_, value| value.fetch(:columns) == [:package_id, :stemcell_id, :dependency_key_sha1]}
|
|
41
|
-
stemcell_index = stemcell_indexes.empty? ? 'package_stemcell_dependency_key_sha1_idx' : stemcell_indexes.first.first
|
|
42
|
-
|
|
43
45
|
alter_table(:compiled_packages) do
|
|
44
46
|
drop_constraint(stemcell_foreign_key_name, :type => :foreign_key)
|
|
45
47
|
add_index [:package_id, :stemcell_os, :stemcell_version, :build], unique: true, name: 'package_stemcell_build_idx'
|
|
@@ -371,22 +371,15 @@ module Bosh::Director
|
|
|
371
371
|
|
|
372
372
|
redact = params['redact'] != 'false'
|
|
373
373
|
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
'
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
result['diff'] = diff.map { |l| [l.to_s, l.status] }
|
|
384
|
-
rescue => error
|
|
385
|
-
result['diff'] = []
|
|
386
|
-
result['error'] = "Unable to diff manifest: #{error.inspect}\n#{error.backtrace.join("\n")}"
|
|
387
|
-
end
|
|
388
|
-
|
|
389
|
-
json_encode(result)
|
|
374
|
+
diff = before_manifest.diff(after_manifest, redact)
|
|
375
|
+
|
|
376
|
+
json_encode({
|
|
377
|
+
'context' => {
|
|
378
|
+
'cloud_config_id' => after_cloud_config ? after_cloud_config.id : nil,
|
|
379
|
+
'runtime_config_id' => after_runtime_config ? after_runtime_config.id : nil
|
|
380
|
+
},
|
|
381
|
+
'diff' => diff.map { |l| [l.to_s, l.status] }
|
|
382
|
+
})
|
|
390
383
|
end
|
|
391
384
|
|
|
392
385
|
post '/:deployment/errands/:errand_name/runs' do
|
|
@@ -68,7 +68,7 @@ module Bosh::Director
|
|
|
68
68
|
'max_in_flight' => @max_in_flight,
|
|
69
69
|
'canary_watch_time' => "#{@min_canary_watch_time}-#{@max_canary_watch_time}",
|
|
70
70
|
'update_watch_time' => "#{@min_update_watch_time}-#{@max_update_watch_time}",
|
|
71
|
-
'serial' => serial
|
|
71
|
+
'serial' => @serial
|
|
72
72
|
}
|
|
73
73
|
end
|
|
74
74
|
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
require 'securerandom'
|
|
2
|
-
require 'common/release/release_directory'
|
|
3
2
|
require 'common/version/release_version'
|
|
4
3
|
require 'bosh/director/compiled_release_downloader'
|
|
5
4
|
require 'bosh/director/compiled_release_manifest'
|
|
@@ -99,8 +98,7 @@ module Bosh::Director
|
|
|
99
98
|
output_path = File.join(download_dir, "compiled_release_#{Time.now.to_f}.tar.gz")
|
|
100
99
|
archiver = Core::TarGzipper.new
|
|
101
100
|
|
|
102
|
-
|
|
103
|
-
archiver.compress(download_dir, release_directory.ordered_release_files, output_path)
|
|
101
|
+
archiver.compress(download_dir, ['compiled_packages', 'jobs', 'release.MF'], output_path)
|
|
104
102
|
tarball_file = File.open(output_path, 'r')
|
|
105
103
|
|
|
106
104
|
oid = blobstore_client.create(tarball_file)
|
|
@@ -3,12 +3,13 @@ module Bosh::Director
|
|
|
3
3
|
|
|
4
4
|
attr_accessor :packages
|
|
5
5
|
|
|
6
|
-
def initialize(job_meta, release_model, release_dir, logger)
|
|
6
|
+
def initialize(job_meta, release_model, release_dir, packages, logger)
|
|
7
7
|
@name = job_meta['name']
|
|
8
8
|
@version = job_meta['version']
|
|
9
9
|
@sha1 = job_meta['sha1']
|
|
10
10
|
@fingerprint = job_meta['fingerprint']
|
|
11
11
|
|
|
12
|
+
@packages = packages
|
|
12
13
|
@release_model = release_model
|
|
13
14
|
@release_dir = release_dir
|
|
14
15
|
@logger = logger
|
|
@@ -62,8 +63,8 @@ module Bosh::Director
|
|
|
62
63
|
result = Bosh::Exec.sh("tar -C #{job_dir} -xzf #{job_tgz} 2>&1", :on_error => :return)
|
|
63
64
|
if result.failed?
|
|
64
65
|
@logger.error("Extracting #{desc} archive failed in dir #{job_dir}, " +
|
|
65
|
-
|
|
66
|
-
|
|
66
|
+
"tar returned #{result.exit_status}, " +
|
|
67
|
+
"output: #{result.output}")
|
|
67
68
|
raise JobInvalidArchive, "Extracting #{desc} archive failed. Check task debug log for details."
|
|
68
69
|
end
|
|
69
70
|
end
|
|
@@ -108,10 +109,24 @@ module Bosh::Director
|
|
|
108
109
|
end
|
|
109
110
|
|
|
110
111
|
def parse_package_names(job_manifest)
|
|
111
|
-
|
|
112
|
-
|
|
112
|
+
package_names = []
|
|
113
|
+
if job_manifest['packages']
|
|
114
|
+
unless job_manifest['packages'].is_a?(Array)
|
|
115
|
+
raise JobInvalidPackageSpec,
|
|
116
|
+
"Job `#{@name}' has invalid package spec format"
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
job_manifest['packages'].each do |package_name|
|
|
120
|
+
package = @packages[package_name]
|
|
121
|
+
if package.nil?
|
|
122
|
+
raise JobMissingPackage,
|
|
123
|
+
"Job `#{@name}' is referencing " +
|
|
124
|
+
"a missing package `#{package_name}'"
|
|
125
|
+
end
|
|
126
|
+
package_names << package.name
|
|
127
|
+
end
|
|
113
128
|
end
|
|
114
|
-
|
|
129
|
+
package_names
|
|
115
130
|
end
|
|
116
131
|
|
|
117
132
|
def validate_logs(job_manifest)
|
|
@@ -140,7 +155,7 @@ module Bosh::Director
|
|
|
140
155
|
def parse_links(links, kind)
|
|
141
156
|
if !links.is_a?(Array)
|
|
142
157
|
raise JobInvalidLinkSpec,
|
|
143
|
-
|
|
158
|
+
"Job '#{@name}' has invalid spec format: '#{kind}' must be an array of hashes with name and type"
|
|
144
159
|
end
|
|
145
160
|
|
|
146
161
|
parsed_links = {}
|
|
@@ -150,6 +150,7 @@ module Bosh::Director
|
|
|
150
150
|
resolve_package_dependencies(@manifest[@packages_folder])
|
|
151
151
|
end
|
|
152
152
|
|
|
153
|
+
@packages = {}
|
|
153
154
|
process_packages(release_dir)
|
|
154
155
|
process_jobs(release_dir)
|
|
155
156
|
|
|
@@ -201,6 +202,7 @@ module Bosh::Director
|
|
|
201
202
|
new_packages = []
|
|
202
203
|
existing_packages = []
|
|
203
204
|
registered_packages = []
|
|
205
|
+
packages_existing_from_other_releases = []
|
|
204
206
|
|
|
205
207
|
@manifest[@packages_folder].each do |package_meta|
|
|
206
208
|
# Checking whether we might have the same bits somewhere (in any release, not just the one being uploaded)
|
|
@@ -259,6 +261,7 @@ module Bosh::Director
|
|
|
259
261
|
end
|
|
260
262
|
end
|
|
261
263
|
new_packages << package_meta
|
|
264
|
+
packages_existing_from_other_releases << package_meta
|
|
262
265
|
end
|
|
263
266
|
end
|
|
264
267
|
|
|
@@ -274,7 +277,7 @@ module Bosh::Director
|
|
|
274
277
|
}
|
|
275
278
|
end
|
|
276
279
|
all_package_refs = Array(created_package_refs) | Array(existing_package_refs) | registered_package_refs
|
|
277
|
-
create_compiled_packages(all_package_refs, release_dir)
|
|
280
|
+
create_compiled_packages(all_package_refs, release_dir, packages_existing_from_other_releases)
|
|
278
281
|
else
|
|
279
282
|
backfill_source_for_packages(registered_packages, release_dir)
|
|
280
283
|
end
|
|
@@ -291,6 +294,7 @@ module Bosh::Director
|
|
|
291
294
|
logger.info("Adding source for package `#{package_desc}'")
|
|
292
295
|
had_effect |= save_package_source_blob(package, package_meta, release_dir)
|
|
293
296
|
package.save
|
|
297
|
+
@packages[package.name] = package
|
|
294
298
|
end
|
|
295
299
|
end
|
|
296
300
|
|
|
@@ -360,11 +364,11 @@ module Bosh::Director
|
|
|
360
364
|
end
|
|
361
365
|
end
|
|
362
366
|
|
|
363
|
-
package_refs
|
|
367
|
+
return package_refs
|
|
364
368
|
end
|
|
365
369
|
|
|
366
370
|
# @return [boolean] true if at least one job was created; false if the call had no effect.
|
|
367
|
-
def create_compiled_packages(all_compiled_packages, release_dir)
|
|
371
|
+
def create_compiled_packages(all_compiled_packages, release_dir, packages_existing_from_other_releases)
|
|
368
372
|
return false if all_compiled_packages.nil?
|
|
369
373
|
|
|
370
374
|
event_log.begin_stage('Creating new compiled packages', all_compiled_packages.size)
|
|
@@ -383,7 +387,7 @@ module Bosh::Director
|
|
|
383
387
|
if existing_compiled_packages.empty?
|
|
384
388
|
package_desc = "#{package.name}/#{package.version} for #{stemcell_os}/#{stemcell_version}"
|
|
385
389
|
event_log.track(package_desc) do
|
|
386
|
-
other_compiled_packages = compiled_packages_matching(package, stemcell)
|
|
390
|
+
other_compiled_packages = compiled_packages_matching(package, packages_existing_from_other_releases, stemcell)
|
|
387
391
|
if @fix
|
|
388
392
|
other_compiled_packages.each do |other_compiled_package|
|
|
389
393
|
fix_compiled_package(other_compiled_package, compiled_pkg_tgz)
|
|
@@ -394,6 +398,7 @@ module Bosh::Director
|
|
|
394
398
|
end
|
|
395
399
|
elsif @fix
|
|
396
400
|
existing_compiled_package = existing_compiled_packages.first
|
|
401
|
+
@packages[existing_compiled_package.name] = existing_compiled_package
|
|
397
402
|
fix_compiled_package(existing_compiled_package, compiled_pkg_tgz)
|
|
398
403
|
end
|
|
399
404
|
end
|
|
@@ -401,12 +406,16 @@ module Bosh::Director
|
|
|
401
406
|
had_effect
|
|
402
407
|
end
|
|
403
408
|
|
|
404
|
-
def compiled_packages_matching(package, stemcell)
|
|
409
|
+
def compiled_packages_matching(package, packages_existing_from_other_releases, stemcell)
|
|
405
410
|
other_compiled_packages = []
|
|
406
411
|
dependency_key = dependency_key(package)
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
412
|
+
packages_existing_from_other_releases.each do |other_package_meta|
|
|
413
|
+
if other_package_meta["fingerprint"] == package.fingerprint
|
|
414
|
+
packages = Models::Package.where(fingerprint: other_package_meta["fingerprint"]).all
|
|
415
|
+
packages.each do |pkg|
|
|
416
|
+
other_compiled_packages.concat(find_compiled_packages(pkg.id, stemcell[:os], stemcell[:version], dependency_key).all)
|
|
417
|
+
end
|
|
418
|
+
end
|
|
410
419
|
end
|
|
411
420
|
other_compiled_packages
|
|
412
421
|
end
|
|
@@ -520,6 +529,7 @@ module Bosh::Director
|
|
|
520
529
|
# @param [Models::Package] package Package model
|
|
521
530
|
# @return [void]
|
|
522
531
|
def register_package(package)
|
|
532
|
+
@packages[package.name] = package
|
|
523
533
|
@release_version_model.add_package(package)
|
|
524
534
|
end
|
|
525
535
|
|
|
@@ -581,7 +591,7 @@ module Bosh::Director
|
|
|
581
591
|
end
|
|
582
592
|
|
|
583
593
|
def create_job(job_meta, release_dir)
|
|
584
|
-
release_job = ReleaseJob.new(job_meta, @release_model, release_dir, logger)
|
|
594
|
+
release_job = ReleaseJob.new(job_meta, @release_model, release_dir, @packages, logger)
|
|
585
595
|
logger.info("Creating job template `#{job_meta['name']}/#{job_meta['version']}' " +
|
|
586
596
|
'from provided bits')
|
|
587
597
|
release_job.update(Models::Template.new())
|
|
@@ -598,7 +608,7 @@ module Bosh::Director
|
|
|
598
608
|
|
|
599
609
|
if @fix
|
|
600
610
|
logger.info("Fixing existing job `#{job_desc}'")
|
|
601
|
-
release_job = ReleaseJob.new(job_meta, @release_model, release_dir, logger)
|
|
611
|
+
release_job = ReleaseJob.new(job_meta, @release_model, release_dir, @packages, logger)
|
|
602
612
|
release_job.update(template)
|
|
603
613
|
else
|
|
604
614
|
logger.info("Using existing job `#{job_desc}'")
|
|
@@ -1,21 +1,24 @@
|
|
|
1
|
+
class ::Hash
|
|
2
|
+
def deep_merge(second)
|
|
3
|
+
merger = proc { |key, v1, v2| Hash === v1 && Hash === v2 ? v1.merge(v2, &merger) : v2 }
|
|
4
|
+
self.merge(second, &merger)
|
|
5
|
+
end
|
|
6
|
+
end
|
|
7
|
+
|
|
1
8
|
module Bosh::Director
|
|
2
9
|
class Changeset
|
|
3
10
|
KEY_NAME = 'name'
|
|
4
11
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
def initialize(before, after, redacted_before = nil, redacted_after = nil)
|
|
11
|
-
@redacted_before = redacted_before.nil? ? Changeset.redact_properties!(Bosh::Common::DeepCopy.copy(before)) : redacted_before
|
|
12
|
-
@redacted_after = redacted_after.nil? ? Changeset.redact_properties!(Bosh::Common::DeepCopy.copy(after)) : redacted_after
|
|
12
|
+
def initialize(before, after, redact = true, redacted_before = nil, redacted_after = nil)
|
|
13
|
+
@redact = redact
|
|
14
|
+
@redacted_before = redacted_before.nil? ? Redactor.redact_properties(Bosh::Common::DeepCopy.copy(before), redact) : redacted_before
|
|
15
|
+
@redacted_after = redacted_after.nil? ? Redactor.redact_properties(Bosh::Common::DeepCopy.copy(after), redact) : redacted_after
|
|
13
16
|
|
|
14
17
|
@before = before
|
|
15
18
|
@after = after
|
|
16
19
|
|
|
17
20
|
if @before && @after
|
|
18
|
-
@merged = deep_merge(@
|
|
21
|
+
@merged = @before.deep_merge(@after)
|
|
19
22
|
elsif @before
|
|
20
23
|
@merged = @before
|
|
21
24
|
else
|
|
@@ -23,113 +26,64 @@ module Bosh::Director
|
|
|
23
26
|
end
|
|
24
27
|
end
|
|
25
28
|
|
|
26
|
-
|
|
27
|
-
# please do not use regexes for diffing/redacting
|
|
28
|
-
def self.redact_properties!(obj, redact_key_is_ancestor = false)
|
|
29
|
-
if redact_key_is_ancestor
|
|
30
|
-
if obj.respond_to?(:key?)
|
|
31
|
-
obj.keys.each{ |key|
|
|
32
|
-
if obj[key].respond_to?(:each)
|
|
33
|
-
redact_properties!(obj[key], true)
|
|
34
|
-
else
|
|
35
|
-
obj[key] = '<redacted>'
|
|
36
|
-
end
|
|
37
|
-
}
|
|
38
|
-
elsif obj.respond_to?(:each_index)
|
|
39
|
-
obj.each_index { |i|
|
|
40
|
-
if obj[i].respond_to?(:each)
|
|
41
|
-
redact_properties!(obj[i], true)
|
|
42
|
-
else
|
|
43
|
-
obj[i] = '<redacted>'
|
|
44
|
-
end
|
|
45
|
-
}
|
|
46
|
-
end
|
|
47
|
-
else
|
|
48
|
-
if obj.respond_to?(:each)
|
|
49
|
-
obj.each{ |a|
|
|
50
|
-
if obj.respond_to?(:key?) && REDACT_KEY_NAMES.any? { |key| key == a.first } && a.last.respond_to?(:key?)
|
|
51
|
-
redact_properties!(a.last, true)
|
|
52
|
-
else
|
|
53
|
-
redact_properties!(a.respond_to?(:last) ? a.last : a)
|
|
54
|
-
end
|
|
55
|
-
|
|
56
|
-
}
|
|
57
|
-
end
|
|
58
|
-
end
|
|
59
|
-
|
|
60
|
-
obj
|
|
61
|
-
end
|
|
62
|
-
|
|
63
|
-
def diff(redact=true, indent = 0)
|
|
29
|
+
def diff(indent = 0)
|
|
64
30
|
lines = DiffLines.new
|
|
65
31
|
|
|
66
|
-
if redact
|
|
67
|
-
output_values_before = @redacted_before
|
|
68
|
-
output_values_after = @redacted_after
|
|
69
|
-
else
|
|
70
|
-
output_values_before = @before
|
|
71
|
-
output_values_after = @after
|
|
72
|
-
end
|
|
73
|
-
|
|
74
32
|
@merged.each_pair do |key, value|
|
|
75
|
-
if @before
|
|
76
|
-
|
|
77
|
-
lines.concat(yaml_lines({key => output_values_after[key]}, indent, 'added'))
|
|
78
|
-
|
|
79
|
-
elsif @after.nil? || @after[key].nil?
|
|
80
|
-
lines.concat(yaml_lines({key => output_values_before[key]}, indent, 'removed'))
|
|
81
|
-
|
|
82
|
-
elsif @before[key].is_a?(Array) && @after[key].is_a?(Array)
|
|
83
|
-
lines.concat(compare_arrays(@before[key], @after[key], output_values_before[key], output_values_after[key], key, redact, indent))
|
|
84
|
-
|
|
85
|
-
elsif @before[key].is_a?(Hash) && @after[key].is_a?(Hash)
|
|
86
|
-
changeset = Changeset.new(@before[key], @after[key], output_values_before[key], output_values_after[key])
|
|
87
|
-
diff_lines = changeset.diff(redact, indent+1)
|
|
88
|
-
unless diff_lines.empty?
|
|
89
|
-
lines << Line.new(indent, "#{key}:", nil)
|
|
90
|
-
lines.concat(diff_lines)
|
|
91
|
-
end
|
|
33
|
+
if @before.nil? || @before[key].nil?
|
|
34
|
+
lines.concat(yaml_lines({key => @redacted_after[key]}, indent, 'added'))
|
|
92
35
|
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
36
|
+
elsif @after.nil? || @after[key].nil?
|
|
37
|
+
lines.concat(yaml_lines({key => @redacted_before[key]}, indent, 'removed'))
|
|
38
|
+
|
|
39
|
+
elsif @before[key].is_a?(Array) && @after[key].is_a?(Array)
|
|
40
|
+
lines.concat(compare_arrays(@before[key], @after[key], @redacted_before[key], @redacted_after[key], key, indent))
|
|
41
|
+
|
|
42
|
+
elsif value.is_a?(Hash)
|
|
43
|
+
changeset = Changeset.new(@before[key], @after[key],@redact, @redacted_before[key], @redacted_after[key])
|
|
44
|
+
diff_lines = changeset.diff(indent+1)
|
|
45
|
+
unless diff_lines.empty?
|
|
46
|
+
lines << Line.new(indent, "#{key}:", nil)
|
|
47
|
+
lines.concat(diff_lines)
|
|
96
48
|
end
|
|
49
|
+
|
|
50
|
+
elsif @before[key] != @after[key]
|
|
51
|
+
lines.concat(yaml_lines({key => @redacted_before[key]}, indent, 'removed'))
|
|
52
|
+
lines.concat(yaml_lines({key => @redacted_after[key]}, indent, 'added'))
|
|
97
53
|
end
|
|
98
54
|
end
|
|
99
55
|
lines
|
|
100
56
|
end
|
|
101
57
|
|
|
102
|
-
private
|
|
103
|
-
|
|
104
|
-
def deep_merge(first, second)
|
|
105
|
-
merger = proc { |key, v1, v2| Hash === v1 && Hash === v2 ? v1.merge(v2, &merger) : v2 }
|
|
106
|
-
first.merge(second, &merger)
|
|
107
|
-
end
|
|
108
|
-
|
|
109
58
|
def yaml_lines(value, indent, state)
|
|
110
59
|
lines = DiffLines.new
|
|
111
|
-
value.to_yaml(indent: Line::INDENT).gsub(
|
|
60
|
+
value.to_yaml(indent: Line::INDENT).gsub("---\n", '').split("\n").each do |line|
|
|
112
61
|
lines << Line.new(indent, line, state)
|
|
113
62
|
end
|
|
114
63
|
lines
|
|
115
64
|
end
|
|
116
65
|
|
|
117
|
-
def compare_arrays(old_value, new_value,
|
|
66
|
+
def compare_arrays(old_value, new_value, redacted_old_value, redacted_new_value, parent_name, indent)
|
|
118
67
|
# combine arrays of redacted and unredacted values. unredacted arrays for diff logic, and redacted arrays for output
|
|
119
|
-
combined_old_value = old_value.zip
|
|
120
|
-
combined_new_value = new_value.zip
|
|
68
|
+
combined_old_value = old_value.zip redacted_old_value
|
|
69
|
+
combined_new_value = new_value.zip redacted_new_value
|
|
70
|
+
|
|
121
71
|
added = combined_new_value - combined_old_value
|
|
122
72
|
removed = combined_old_value - combined_new_value
|
|
123
73
|
|
|
124
74
|
lines = DiffLines.new
|
|
125
75
|
|
|
126
76
|
added.each do |pair|
|
|
77
|
+
|
|
127
78
|
elem = pair.first
|
|
128
79
|
redacted_elem = pair.last
|
|
80
|
+
|
|
129
81
|
if elem.is_a?(Hash)
|
|
130
82
|
using_names = (added+removed).all? { |e| e.first['name'] }
|
|
83
|
+
|
|
131
84
|
using_ranges = (added+removed).all? { |e| e.first['range'] }
|
|
132
85
|
if using_names || using_ranges
|
|
86
|
+
#clean up duplicate values
|
|
133
87
|
if using_names
|
|
134
88
|
removed_same_name_element = removed.find { |e| e.first['name'] == elem['name'] }
|
|
135
89
|
elsif using_ranges
|
|
@@ -138,8 +92,8 @@ module Bosh::Director
|
|
|
138
92
|
removed.delete(removed_same_name_element)
|
|
139
93
|
|
|
140
94
|
if removed_same_name_element
|
|
141
|
-
changeset = Changeset.new(removed_same_name_element.first, elem, removed_same_name_element.last, redacted_elem)
|
|
142
|
-
diff_lines = changeset.diff(
|
|
95
|
+
changeset = Changeset.new(removed_same_name_element.first, elem, @redact, removed_same_name_element.last, redacted_elem)
|
|
96
|
+
diff_lines = changeset.diff(indent+1)
|
|
143
97
|
|
|
144
98
|
unless diff_lines.empty?
|
|
145
99
|
# write name if elem has been changed
|
|
@@ -12,9 +12,7 @@ module Bosh::Director::Models
|
|
|
12
12
|
end
|
|
13
13
|
|
|
14
14
|
def package_by_name(package_name)
|
|
15
|
-
packages_by_name.fetch(package_name)
|
|
16
|
-
raise "Package name '#{package_name}' not found in release '#{release.name}/#{version}'"
|
|
17
|
-
end
|
|
15
|
+
packages_by_name.fetch(package_name)
|
|
18
16
|
end
|
|
19
17
|
|
|
20
18
|
private
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: bosh-director
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 1.3215.
|
|
4
|
+
version: 1.3215.4.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-04-
|
|
11
|
+
date: 2016-04-14 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: bosh_common
|
|
@@ -16,98 +16,98 @@ dependencies:
|
|
|
16
16
|
requirements:
|
|
17
17
|
- - "~>"
|
|
18
18
|
- !ruby/object:Gem::Version
|
|
19
|
-
version: 1.3215.
|
|
19
|
+
version: 1.3215.4.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.3215.
|
|
26
|
+
version: 1.3215.4.0
|
|
27
27
|
- !ruby/object:Gem::Dependency
|
|
28
28
|
name: bosh_cpi
|
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
|
30
30
|
requirements:
|
|
31
31
|
- - "~>"
|
|
32
32
|
- !ruby/object:Gem::Version
|
|
33
|
-
version: 1.3215.
|
|
33
|
+
version: 1.3215.4.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.3215.
|
|
40
|
+
version: 1.3215.4.0
|
|
41
41
|
- !ruby/object:Gem::Dependency
|
|
42
42
|
name: bosh-registry
|
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
|
44
44
|
requirements:
|
|
45
45
|
- - "~>"
|
|
46
46
|
- !ruby/object:Gem::Version
|
|
47
|
-
version: 1.3215.
|
|
47
|
+
version: 1.3215.4.0
|
|
48
48
|
type: :runtime
|
|
49
49
|
prerelease: false
|
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
|
51
51
|
requirements:
|
|
52
52
|
- - "~>"
|
|
53
53
|
- !ruby/object:Gem::Version
|
|
54
|
-
version: 1.3215.
|
|
54
|
+
version: 1.3215.4.0
|
|
55
55
|
- !ruby/object:Gem::Dependency
|
|
56
56
|
name: blobstore_client
|
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
|
58
58
|
requirements:
|
|
59
59
|
- - "~>"
|
|
60
60
|
- !ruby/object:Gem::Version
|
|
61
|
-
version: 1.3215.
|
|
61
|
+
version: 1.3215.4.0
|
|
62
62
|
type: :runtime
|
|
63
63
|
prerelease: false
|
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
|
65
65
|
requirements:
|
|
66
66
|
- - "~>"
|
|
67
67
|
- !ruby/object:Gem::Version
|
|
68
|
-
version: 1.3215.
|
|
68
|
+
version: 1.3215.4.0
|
|
69
69
|
- !ruby/object:Gem::Dependency
|
|
70
70
|
name: bosh-core
|
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
|
72
72
|
requirements:
|
|
73
73
|
- - "~>"
|
|
74
74
|
- !ruby/object:Gem::Version
|
|
75
|
-
version: 1.3215.
|
|
75
|
+
version: 1.3215.4.0
|
|
76
76
|
type: :runtime
|
|
77
77
|
prerelease: false
|
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
|
79
79
|
requirements:
|
|
80
80
|
- - "~>"
|
|
81
81
|
- !ruby/object:Gem::Version
|
|
82
|
-
version: 1.3215.
|
|
82
|
+
version: 1.3215.4.0
|
|
83
83
|
- !ruby/object:Gem::Dependency
|
|
84
84
|
name: bosh-director-core
|
|
85
85
|
requirement: !ruby/object:Gem::Requirement
|
|
86
86
|
requirements:
|
|
87
87
|
- - "~>"
|
|
88
88
|
- !ruby/object:Gem::Version
|
|
89
|
-
version: 1.3215.
|
|
89
|
+
version: 1.3215.4.0
|
|
90
90
|
type: :runtime
|
|
91
91
|
prerelease: false
|
|
92
92
|
version_requirements: !ruby/object:Gem::Requirement
|
|
93
93
|
requirements:
|
|
94
94
|
- - "~>"
|
|
95
95
|
- !ruby/object:Gem::Version
|
|
96
|
-
version: 1.3215.
|
|
96
|
+
version: 1.3215.4.0
|
|
97
97
|
- !ruby/object:Gem::Dependency
|
|
98
98
|
name: bosh-template
|
|
99
99
|
requirement: !ruby/object:Gem::Requirement
|
|
100
100
|
requirements:
|
|
101
101
|
- - "~>"
|
|
102
102
|
- !ruby/object:Gem::Version
|
|
103
|
-
version: 1.3215.
|
|
103
|
+
version: 1.3215.4.0
|
|
104
104
|
type: :runtime
|
|
105
105
|
prerelease: false
|
|
106
106
|
version_requirements: !ruby/object:Gem::Requirement
|
|
107
107
|
requirements:
|
|
108
108
|
- - "~>"
|
|
109
109
|
- !ruby/object:Gem::Version
|
|
110
|
-
version: 1.3215.
|
|
110
|
+
version: 1.3215.4.0
|
|
111
111
|
- !ruby/object:Gem::Dependency
|
|
112
112
|
name: bosh_openstack_cpi
|
|
113
113
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -681,8 +681,6 @@ files:
|
|
|
681
681
|
- db/migrations/director/20160219175840_add_column_teams_to_deployments.rb
|
|
682
682
|
- db/migrations/director/20160224222508_add_deployment_name_to_task.rb
|
|
683
683
|
- db/migrations/director/20160225182206_rename_post_start_completed.rb
|
|
684
|
-
- db/migrations/director/20160329201256_set_instances_with_nil_serial_to_false.rb
|
|
685
|
-
- db/migrations/director/20160331225404_backfill_stemcell_os.rb
|
|
686
684
|
- db/migrations/dns/20120123234908_initial.rb
|
|
687
685
|
- lib/bosh/director.rb
|
|
688
686
|
- lib/bosh/director/agent_client.rb
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
require 'json'
|
|
2
|
-
|
|
3
|
-
Sequel.migration do
|
|
4
|
-
up do
|
|
5
|
-
self[:instances].all do |instance|
|
|
6
|
-
unless instance[:spec_json].nil?
|
|
7
|
-
spec = JSON.parse(instance[:spec_json])
|
|
8
|
-
if !spec['update'].nil? && spec['update'].has_key?('serial') && spec['update']['serial'].nil?
|
|
9
|
-
spec['update']['serial'] = false
|
|
10
|
-
self[:instances].where(id: instance[:id]).update(spec_json: JSON.generate(spec))
|
|
11
|
-
end
|
|
12
|
-
end
|
|
13
|
-
end
|
|
14
|
-
end
|
|
15
|
-
end
|