bosh-director 1.3215.4.0 → 1.3232.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (147) hide show
  1. checksums.yaml +4 -4
  2. data/bin/bosh-director-console +1 -1
  3. data/bin/bosh-director-drain-workers +8 -2
  4. data/bin/bosh-director-worker +34 -53
  5. data/db/migrations/director/20110617211923_add_deployments_release_versions.rb +2 -2
  6. data/db/migrations/director/20120524175805_add_task_type.rb +23 -23
  7. data/db/migrations/director/20130531172604_add_director_attributes.rb +1 -2
  8. data/db/migrations/director/20140116002324_pivot_director_attributes.rb +1 -2
  9. data/db/migrations/director/20160210201838_denormalize_compiled_package_stemcell_id_to_stemcell_name_and_version.rb +7 -9
  10. data/db/migrations/director/20160211174110_add_events.rb +22 -0
  11. data/db/migrations/director/20160324181932_create_delayed_jobs.rb +22 -0
  12. data/db/migrations/director/20160324182211_add_locks.rb +15 -0
  13. data/db/migrations/director/20160329201256_set_instances_with_nil_serial_to_false.rb +15 -0
  14. data/db/migrations/director/20160331225404_backfill_stemcell_os.rb +9 -0
  15. data/db/migrations/director/20160411104407_add_task_started_at.rb +9 -0
  16. data/lib/bosh/director.rb +9 -2
  17. data/lib/bosh/director/agent_client.rb +22 -9
  18. data/lib/bosh/director/api.rb +0 -1
  19. data/lib/bosh/director/api/api_helper.rb +1 -1
  20. data/lib/bosh/director/api/controllers/base_controller.rb +5 -1
  21. data/lib/bosh/director/api/controllers/cloud_configs_controller.rb +18 -2
  22. data/lib/bosh/director/api/controllers/deployments_controller.rb +16 -9
  23. data/lib/bosh/director/api/controllers/events_controller.rb +37 -0
  24. data/lib/bosh/director/api/controllers/locks_controller.rb +7 -11
  25. data/lib/bosh/director/api/controllers/packages_controller.rb +1 -1
  26. data/lib/bosh/director/api/controllers/runtime_configs_controller.rb +18 -2
  27. data/lib/bosh/director/api/controllers/tasks_controller.rb +7 -2
  28. data/lib/bosh/director/api/deployment_lookup.rb +1 -1
  29. data/lib/bosh/director/api/deployment_manager.rb +1 -1
  30. data/lib/bosh/director/api/event_manager.rb +68 -0
  31. data/lib/bosh/director/api/extensions/scoping.rb +2 -2
  32. data/lib/bosh/director/api/extensions/syslog_request_logger.rb +75 -0
  33. data/lib/bosh/director/api/instance_lookup.rb +2 -2
  34. data/lib/bosh/director/api/instance_manager.rb +2 -2
  35. data/lib/bosh/director/api/local_identity_provider.rb +8 -0
  36. data/lib/bosh/director/api/property_manager.rb +6 -5
  37. data/lib/bosh/director/api/release_manager.rb +3 -3
  38. data/lib/bosh/director/api/resource_manager.rb +2 -2
  39. data/lib/bosh/director/api/resurrector_manager.rb +1 -1
  40. data/lib/bosh/director/api/route_configuration.rb +1 -0
  41. data/lib/bosh/director/api/stemcell_manager.rb +5 -5
  42. data/lib/bosh/director/api/task_manager.rb +1 -0
  43. data/lib/bosh/director/api/task_remover.rb +1 -1
  44. data/lib/bosh/director/api/uaa_identity_provider.rb +9 -1
  45. data/lib/bosh/director/api/user/database_user_manager.rb +1 -1
  46. data/lib/bosh/director/app.rb +1 -1
  47. data/lib/bosh/director/arp_flusher.rb +23 -0
  48. data/lib/bosh/director/cloudcheck_helper.rb +4 -3
  49. data/lib/bosh/director/compile_task.rb +6 -6
  50. data/lib/bosh/director/compile_task_generator.rb +6 -6
  51. data/lib/bosh/director/compiled_release_downloader.rb +4 -4
  52. data/lib/bosh/director/config.rb +29 -87
  53. data/lib/bosh/director/deployment_deleter.rb +6 -6
  54. data/lib/bosh/director/deployment_plan/agent_state_migrator.rb +2 -2
  55. data/lib/bosh/director/deployment_plan/assembler.rb +1 -1
  56. data/lib/bosh/director/deployment_plan/compilation_instance_pool.rb +26 -1
  57. data/lib/bosh/director/deployment_plan/deployment_repo.rb +1 -1
  58. data/lib/bosh/director/deployment_plan/disk_type.rb +1 -1
  59. data/lib/bosh/director/deployment_plan/instance.rb +2 -2
  60. data/lib/bosh/director/deployment_plan/instance_plan.rb +2 -2
  61. data/lib/bosh/director/deployment_plan/instance_spec.rb +2 -0
  62. data/lib/bosh/director/deployment_plan/ip_provider/ip_provider.rb +7 -3
  63. data/lib/bosh/director/deployment_plan/job.rb +12 -10
  64. data/lib/bosh/director/deployment_plan/job_spec_parser.rb +4 -4
  65. data/lib/bosh/director/deployment_plan/links/link.rb +1 -0
  66. data/lib/bosh/director/deployment_plan/links/link_path.rb +18 -19
  67. data/lib/bosh/director/deployment_plan/links/links_resolver.rb +2 -0
  68. data/lib/bosh/director/deployment_plan/links/template_link.rb +1 -1
  69. data/lib/bosh/director/deployment_plan/manual_network.rb +1 -1
  70. data/lib/bosh/director/deployment_plan/manual_network_subnet.rb +6 -6
  71. data/lib/bosh/director/deployment_plan/planner.rb +3 -3
  72. data/lib/bosh/director/deployment_plan/planner_factory.rb +38 -40
  73. data/lib/bosh/director/deployment_plan/release_version.rb +5 -5
  74. data/lib/bosh/director/deployment_plan/runtime_manifest_parser.rb +22 -18
  75. data/lib/bosh/director/deployment_plan/steps/package_compile_step.rb +14 -16
  76. data/lib/bosh/director/deployment_plan/steps/update_step.rb +5 -5
  77. data/lib/bosh/director/deployment_plan/template.rb +61 -1
  78. data/lib/bosh/director/deployment_plan/update_config.rb +1 -1
  79. data/lib/bosh/director/disk_manager.rb +49 -40
  80. data/lib/bosh/director/dns/canonicalizer.rb +2 -2
  81. data/lib/bosh/director/dns/dns_manager.rb +2 -2
  82. data/lib/bosh/director/dns/powerdns.rb +2 -2
  83. data/lib/bosh/director/download_helper.rb +5 -5
  84. data/lib/bosh/director/errand/job_manager.rb +5 -6
  85. data/lib/bosh/director/errand/result.rb +1 -1
  86. data/lib/bosh/director/errand/runner.rb +2 -3
  87. data/lib/bosh/director/event_log.rb +1 -7
  88. data/lib/bosh/director/ext.rb +0 -6
  89. data/lib/bosh/director/instance_deleter.rb +23 -2
  90. data/lib/bosh/director/instance_updater.rb +62 -6
  91. data/lib/bosh/director/instance_updater/state_applier.rb +2 -2
  92. data/lib/bosh/director/job_queue.rb +4 -2
  93. data/lib/bosh/director/job_runner.rb +3 -8
  94. data/lib/bosh/director/jobs/backup.rb +1 -1
  95. data/lib/bosh/director/jobs/base_job.rb +10 -6
  96. data/lib/bosh/director/jobs/cleanup_artifacts.rb +6 -6
  97. data/lib/bosh/director/jobs/db_job.rb +87 -0
  98. data/lib/bosh/director/jobs/delete_deployment.rb +23 -2
  99. data/lib/bosh/director/jobs/delete_deployment_snapshots.rb +1 -1
  100. data/lib/bosh/director/jobs/delete_orphan_disks.rb +2 -2
  101. data/lib/bosh/director/jobs/delete_release.rb +2 -2
  102. data/lib/bosh/director/jobs/delete_stemcell.rb +1 -1
  103. data/lib/bosh/director/jobs/export_release.rb +4 -2
  104. data/lib/bosh/director/jobs/fetch_logs.rb +1 -1
  105. data/lib/bosh/director/jobs/helpers/blob_deleter.rb +1 -1
  106. data/lib/bosh/director/jobs/helpers/name_version_release_deleter.rb +3 -3
  107. data/lib/bosh/director/jobs/helpers/release_version_deleter.rb +1 -1
  108. data/lib/bosh/director/jobs/helpers/stemcell_deleter.rb +2 -12
  109. data/lib/bosh/director/jobs/release/release_job.rb +13 -28
  110. data/lib/bosh/director/jobs/run_errand.rb +6 -6
  111. data/lib/bosh/director/jobs/scheduled_backup.rb +1 -1
  112. data/lib/bosh/director/jobs/scheduled_events_cleanup.rb +31 -0
  113. data/lib/bosh/director/jobs/scheduled_orphan_cleanup.rb +1 -1
  114. data/lib/bosh/director/jobs/snapshot_deployment.rb +4 -1
  115. data/lib/bosh/director/jobs/ssh.rb +36 -14
  116. data/lib/bosh/director/jobs/update_deployment.rb +28 -6
  117. data/lib/bosh/director/jobs/update_release.rb +31 -41
  118. data/lib/bosh/director/jobs/update_stemcell.rb +4 -4
  119. data/lib/bosh/director/jobs/vm_state.rb +1 -2
  120. data/lib/bosh/director/lock.rb +30 -55
  121. data/lib/bosh/director/logs_fetcher.rb +2 -3
  122. data/lib/bosh/director/manifest/changeset.rb +88 -42
  123. data/lib/bosh/director/manifest/manifest.rb +1 -1
  124. data/lib/bosh/director/models.rb +3 -0
  125. data/lib/bosh/director/models/event.rb +18 -0
  126. data/lib/bosh/director/models/lock.rb +9 -0
  127. data/lib/bosh/director/models/release_version.rb +3 -1
  128. data/lib/bosh/director/problem_handlers/base.rb +3 -3
  129. data/lib/bosh/director/problem_handlers/inactive_disk.rb +4 -4
  130. data/lib/bosh/director/problem_handlers/missing_disk.rb +3 -3
  131. data/lib/bosh/director/problem_handlers/missing_vm.rb +1 -1
  132. data/lib/bosh/director/problem_handlers/mount_info_mismatch.rb +3 -3
  133. data/lib/bosh/director/problem_handlers/unresponsive_agent.rb +2 -2
  134. data/lib/bosh/director/problem_resolver.rb +5 -5
  135. data/lib/bosh/director/problem_scanner/problem_register.rb +1 -1
  136. data/lib/bosh/director/problem_scanner/scanner.rb +3 -2
  137. data/lib/bosh/director/scheduler.rb +3 -3
  138. data/lib/bosh/director/sequel.rb +1 -3
  139. data/lib/bosh/director/stopper.rb +1 -1
  140. data/lib/bosh/director/validation_helper.rb +60 -37
  141. data/lib/bosh/director/version.rb +1 -1
  142. data/lib/bosh/director/vm_creator.rb +39 -7
  143. data/lib/bosh/director/vm_deleter.rb +29 -2
  144. data/lib/bosh/director/vm_metadata_updater.rb +4 -0
  145. data/lib/bosh/director/worker.rb +52 -0
  146. metadata +47 -61
  147. data/lib/bosh/director/manifest/redactor.rb +0 -44
@@ -121,7 +121,8 @@ module Bosh::Director
121
121
  vm_deleter = VmDeleter.new(cloud, @logger)
122
122
  disk_manager = DiskManager.new(cloud, @logger)
123
123
  job_renderer = JobRenderer.create
124
- vm_creator = Bosh::Director::VmCreator.new(cloud, @logger, vm_deleter, disk_manager, job_renderer)
124
+ arp_flusher = ArpFlusher.new
125
+ vm_creator = Bosh::Director::VmCreator.new(cloud, @logger, vm_deleter, disk_manager, job_renderer, arp_flusher)
125
126
  dns_manager = DnsManagerProvider.create
126
127
  instance_deleter = Bosh::Director::InstanceDeleter.new(ip_provider, dns_manager, disk_manager)
127
128
  compilation_instance_pool = CompilationInstancePool.new(
@@ -136,7 +137,6 @@ module Bosh::Director
136
137
  compilation,
137
138
  compilation_instance_pool,
138
139
  @logger,
139
- Config.event_log,
140
140
  nil
141
141
  )
142
142
  package_compile_step.perform
@@ -179,7 +179,7 @@ module Bosh::Director
179
179
  def add_release(release)
180
180
  if @releases.has_key?(release.name)
181
181
  raise DeploymentDuplicateReleaseName,
182
- "Duplicate release name `#{release.name}'"
182
+ "Duplicate release name '#{release.name}'"
183
183
  end
184
184
  @releases[release.name] = release
185
185
  end
@@ -115,11 +115,11 @@ module Bosh
115
115
 
116
116
  if template.link_infos.has_key?(current_job.name) && template.link_infos[current_job.name].has_key?('provides')
117
117
  template.link_infos[current_job.name]['provides'].each do |link_name, provided_link|
118
- if provided_link['properties']
118
+ if provided_link['link_properties_exported']
119
119
  ## Get default values for this job
120
120
  default_properties = get_default_properties(deployment, template)
121
121
 
122
- provided_link['mapped_properties'] = process_link_properties(scoped_properties, default_properties, provided_link['properties'], errors)
122
+ provided_link['mapped_properties'] = process_link_properties(scoped_properties, default_properties, provided_link['link_properties_exported'], errors)
123
123
  end
124
124
  end
125
125
  end
@@ -168,52 +168,50 @@ module Bosh
168
168
 
169
169
  def process_link_properties(scoped_properties, default_properties, link_property_list, errors)
170
170
  mapped_properties = {}
171
-
172
- link_property_list.each do |link_property| #list of properties
173
- previous_property_in_loop = {}
174
- current_property_in_loop = scoped_properties
175
- mapped_properties_in_loop = mapped_properties
176
-
177
- use_defaults = false
178
- property_path = link_property.split(".")
179
- property_path.each do |key|
180
- if !current_property_in_loop || !current_property_in_loop.has_key?(key)
181
- use_defaults = true
182
- else
183
- current_property_in_loop = current_property_in_loop[key]
184
- end
185
-
186
- if !mapped_properties_in_loop.has_key?(key)
187
- mapped_properties_in_loop[key] = {}
188
- end
189
- previous_property_in_loop = mapped_properties_in_loop
190
- mapped_properties_in_loop = mapped_properties_in_loop[key]
191
- end
192
-
193
- if use_defaults
194
- if default_properties.has_key?('properties') && default_properties['properties'].has_key?(link_property)
195
- if default_properties['properties'][link_property].has_key?('default')
196
- previous_property_in_loop[property_path.last()] = default_properties['properties'][link_property]['default']
171
+ link_property_list.each do |link_property|
172
+ property_path = link_property.split(".")
173
+ result = find_property(property_path, scoped_properties)
174
+ if !result['found']
175
+ if default_properties.has_key?('properties') && default_properties['properties'].has_key?(link_property)
176
+ if default_properties['properties'][link_property].has_key?('default')
177
+ mapped_properties = update_mapped_properties(mapped_properties, property_path, default_properties['properties'][link_property]['default'])
178
+ else
179
+ mapped_properties = update_mapped_properties(mapped_properties, property_path, nil)
180
+ end
197
181
  else
198
- e = Exception.new("Link property #{link_property} in template #{default_properties['template_name']} has no default value or value supplied by the deployment manifest")
182
+ e = Exception.new("Link property #{link_property} in template #{default_properties['template_name']} is not defined in release spec")
199
183
  errors.push(e)
200
184
  end
201
185
  else
202
- e = Exception.new("Link property #{link_property} in template #{default_properties['template_name']} is not defined in release spec")
203
- errors.push(e)
186
+ mapped_properties = update_mapped_properties(mapped_properties, property_path, result['value'])
204
187
  end
188
+ end
189
+ return mapped_properties
190
+ end
191
+
192
+ def find_property(property_path, scoped_properties)
193
+ current_node = scoped_properties
194
+ property_path.each do |key|
195
+ if !current_node || !current_node.has_key?(key)
196
+ return {'found'=> false, 'value' => nil}
205
197
  else
206
- previous_property_in_loop[property_path.last()] = current_property_in_loop
198
+ current_node = current_node[key]
207
199
  end
200
+ end
201
+ return {'found'=> true,'value'=> current_node}
202
+ end
208
203
 
209
- # if use_defaults && !default_properties.has_key?("properties") && !default_properties['properties'][link_property].has_key?('default')
210
- # e = Exception.new("Property #{link_property} in template #{default_properties['template_name']} has no default value or value supplied by the deployment manifest")
211
- # errors.push(e)
212
- # elsif use_defaults
213
- # previous_property_in_loop[property_path.last()] = default_properties['properties'][link_property]['default']
214
- # else
215
- # previous_property_in_loop[property_path.last()] = current_property_in_loop
216
- # end
204
+ def update_mapped_properties(mapped_properties, property_path, value)
205
+ current_node = mapped_properties
206
+ property_path.each_with_index do |key, index|
207
+ if index == property_path.size - 1
208
+ current_node[key] = value
209
+ else
210
+ if !current_node.has_key?(key)
211
+ current_node[key] = {}
212
+ end
213
+ current_node = current_node[key]
214
+ end
217
215
  end
218
216
  return mapped_properties
219
217
  end
@@ -35,11 +35,11 @@ module Bosh::Director
35
35
 
36
36
  release = @manager.find_by_name(@name)
37
37
  @model = @manager.find_version(release, @version)
38
- @logger.debug("Found release `#{@name}/#{@version}'")
38
+ @logger.debug("Found release '#{@name}/#{@version}'")
39
39
 
40
40
  unless @deployment_model.release_versions.include?(@model)
41
- @logger.debug("Binding release `#{@name}/#{@version}' " +
42
- "to deployment `#{@deployment_model.name}'")
41
+ @logger.debug("Binding release '#{@name}/#{@version}' " +
42
+ "to deployment '#{@deployment_model.name}'")
43
43
  @deployment_model.add_release_version(@model)
44
44
  end
45
45
  end
@@ -58,9 +58,9 @@ module Bosh::Director
58
58
  # have been parsed, so we can assume @templates contains
59
59
  # the list of templates that need to be bound
60
60
  @templates.each_value do |template|
61
- @logger.debug("Binding template `#{template.name}'")
61
+ @logger.debug("Binding template '#{template.name}'")
62
62
  template.bind_models
63
- @logger.debug("Bound template `#{template.name}'")
63
+ @logger.debug("Bound template '#{template.name}'")
64
64
  end
65
65
  end
66
66
 
@@ -21,7 +21,7 @@ module Bosh::Director
21
21
  if runtime_manifest['release']
22
22
  if runtime_manifest['releases']
23
23
  raise RuntimeAmbiguousReleaseSpec,
24
- "Runtime manifest contains both `release' and `releases' " +
24
+ "Runtime manifest contains both 'release' and 'releases' " +
25
25
  'sections, please use one of the two.'
26
26
  end
27
27
  @release_specs << runtime_manifest['release']
@@ -34,16 +34,16 @@ module Bosh::Director
34
34
  @release_specs.each do |release_spec|
35
35
  if release_spec['version'] == 'latest'
36
36
  raise RuntimeInvalidReleaseVersion,
37
- "Runtime manifest contains the release `#{release_spec['name']}' with version as `latest'. " +
37
+ "Runtime manifest contains the release '#{release_spec['name']}' with version as 'latest'. " +
38
38
  "Please specify the actual version string."
39
39
  end
40
40
 
41
41
  if @deployment
42
42
  deployment_release = @deployment.release(release_spec["name"])
43
43
  if deployment_release
44
- if deployment_release.version != release_spec["version"]
45
- raise RuntimeInvalidDeploymentRelease, "Runtime manifest specifies release `#{release_spec["name"]}' with version as `#{release_spec["version"]}'. " +
46
- "This conflicts with version `#{deployment_release.version}' specified in the deployment manifest."
44
+ if deployment_release.version != release_spec["version"].to_s
45
+ raise RuntimeInvalidDeploymentRelease, "Runtime manifest specifies release '#{release_spec["name"]}' with version as '#{release_spec["version"]}'. " +
46
+ "This conflicts with version '#{deployment_release.version}' specified in the deployment manifest."
47
47
  else
48
48
  next
49
49
  end
@@ -64,10 +64,10 @@ module Bosh::Director
64
64
 
65
65
  addon_jobs = safe_property(addon_spec, 'jobs', :class => Array, :default => [])
66
66
 
67
- addon_jobs.each do |job|
68
- if !@release_specs.find { |release_spec| release_spec['name'] == job['release'] }
67
+ addon_jobs.each do |addon_job|
68
+ if !@release_specs.find { |release_spec| release_spec['name'] == addon_job['release'] }
69
69
  raise RuntimeReleaseNotListedInReleases,
70
- "Runtime manifest specifies job `#{job['name']}' which is defined in `#{job['release']}', but `#{job['release']}' is not listed in the releases section."
70
+ "Runtime manifest specifies job '#{addon_job['name']}' which is defined in '#{addon_job['release']}', but '#{addon_job['release']}' is not listed in the releases section."
71
71
  end
72
72
 
73
73
  if @deployment
@@ -75,38 +75,42 @@ module Bosh::Director
75
75
  deployment_release_ids = Models::Release.where(:name => valid_release_versions).map {|r| r.id}
76
76
  deployment_jobs = @deployment.jobs
77
77
 
78
- templates_from_model = Models::Template.where(:name => job['name'], :release_id => deployment_release_ids)
78
+ templates_from_model = Models::Template.where(:name => addon_job['name'], :release_id => deployment_release_ids)
79
79
  if templates_from_model == nil
80
- raise "Job '#{job['name']}' not found in Template table"
80
+ raise "Job '#{addon_job['name']}' not found in Template table"
81
81
  end
82
82
 
83
- release = @deployment.release(job['release'])
83
+ release = @deployment.release(addon_job['release'])
84
84
  release.bind_model
85
85
 
86
- template = DeploymentPlan::Template.new(release, job['name'])
86
+ template = DeploymentPlan::Template.new(release, addon_job['name'])
87
87
 
88
88
  deployment_jobs.each do |j|
89
89
  templates_from_model.each do |template_from_model|
90
90
  if template_from_model.consumes != nil
91
91
  template_from_model.consumes.each do |consumes|
92
- template.add_link_info(j.name, 'consumes', consumes["name"], consumes)
92
+ template.add_link_from_release(j.name, 'consumes', consumes["name"], consumes)
93
93
  end
94
94
  end
95
95
  if template_from_model.provides != nil
96
96
  template_from_model.provides.each do |provides|
97
- template.add_link_info(j.name, 'provides', provides["name"], provides)
97
+ template.add_link_from_release(j.name, 'provides', provides["name"], provides)
98
98
  end
99
99
  end
100
100
  end
101
101
 
102
- provides_links = safe_property(job, 'provides', class: Hash, optional: true)
102
+ provides_links = safe_property(addon_job, 'provides', class: Hash, optional: true)
103
103
  provides_links.to_a.each do |link_name, source|
104
- template.add_link_info(j.name, "provides", link_name, source)
104
+ template.add_link_from_manifest(j.name, "provides", link_name, source)
105
105
  end
106
106
 
107
- consumes_links = safe_property(job, 'consumes', class: Hash, optional: true)
107
+ consumes_links = safe_property(addon_job, 'consumes', class: Hash, optional: true)
108
108
  consumes_links.to_a.each do |link_name, source|
109
- template.add_link_info(j.name, 'consumes', link_name, source)
109
+ template.add_link_from_manifest(j.name, 'consumes', link_name, source)
110
+ end
111
+
112
+ if addon_job.has_key?('properties')
113
+ template.add_template_scoped_properties(addon_job['properties'], j.name)
110
114
  end
111
115
  end
112
116
 
@@ -9,8 +9,8 @@ module Bosh::Director
9
9
 
10
10
  attr_reader :compilations_performed
11
11
 
12
- def initialize(jobs_to_compile, compilation_config, compilation_instance_pool, logger, event_log, director_job)
13
- @event_log = event_log
12
+ def initialize(jobs_to_compile, compilation_config, compilation_instance_pool, logger, director_job)
13
+ @event_log_stage = nil
14
14
  @logger = logger
15
15
  @director_job = director_job
16
16
 
@@ -18,9 +18,6 @@ module Bosh::Director
18
18
  @counter_mutex = Mutex.new
19
19
 
20
20
  @compilation_instance_pool = compilation_instance_pool
21
-
22
- @compile_task_generator = CompileTaskGenerator.new(@logger, @event_log)
23
-
24
21
  @compile_tasks = {}
25
22
  @ready_tasks = []
26
23
  @compilations_performed = 0
@@ -34,7 +31,7 @@ module Bosh::Director
34
31
 
35
32
  @compile_tasks.each_value do |task|
36
33
  if task.ready_to_compile?
37
- @logger.info("Package `#{task.package.desc}' is ready to be compiled for stemcell `#{task.stemcell.desc}'")
34
+ @logger.info("Package '#{task.package.desc}' is ready to be compiled for stemcell '#{task.stemcell.desc}'")
38
35
  @ready_tasks << task
39
36
  end
40
37
  end
@@ -61,7 +58,7 @@ module Bosh::Director
61
58
 
62
59
  with_compile_lock(package.id, stemcell.id) do
63
60
  # Check if the package was compiled in a parallel deployment
64
- compiled_package = task.find_compiled_package(@logger, @event_log)
61
+ compiled_package = task.find_compiled_package(@logger, @event_log_stage)
65
62
  if compiled_package.nil?
66
63
  build = Models::CompiledPackage.generate_build_number(package, stemcell.model.operating_system, stemcell.model.version)
67
64
  task_result = nil
@@ -124,9 +121,10 @@ module Bosh::Director
124
121
  private
125
122
 
126
123
  def prepare_tasks
127
- @event_log.begin_stage('Preparing package compilation', 1)
124
+ @event_log_stage = Config.event_log.begin_stage('Preparing package compilation', 1)
125
+ @compile_task_generator = CompileTaskGenerator.new(@logger, @event_log_stage)
128
126
 
129
- @event_log.track('Finding packages to compile') do
127
+ @event_log_stage.advance_and_track('Finding packages to compile') do
130
128
  @jobs_to_compile.each do |job|
131
129
  stemcell = job.stemcell
132
130
 
@@ -136,9 +134,9 @@ module Bosh::Director
136
134
  # it's obscure which double is at fault
137
135
  release_name = t.release.name
138
136
  template_name = t.name
139
- "`#{release_name}/#{template_name}'"
137
+ "'#{release_name}/#{template_name}'"
140
138
  end
141
- @logger.info("Job templates #{template_descs.join(', ')} need to run on stemcell `#{stemcell.desc}'")
139
+ @logger.info("Job templates #{template_descs.join(', ')} need to run on stemcell '#{stemcell.desc}'")
142
140
 
143
141
  job.templates.each do |template|
144
142
  template.package_models.each do |package|
@@ -150,7 +148,7 @@ module Bosh::Director
150
148
  end
151
149
 
152
150
  def compile_packages
153
- @event_log.begin_stage('Compiling packages', compilation_count)
151
+ @event_log_stage = Config.event_log.begin_stage('Compiling packages', compilation_count)
154
152
 
155
153
  begin
156
154
  ThreadPool.new(:max_threads => @compilation_config.workers).wrap do |pool|
@@ -182,10 +180,10 @@ module Bosh::Director
182
180
 
183
181
  def enqueue_unblocked_tasks(task)
184
182
  @tasks_mutex.synchronize do
185
- @logger.info("Unblocking dependents of `#{task.package.desc}` for `#{task.stemcell.desc}`")
183
+ @logger.info("Unblocking dependents of '#{task.package.desc}' for '#{task.stemcell.desc}'")
186
184
  task.dependent_tasks.each do |dep_task|
187
185
  if dep_task.ready_to_compile?
188
- @logger.info("Package `#{dep_task.package.desc}' now ready to be compiled for `#{dep_task.stemcell.desc}'")
186
+ @logger.info("Package '#{dep_task.package.desc}' now ready to be compiled for '#{dep_task.stemcell.desc}'")
189
187
  @ready_tasks << dep_task
190
188
  end
191
189
  end
@@ -195,13 +193,13 @@ module Bosh::Director
195
193
  def process_task(task)
196
194
  package_desc = task.package.desc
197
195
  stemcell_desc = task.stemcell.desc
198
- task_desc = "package `#{package_desc}' for stemcell `#{stemcell_desc}'"
196
+ task_desc = "package '#{package_desc}' for stemcell '#{stemcell_desc}'"
199
197
 
200
198
  with_thread_name("compile_package(#{package_desc}, #{stemcell_desc})") do
201
199
  if director_job_cancelled?
202
200
  @logger.info("Cancelled compiling #{task_desc}")
203
201
  else
204
- @event_log.track(package_desc) do
202
+ @event_log_stage.advance_and_track(package_desc) do
205
203
  @logger.info("Compiling #{task_desc}")
206
204
  compile_package(task)
207
205
  @logger.info("Finished compiling #{task_desc}")
@@ -2,17 +2,17 @@ module Bosh::Director
2
2
  module DeploymentPlan
3
3
  module Steps
4
4
  class UpdateStep
5
- def initialize(base_job, event_log, deployment_plan, multi_job_updater, cloud)
5
+ def initialize(base_job, deployment_plan, multi_job_updater, cloud)
6
6
  @base_job = base_job
7
7
  @logger = base_job.logger
8
- @event_log = event_log
9
8
  @cloud = cloud
10
9
  @deployment_plan = deployment_plan
11
10
  @multi_job_updater = multi_job_updater
12
11
  @vm_deleter = Bosh::Director::VmDeleter.new(@cloud, @logger)
13
12
  @disk_manager = DiskManager.new(@cloud, @logger)
14
13
  job_renderer = JobRenderer.create
15
- @vm_creator = Bosh::Director::VmCreator.new(@cloud, @logger, @vm_deleter, @disk_manager, job_renderer)
14
+ arp_flusher = ArpFlusher.new
15
+ @vm_creator = Bosh::Director::VmCreator.new(@cloud, @logger, @vm_deleter, @disk_manager, job_renderer, arp_flusher)
16
16
  end
17
17
 
18
18
  def perform
@@ -36,7 +36,7 @@ module Bosh::Director
36
36
 
37
37
  @logger.info('Creating missing VMs')
38
38
  # TODO: something about instance_plans.select(&:new?) -- how does that compare to the isntance#has_vm? check?
39
- @vm_creator.create_for_instance_plans(@deployment_plan.instance_plans_with_missing_vms, @deployment_plan.ip_provider, @event_log)
39
+ @vm_creator.create_for_instance_plans(@deployment_plan.instance_plans_with_missing_vms, @deployment_plan.ip_provider)
40
40
 
41
41
  @base_job.task_checkpoint
42
42
  end
@@ -56,7 +56,7 @@ module Bosh::Director
56
56
  @logger.info('No unneeded instances to delete')
57
57
  return
58
58
  end
59
- event_log_stage = @event_log.begin_stage('Deleting unneeded instances', unneeded_instances.size)
59
+ event_log_stage = Config.event_log.begin_stage('Deleting unneeded instances', unneeded_instances.size)
60
60
  dns_manager = DnsManagerProvider.create
61
61
  instance_deleter = InstanceDeleter.new(@deployment_plan.ip_provider, dns_manager, @disk_manager)
62
62
  unneeded_instance_plans = unneeded_instances.map do |instance|
@@ -124,7 +124,7 @@ module Bosh::Director
124
124
  end
125
125
  end
126
126
 
127
- def add_link_info(job_name, kind, link_name, source)
127
+ def add_link_from_release(job_name, kind, link_name, source)
128
128
  @link_infos[job_name] ||= {}
129
129
  @link_infos[job_name][kind] ||= {}
130
130
  @link_infos[job_name][kind][link_name] ||= {}
@@ -136,6 +136,37 @@ module Bosh::Director
136
136
  @link_infos[job_name][kind][link_name]['skip_link'] = true
137
137
  else
138
138
  source.to_a.each do |key, value|
139
+ if key == "properties"
140
+ key = "link_properties_exported"
141
+ end
142
+ @link_infos[job_name][kind][link_name][key] = value
143
+ end
144
+ end
145
+ end
146
+
147
+ def add_link_from_manifest(job_name, kind, link_name, source)
148
+ @link_infos[job_name] ||= {}
149
+ @link_infos[job_name][kind] ||= {}
150
+ @link_infos[job_name][kind][link_name] ||= {}
151
+
152
+ if source.eql? 'nil'
153
+ # This is the case where the user set link source to nil explicitly in the deployment manifest
154
+ # We should skip the binding of this link, even if it exist. This is used only when the link
155
+ # is optional
156
+ @link_infos[job_name][kind][link_name]['skip_link'] = true
157
+ else
158
+ errors = []
159
+ if kind == "consumes"
160
+ errors = validate_consume_link(source, link_name, job_name)
161
+ end
162
+ errors.concat(validate_link_def(source, link_name, job_name))
163
+
164
+ if errors.size > 0
165
+ raise errors.join("\n")
166
+ end
167
+
168
+ source_hash = source.to_a
169
+ source_hash.each do |key, value|
139
170
  @link_infos[job_name][kind][link_name][key] = value
140
171
  end
141
172
  end
@@ -177,6 +208,35 @@ module Bosh::Director
177
208
 
178
209
  private
179
210
 
211
+ def validate_consume_link(source, link_name, job_name)
212
+ blacklist = [ ['instances', 'from'], ['properties', 'from'] ]
213
+ errors = []
214
+ if source == nil
215
+ return errors
216
+ end
217
+
218
+ blacklist.each do |invalid_props|
219
+ if invalid_props.all? { |prop| source.has_key?(prop) }
220
+ errors.push("Cannot specify both '#{invalid_props[0]}' and '#{invalid_props[1]}' keys for link '#{link_name}' in job '#{@name}' in instance group '#{job_name}'.")
221
+ end
222
+ end
223
+
224
+ if source.has_key?('properties') && !source.has_key?('instances')
225
+ errors.push("Cannot specify 'properties' without 'instances' for link '#{link_name}' in job '#{@name}' in instance group '#{job_name}'.")
226
+ end
227
+
228
+ errors
229
+ end
230
+
231
+ def validate_link_def(source, link_name, job_name)
232
+ errors = []
233
+ if !source.nil? && (source.has_key?('name') || source.has_key?('type'))
234
+ errors.push("Cannot specify 'name' or 'type' properties in the manifest for link '#{link_name}' in job '#{@name}' in instance group '#{job_name}'. Please provide these keys in the release only.")
235
+ end
236
+
237
+ errors
238
+ end
239
+
180
240
  # Returns model only if it's present, fails otherwise
181
241
  # @return [Models::Template]
182
242
  def present_model