bosh-director 1.3215.3.0 → 1.3215.4.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|