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.
@@ -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
@@ -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 || retrieve_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
- # lock before read to avoid director/worker race condition
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
- # empty state file to prevent blocked processes from attempting to set UUID
305
+
306
+ # Empty state file to prevent blocked processes from attempting to set UUID
323
307
  file.truncate(0)
324
308
 
325
- if state["uuid"]
326
- Bosh::Director::Models::DirectorAttribute.delete
327
- director = Bosh::Director::Models::DirectorAttribute.new
328
- director.uuid = state["uuid"]
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
- # unlock after storing UUID
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.reduce([]) { |memo, t|
208
- 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
- }
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
- if releases_by_package_names.values.detect { |x| x.size > 1 }
218
- raise JobPackageCollision, 'Unable to deploy: package name collision in job definitions.'
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
- if @job.templates.uniq(&:name).size != @job.templates.size
109
- raise JobInvalidTemplates,
110
- "Job `#{@job.name}' templates must not have repeating names."
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
- validates_unique [:uuid]
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
@@ -1,5 +1,5 @@
1
1
  module Bosh
2
2
  module Director
3
- VERSION = '1.1782.0'
3
+ VERSION = '1.1798.0'
4
4
  end
5
5
  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.1782.0
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-16 00:00:00.000000000 Z
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.1782.0
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.1782.0
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.1782.0
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.1782.0
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.1782.0
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.1782.0
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.1782.0
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.1782.0
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.1782.0
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.1782.0
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.1782.0
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.1782.0
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.1782.0
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.1782.0
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
- 5aedfc'
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: 4571235917096416855
717
+ hash: -1547539602198935562
717
718
  requirements: []
718
719
  rubyforge_project:
719
720
  rubygems_version: 1.8.23