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
@@ -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
 
@@ -7,7 +7,7 @@ module Bosh::Director
7
7
  @transactor = Transactor.new
8
8
  end
9
9
 
10
- def update_persistent_disk(instance_plan, vm_recreator)
10
+ def update_persistent_disk(instance_plan)
11
11
  @logger.info('Updating persistent disk')
12
12
  check_persistent_disk(instance_plan)
13
13
 
@@ -18,7 +18,7 @@ module Bosh::Director
18
18
 
19
19
  disk = nil
20
20
  if instance_plan.needs_disk?
21
- disk = create_and_attach_disk(instance_plan, vm_recreator)
21
+ disk = create_and_attach_disk(instance_plan)
22
22
  mount_and_migrate_disk(instance, disk, old_disk)
23
23
  end
24
24
 
@@ -52,19 +52,25 @@ module Bosh::Director
52
52
 
53
53
  def orphan_disk(disk)
54
54
  @transactor.retryable_transaction(Bosh::Director::Config.db) do
55
- orphan_disk = Models::OrphanDisk.create(
56
- disk_cid: disk.disk_cid,
57
- size: disk.size,
58
- availability_zone: disk.instance.availability_zone,
59
- deployment_name: disk.instance.deployment.name,
60
- instance_name: "#{disk.instance.job}/#{disk.instance.uuid}",
61
- cloud_properties: disk.cloud_properties
62
- )
63
-
64
- orphan_snapshots(disk.snapshots, orphan_disk)
65
- @logger.info("Orphaning disk: '#{disk.disk_cid}', #{disk.active ? "active" : "inactive"}")
66
-
67
- disk.destroy
55
+ begin
56
+ parent_id = add_event('delete', disk.instance.deployment.name, "#{disk.instance.job}/#{disk.instance.uuid}", disk.disk_cid)
57
+ orphan_disk = Models::OrphanDisk.create(
58
+ disk_cid: disk.disk_cid,
59
+ size: disk.size,
60
+ availability_zone: disk.instance.availability_zone,
61
+ deployment_name: disk.instance.deployment.name,
62
+ instance_name: "#{disk.instance.job}/#{disk.instance.uuid}",
63
+ cloud_properties: disk.cloud_properties
64
+ )
65
+
66
+ orphan_snapshots(disk.snapshots, orphan_disk)
67
+ @logger.info("Orphaning disk: '#{disk.disk_cid}', #{disk.active ? "active" : "inactive"}")
68
+ disk.destroy
69
+ rescue Exception => e
70
+ raise e
71
+ ensure
72
+ add_event('delete', orphan_disk.deployment_name, orphan_disk.instance_name, orphan_disk.disk_cid, parent_id, e)
73
+ end
68
74
  end
69
75
  end
70
76
 
@@ -150,7 +156,7 @@ module Bosh::Director
150
156
  rescue Bosh::Clouds::DiskNotAttached
151
157
  if disk.active
152
158
  raise CloudDiskNotAttached,
153
- "`#{instance_model}' VM should have persistent disk attached " +
159
+ "'#{instance_model}' VM should have persistent disk attached " +
154
160
  "but it doesn't (according to CPI)"
155
161
  end
156
162
  end
@@ -173,6 +179,22 @@ module Bosh::Director
173
179
 
174
180
  private
175
181
 
182
+ def add_event(action, deployment_name, instance_name, object_name = nil, parent_id = nil, error = nil)
183
+ event = Config.current_job.event_manager.create_event(
184
+ {
185
+ parent_id: parent_id,
186
+ user: Config.current_job.username,
187
+ action: action,
188
+ object_type: 'disk',
189
+ object_name: object_name,
190
+ deployment: deployment_name,
191
+ instance: instance_name,
192
+ task: Config.current_job.task_id,
193
+ error: error
194
+ })
195
+ event.id
196
+ end
197
+
176
198
  def orphan_mounted_persistent_disk(instance_model, disk)
177
199
  unmount_disk(instance_model, disk)
178
200
 
@@ -223,14 +245,14 @@ module Bosh::Director
223
245
  @logger.debug('Disk is already detached')
224
246
  elsif agent_disk_cid != instance.model.persistent_disk_cid
225
247
  raise AgentDiskOutOfSync,
226
- "`#{instance}' has invalid disks: agent reports " +
227
- "`#{agent_disk_cid}' while director record shows " +
228
- "`#{instance.model.persistent_disk_cid}'"
248
+ "'#{instance}' has invalid disks: agent reports " +
249
+ "'#{agent_disk_cid}' while director record shows " +
250
+ "'#{instance.model.persistent_disk_cid}'"
229
251
  end
230
252
 
231
253
  instance.model.persistent_disks.each do |disk|
232
254
  unless disk.active
233
- @logger.warn("`#{instance}' has inactive disk #{disk.disk_cid}")
255
+ @logger.warn("'#{instance}' has inactive disk #{disk.disk_cid}")
234
256
  end
235
257
  end
236
258
  end
@@ -243,28 +265,11 @@ module Bosh::Director
243
265
  AgentClient.with_vm_credentials_and_agent_id(instance_model.credentials, instance_model.agent_id)
244
266
  end
245
267
 
246
- def create_and_attach_disk(instance_plan, vm_recreator)
268
+ def create_and_attach_disk(instance_plan)
247
269
  instance = instance_plan.instance
248
270
  disk = create_disk(instance_plan)
249
271
  @cloud.attach_disk(instance.model.vm_cid, disk.disk_cid)
250
- return disk
251
- rescue Bosh::Clouds::NoDiskSpace => e
252
- if e.ok_to_retry
253
- @logger.warn('Retrying attach disk operation after persistent disk update failed')
254
- # Re-creating the vm may cause it to be re-created in a place with more storage
255
- unmount_disk_for(instance_plan)
256
- vm_recreator.recreate_vm(instance_plan, disk.disk_cid)
257
- begin
258
- @cloud.attach_disk(instance.model.vm_cid, disk.disk_cid)
259
- rescue
260
- orphan_disk(disk)
261
- raise
262
- end
263
- else
264
- orphan_disk(disk)
265
- raise
266
- end
267
- return disk
272
+ disk
268
273
  end
269
274
 
270
275
  def mount_and_migrate_disk(instance, new_disk, old_disk)
@@ -282,7 +287,7 @@ module Bosh::Director
282
287
  def create_disk(instance_plan)
283
288
  job = instance_plan.desired_instance.job
284
289
  instance_model = instance_plan.instance.model
285
-
290
+ parent_id = add_event('create', instance_model.deployment.name, "#{instance_model.job}/#{instance_model.uuid}")
286
291
  disk_size = job.persistent_disk_type.disk_size
287
292
  cloud_properties = job.persistent_disk_type.cloud_properties
288
293
  disk_cid = @cloud.create_disk(disk_size, cloud_properties, instance_model.vm_cid)
@@ -294,6 +299,10 @@ module Bosh::Director
294
299
  size: disk_size,
295
300
  cloud_properties: cloud_properties,
296
301
  )
302
+ rescue Exception => e
303
+ raise e
304
+ ensure
305
+ add_event('create', instance_model.deployment.name, "#{instance_model.job}/#{instance_model.uuid}", disk_cid, parent_id, e)
297
306
  end
298
307
  end
299
308
  end
@@ -16,11 +16,11 @@ module Bosh::Director
16
16
  def self.validate_dns_name(string)
17
17
  if string =~ /^(\d|-)/
18
18
  raise DnsInvalidCanonicalName,
19
- "Invalid DNS canonical name `#{string}', must begin with a letter"
19
+ "Invalid DNS canonical name '#{string}', must begin with a letter"
20
20
  end
21
21
  if string =~ /-$/
22
22
  raise DnsInvalidCanonicalName,
23
- "Invalid DNS canonical name `#{string}', can't end with a hyphen"
23
+ "Invalid DNS canonical name '#{string}', can't end with a hyphen"
24
24
  end
25
25
  string
26
26
  end
@@ -35,7 +35,7 @@ module Bosh::Director
35
35
  dns = NetAddr::CIDR.create(dns)
36
36
  unless dns.size == 1
37
37
  raise NetworkInvalidDns,
38
- "Invalid DNS for network `#{network}': must be a single IP"
38
+ "Invalid DNS for network '#{network}': must be a single IP"
39
39
  end
40
40
 
41
41
  servers << dns.ip
@@ -160,7 +160,7 @@ module Bosh::Director
160
160
  dns = NetAddr::CIDR.create(dns)
161
161
  unless dns.size == 1
162
162
  raise NetworkInvalidDns,
163
- "Invalid DNS for network `#{network}': must be a single IP"
163
+ "Invalid DNS for network '#{network}': must be a single IP"
164
164
  end
165
165
 
166
166
  servers << dns.ip
@@ -34,7 +34,7 @@ module Bosh::Director
34
34
  end
35
35
 
36
36
  def find_dns_records_by_pattern(record_pattern)
37
- records = Models::Dns::Record.filter(:name.like(record_pattern))
37
+ records = Models::Dns::Record.grep(:name, record_pattern)
38
38
  records.filter(:domain_id => find_domain_id).all
39
39
  end
40
40
 
@@ -45,7 +45,7 @@ module Bosh::Director
45
45
  ips = []
46
46
  records.each do |record|
47
47
  ips << record.content
48
- Models::Dns::Record.filter(:content.like(record.name)).each do |ptr|
48
+ Models::Dns::Record.grep(:content, record.name).each do |ptr|
49
49
  @logger.info("Deleting reverse DNS record: #{ptr.name} -> #{ptr.content}")
50
50
  ptr.destroy
51
51
  end
@@ -13,7 +13,7 @@ module Bosh::Director
13
13
  def download_remote_file(resource, remote_file, local_file, num_redirects = 0)
14
14
  @logger.info("Downloading remote #{resource} from #{remote_file}") if @logger
15
15
  uri = URI.parse(remote_file)
16
- Net::HTTP.start(uri.host, uri.port,
16
+ Net::HTTP.start(uri.host, uri.port,
17
17
  :use_ssl => uri.scheme == 'https',
18
18
  :verify_mode => OpenSSL::SSL::VERIFY_NONE) do |http|
19
19
  http.request_get(uri.request_uri) do |response|
@@ -26,23 +26,23 @@ module Bosh::Director
26
26
  end
27
27
 
28
28
  when Net::HTTPFound
29
- raise ResourceError, "Too many redirects at `#{remote_file}'." if num_redirects >= 9
29
+ raise ResourceError, "Too many redirects at '#{remote_file}'." if num_redirects >= 9
30
30
  location = response.header['location']
31
- raise ResourceError, "No location header for redirect found at `#{remote_file}'." if location.nil?
31
+ raise ResourceError, "No location header for redirect found at '#{remote_file}'." if location.nil?
32
32
 
33
33
  location = URI.join(uri, location).to_s
34
34
  download_remote_file(resource, location, local_file, num_redirects + 1)
35
35
 
36
36
  when Net::HTTPNotFound
37
37
  @logger.error("Downloading remote #{resource} from #{remote_file} failed: #{response.message}") if @logger
38
- raise ResourceNotFound, "No #{resource} found at `#{remote_file}'."
38
+ raise ResourceNotFound, "No #{resource} found at '#{remote_file}'."
39
39
 
40
40
  else
41
41
  @logger.error("Downloading remote #{resource} from #{remote_file} failed: #{response.message}") if @logger
42
42
  raise ResourceError, "Downloading remote #{resource} failed. Check task debug log for details."
43
43
  end
44
44
  end
45
- end
45
+ end
46
46
  rescue URI::Error, SocketError, Timeout::Error, Errno::EINVAL, Errno::ECONNRESET, Errno::ECONNREFUSED, EOFError,
47
47
  Net::HTTPBadResponse, Net::HTTPHeaderSyntaxError, Net::ProtocolError => e
48
48
  @logger.error("Downloading remote #{resource} from #{remote_file} failed: #{e.inspect}") if @logger
@@ -3,21 +3,20 @@ module Bosh::Director
3
3
  # @param [Bosh::Director::DeploymentPlan::Planner] deployment
4
4
  # @param [Bosh::Director::DeploymentPlan::Job] job
5
5
  # @param [Bosh::Clouds] cloud
6
- # @param [Bosh::Director::EventLog::Log] event_log
7
6
  # @param [Logger] logger
8
- def initialize(deployment, job, cloud, event_log, logger)
7
+ def initialize(deployment, job, cloud, logger)
9
8
  @deployment = deployment
10
9
  @job = job
11
- @event_log = event_log
12
10
  @logger = logger
13
11
  vm_deleter = Bosh::Director::VmDeleter.new(cloud, logger)
14
12
  @disk_manager = DiskManager.new(cloud, logger)
15
13
  @job_renderer = JobRenderer.create
16
- @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)
17
16
  end
18
17
 
19
18
  def create_missing_vms
20
- @vm_creator.create_for_instance_plans(@job.instance_plans_with_missing_vms, @deployment.ip_provider, @event_log)
19
+ @vm_creator.create_for_instance_plans(@job.instance_plans_with_missing_vms, @deployment.ip_provider)
21
20
  end
22
21
 
23
22
  # Creates/updates all errand job instances
@@ -38,7 +37,7 @@ module Bosh::Director
38
37
  end
39
38
 
40
39
  @logger.info('Deleting errand instances')
41
- event_log_stage = @event_log.begin_stage('Deleting errand instances', instance_plans.size, [@job.name])
40
+ event_log_stage = Config.event_log.begin_stage('Deleting errand instances', instance_plans.size, [@job.name])
42
41
  dns_manager = DnsManagerProvider.create
43
42
  instance_deleter = InstanceDeleter.new(@deployment.ip_provider, dns_manager, @disk_manager)
44
43
  instance_deleter.delete_instance_plans(instance_plans, event_log_stage)
@@ -29,7 +29,7 @@ module Bosh::Director
29
29
  end
30
30
 
31
31
  def short_description(job_name)
32
- title_prefix = "Errand `#{job_name}'"
32
+ title_prefix = "Errand '#{job_name}'"
33
33
  exit_code_suffix = "(exit code #{@exit_code})"
34
34
 
35
35
  if @exit_code == 0
@@ -5,11 +5,10 @@ module Bosh::Director
5
5
  # @param [Bosh::Director::Api::InstanceManager] instance_manager
6
6
  # @param [Bosh::Director::EventLog::Log] event_log
7
7
  # @param [Bosh::Director::LogsFetcher] logs_fetcher
8
- def initialize(job, result_file, instance_manager, event_log, logs_fetcher)
8
+ def initialize(job, result_file, instance_manager, logs_fetcher)
9
9
  @job = job
10
10
  @result_file = result_file
11
11
  @instance_manager = instance_manager
12
- @event_log = event_log
13
12
  @agent_task_id = nil
14
13
  @logs_fetcher = logs_fetcher
15
14
  end
@@ -22,7 +21,7 @@ module Bosh::Director
22
21
  end
23
22
 
24
23
  agent_task_result = nil
25
- event_log_stage = @event_log.begin_stage('Running errand', 1)
24
+ event_log_stage = Config.event_log.begin_stage('Running errand', 1)
26
25
 
27
26
  begin
28
27
  event_log_stage.advance_and_track("#{@job.name}/#{instance.index}") do
@@ -38,16 +38,10 @@ module Bosh::Director
38
38
  layout: Logging.layouts.pattern(:pattern => '%m\n')
39
39
  ))
40
40
  end
41
-
42
- @last_stage = Stage.new(self, 'unknown', [], 0)
43
41
  end
44
42
 
45
43
  def begin_stage(stage_name, total = nil, tags = [])
46
- @last_stage = Stage.new(self, stage_name, tags, total)
47
- end
48
-
49
- def track(task_name = nil, &blk)
50
- @last_stage.advance_and_track(task_name, &blk)
44
+ Stage.new(self, stage_name, tags, total)
51
45
  end
52
46
 
53
47
  def warn_deprecated(message)
@@ -1,9 +1,3 @@
1
- module Resque
2
- def redis
3
- Bosh::Director::Config.redis
4
- end
5
- end
6
-
7
1
  class Object
8
2
  def to_openstruct
9
3
  self
@@ -15,9 +15,10 @@ module Bosh::Director
15
15
 
16
16
  def delete_instance_plan(instance_plan, event_log_stage)
17
17
  instance_model = instance_plan.new? ? instance_plan.instance.model : instance_plan.existing_instance
18
-
18
+ deployment_name = instance_model.deployment.name
19
+ instance_name = instance_model.name
20
+ parent_id = add_event(deployment_name, instance_name)
19
21
  event_log_stage.advance_and_track(instance_model.to_s) do
20
-
21
22
  error_ignorer.with_force_check do
22
23
  stop(instance_plan)
23
24
  end
@@ -46,6 +47,10 @@ module Bosh::Director
46
47
 
47
48
  instance_model.destroy
48
49
  end
50
+ rescue Exception => e
51
+ raise e
52
+ ensure
53
+ add_event(deployment_name, instance_name, parent_id, e) if parent_id
49
54
  end
50
55
 
51
56
  def delete_instance_plans(instance_plans, event_log_stage, options = {})
@@ -59,6 +64,22 @@ module Bosh::Director
59
64
 
60
65
  private
61
66
 
67
+ def add_event(deployment_name, instance_name, parent_id = nil, error = nil)
68
+ event = Config.current_job.event_manager.create_event(
69
+ {
70
+ parent_id: parent_id,
71
+ user: Config.current_job.username,
72
+ action: 'delete',
73
+ object_type: 'instance',
74
+ object_name: instance_name,
75
+ task: Config.current_job.task_id,
76
+ deployment: deployment_name,
77
+ instance: instance_name,
78
+ error: error
79
+ })
80
+ event.id
81
+ end
82
+
62
83
  def stop(instance_plan)
63
84
  stopper = Stopper.new(instance_plan, 'stopped', Config, @logger)
64
85
  stopper.stop
@@ -10,7 +10,8 @@ module Bosh::Director
10
10
  vm_deleter = VmDeleter.new(cloud, logger)
11
11
  disk_manager = DiskManager.new(cloud, logger)
12
12
  job_renderer = JobRenderer.create
13
- vm_creator = VmCreator.new(cloud, logger, vm_deleter, disk_manager, job_renderer)
13
+ arp_flusher = ArpFlusher.new
14
+ vm_creator = VmCreator.new(cloud, logger, vm_deleter, disk_manager, job_renderer, arp_flusher)
14
15
  vm_recreator = VmRecreator.new(vm_creator, vm_deleter)
15
16
  dns_manager = DnsManagerProvider.create
16
17
  new(
@@ -41,6 +42,8 @@ module Bosh::Director
41
42
 
42
43
  def update(instance_plan, options = {})
43
44
  instance = instance_plan.instance
45
+ action, context = get_action_and_context(instance_plan)
46
+ parent_id = add_event(instance.deployment_model.name, action, instance.model.name, context) if instance_plan.changed?
44
47
  @logger.info("Updating instance #{instance}, changes: #{instance_plan.changes.to_a.join(', ').inspect}")
45
48
 
46
49
  InstanceUpdater::InstanceState.with_instance_update(instance.model) do
@@ -72,16 +75,23 @@ module Bosh::Director
72
75
 
73
76
  recreated = false
74
77
  if needs_recreate?(instance_plan)
75
- @logger.debug('Failed to update in place. Recreating VM')
76
- @disk_manager.unmount_disk_for(instance_plan)
77
- @vm_recreator.recreate_vm(instance_plan, nil)
78
- recreated = true
78
+ begin
79
+ recreate_parent_id = add_event(instance.deployment_model.name, 'recreate', instance.model.name, nil) if action == 'update'
80
+ @logger.debug('Failed to update in place. Recreating VM')
81
+ @disk_manager.unmount_disk_for(instance_plan)
82
+ @vm_recreator.recreate_vm(instance_plan, nil)
83
+ recreated = true
84
+ rescue Exception => e
85
+ raise e
86
+ ensure
87
+ add_event(instance.deployment_model.name, 'recreate', instance.model.name, nil, recreate_parent_id, e) if recreate_parent_id
88
+ end
79
89
  end
80
90
 
81
91
  release_obsolete_ips(instance_plan)
82
92
 
83
93
  update_dns(instance_plan)
84
- @disk_manager.update_persistent_disk(instance_plan, @vm_recreator)
94
+ @disk_manager.update_persistent_disk(instance_plan)
85
95
 
86
96
  unless recreated
87
97
  if instance.trusted_certs_changed?
@@ -100,10 +110,56 @@ module Bosh::Director
100
110
  )
101
111
  state_applier.apply(instance_plan.desired_instance.job.update)
102
112
  end
113
+ rescue Exception => e
114
+ raise e
115
+ ensure
116
+ add_event(instance.deployment_model.name, action, instance.model.name, nil, parent_id, e) if parent_id
103
117
  end
104
118
 
105
119
  private
106
120
 
121
+ def add_event(deployment_name, action, instance_name = nil, context = nil, parent_id = nil, error = nil)
122
+ event = Config.current_job.event_manager.create_event(
123
+ {
124
+ parent_id: parent_id,
125
+ user: Config.current_job.username,
126
+ action: action,
127
+ object_type: 'instance',
128
+ object_name: instance_name,
129
+ task: Config.current_job.task_id,
130
+ deployment: deployment_name,
131
+ instance: instance_name,
132
+ error: error,
133
+ context: context ? context: {}
134
+ })
135
+ event.id
136
+ end
137
+
138
+ def get_action_and_context(instance_plan)
139
+ changes = instance_plan.changes
140
+ if changes.size == 1 && [:state,:recreate,:restart].include?(changes.first)
141
+ action = case instance_plan.instance.virtual_state
142
+ when 'started'
143
+ 'start'
144
+ when 'stopped'
145
+ 'stop'
146
+ when 'detached'
147
+ 'stop'
148
+ else
149
+ instance_plan.instance.virtual_state
150
+ end
151
+ return action , {}
152
+ else
153
+ if instance_plan.new?
154
+ return 'create', {}
155
+ else
156
+ context = {changes: changes.to_a}
157
+ context['az'] = instance_plan.desired_az_name if instance_plan.desired_az_name
158
+ return 'update', context
159
+ end
160
+ end
161
+ end
162
+
107
163
  def release_obsolete_ips(instance_plan)
108
164
  instance_plan.network_plans
109
165
  .select(&:obsolete?)