bosh-director 1.1782.0 → 1.1798.0
Sign up to get free protection for your applications and to get access to all the features.
- data/db/migrations/director/20140116002324_pivot_director_attributes.rb +20 -0
- data/lib/bosh/director/config.rb +11 -38
- data/lib/bosh/director/deployment_plan/job.rb +15 -11
- data/lib/bosh/director/deployment_plan/job_spec_parser.rb +9 -3
- data/lib/bosh/director/models/director_attribute.rb +32 -2
- data/lib/bosh/director/version.rb +1 -1
- metadata +19 -18
@@ -0,0 +1,20 @@
|
|
1
|
+
Sequel.migration do
|
2
|
+
change do
|
3
|
+
rename_table(:director_attributes, :old_director_attributes)
|
4
|
+
|
5
|
+
create_table(:director_attributes) do
|
6
|
+
primary_key :name
|
7
|
+
String :name, unique: true, null: false
|
8
|
+
String :value
|
9
|
+
end
|
10
|
+
|
11
|
+
# Some directors might have created multiple records.
|
12
|
+
# Only the first record is ever used after every director restart.
|
13
|
+
old_attribute = self[:old_director_attributes].first
|
14
|
+
if old_attribute
|
15
|
+
self[:director_attributes].insert(name: 'uuid', value: old_attribute[:uuid])
|
16
|
+
end
|
17
|
+
|
18
|
+
drop_table(:old_director_attributes)
|
19
|
+
end
|
20
|
+
end
|
data/lib/bosh/director/config.rb
CHANGED
@@ -118,7 +118,7 @@ module Bosh::Director
|
|
118
118
|
@dns_domain_name = canonical(@dns["domain_name"]) if @dns["domain_name"]
|
119
119
|
end
|
120
120
|
|
121
|
-
@uuid = override_uuid ||
|
121
|
+
@uuid = override_uuid || Bosh::Director::Models::DirectorAttribute.find_or_create_uuid(@logger)
|
122
122
|
@logger.info("Director UUID: #{@uuid}")
|
123
123
|
|
124
124
|
@encryption = config["encryption"]
|
@@ -292,46 +292,27 @@ module Bosh::Director
|
|
292
292
|
end
|
293
293
|
end
|
294
294
|
|
295
|
-
def retrieve_uuid
|
296
|
-
directors = Bosh::Director::Models::DirectorAttribute.all
|
297
|
-
director = directors.first
|
298
|
-
|
299
|
-
if directors.size > 1
|
300
|
-
@logger.warn("More than one UUID stored in director table, using #{director.uuid}")
|
301
|
-
end
|
302
|
-
|
303
|
-
unless director
|
304
|
-
director = Bosh::Director::Models::DirectorAttribute.new
|
305
|
-
director.uuid = gen_uuid
|
306
|
-
director.save
|
307
|
-
@logger.info("Generated director UUID #{director.uuid}")
|
308
|
-
end
|
309
|
-
|
310
|
-
director.uuid
|
311
|
-
end
|
312
|
-
|
313
295
|
def override_uuid
|
314
296
|
new_uuid = nil
|
297
|
+
state_file = File.join(base_dir, 'state.json')
|
315
298
|
|
316
299
|
if File.exists?(state_file)
|
317
300
|
open(state_file, 'r+') do |file|
|
318
301
|
|
319
|
-
#
|
302
|
+
# Lock before read to avoid director/worker race condition
|
320
303
|
file.flock(File::LOCK_EX)
|
321
304
|
state = Yajl::Parser.parse(file) || {}
|
322
|
-
|
305
|
+
|
306
|
+
# Empty state file to prevent blocked processes from attempting to set UUID
|
323
307
|
file.truncate(0)
|
324
308
|
|
325
|
-
if state[
|
326
|
-
Bosh::Director::Models::DirectorAttribute.
|
327
|
-
director
|
328
|
-
|
329
|
-
director.save
|
330
|
-
@logger.info("Using director UUID #{state["uuid"]} from #{state_file}")
|
331
|
-
new_uuid = state["uuid"]
|
309
|
+
if state['uuid']
|
310
|
+
Bosh::Director::Models::DirectorAttribute.update_or_create_uuid(state['uuid'], @logger)
|
311
|
+
@logger.info("Using director UUID #{state['uuid']} from #{state_file}")
|
312
|
+
new_uuid = state['uuid']
|
332
313
|
end
|
333
314
|
|
334
|
-
#
|
315
|
+
# Unlock after storing UUID
|
335
316
|
file.flock(File::LOCK_UN)
|
336
317
|
end
|
337
318
|
|
@@ -340,21 +321,13 @@ module Bosh::Director
|
|
340
321
|
|
341
322
|
new_uuid
|
342
323
|
end
|
343
|
-
|
344
|
-
def state_file
|
345
|
-
File.join(base_dir, "state.json")
|
346
|
-
end
|
347
|
-
|
348
|
-
def gen_uuid
|
349
|
-
SecureRandom.uuid
|
350
|
-
end
|
351
|
-
|
352
324
|
end
|
353
325
|
|
354
326
|
class << self
|
355
327
|
def load_file(path)
|
356
328
|
Config.new(Psych.load_file(path))
|
357
329
|
end
|
330
|
+
|
358
331
|
def load_hash(hash)
|
359
332
|
Config.new(hash)
|
360
333
|
end
|
@@ -204,18 +204,22 @@ module Bosh::Director
|
|
204
204
|
end
|
205
205
|
|
206
206
|
def validate_package_names_do_not_collide!
|
207
|
-
releases_by_package_names = templates
|
208
|
-
memo + t.model.package_names.product([t.release])
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
207
|
+
releases_by_package_names = templates
|
208
|
+
.reduce([]) { |memo, t| memo + t.model.package_names.product([t.release]) }
|
209
|
+
.reduce({}) { |memo, package_name_and_release_version|
|
210
|
+
package_name = package_name_and_release_version.first
|
211
|
+
release_version = package_name_and_release_version.last
|
212
|
+
memo[package_name] ||= Set.new
|
213
|
+
memo[package_name] << release_version
|
214
|
+
memo
|
215
|
+
}
|
216
216
|
|
217
|
-
|
218
|
-
|
217
|
+
releases_by_package_names.each do |package_name, releases|
|
218
|
+
if releases.size > 1
|
219
|
+
raise JobPackageCollision,
|
220
|
+
"Colocated package `#{package_name}' has the same name in multiple releases. " +
|
221
|
+
'BOSH cannot currently colocate two packages with identical names from separate releases.'
|
222
|
+
end
|
219
223
|
end
|
220
224
|
end
|
221
225
|
|
@@ -87,6 +87,7 @@ module Bosh::Director
|
|
87
87
|
release_name = safe_property(template, 'release', class: String, optional: true)
|
88
88
|
|
89
89
|
release = nil
|
90
|
+
|
90
91
|
if release_name
|
91
92
|
release = @deployment.release(release_name)
|
92
93
|
unless release
|
@@ -99,15 +100,20 @@ module Bosh::Director
|
|
99
100
|
raise JobMissingRelease, "Cannot tell what release template `#{template_name}' (job `#{@job.name}') is supposed to use, please explicitly specify one"
|
100
101
|
end
|
101
102
|
end
|
103
|
+
|
102
104
|
@job.templates << release.use_template_named(template_name)
|
103
105
|
end
|
104
106
|
end
|
105
107
|
end
|
106
108
|
|
107
109
|
def check_template_uniqueness
|
108
|
-
|
109
|
-
|
110
|
-
|
110
|
+
all_names = @job.templates.map(&:name)
|
111
|
+
@job.templates.each do |template|
|
112
|
+
if all_names.count(template.name) > 1
|
113
|
+
raise JobInvalidTemplates,
|
114
|
+
"Colocated job template `#{template.name}' has the same name in multiple releases. " +
|
115
|
+
"BOSH cannot currently colocate two job templates with identical names from separate releases."
|
116
|
+
end
|
111
117
|
end
|
112
118
|
end
|
113
119
|
|
@@ -1,9 +1,39 @@
|
|
1
1
|
module Bosh::Director::Models
|
2
2
|
class DirectorAttribute < Sequel::Model(Bosh::Director::Config.db)
|
3
|
-
|
4
3
|
def validate
|
5
|
-
|
4
|
+
validates_presence :name
|
5
|
+
end
|
6
|
+
|
7
|
+
def self.find_or_create_uuid(logger)
|
8
|
+
uuid = first(name: 'uuid')
|
9
|
+
if uuid
|
10
|
+
logger.info("Found uuid director attribute with value=#{uuid.value.inspect}")
|
11
|
+
return uuid.value
|
12
|
+
end
|
13
|
+
|
14
|
+
begin
|
15
|
+
uuid = create(name: 'uuid', value: SecureRandom.uuid)
|
16
|
+
logger.info("Created uuid director attribute with value=#{uuid.value.inspect}")
|
17
|
+
uuid.value
|
18
|
+
rescue Sequel::DatabaseError => e
|
19
|
+
# Database will throw an error in case of race condition
|
20
|
+
# causing multiple uuid records being inserted
|
21
|
+
logger.info("Failed to create uuid director attribute e=#{e.inspect}\n#{e.backtrace}")
|
22
|
+
|
23
|
+
uuid = first(name: 'uuid')
|
24
|
+
logger.info("Found uuid director attribute with value=#{uuid.value.inspect}")
|
25
|
+
uuid.value
|
26
|
+
end
|
6
27
|
end
|
7
28
|
|
29
|
+
def self.update_or_create_uuid(value, logger)
|
30
|
+
if where(name: 'uuid').update(value: value) == 0
|
31
|
+
create(name: 'uuid', value: value)
|
32
|
+
logger.info("Created uuid director attribute with value=#{value.inspect}")
|
33
|
+
else
|
34
|
+
logger.info("Updated uuid director attribute with value=#{value.inspect}")
|
35
|
+
end
|
36
|
+
value
|
37
|
+
end
|
8
38
|
end
|
9
39
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bosh-director
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.1798.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2014-01-
|
12
|
+
date: 2014-01-18 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: bcrypt-ruby
|
@@ -34,7 +34,7 @@ dependencies:
|
|
34
34
|
requirements:
|
35
35
|
- - ~>
|
36
36
|
- !ruby/object:Gem::Version
|
37
|
-
version: 1.
|
37
|
+
version: 1.1798.0
|
38
38
|
type: :runtime
|
39
39
|
prerelease: false
|
40
40
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -42,7 +42,7 @@ dependencies:
|
|
42
42
|
requirements:
|
43
43
|
- - ~>
|
44
44
|
- !ruby/object:Gem::Version
|
45
|
-
version: 1.
|
45
|
+
version: 1.1798.0
|
46
46
|
- !ruby/object:Gem::Dependency
|
47
47
|
name: bosh-core
|
48
48
|
requirement: !ruby/object:Gem::Requirement
|
@@ -50,7 +50,7 @@ dependencies:
|
|
50
50
|
requirements:
|
51
51
|
- - ~>
|
52
52
|
- !ruby/object:Gem::Version
|
53
|
-
version: 1.
|
53
|
+
version: 1.1798.0
|
54
54
|
type: :runtime
|
55
55
|
prerelease: false
|
56
56
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -58,7 +58,7 @@ dependencies:
|
|
58
58
|
requirements:
|
59
59
|
- - ~>
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version: 1.
|
61
|
+
version: 1.1798.0
|
62
62
|
- !ruby/object:Gem::Dependency
|
63
63
|
name: bosh_common
|
64
64
|
requirement: !ruby/object:Gem::Requirement
|
@@ -66,7 +66,7 @@ dependencies:
|
|
66
66
|
requirements:
|
67
67
|
- - ~>
|
68
68
|
- !ruby/object:Gem::Version
|
69
|
-
version: 1.
|
69
|
+
version: 1.1798.0
|
70
70
|
type: :runtime
|
71
71
|
prerelease: false
|
72
72
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -74,7 +74,7 @@ dependencies:
|
|
74
74
|
requirements:
|
75
75
|
- - ~>
|
76
76
|
- !ruby/object:Gem::Version
|
77
|
-
version: 1.
|
77
|
+
version: 1.1798.0
|
78
78
|
- !ruby/object:Gem::Dependency
|
79
79
|
name: bosh_cpi
|
80
80
|
requirement: !ruby/object:Gem::Requirement
|
@@ -82,7 +82,7 @@ dependencies:
|
|
82
82
|
requirements:
|
83
83
|
- - ~>
|
84
84
|
- !ruby/object:Gem::Version
|
85
|
-
version: 1.
|
85
|
+
version: 1.1798.0
|
86
86
|
type: :runtime
|
87
87
|
prerelease: false
|
88
88
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -90,7 +90,7 @@ dependencies:
|
|
90
90
|
requirements:
|
91
91
|
- - ~>
|
92
92
|
- !ruby/object:Gem::Version
|
93
|
-
version: 1.
|
93
|
+
version: 1.1798.0
|
94
94
|
- !ruby/object:Gem::Dependency
|
95
95
|
name: bosh_openstack_cpi
|
96
96
|
requirement: !ruby/object:Gem::Requirement
|
@@ -98,7 +98,7 @@ dependencies:
|
|
98
98
|
requirements:
|
99
99
|
- - ~>
|
100
100
|
- !ruby/object:Gem::Version
|
101
|
-
version: 1.
|
101
|
+
version: 1.1798.0
|
102
102
|
type: :runtime
|
103
103
|
prerelease: false
|
104
104
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -106,7 +106,7 @@ dependencies:
|
|
106
106
|
requirements:
|
107
107
|
- - ~>
|
108
108
|
- !ruby/object:Gem::Version
|
109
|
-
version: 1.
|
109
|
+
version: 1.1798.0
|
110
110
|
- !ruby/object:Gem::Dependency
|
111
111
|
name: bosh_aws_cpi
|
112
112
|
requirement: !ruby/object:Gem::Requirement
|
@@ -114,7 +114,7 @@ dependencies:
|
|
114
114
|
requirements:
|
115
115
|
- - ~>
|
116
116
|
- !ruby/object:Gem::Version
|
117
|
-
version: 1.
|
117
|
+
version: 1.1798.0
|
118
118
|
type: :runtime
|
119
119
|
prerelease: false
|
120
120
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -122,7 +122,7 @@ dependencies:
|
|
122
122
|
requirements:
|
123
123
|
- - ~>
|
124
124
|
- !ruby/object:Gem::Version
|
125
|
-
version: 1.
|
125
|
+
version: 1.1798.0
|
126
126
|
- !ruby/object:Gem::Dependency
|
127
127
|
name: bosh_vsphere_cpi
|
128
128
|
requirement: !ruby/object:Gem::Requirement
|
@@ -130,7 +130,7 @@ dependencies:
|
|
130
130
|
requirements:
|
131
131
|
- - ~>
|
132
132
|
- !ruby/object:Gem::Version
|
133
|
-
version: 1.
|
133
|
+
version: 1.1798.0
|
134
134
|
type: :runtime
|
135
135
|
prerelease: false
|
136
136
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -138,7 +138,7 @@ dependencies:
|
|
138
138
|
requirements:
|
139
139
|
- - ~>
|
140
140
|
- !ruby/object:Gem::Version
|
141
|
-
version: 1.
|
141
|
+
version: 1.1798.0
|
142
142
|
- !ruby/object:Gem::Dependency
|
143
143
|
name: eventmachine
|
144
144
|
requirement: !ruby/object:Gem::Requirement
|
@@ -461,7 +461,7 @@ dependencies:
|
|
461
461
|
version: '1.0'
|
462
462
|
description: ! 'BOSH Director
|
463
463
|
|
464
|
-
|
464
|
+
4c516b'
|
465
465
|
email: support@cloudfoundry.com
|
466
466
|
executables:
|
467
467
|
- bosh-director
|
@@ -501,6 +501,7 @@ files:
|
|
501
501
|
- db/migrations/director/20130531172604_add_director_attributes.rb
|
502
502
|
- db/migrations/director/20131121182231_add_rendered_templates_archives.rb
|
503
503
|
- db/migrations/director/20131125232201_rename_rendered_templates_archives_blob_id_and_checksum_columns.rb
|
504
|
+
- db/migrations/director/20140116002324_pivot_director_attributes.rb
|
504
505
|
- db/migrations/dns/20120123234908_initial.rb
|
505
506
|
- lib/bosh/director.rb
|
506
507
|
- lib/bosh/director/agent_client.rb
|
@@ -713,7 +714,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
713
714
|
version: '0'
|
714
715
|
segments:
|
715
716
|
- 0
|
716
|
-
hash:
|
717
|
+
hash: -1547539602198935562
|
717
718
|
requirements: []
|
718
719
|
rubyforge_project:
|
719
720
|
rubygems_version: 1.8.23
|