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
@@ -3,13 +3,12 @@ module Bosh::Director
3
3
 
4
4
  attr_accessor :packages
5
5
 
6
- def initialize(job_meta, release_model, release_dir, packages, logger)
6
+ def initialize(job_meta, release_model, release_dir, 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
13
12
  @release_model = release_model
14
13
  @release_dir = release_dir
15
14
  @logger = logger
@@ -59,12 +58,12 @@ module Bosh::Director
59
58
  def unpack
60
59
  FileUtils.mkdir_p(job_dir)
61
60
 
62
- desc = "job `#{@name}/#{@version}'"
61
+ desc = "job '#{@name}/#{@version}'"
63
62
  result = Bosh::Exec.sh("tar -C #{job_dir} -xzf #{job_tgz} 2>&1", :on_error => :return)
64
63
  if result.failed?
65
64
  @logger.error("Extracting #{desc} archive failed in dir #{job_dir}, " +
66
- "tar returned #{result.exit_status}, " +
67
- "output: #{result.output}")
65
+ "tar returned #{result.exit_status}, " +
66
+ "output: #{result.output}")
68
67
  raise JobInvalidArchive, "Extracting #{desc} archive failed. Check task debug log for details."
69
68
  end
70
69
  end
@@ -81,7 +80,7 @@ module Bosh::Director
81
80
  manifest_file = File.join(job_dir, 'job.MF')
82
81
  unless File.file?(manifest_file)
83
82
  raise JobMissingManifest,
84
- "Missing job manifest for `#{@name}'"
83
+ "Missing job manifest for '#{@name}'"
85
84
  end
86
85
 
87
86
  Psych.load_file(manifest_file)
@@ -93,7 +92,7 @@ module Bosh::Director
93
92
  path = File.join(job_dir, 'templates', relative_path)
94
93
  unless File.file?(path)
95
94
  raise JobMissingTemplateFile,
96
- "Missing template file `#{relative_path}' for job `#{@name}'"
95
+ "Missing template file '#{relative_path}' for job '#{@name}'"
97
96
  end
98
97
  end
99
98
  end
@@ -104,36 +103,22 @@ module Bosh::Director
104
103
  aux_monit_files = Dir.glob(File.join(job_dir, '*.monit'))
105
104
 
106
105
  unless File.exists?(main_monit_file) || aux_monit_files.size > 0
107
- raise JobMissingMonit, "Job `#{@name}' is missing monit file"
106
+ raise JobMissingMonit, "Job '#{@name}' is missing monit file"
108
107
  end
109
108
  end
110
109
 
111
110
  def parse_package_names(job_manifest)
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
111
+ if job_manifest['packages'] && !job_manifest['packages'].is_a?(Array)
112
+ raise JobInvalidPackageSpec, "Job '#{@name}' has invalid package spec format"
128
113
  end
129
- package_names
114
+ job_manifest['packages'] || []
130
115
  end
131
116
 
132
117
  def validate_logs(job_manifest)
133
118
  if job_manifest['logs']
134
119
  unless job_manifest['logs'].is_a?(Hash)
135
120
  raise JobInvalidLogSpec,
136
- "Job `#{@name}' has invalid logs spec format"
121
+ "Job '#{@name}' has invalid logs spec format"
137
122
  end
138
123
  end
139
124
  end
@@ -142,7 +127,7 @@ module Bosh::Director
142
127
  if job_manifest['properties']
143
128
  unless job_manifest['properties'].is_a?(Hash)
144
129
  raise JobInvalidPropertySpec,
145
- "Job `#{@name}' has invalid properties spec format"
130
+ "Job '#{@name}' has invalid properties spec format"
146
131
  end
147
132
  end
148
133
  end
@@ -155,7 +140,7 @@ module Bosh::Director
155
140
  def parse_links(links, kind)
156
141
  if !links.is_a?(Array)
157
142
  raise JobInvalidLinkSpec,
158
- "Job '#{@name}' has invalid spec format: '#{kind}' must be an array of hashes with name and type"
143
+ "Job '#{@name}' has invalid spec format: '#{kind}' must be an array of hashes with name and type"
159
144
  end
160
145
 
161
146
  parsed_links = {}
@@ -18,7 +18,7 @@ module Bosh::Director
18
18
  @keep_alive = keep_alive
19
19
  blobstore = App.instance.blobstores.blobstore
20
20
  log_bundles_cleaner = LogBundlesCleaner.new(blobstore, 60 * 60 * 24 * 10, logger) # 10 days
21
- @logs_fetcher = LogsFetcher.new(event_log, @instance_manager, log_bundles_cleaner, logger)
21
+ @logs_fetcher = LogsFetcher.new(@instance_manager, log_bundles_cleaner, logger)
22
22
  end
23
23
 
24
24
  def perform
@@ -29,15 +29,15 @@ module Bosh::Director
29
29
  deployment = nil
30
30
  job = nil
31
31
 
32
- event_log.begin_stage('Preparing deployment', 1)
33
- event_log.track('Preparing deployment') do
32
+ event_log_stage = Config.event_log.begin_stage('Preparing deployment', 1)
33
+ event_log_stage.advance_and_track('Preparing deployment') do
34
34
  planner_factory = DeploymentPlan::PlannerFactory.create(logger)
35
35
  deployment = planner_factory.create_from_manifest(deployment_manifest, deployment_model.cloud_config, deployment_model.runtime_config, {})
36
36
  deployment.bind_models
37
37
  job = deployment.job(@errand_name)
38
38
 
39
39
  if job.nil?
40
- raise JobNotFound, "Errand `#{@errand_name}' doesn't exist"
40
+ raise JobNotFound, "Errand '#{@errand_name}' doesn't exist"
41
41
  end
42
42
 
43
43
  unless job.is_errand?
@@ -58,7 +58,7 @@ module Bosh::Director
58
58
 
59
59
  deployment.compile_packages
60
60
 
61
- runner = Errand::Runner.new(job, result_file, @instance_manager, event_log, @logs_fetcher)
61
+ runner = Errand::Runner.new(job, result_file, @instance_manager, @logs_fetcher)
62
62
 
63
63
  cancel_blk = lambda {
64
64
  begin
@@ -83,7 +83,7 @@ module Bosh::Director
83
83
  private
84
84
 
85
85
  def with_updated_instances(deployment, job, &blk)
86
- job_manager = Errand::JobManager.new(deployment, job, Config.cloud, event_log, logger)
86
+ job_manager = Errand::JobManager.new(deployment, job, Config.cloud, logger)
87
87
 
88
88
  begin
89
89
  update_instances(job_manager)
@@ -23,7 +23,7 @@ module Bosh::Director
23
23
  @backup_destination.create(f, blobstore_path)
24
24
  end
25
25
 
26
- "Stored `#{blobstore_path}' in backup blobstore"
26
+ "Stored '#{blobstore_path}' in backup blobstore"
27
27
  ensure
28
28
  FileUtils.rm_f(@backup_job.backup_file)
29
29
  end
@@ -0,0 +1,31 @@
1
+ module Bosh::Director
2
+ module Jobs
3
+ class ScheduledEventsCleanup < BaseJob
4
+ @queue = :normal
5
+
6
+ def self.job_type
7
+ :scheduled_events_cleanup
8
+ end
9
+
10
+ def self.has_work(params = {})
11
+ max_events = params.first['max_events']
12
+ Models::Event.count > max_events
13
+ end
14
+
15
+ def self.schedule_message
16
+ "clean up events"
17
+ end
18
+
19
+ def initialize(params = {})
20
+ logger.debug("ScheduledEventsCleanup initialized with params: #{params.inspect}")
21
+ @max_events = params['max_events']
22
+ end
23
+
24
+ def perform
25
+ logger.info("Started cleanup of events")
26
+ event_manager.remove_old_events(@max_events)
27
+ "Old events were deleted"
28
+ end
29
+ end
30
+ end
31
+ end
@@ -33,7 +33,7 @@ module Bosh::Director
33
33
 
34
34
  old_orphans = Models::OrphanDisk.where('created_at < ?', time)
35
35
  old_orphans_count = old_orphans.count
36
- stage = event_log.begin_stage('Deleting orphan disks', old_orphans_count)
36
+ stage = Config.event_log.begin_stage('Deleting orphan disks', old_orphans_count)
37
37
  old_orphans.each do |old_orphan|
38
38
  stage.advance_and_track("#{old_orphan.disk_cid}") do
39
39
  @disk_manager.delete_orphan_disk(old_orphan)
@@ -31,6 +31,10 @@ module Bosh::Director
31
31
  end
32
32
 
33
33
  def snapshot(instance)
34
+ if instance.vm_cid.nil?
35
+ logger.info('No vm attached to this instance, no snapshot; skipping')
36
+ return
37
+ end
34
38
  logger.info("taking snapshot of: #{instance.job}/#{instance.index} (#{instance.vm_cid})")
35
39
  Bosh::Director::Api::SnapshotManager.take_snapshot(instance, @options)
36
40
  rescue Bosh::Clouds::CloudError => e
@@ -54,4 +58,3 @@ module Bosh::Director
54
58
  end
55
59
  end
56
60
  end
57
-
@@ -29,22 +29,28 @@ module Bosh::Director
29
29
  instances = @instance_manager.filter_by(deployment, filter)
30
30
 
31
31
  ssh_info = instances.map do |instance|
32
- agent = @instance_manager.agent_client_for(instance)
33
-
34
- logger.info("ssh #{@command} `#{instance.job}/#{instance.uuid}'")
35
- result = agent.ssh(@command, @params)
36
- if target.ids_provided?
37
- result["id"] = instance.uuid
38
- else
39
- result["index"] = instance.index
40
- end
32
+ begin
33
+ agent = @instance_manager.agent_client_for(instance)
41
34
 
42
- if Config.default_ssh_options
43
- result["gateway_host"] = Config.default_ssh_options["gateway_host"]
44
- result["gateway_user"] = Config.default_ssh_options["gateway_user"]
45
- end
35
+ logger.info("ssh #{@command} '#{instance.job}/#{instance.uuid}'")
36
+ result = agent.ssh(@command, @params)
37
+ if target.ids_provided?
38
+ result["id"] = instance.uuid
39
+ else
40
+ result["index"] = instance.index
41
+ end
46
42
 
47
- result
43
+ if Config.default_ssh_options
44
+ result["gateway_host"] = Config.default_ssh_options["gateway_host"]
45
+ result["gateway_user"] = Config.default_ssh_options["gateway_user"]
46
+ end
47
+
48
+ result
49
+ rescue Exception => e
50
+ raise e
51
+ ensure
52
+ add_event(deployment.name, instance.name, e)
53
+ end
48
54
  end
49
55
 
50
56
  result_file.write(Yajl::Encoder.encode(ssh_info))
@@ -56,6 +62,22 @@ module Bosh::Director
56
62
 
57
63
  private
58
64
 
65
+ def add_event(deployment_name, instance_name, error = nil)
66
+ user = @params['user_regex'] || @params['user']
67
+ event_manager.create_event(
68
+ {
69
+ user: username,
70
+ action: "#{@command} ssh",
71
+ object_type: 'instance',
72
+ object_name: instance_name,
73
+ task: task_id,
74
+ error: error,
75
+ deployment: deployment_name,
76
+ instance: instance_name,
77
+ context: {user: user}
78
+ })
79
+ end
80
+
59
81
  class Target
60
82
  attr_reader :job, :indexes, :ids
61
83
 
@@ -37,16 +37,17 @@ module Bosh::Director
37
37
  end
38
38
 
39
39
  deployment_manifest = Manifest.load_from_text(manifest_text, cloud_config_model, runtime_config_model)
40
- deployment_name = deployment_manifest.to_hash['name']
40
+ @deployment_name = deployment_manifest.to_hash['name']
41
+ parent_id = add_event
41
42
 
42
- with_deployment_lock(deployment_name) do
43
- @notifier = DeploymentPlan::Notifier.new(deployment_name, Config.nats_rpc, logger)
43
+ with_deployment_lock(@deployment_name) do
44
+ @notifier = DeploymentPlan::Notifier.new(@deployment_name, Config.nats_rpc, logger)
44
45
  @notifier.send_start_event
45
46
 
46
47
  deployment_plan = nil
47
48
 
48
- event_log.begin_stage('Preparing deployment', 1)
49
- event_log.track('Preparing deployment') do
49
+ event_log_stage = Config.event_log.begin_stage('Preparing deployment', 1)
50
+ event_log_stage.advance_and_track('Preparing deployment') do
50
51
  planner_factory = DeploymentPlan::PlannerFactory.create(logger)
51
52
  deployment_plan = planner_factory.create_from_manifest(deployment_manifest, cloud_config_model, runtime_config_model, @options)
52
53
  deployment_plan.bind_models
@@ -63,6 +64,7 @@ module Bosh::Director
63
64
 
64
65
  @notifier.send_end_event
65
66
  logger.info('Finished updating deployment')
67
+ add_event(parent_id)
66
68
 
67
69
  "/deployments/#{deployment_plan.name}"
68
70
  end
@@ -72,6 +74,7 @@ module Bosh::Director
72
74
  rescue Exception => e2
73
75
  # log the second error
74
76
  ensure
77
+ add_event(parent_id, e)
75
78
  raise e
76
79
  end
77
80
  ensure
@@ -80,6 +83,22 @@ module Bosh::Director
80
83
 
81
84
  private
82
85
 
86
+ def add_event(parent_id = nil, error = nil)
87
+ action = deployment_new? ? "create" : "update"
88
+ event = event_manager.create_event(
89
+ {
90
+ parent_id: parent_id,
91
+ user: username,
92
+ action: action,
93
+ object_type: "deployment",
94
+ object_name: @deployment_name,
95
+ deployment: @deployment_name,
96
+ task: task_id,
97
+ error: error
98
+ })
99
+ event.id
100
+ end
101
+
83
102
  # Job tasks
84
103
 
85
104
  def check_for_changes(deployment_plan)
@@ -92,7 +111,6 @@ module Bosh::Director
92
111
  def update_step(deployment_plan)
93
112
  DeploymentPlan::Steps::UpdateStep.new(
94
113
  self,
95
- event_log,
96
114
  deployment_plan,
97
115
  multi_job_updater,
98
116
  Config.cloud
@@ -128,6 +146,10 @@ module Bosh::Director
128
146
  raise message
129
147
  end
130
148
  end
149
+
150
+ def deployment_new?
151
+ @deployment_new ||= Models::Deployment.exclude(manifest: nil)[name: @deployment_name].nil?
152
+ end
131
153
  end
132
154
  end
133
155
  end
@@ -51,7 +51,7 @@ module Bosh::Director
51
51
 
52
52
  with_release_lock(@name) { process_release(release_dir) }
53
53
 
54
- "Created release `#{@name}/#{@version}'"
54
+ "Created release '#{@name}/#{@version}'"
55
55
 
56
56
  rescue Exception => e
57
57
  raise e
@@ -110,7 +110,7 @@ module Bosh::Director
110
110
  def verify_sha1
111
111
  release_hash = Digest::SHA1.file(release_path).hexdigest
112
112
  if release_hash != sha1
113
- raise ReleaseSha1DoesNotMatch, "Release SHA1 `#{release_hash}' does not match the expected SHA1 `#{sha1}'"
113
+ raise ReleaseSha1DoesNotMatch, "Release SHA1 '#{release_hash}' does not match the expected SHA1 '#{sha1}'"
114
114
  end
115
115
  end
116
116
 
@@ -142,7 +142,7 @@ module Bosh::Director
142
142
  @release_version_model.save
143
143
  else
144
144
  if @release_version_model.commit_hash != @commit_hash || @release_version_model.uncommitted_changes != @uncommitted_changes
145
- raise ReleaseVersionCommitHashMismatch, "release `#{@name}/#{@version}' has already been uploaded with commit_hash as `#{@commit_hash}' and uncommitted_changes as `#{@uncommitted_changes}'"
145
+ raise ReleaseVersionCommitHashMismatch, "release '#{@name}/#{@version}' has already been uploaded with commit_hash as '#{@commit_hash}' and uncommitted_changes as '#{@uncommitted_changes}'"
146
146
  end
147
147
  end
148
148
 
@@ -150,12 +150,11 @@ module Bosh::Director
150
150
  resolve_package_dependencies(@manifest[@packages_folder])
151
151
  end
152
152
 
153
- @packages = {}
154
153
  process_packages(release_dir)
155
154
  process_jobs(release_dir)
156
155
 
157
- event_log.begin_stage(@compiled_release ? "Compiled Release has been created" : "Release has been created", 1)
158
- event_log.track("#{@name}/#{@version}") {}
156
+ event_log_stage = Config.event_log.begin_stage(@compiled_release ? "Compiled Release has been created" : "Release has been created", 1)
157
+ event_log_stage.advance_and_track("#{@name}/#{@version}") {}
159
158
  end
160
159
 
161
160
  # Normalizes release manifest, so all names, versions, and checksums are Strings.
@@ -187,7 +186,7 @@ module Bosh::Director
187
186
  name = package["name"]
188
187
  dependencies = package["dependencies"]
189
188
  all_dependencies = result[:connected_vertices][name]
190
- logger.info("Resolved package dependencies for `#{name}': #{dependencies.pretty_inspect} => #{all_dependencies.pretty_inspect}")
189
+ logger.info("Resolved package dependencies for '#{name}': #{dependencies.pretty_inspect} => #{all_dependencies.pretty_inspect}")
191
190
  end
192
191
  end
193
192
 
@@ -202,13 +201,12 @@ module Bosh::Director
202
201
  new_packages = []
203
202
  existing_packages = []
204
203
  registered_packages = []
205
- packages_existing_from_other_releases = []
206
204
 
207
205
  @manifest[@packages_folder].each do |package_meta|
208
206
  # Checking whether we might have the same bits somewhere (in any release, not just the one being uploaded)
209
207
  @release_version_model.packages.select { |pv| pv.name == package_meta['name'] }.each do |package|
210
208
  if package.fingerprint != package_meta['fingerprint']
211
- raise ReleaseInvalidPackage, "package `#{package_meta['name']}' had different fingerprint in previously uploaded release `#{@name}/#{@version}'"
209
+ raise ReleaseInvalidPackage, "package '#{package_meta['name']}' had different fingerprint in previously uploaded release '#{@name}/#{@version}'"
212
210
  end
213
211
  end
214
212
 
@@ -261,7 +259,6 @@ module Bosh::Director
261
259
  end
262
260
  end
263
261
  new_packages << package_meta
264
- packages_existing_from_other_releases << package_meta
265
262
  end
266
263
  end
267
264
 
@@ -277,7 +274,7 @@ module Bosh::Director
277
274
  }
278
275
  end
279
276
  all_package_refs = Array(created_package_refs) | Array(existing_package_refs) | registered_package_refs
280
- create_compiled_packages(all_package_refs, release_dir, packages_existing_from_other_releases)
277
+ create_compiled_packages(all_package_refs, release_dir)
281
278
  else
282
279
  backfill_source_for_packages(registered_packages, release_dir)
283
280
  end
@@ -291,10 +288,9 @@ module Bosh::Director
291
288
  single_step_stage("Processing #{packages.size} existing package#{"s" if packages.size > 1}") do
292
289
  packages.each do |package, package_meta|
293
290
  package_desc = "#{package.name}/#{package.version}"
294
- logger.info("Adding source for package `#{package_desc}'")
291
+ logger.info("Adding source for package '#{package_desc}'")
295
292
  had_effect |= save_package_source_blob(package, package_meta, release_dir)
296
293
  package.save
297
- @packages[package.name] = package
298
294
  end
299
295
  end
300
296
 
@@ -314,7 +310,7 @@ module Bosh::Director
314
310
  single_step_stage("Processing #{packages.size} existing package#{"s" if packages.size > 1}") do
315
311
  packages.each do |package, package_meta|
316
312
  package_desc = "#{package.name}/#{package.version}"
317
- logger.info("Using existing package `#{package_desc}'")
313
+ logger.info("Using existing package '#{package_desc}'")
318
314
  register_package(package)
319
315
 
320
316
  if compiled_release
@@ -345,13 +341,13 @@ module Bosh::Director
345
341
 
346
342
  package_refs = []
347
343
 
348
- event_log.begin_stage("Creating new packages", package_metas.size)
344
+ event_log_stage = Config.event_log.begin_stage("Creating new packages", package_metas.size)
349
345
 
350
346
  package_metas.each do |package_meta|
351
347
  package_desc = "#{package_meta["name"]}/#{package_meta["version"]}"
352
348
  package = nil
353
- event_log.track(package_desc) do
354
- logger.info("Creating new package `#{package_desc}'")
349
+ event_log_stage.advance_and_track(package_desc) do
350
+ logger.info("Creating new package '#{package_desc}'")
355
351
  package = create_package(package_meta, release_dir)
356
352
  register_package(package)
357
353
  end
@@ -364,14 +360,14 @@ module Bosh::Director
364
360
  end
365
361
  end
366
362
 
367
- return package_refs
363
+ package_refs
368
364
  end
369
365
 
370
366
  # @return [boolean] true if at least one job was created; false if the call had no effect.
371
- def create_compiled_packages(all_compiled_packages, release_dir, packages_existing_from_other_releases)
367
+ def create_compiled_packages(all_compiled_packages, release_dir)
372
368
  return false if all_compiled_packages.nil?
373
369
 
374
- event_log.begin_stage('Creating new compiled packages', all_compiled_packages.size)
370
+ event_log_stage = Config.event_log.begin_stage('Creating new compiled packages', all_compiled_packages.size)
375
371
  had_effect = false
376
372
 
377
373
  all_compiled_packages.each do |compiled_package_spec|
@@ -386,8 +382,8 @@ module Bosh::Director
386
382
 
387
383
  if existing_compiled_packages.empty?
388
384
  package_desc = "#{package.name}/#{package.version} for #{stemcell_os}/#{stemcell_version}"
389
- event_log.track(package_desc) do
390
- other_compiled_packages = compiled_packages_matching(package, packages_existing_from_other_releases, stemcell)
385
+ event_log_stage.advance_and_track(package_desc) do
386
+ other_compiled_packages = compiled_packages_matching(package, stemcell)
391
387
  if @fix
392
388
  other_compiled_packages.each do |other_compiled_package|
393
389
  fix_compiled_package(other_compiled_package, compiled_pkg_tgz)
@@ -398,7 +394,6 @@ module Bosh::Director
398
394
  end
399
395
  elsif @fix
400
396
  existing_compiled_package = existing_compiled_packages.first
401
- @packages[existing_compiled_package.name] = existing_compiled_package
402
397
  fix_compiled_package(existing_compiled_package, compiled_pkg_tgz)
403
398
  end
404
399
  end
@@ -406,16 +401,12 @@ module Bosh::Director
406
401
  had_effect
407
402
  end
408
403
 
409
- def compiled_packages_matching(package, packages_existing_from_other_releases, stemcell)
404
+ def compiled_packages_matching(package, stemcell)
410
405
  other_compiled_packages = []
411
406
  dependency_key = dependency_key(package)
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
407
+ packages = Models::Package.where(fingerprint: package.fingerprint).all
408
+ packages.each do |pkg|
409
+ other_compiled_packages.concat(find_compiled_packages(pkg.id, stemcell[:os], stemcell[:version], dependency_key).all)
419
410
  end
420
411
  other_compiled_packages
421
412
  end
@@ -529,7 +520,6 @@ module Bosh::Director
529
520
  # @param [Models::Package] package Package model
530
521
  # @return [void]
531
522
  def register_package(package)
532
- @packages[package.name] = package
533
523
  @release_version_model.add_package(package)
534
524
  end
535
525
 
@@ -548,7 +538,7 @@ module Bosh::Director
548
538
  # Checking whether we might have the same bits somewhere
549
539
  @release_version_model.templates.select { |t| t.name == job_meta["name"] }.each do |tmpl|
550
540
  if tmpl.fingerprint != job_meta["fingerprint"]
551
- raise ReleaseExistingJobFingerprintMismatch, "job `#{job_meta["name"]}' had different fingerprint in previously uploaded release `#{@name}/#{@version}'"
541
+ raise ReleaseExistingJobFingerprintMismatch, "job '#{job_meta["name"]}' had different fingerprint in previously uploaded release '#{@name}/#{@version}'"
552
542
  end
553
543
  end
554
544
 
@@ -577,11 +567,11 @@ module Bosh::Director
577
567
  def create_jobs(jobs, release_dir)
578
568
  return false if jobs.empty?
579
569
 
580
- event_log.begin_stage("Creating new jobs", jobs.size)
570
+ event_log_stage = Config.event_log.begin_stage("Creating new jobs", jobs.size)
581
571
  jobs.each do |job_meta|
582
572
  job_desc = "#{job_meta["name"]}/#{job_meta["version"]}"
583
- event_log.track(job_desc) do
584
- logger.info("Creating new template `#{job_desc}'")
573
+ event_log_stage.advance_and_track(job_desc) do
574
+ logger.info("Creating new template '#{job_desc}'")
585
575
  template = create_job(job_meta, release_dir)
586
576
  register_template(template)
587
577
  end
@@ -591,8 +581,8 @@ module Bosh::Director
591
581
  end
592
582
 
593
583
  def create_job(job_meta, release_dir)
594
- release_job = ReleaseJob.new(job_meta, @release_model, release_dir, @packages, logger)
595
- logger.info("Creating job template `#{job_meta['name']}/#{job_meta['version']}' " +
584
+ release_job = ReleaseJob.new(job_meta, @release_model, release_dir, logger)
585
+ logger.info("Creating job template '#{job_meta['name']}/#{job_meta['version']}' " +
596
586
  'from provided bits')
597
587
  release_job.update(Models::Template.new())
598
588
  end
@@ -607,11 +597,11 @@ module Bosh::Director
607
597
  job_desc = "#{template.name}/#{template.version}"
608
598
 
609
599
  if @fix
610
- logger.info("Fixing existing job `#{job_desc}'")
611
- release_job = ReleaseJob.new(job_meta, @release_model, release_dir, @packages, logger)
600
+ logger.info("Fixing existing job '#{job_desc}'")
601
+ release_job = ReleaseJob.new(job_meta, @release_model, release_dir, logger)
612
602
  release_job.update(template)
613
603
  else
614
- logger.info("Using existing job `#{job_desc}'")
604
+ logger.info("Using existing job '#{job_desc}'")
615
605
  end
616
606
 
617
607
  register_template(template) unless template.release_versions.include? @release_version_model