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.
- checksums.yaml +4 -4
- data/db/migrations/director/20160414183654_set_teams_on_task.rb +7 -0
- data/db/migrations/director/20160427164345_add_teams.rb +48 -0
- data/db/migrations/director/20160511191928_ephemeral_blobs.rb +10 -0
- data/db/migrations/director/20160513102035_add_tracking_to_instance.rb +7 -0
- data/db/migrations/director/20160531164756_add_local_dns_blobs.rb +14 -0
- data/lib/bosh/director.rb +5 -1
- data/lib/bosh/director/api.rb +1 -0
- data/lib/bosh/director/api/api_helper.rb +2 -2
- data/lib/bosh/director/api/controllers/cleanup_controller.rb +1 -1
- data/lib/bosh/director/api/controllers/deployments_controller.rb +39 -25
- data/lib/bosh/director/api/controllers/disks_controller.rb +2 -1
- data/lib/bosh/director/api/controllers/events_controller.rb +34 -0
- data/lib/bosh/director/api/controllers/releases_controller.rb +1 -1
- data/lib/bosh/director/api/controllers/resurrection_controller.rb +1 -1
- data/lib/bosh/director/api/controllers/stemcells_controller.rb +1 -1
- data/lib/bosh/director/api/controllers/tasks_controller.rb +31 -46
- data/lib/bosh/director/api/controllers/users_controller.rb +2 -2
- data/lib/bosh/director/api/controllers/vms_controller.rb +18 -0
- data/lib/bosh/director/api/deployment_manager.rb +3 -3
- data/lib/bosh/director/api/instance_ignore_manager.rb +11 -0
- data/lib/bosh/director/api/instance_manager.rb +3 -3
- data/lib/bosh/director/api/local_identity_provider.rb +1 -1
- data/lib/bosh/director/api/problem_manager.rb +3 -3
- data/lib/bosh/director/api/release_manager.rb +9 -4
- data/lib/bosh/director/api/resurrector_manager.rb +13 -1
- data/lib/bosh/director/api/route_configuration.rb +1 -0
- data/lib/bosh/director/api/snapshot_manager.rb +2 -2
- data/lib/bosh/director/api/stemcell_manager.rb +29 -9
- data/lib/bosh/director/api/task_helper.rb +4 -3
- data/lib/bosh/director/api/uaa_identity_provider.rb +9 -3
- data/lib/bosh/director/api/user/config_user_manager.rb +1 -1
- data/lib/bosh/director/api/user/database_user_manager.rb +2 -2
- data/lib/bosh/director/cidr_range_combiner.rb +51 -0
- data/lib/bosh/director/cloudcheck_helper.rb +17 -6
- data/lib/bosh/director/config.rb +27 -1
- data/lib/bosh/director/db_backup/adapter/postgres.rb +0 -1
- data/lib/bosh/director/deployment_plan.rb +1 -1
- data/lib/bosh/director/deployment_plan/assembler.rb +8 -5
- data/lib/bosh/director/deployment_plan/deployment_repo.rb +10 -3
- data/lib/bosh/director/deployment_plan/deployment_spec_parser.rb +17 -6
- data/lib/bosh/director/deployment_plan/global_network_resolver.rb +44 -23
- data/lib/bosh/director/deployment_plan/instance.rb +2 -2
- data/lib/bosh/director/deployment_plan/{job.rb → instance_group.rb} +5 -5
- data/lib/bosh/director/deployment_plan/{job_spec_parser.rb → instance_group_spec_parser.rb} +17 -15
- data/lib/bosh/director/deployment_plan/instance_plan.rb +14 -10
- data/lib/bosh/director/deployment_plan/instance_planner.rb +22 -0
- data/lib/bosh/director/deployment_plan/job_migrator.rb +2 -2
- data/lib/bosh/director/deployment_plan/links/link_lookup.rb +3 -3
- data/lib/bosh/director/deployment_plan/links/link_path.rb +2 -2
- data/lib/bosh/director/deployment_plan/links/links_resolver.rb +1 -1
- data/lib/bosh/director/deployment_plan/manual_network.rb +1 -1
- data/lib/bosh/director/deployment_plan/manual_network_subnet.rb +1 -1
- data/lib/bosh/director/deployment_plan/placement_planner/availability_zone_picker.rb +53 -1
- data/lib/bosh/director/deployment_plan/placement_planner/static_ips_availability_zone_picker.rb +39 -1
- data/lib/bosh/director/deployment_plan/placement_planner/unplaced_existing_instances.rb +4 -0
- data/lib/bosh/director/deployment_plan/planner.rb +37 -31
- data/lib/bosh/director/deployment_plan/planner_factory.rb +26 -11
- data/lib/bosh/director/deployment_plan/runtime_manifest_parser.rb +15 -6
- data/lib/bosh/director/deployment_plan/steps/update_step.rb +1 -1
- data/lib/bosh/director/deployment_plan/template.rb +14 -1
- data/lib/bosh/director/dns/blobstore_dns_publisher.rb +35 -0
- data/lib/bosh/director/dns/dns_manager.rb +37 -74
- data/lib/bosh/director/errand/job_manager.rb +1 -1
- data/lib/bosh/director/error_ignorer.rb +1 -2
- data/lib/bosh/director/errors.rb +4 -0
- data/lib/bosh/director/event_log.rb +10 -2
- data/lib/bosh/director/instance_deleter.rb +11 -2
- data/lib/bosh/director/instance_updater.rb +21 -25
- data/lib/bosh/director/instance_updater/instance_state.rb +24 -2
- data/lib/bosh/director/instance_updater/state_applier.rb +4 -4
- data/lib/bosh/director/job_queue.rb +2 -2
- data/lib/bosh/director/job_updater.rb +3 -1
- data/lib/bosh/director/jobs/attach_disk.rb +7 -2
- data/lib/bosh/director/jobs/cleanup_artifacts.rb +15 -5
- data/lib/bosh/director/jobs/cloud_check/apply_resolutions.rb +2 -0
- data/lib/bosh/director/jobs/cloud_check/scan_and_fix.rb +5 -5
- data/lib/bosh/director/jobs/db_job.rb +10 -13
- data/lib/bosh/director/jobs/delete_deployment.rb +13 -1
- data/lib/bosh/director/jobs/delete_vm.rb +58 -0
- data/lib/bosh/director/jobs/export_release.rb +11 -4
- data/lib/bosh/director/jobs/helpers.rb +2 -0
- data/lib/bosh/director/jobs/helpers/config_parser.rb +66 -0
- data/lib/bosh/director/jobs/helpers/deep_hash_replacement.rb +38 -0
- data/lib/bosh/director/jobs/run_errand.rb +1 -1
- data/lib/bosh/director/jobs/ssh.rb +3 -2
- data/lib/bosh/director/jobs/update_deployment.rb +73 -14
- data/lib/bosh/director/jobs/update_release.rb +3 -1
- data/lib/bosh/director/jobs/update_stemcell.rb +1 -0
- data/lib/bosh/director/jobs/vm_state.rb +4 -3
- data/lib/bosh/director/legacy_deployment_helper.rb +7 -0
- data/lib/bosh/director/manifest/diff_lines.rb +4 -0
- data/lib/bosh/director/manifest/manifest.rb +18 -6
- data/lib/bosh/director/models.rb +3 -0
- data/lib/bosh/director/models/deployment.rb +17 -8
- data/lib/bosh/director/models/deployment_problem.rb +2 -2
- data/lib/bosh/director/models/ephemeral_blob.rb +11 -0
- data/lib/bosh/director/models/event.rb +2 -2
- data/lib/bosh/director/models/instance.rb +35 -5
- data/lib/bosh/director/models/local_dns_blob.rb +4 -0
- data/lib/bosh/director/models/orphan_disk.rb +2 -2
- data/lib/bosh/director/models/package.rb +2 -2
- data/lib/bosh/director/models/persistent_disk.rb +2 -2
- data/lib/bosh/director/models/task.rb +15 -0
- data/lib/bosh/director/models/team.rb +35 -0
- data/lib/bosh/director/models/template.rb +6 -2
- data/lib/bosh/director/nats_rpc.rb +3 -3
- data/lib/bosh/director/permission_authorizer.rb +14 -4
- data/lib/bosh/director/post_deployment_script_runner.rb +5 -4
- data/lib/bosh/director/problem_handlers/missing_vm.rb +7 -2
- data/lib/bosh/director/problem_handlers/unresponsive_agent.rb +11 -1
- data/lib/bosh/director/problem_resolver.rb +1 -1
- data/lib/bosh/director/problem_scanner/disk_scan_stage.rb +1 -1
- data/lib/bosh/director/problem_scanner/vm_scan_stage.rb +5 -1
- data/lib/bosh/director/version.rb +1 -1
- data/lib/bosh/director/vm_deleter.rb +8 -7
- data/lib/bosh/director/worker.rb +1 -0
- 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
|
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.
|
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
|
-
|
110
|
-
|
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::
|
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.
|
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
|
-
|
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(
|
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
|
-
|
26
|
-
if
|
27
|
-
|
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
|
-
|
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.
|
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 =
|
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 =
|
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.
|
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
|
151
|
-
|
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
|