bosh-director 1.3232.24.0 → 1.3262.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (118) hide show
  1. checksums.yaml +4 -4
  2. data/db/migrations/director/20160414183654_set_teams_on_task.rb +7 -0
  3. data/db/migrations/director/20160427164345_add_teams.rb +48 -0
  4. data/db/migrations/director/20160511191928_ephemeral_blobs.rb +10 -0
  5. data/db/migrations/director/20160513102035_add_tracking_to_instance.rb +7 -0
  6. data/db/migrations/director/20160531164756_add_local_dns_blobs.rb +14 -0
  7. data/lib/bosh/director.rb +5 -1
  8. data/lib/bosh/director/api.rb +1 -0
  9. data/lib/bosh/director/api/api_helper.rb +2 -2
  10. data/lib/bosh/director/api/controllers/cleanup_controller.rb +1 -1
  11. data/lib/bosh/director/api/controllers/deployments_controller.rb +39 -25
  12. data/lib/bosh/director/api/controllers/disks_controller.rb +2 -1
  13. data/lib/bosh/director/api/controllers/events_controller.rb +34 -0
  14. data/lib/bosh/director/api/controllers/releases_controller.rb +1 -1
  15. data/lib/bosh/director/api/controllers/resurrection_controller.rb +1 -1
  16. data/lib/bosh/director/api/controllers/stemcells_controller.rb +1 -1
  17. data/lib/bosh/director/api/controllers/tasks_controller.rb +31 -46
  18. data/lib/bosh/director/api/controllers/users_controller.rb +2 -2
  19. data/lib/bosh/director/api/controllers/vms_controller.rb +18 -0
  20. data/lib/bosh/director/api/deployment_manager.rb +3 -3
  21. data/lib/bosh/director/api/instance_ignore_manager.rb +11 -0
  22. data/lib/bosh/director/api/instance_manager.rb +3 -3
  23. data/lib/bosh/director/api/local_identity_provider.rb +1 -1
  24. data/lib/bosh/director/api/problem_manager.rb +3 -3
  25. data/lib/bosh/director/api/release_manager.rb +9 -4
  26. data/lib/bosh/director/api/resurrector_manager.rb +13 -1
  27. data/lib/bosh/director/api/route_configuration.rb +1 -0
  28. data/lib/bosh/director/api/snapshot_manager.rb +2 -2
  29. data/lib/bosh/director/api/stemcell_manager.rb +29 -9
  30. data/lib/bosh/director/api/task_helper.rb +4 -3
  31. data/lib/bosh/director/api/uaa_identity_provider.rb +9 -3
  32. data/lib/bosh/director/api/user/config_user_manager.rb +1 -1
  33. data/lib/bosh/director/api/user/database_user_manager.rb +2 -2
  34. data/lib/bosh/director/cidr_range_combiner.rb +51 -0
  35. data/lib/bosh/director/cloudcheck_helper.rb +17 -6
  36. data/lib/bosh/director/config.rb +27 -1
  37. data/lib/bosh/director/db_backup/adapter/postgres.rb +0 -1
  38. data/lib/bosh/director/deployment_plan.rb +1 -1
  39. data/lib/bosh/director/deployment_plan/assembler.rb +8 -5
  40. data/lib/bosh/director/deployment_plan/deployment_repo.rb +10 -3
  41. data/lib/bosh/director/deployment_plan/deployment_spec_parser.rb +17 -6
  42. data/lib/bosh/director/deployment_plan/global_network_resolver.rb +44 -23
  43. data/lib/bosh/director/deployment_plan/instance.rb +2 -2
  44. data/lib/bosh/director/deployment_plan/{job.rb → instance_group.rb} +5 -5
  45. data/lib/bosh/director/deployment_plan/{job_spec_parser.rb → instance_group_spec_parser.rb} +17 -15
  46. data/lib/bosh/director/deployment_plan/instance_plan.rb +14 -10
  47. data/lib/bosh/director/deployment_plan/instance_planner.rb +22 -0
  48. data/lib/bosh/director/deployment_plan/job_migrator.rb +2 -2
  49. data/lib/bosh/director/deployment_plan/links/link_lookup.rb +3 -3
  50. data/lib/bosh/director/deployment_plan/links/link_path.rb +2 -2
  51. data/lib/bosh/director/deployment_plan/links/links_resolver.rb +1 -1
  52. data/lib/bosh/director/deployment_plan/manual_network.rb +1 -1
  53. data/lib/bosh/director/deployment_plan/manual_network_subnet.rb +1 -1
  54. data/lib/bosh/director/deployment_plan/placement_planner/availability_zone_picker.rb +53 -1
  55. data/lib/bosh/director/deployment_plan/placement_planner/static_ips_availability_zone_picker.rb +39 -1
  56. data/lib/bosh/director/deployment_plan/placement_planner/unplaced_existing_instances.rb +4 -0
  57. data/lib/bosh/director/deployment_plan/planner.rb +37 -31
  58. data/lib/bosh/director/deployment_plan/planner_factory.rb +26 -11
  59. data/lib/bosh/director/deployment_plan/runtime_manifest_parser.rb +15 -6
  60. data/lib/bosh/director/deployment_plan/steps/update_step.rb +1 -1
  61. data/lib/bosh/director/deployment_plan/template.rb +14 -1
  62. data/lib/bosh/director/dns/blobstore_dns_publisher.rb +35 -0
  63. data/lib/bosh/director/dns/dns_manager.rb +37 -74
  64. data/lib/bosh/director/errand/job_manager.rb +1 -1
  65. data/lib/bosh/director/error_ignorer.rb +1 -2
  66. data/lib/bosh/director/errors.rb +4 -0
  67. data/lib/bosh/director/event_log.rb +10 -2
  68. data/lib/bosh/director/instance_deleter.rb +11 -2
  69. data/lib/bosh/director/instance_updater.rb +21 -25
  70. data/lib/bosh/director/instance_updater/instance_state.rb +24 -2
  71. data/lib/bosh/director/instance_updater/state_applier.rb +4 -4
  72. data/lib/bosh/director/job_queue.rb +2 -2
  73. data/lib/bosh/director/job_updater.rb +3 -1
  74. data/lib/bosh/director/jobs/attach_disk.rb +7 -2
  75. data/lib/bosh/director/jobs/cleanup_artifacts.rb +15 -5
  76. data/lib/bosh/director/jobs/cloud_check/apply_resolutions.rb +2 -0
  77. data/lib/bosh/director/jobs/cloud_check/scan_and_fix.rb +5 -5
  78. data/lib/bosh/director/jobs/db_job.rb +10 -13
  79. data/lib/bosh/director/jobs/delete_deployment.rb +13 -1
  80. data/lib/bosh/director/jobs/delete_vm.rb +58 -0
  81. data/lib/bosh/director/jobs/export_release.rb +11 -4
  82. data/lib/bosh/director/jobs/helpers.rb +2 -0
  83. data/lib/bosh/director/jobs/helpers/config_parser.rb +66 -0
  84. data/lib/bosh/director/jobs/helpers/deep_hash_replacement.rb +38 -0
  85. data/lib/bosh/director/jobs/run_errand.rb +1 -1
  86. data/lib/bosh/director/jobs/ssh.rb +3 -2
  87. data/lib/bosh/director/jobs/update_deployment.rb +73 -14
  88. data/lib/bosh/director/jobs/update_release.rb +3 -1
  89. data/lib/bosh/director/jobs/update_stemcell.rb +1 -0
  90. data/lib/bosh/director/jobs/vm_state.rb +4 -3
  91. data/lib/bosh/director/legacy_deployment_helper.rb +7 -0
  92. data/lib/bosh/director/manifest/diff_lines.rb +4 -0
  93. data/lib/bosh/director/manifest/manifest.rb +18 -6
  94. data/lib/bosh/director/models.rb +3 -0
  95. data/lib/bosh/director/models/deployment.rb +17 -8
  96. data/lib/bosh/director/models/deployment_problem.rb +2 -2
  97. data/lib/bosh/director/models/ephemeral_blob.rb +11 -0
  98. data/lib/bosh/director/models/event.rb +2 -2
  99. data/lib/bosh/director/models/instance.rb +35 -5
  100. data/lib/bosh/director/models/local_dns_blob.rb +4 -0
  101. data/lib/bosh/director/models/orphan_disk.rb +2 -2
  102. data/lib/bosh/director/models/package.rb +2 -2
  103. data/lib/bosh/director/models/persistent_disk.rb +2 -2
  104. data/lib/bosh/director/models/task.rb +15 -0
  105. data/lib/bosh/director/models/team.rb +35 -0
  106. data/lib/bosh/director/models/template.rb +6 -2
  107. data/lib/bosh/director/nats_rpc.rb +3 -3
  108. data/lib/bosh/director/permission_authorizer.rb +14 -4
  109. data/lib/bosh/director/post_deployment_script_runner.rb +5 -4
  110. data/lib/bosh/director/problem_handlers/missing_vm.rb +7 -2
  111. data/lib/bosh/director/problem_handlers/unresponsive_agent.rb +11 -1
  112. data/lib/bosh/director/problem_resolver.rb +1 -1
  113. data/lib/bosh/director/problem_scanner/disk_scan_stage.rb +1 -1
  114. data/lib/bosh/director/problem_scanner/vm_scan_stage.rb +5 -1
  115. data/lib/bosh/director/version.rb +1 -1
  116. data/lib/bosh/director/vm_deleter.rb +8 -7
  117. data/lib/bosh/director/worker.rb +1 -0
  118. metadata +36 -34
@@ -23,6 +23,8 @@ module Bosh::Director
23
23
  with_deployment_lock(@deployment_name) do
24
24
  deployment_model = @deployment_manager.find_by_name(@deployment_name)
25
25
 
26
+ fail_if_ignored_instances_found(deployment_model)
27
+
26
28
  ip_provider = DeploymentPlan::IpProviderFactory.new(true, logger)
27
29
 
28
30
  dns_manager = DnsManagerProvider.create
@@ -30,7 +32,7 @@ module Bosh::Director
30
32
  instance_deleter = InstanceDeleter.new(ip_provider, dns_manager, disk_manager, force: @force)
31
33
  deployment_deleter = DeploymentDeleter.new(Config.event_log, logger, dns_manager, Config.max_threads)
32
34
 
33
- vm_deleter = Bosh::Director::VmDeleter.new(@cloud, logger, force: @force)
35
+ vm_deleter = Bosh::Director::VmDeleter.new(@cloud, logger, @force, Config.enable_virtual_delete_vms)
34
36
  deployment_deleter.delete(deployment_model, instance_deleter, vm_deleter)
35
37
  add_event(parent_id)
36
38
 
@@ -57,6 +59,16 @@ module Bosh::Director
57
59
  })
58
60
  event.id
59
61
  end
62
+
63
+ def fail_if_ignored_instances_found(deployment_model)
64
+ deployment_model.instances.each do |instance_model|
65
+ if instance_model.ignore
66
+ raise DeploymentIgnoredInstancesDeletion, "You are trying to delete deployment '#{deployment_model.name}', which " +
67
+ 'contains ignored instance(s). Operation not allowed.'
68
+ end
69
+ end
70
+ end
71
+
60
72
  end
61
73
  end
62
74
  end
@@ -0,0 +1,58 @@
1
+ module Bosh::Director
2
+ module Jobs
3
+ class DeleteVm < BaseJob
4
+
5
+ @queue = :normal
6
+
7
+ def self.job_type
8
+ :delete_vm
9
+ end
10
+
11
+ def initialize(vm_cid)
12
+ @vm_cid = vm_cid
13
+ @cloud = Config.cloud
14
+ @vm_deleter = Bosh::Director::VmDeleter.new(@cloud, logger, false, false)
15
+ @deployment_name = nil
16
+ @instance_name = nil
17
+ end
18
+
19
+ def perform
20
+ logger.info("deleting vm: #{@vm_cid}")
21
+ begin
22
+ instance = Bosh::Director::Api::InstanceLookup.new.by_filter(vm_cid: @vm_cid).first
23
+ @deployment_name = instance.deployment.name
24
+ @instance_name = instance.name
25
+ parent_id = add_event
26
+ @vm_deleter.delete_for_instance(instance, false)
27
+ rescue InstanceNotFound
28
+ parent_id = add_event
29
+ @vm_deleter.delete_vm(@vm_cid)
30
+ end
31
+ rescue Bosh::Clouds::VMNotFound
32
+ logger.info("vm #{@vm_cid} does not exists")
33
+ rescue Exception => e
34
+ raise e
35
+ ensure
36
+ add_event(parent_id, e)
37
+ return "vm #{@vm_cid} deleted" unless e
38
+ end
39
+
40
+ private
41
+ def add_event(parent_id = nil, error = nil)
42
+ event = Config.current_job.event_manager.create_event(
43
+ {
44
+ parent_id: parent_id,
45
+ user: Config.current_job.username,
46
+ action: 'delete',
47
+ object_type: 'vm',
48
+ object_name: @vm_cid,
49
+ task: Config.current_job.task_id,
50
+ deployment: @deployment_name,
51
+ instance: @instance_name,
52
+ error: error
53
+ })
54
+ event.id
55
+ end
56
+ end
57
+ end
58
+ end
@@ -54,7 +54,7 @@ module Bosh::Director
54
54
  release = planner.release(@release_name)
55
55
 
56
56
  export_release_job = create_job_with_all_the_templates_so_everything_compiles(release_version_model, release, planner, deployment_plan_stemcell)
57
- planner.add_job(export_release_job)
57
+ planner.add_instance_group(export_release_job)
58
58
  planner.bind_models(true)
59
59
 
60
60
  lock_timeout = 15 * 60 # 15 minutes
@@ -105,16 +105,23 @@ module Bosh::Director
105
105
 
106
106
  oid = blobstore_client.create(tarball_file)
107
107
 
108
+ tarball_hexdigest = Digest::SHA1.file(output_path).hexdigest
109
+
110
+ Bosh::Director::Models::EphemeralBlob.new(
111
+ blobstore_id: oid,
112
+ sha1: tarball_hexdigest
113
+ ).save
114
+
108
115
  {
109
- :blobstore_id => oid,
110
- :sha1 => Digest::SHA1.file(output_path).hexdigest,
116
+ :blobstore_id => oid,
117
+ :sha1 => tarball_hexdigest,
111
118
  }
112
119
  ensure
113
120
  compiled_release_downloader.cleanup unless compiled_release_downloader.nil?
114
121
  end
115
122
 
116
123
  def create_job_with_all_the_templates_so_everything_compiles(release_version_model, release, planner, deployment_plan_stemcell)
117
- job = DeploymentPlan::Job.new(logger)
124
+ job = DeploymentPlan::InstanceGroup.new(logger)
118
125
 
119
126
  job.name = 'dummy-job-for-compilation'
120
127
  job.stemcell = deployment_plan_stemcell
@@ -8,3 +8,5 @@ require 'bosh/director/jobs/helpers/template_deleter'
8
8
  require 'bosh/director/jobs/helpers/release_version_deleter'
9
9
  require 'bosh/director/jobs/helpers/release_deleter'
10
10
  require 'bosh/director/jobs/helpers/name_version_release_deleter'
11
+ require 'bosh/director/jobs/helpers/config_parser'
12
+ require 'bosh/director/jobs/helpers/deep_hash_replacement'
@@ -0,0 +1,66 @@
1
+ require 'net/http'
2
+
3
+ module Bosh::Director::Jobs
4
+ module Helpers
5
+ class ConfigParser
6
+
7
+ class << self
8
+ # Search and Replace at a config placeholders in manifest
9
+ def parse(manifest)
10
+ new_manifest = Bosh::Common::DeepCopy.copy(manifest)
11
+
12
+ config_map = DeepHashReplacement.replacement_map(new_manifest)
13
+ parsed_config = apply_replacements(new_manifest, config_map)
14
+
15
+ parsed_config
16
+ end
17
+
18
+ private
19
+
20
+ def apply_replacements(manifest, config_map)
21
+ config_keys = config_map.map { |c| c["key"] }.uniq
22
+
23
+ config_values, invalid_keys = fetch_config_values(config_keys)
24
+
25
+ if invalid_keys.length > 0
26
+ raise "Failed to find keys in the config server: " + invalid_keys.join(", ")
27
+ end
28
+
29
+ update_manifest!(manifest, config_map, config_values)
30
+
31
+ manifest
32
+ end
33
+
34
+ def fetch_config_values(keys)
35
+ invalid_keys = []
36
+ config_values = {}
37
+
38
+ keys.each do |k|
39
+ config_server_url = URI.join(Bosh::Director::Config.config_server_url, 'v1/', 'config/', k)
40
+ response = Net::HTTP.get_response(config_server_url)
41
+
42
+ if response.kind_of? Net::HTTPSuccess
43
+ config_values[k] = JSON.parse(response.body)['value']
44
+ else
45
+ invalid_keys << k
46
+ end
47
+ end
48
+
49
+ [config_values, invalid_keys]
50
+ end
51
+
52
+ def update_manifest!(manifest, config_map, config_values)
53
+ config_map.each do |config_loc|
54
+ config_path = config_loc['path']
55
+ ret = config_path[0..config_path.length-2].inject(manifest) do |obj, el|
56
+ obj[el]
57
+ end
58
+
59
+ ret[config_path.last] = config_values[config_loc['key']]
60
+ end
61
+ end
62
+ end
63
+
64
+ end
65
+ end
66
+ end
@@ -0,0 +1,38 @@
1
+ require 'net/http'
2
+
3
+ module Bosh::Director::Jobs
4
+ module Helpers
5
+ class DeepHashReplacement
6
+ def self.replacement_map(obj)
7
+ result = []
8
+ create_replacement_map(result, obj)
9
+
10
+ result
11
+ end
12
+
13
+ private
14
+
15
+ def self.create_replacement_map(result, obj, path = nil)
16
+ if obj.is_a? Array
17
+ obj.each_with_index do |item, index|
18
+ new_path = path.nil? ? [] : Bosh::Common::DeepCopy.copy(path)
19
+ new_path << index
20
+ create_replacement_map(result, item, new_path)
21
+ end
22
+ elsif obj.is_a? Hash
23
+ obj.each do |key, value|
24
+ new_path = path.nil? ? [] : Bosh::Common::DeepCopy.copy(path)
25
+ new_path << key
26
+ create_replacement_map(result, value, new_path)
27
+ end
28
+ else
29
+ path ||= []
30
+ if obj.to_s.match(/^\(\(.*\)\)$/)
31
+ key_name = obj.gsub(/(^\(\(|\)\)$)/, '')
32
+ result << {'key' => key_name, 'path' => path}
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
@@ -34,7 +34,7 @@ module Bosh::Director
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
- job = deployment.job(@errand_name)
37
+ job = deployment.instance_group(@errand_name)
38
38
 
39
39
  if job.nil?
40
40
  raise JobNotFound, "Errand '#{@errand_name}' doesn't exist"
@@ -3,7 +3,8 @@ module Bosh::Director
3
3
  class Ssh < BaseJob
4
4
  DEFAULT_SSH_DATA_LIFETIME = 300
5
5
  SSH_TAG = "ssh"
6
- @queue = :normal
6
+
7
+ @queue = :urgent
7
8
 
8
9
  def self.job_type
9
10
  :ssh
@@ -53,7 +54,7 @@ module Bosh::Director
53
54
  end
54
55
  end
55
56
 
56
- result_file.write(Yajl::Encoder.encode(ssh_info))
57
+ result_file.write(JSON.generate(ssh_info))
57
58
  result_file.write("\n")
58
59
 
59
60
  # task result
@@ -2,8 +2,11 @@ module Bosh::Director
2
2
  module Jobs
3
3
  class UpdateDeployment < BaseJob
4
4
  include LockHelper
5
+ include LegacyDeploymentHelper
5
6
 
6
7
  @queue = :normal
8
+ @local_fs = true
9
+
7
10
 
8
11
  def self.job_type
9
12
  :update_deployment
@@ -15,18 +18,32 @@ module Bosh::Director
15
18
  @cloud_config_id = cloud_config_id
16
19
  @runtime_config_id = runtime_config_id
17
20
  @options = options
21
+ @event_log = Config.event_log
18
22
  end
19
23
 
20
24
  def perform
21
25
  logger.info('Reading deployment manifest')
22
26
 
23
27
  manifest_text = File.read(@manifest_file_path)
28
+ manifest_hash = Psych.load(manifest_text)
24
29
  logger.debug("Manifest:\n#{manifest_text}")
25
- cloud_config_model = Bosh::Director::Models::CloudConfig[@cloud_config_id]
26
- if cloud_config_model.nil?
27
- logger.debug("No cloud config uploaded yet.")
30
+
31
+ if Config.parse_config_values
32
+ manifest_hash = Bosh::Director::Jobs::Helpers::ConfigParser.parse(manifest_hash)
33
+ end
34
+
35
+ if ignore_cloud_config?(manifest_hash)
36
+ warning = "Ignoring cloud config. Manifest contains 'networks' section."
37
+ logger.debug(warning)
38
+ @event_log.warn_deprecated(warning)
39
+ cloud_config_model = nil
28
40
  else
29
- logger.debug("Cloud config:\n#{cloud_config_model.manifest}")
41
+ cloud_config_model = Bosh::Director::Models::CloudConfig[@cloud_config_id]
42
+ if cloud_config_model.nil?
43
+ logger.debug("No cloud config uploaded yet.")
44
+ else
45
+ logger.debug("Cloud config:\n#{cloud_config_model.manifest}")
46
+ end
30
47
  end
31
48
 
32
49
  runtime_config_model = Bosh::Director::Models::RuntimeConfig[@runtime_config_id]
@@ -36,8 +53,12 @@ module Bosh::Director
36
53
  logger.debug("Runtime config:\n#{runtime_config_model.manifest}")
37
54
  end
38
55
 
39
- deployment_manifest = Manifest.load_from_text(manifest_text, cloud_config_model, runtime_config_model)
56
+ deployment_manifest = Manifest.load_from_hash(manifest_hash, cloud_config_model, runtime_config_model)
57
+
40
58
  @deployment_name = deployment_manifest.to_hash['name']
59
+
60
+ previous_releases, previous_stemcells = get_stemcells_and_releases
61
+ context = {}
41
62
  parent_id = add_event
42
63
 
43
64
  with_deployment_lock(@deployment_name) do
@@ -46,13 +67,20 @@ module Bosh::Director
46
67
 
47
68
  deployment_plan = nil
48
69
 
49
- event_log_stage = Config.event_log.begin_stage('Preparing deployment', 1)
70
+ event_log_stage = @event_log.begin_stage('Preparing deployment', 1)
50
71
  event_log_stage.advance_and_track('Preparing deployment') do
51
72
  planner_factory = DeploymentPlan::PlannerFactory.create(logger)
52
73
  deployment_plan = planner_factory.create_from_manifest(deployment_manifest, cloud_config_model, runtime_config_model, @options)
53
74
  deployment_plan.bind_models
54
75
  end
55
76
 
77
+ if deployment_plan.instance_models.any?(&:ignore)
78
+ @event_log.warn('You have ignored instances. They will not be changed.')
79
+ end
80
+
81
+ next_releases, next_stemcells = get_stemcells_and_releases
82
+ context = event_context(next_releases, previous_releases, next_stemcells, previous_stemcells)
83
+
56
84
  render_job_templates(deployment_plan.jobs_starting_on_deploy)
57
85
  deployment_plan.compile_packages
58
86
 
@@ -64,7 +92,7 @@ module Bosh::Director
64
92
 
65
93
  @notifier.send_end_event
66
94
  logger.info('Finished updating deployment')
67
- add_event(parent_id)
95
+ add_event(context, parent_id)
68
96
 
69
97
  "/deployments/#{deployment_plan.name}"
70
98
  end
@@ -74,7 +102,7 @@ module Bosh::Director
74
102
  rescue Exception => e2
75
103
  # log the second error
76
104
  ensure
77
- add_event(parent_id, e)
105
+ add_event(context, parent_id, e)
78
106
  raise e
79
107
  end
80
108
  ensure
@@ -83,8 +111,8 @@ module Bosh::Director
83
111
 
84
112
  private
85
113
 
86
- def add_event(parent_id = nil, error = nil)
87
- action = deployment_new? ? "create" : "update"
114
+ def add_event(context = {}, parent_id = nil, error = nil)
115
+ action = @options.fetch('new', false) ? "create" : "update"
88
116
  event = event_manager.create_event(
89
117
  {
90
118
  parent_id: parent_id,
@@ -94,7 +122,8 @@ module Bosh::Director
94
122
  object_name: @deployment_name,
95
123
  deployment: @deployment_name,
96
124
  task: task_id,
97
- error: error
125
+ error: error,
126
+ context: context
98
127
  })
99
128
  event.id
100
129
  end
@@ -102,7 +131,7 @@ module Bosh::Director
102
131
  # Job tasks
103
132
 
104
133
  def check_for_changes(deployment_plan)
105
- deployment_plan.jobs.each do |job|
134
+ deployment_plan.instance_groups.each do |job|
106
135
  return true if job.did_change
107
136
  end
108
137
  false
@@ -147,8 +176,38 @@ module Bosh::Director
147
176
  end
148
177
  end
149
178
 
150
- def deployment_new?
151
- @deployment_new ||= Models::Deployment.exclude(manifest: nil)[name: @deployment_name].nil?
179
+ def get_stemcells_and_releases
180
+ deployment = current_deployment
181
+ stemcells = []
182
+ releases = []
183
+ if deployment
184
+ releases = deployment.release_versions.map do |rv|
185
+ "#{rv.release.name}/#{rv.version}"
186
+ end
187
+ stemcells = deployment.stemcells.map do |sc|
188
+ "#{sc.name}/#{sc.version}"
189
+ end
190
+ end
191
+ return releases, stemcells
192
+ end
193
+
194
+ def current_deployment
195
+ Models::Deployment[name: @deployment_name]
196
+ end
197
+
198
+ def event_context(next_releases, previous_releases, next_stemcells, previous_stemcells)
199
+ after_objects = {}
200
+ after_objects['releases'] = next_releases unless next_releases.empty?
201
+ after_objects['stemcells'] = next_stemcells unless next_stemcells.empty?
202
+
203
+ before_objects = {}
204
+ before_objects['releases'] = previous_releases unless previous_releases.empty?
205
+ before_objects['stemcells'] = previous_stemcells unless previous_stemcells.empty?
206
+
207
+ context = {}
208
+ context['before'] = before_objects
209
+ context['after'] = after_objects
210
+ context
152
211
  end
153
212
  end
154
213
  end
@@ -8,6 +8,8 @@ module Bosh::Director
8
8
  include DownloadHelper
9
9
 
10
10
  @queue = :normal
11
+ @local_fs = true
12
+
11
13
  @compiled_release = false
12
14
 
13
15
  attr_accessor :release_model
@@ -98,7 +100,7 @@ module Bosh::Director
98
100
 
99
101
  begin
100
102
  @version = Bosh::Common::Version::ReleaseVersion.parse(@manifest["version"])
101
- logger.info("Formatted version '#{@manifest["version"]}' => '#{@version}'") unless @version == @manifest["version"]
103
+ logger.info("Formatted version '#{@manifest["version"]}' => '#{@version}'") unless @version.to_s == @manifest["version"]
102
104
  rescue SemiSemantic::ParseError
103
105
  raise ReleaseVersionInvalid, "Release version invalid: #{@manifest["version"]}"
104
106
  end