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.
- checksums.yaml +4 -4
- data/bin/bosh-director-console +1 -1
- data/bin/bosh-director-drain-workers +8 -2
- data/bin/bosh-director-worker +34 -53
- data/db/migrations/director/20110617211923_add_deployments_release_versions.rb +2 -2
- data/db/migrations/director/20120524175805_add_task_type.rb +23 -23
- data/db/migrations/director/20130531172604_add_director_attributes.rb +1 -2
- data/db/migrations/director/20140116002324_pivot_director_attributes.rb +1 -2
- data/db/migrations/director/20160210201838_denormalize_compiled_package_stemcell_id_to_stemcell_name_and_version.rb +7 -9
- data/db/migrations/director/20160211174110_add_events.rb +22 -0
- data/db/migrations/director/20160324181932_create_delayed_jobs.rb +22 -0
- data/db/migrations/director/20160324182211_add_locks.rb +15 -0
- data/db/migrations/director/20160329201256_set_instances_with_nil_serial_to_false.rb +15 -0
- data/db/migrations/director/20160331225404_backfill_stemcell_os.rb +9 -0
- data/db/migrations/director/20160411104407_add_task_started_at.rb +9 -0
- data/lib/bosh/director.rb +9 -2
- data/lib/bosh/director/agent_client.rb +22 -9
- data/lib/bosh/director/api.rb +0 -1
- data/lib/bosh/director/api/api_helper.rb +1 -1
- data/lib/bosh/director/api/controllers/base_controller.rb +5 -1
- data/lib/bosh/director/api/controllers/cloud_configs_controller.rb +18 -2
- data/lib/bosh/director/api/controllers/deployments_controller.rb +16 -9
- data/lib/bosh/director/api/controllers/events_controller.rb +37 -0
- data/lib/bosh/director/api/controllers/locks_controller.rb +7 -11
- data/lib/bosh/director/api/controllers/packages_controller.rb +1 -1
- data/lib/bosh/director/api/controllers/runtime_configs_controller.rb +18 -2
- data/lib/bosh/director/api/controllers/tasks_controller.rb +7 -2
- data/lib/bosh/director/api/deployment_lookup.rb +1 -1
- data/lib/bosh/director/api/deployment_manager.rb +1 -1
- data/lib/bosh/director/api/event_manager.rb +68 -0
- data/lib/bosh/director/api/extensions/scoping.rb +2 -2
- data/lib/bosh/director/api/extensions/syslog_request_logger.rb +75 -0
- data/lib/bosh/director/api/instance_lookup.rb +2 -2
- data/lib/bosh/director/api/instance_manager.rb +2 -2
- data/lib/bosh/director/api/local_identity_provider.rb +8 -0
- data/lib/bosh/director/api/property_manager.rb +6 -5
- data/lib/bosh/director/api/release_manager.rb +3 -3
- data/lib/bosh/director/api/resource_manager.rb +2 -2
- data/lib/bosh/director/api/resurrector_manager.rb +1 -1
- data/lib/bosh/director/api/route_configuration.rb +1 -0
- data/lib/bosh/director/api/stemcell_manager.rb +5 -5
- data/lib/bosh/director/api/task_manager.rb +1 -0
- data/lib/bosh/director/api/task_remover.rb +1 -1
- data/lib/bosh/director/api/uaa_identity_provider.rb +9 -1
- data/lib/bosh/director/api/user/database_user_manager.rb +1 -1
- data/lib/bosh/director/app.rb +1 -1
- data/lib/bosh/director/arp_flusher.rb +23 -0
- data/lib/bosh/director/cloudcheck_helper.rb +4 -3
- data/lib/bosh/director/compile_task.rb +6 -6
- data/lib/bosh/director/compile_task_generator.rb +6 -6
- data/lib/bosh/director/compiled_release_downloader.rb +4 -4
- data/lib/bosh/director/config.rb +29 -87
- data/lib/bosh/director/deployment_deleter.rb +6 -6
- data/lib/bosh/director/deployment_plan/agent_state_migrator.rb +2 -2
- data/lib/bosh/director/deployment_plan/assembler.rb +1 -1
- data/lib/bosh/director/deployment_plan/compilation_instance_pool.rb +26 -1
- data/lib/bosh/director/deployment_plan/deployment_repo.rb +1 -1
- data/lib/bosh/director/deployment_plan/disk_type.rb +1 -1
- data/lib/bosh/director/deployment_plan/instance.rb +2 -2
- data/lib/bosh/director/deployment_plan/instance_plan.rb +2 -2
- data/lib/bosh/director/deployment_plan/instance_spec.rb +2 -0
- data/lib/bosh/director/deployment_plan/ip_provider/ip_provider.rb +7 -3
- data/lib/bosh/director/deployment_plan/job.rb +12 -10
- data/lib/bosh/director/deployment_plan/job_spec_parser.rb +4 -4
- data/lib/bosh/director/deployment_plan/links/link.rb +1 -0
- data/lib/bosh/director/deployment_plan/links/link_path.rb +18 -19
- data/lib/bosh/director/deployment_plan/links/links_resolver.rb +2 -0
- data/lib/bosh/director/deployment_plan/links/template_link.rb +1 -1
- data/lib/bosh/director/deployment_plan/manual_network.rb +1 -1
- data/lib/bosh/director/deployment_plan/manual_network_subnet.rb +6 -6
- data/lib/bosh/director/deployment_plan/planner.rb +3 -3
- data/lib/bosh/director/deployment_plan/planner_factory.rb +38 -40
- data/lib/bosh/director/deployment_plan/release_version.rb +5 -5
- data/lib/bosh/director/deployment_plan/runtime_manifest_parser.rb +22 -18
- data/lib/bosh/director/deployment_plan/steps/package_compile_step.rb +14 -16
- data/lib/bosh/director/deployment_plan/steps/update_step.rb +5 -5
- data/lib/bosh/director/deployment_plan/template.rb +61 -1
- data/lib/bosh/director/deployment_plan/update_config.rb +1 -1
- data/lib/bosh/director/disk_manager.rb +49 -40
- data/lib/bosh/director/dns/canonicalizer.rb +2 -2
- data/lib/bosh/director/dns/dns_manager.rb +2 -2
- data/lib/bosh/director/dns/powerdns.rb +2 -2
- data/lib/bosh/director/download_helper.rb +5 -5
- data/lib/bosh/director/errand/job_manager.rb +5 -6
- data/lib/bosh/director/errand/result.rb +1 -1
- data/lib/bosh/director/errand/runner.rb +2 -3
- data/lib/bosh/director/event_log.rb +1 -7
- data/lib/bosh/director/ext.rb +0 -6
- data/lib/bosh/director/instance_deleter.rb +23 -2
- data/lib/bosh/director/instance_updater.rb +62 -6
- data/lib/bosh/director/instance_updater/state_applier.rb +2 -2
- data/lib/bosh/director/job_queue.rb +4 -2
- data/lib/bosh/director/job_runner.rb +3 -8
- data/lib/bosh/director/jobs/backup.rb +1 -1
- data/lib/bosh/director/jobs/base_job.rb +10 -6
- data/lib/bosh/director/jobs/cleanup_artifacts.rb +6 -6
- data/lib/bosh/director/jobs/db_job.rb +87 -0
- data/lib/bosh/director/jobs/delete_deployment.rb +23 -2
- data/lib/bosh/director/jobs/delete_deployment_snapshots.rb +1 -1
- data/lib/bosh/director/jobs/delete_orphan_disks.rb +2 -2
- data/lib/bosh/director/jobs/delete_release.rb +2 -2
- data/lib/bosh/director/jobs/delete_stemcell.rb +1 -1
- data/lib/bosh/director/jobs/export_release.rb +4 -2
- data/lib/bosh/director/jobs/fetch_logs.rb +1 -1
- data/lib/bosh/director/jobs/helpers/blob_deleter.rb +1 -1
- data/lib/bosh/director/jobs/helpers/name_version_release_deleter.rb +3 -3
- data/lib/bosh/director/jobs/helpers/release_version_deleter.rb +1 -1
- data/lib/bosh/director/jobs/helpers/stemcell_deleter.rb +2 -12
- data/lib/bosh/director/jobs/release/release_job.rb +13 -28
- data/lib/bosh/director/jobs/run_errand.rb +6 -6
- data/lib/bosh/director/jobs/scheduled_backup.rb +1 -1
- data/lib/bosh/director/jobs/scheduled_events_cleanup.rb +31 -0
- data/lib/bosh/director/jobs/scheduled_orphan_cleanup.rb +1 -1
- data/lib/bosh/director/jobs/snapshot_deployment.rb +4 -1
- data/lib/bosh/director/jobs/ssh.rb +36 -14
- data/lib/bosh/director/jobs/update_deployment.rb +28 -6
- data/lib/bosh/director/jobs/update_release.rb +31 -41
- data/lib/bosh/director/jobs/update_stemcell.rb +4 -4
- data/lib/bosh/director/jobs/vm_state.rb +1 -2
- data/lib/bosh/director/lock.rb +30 -55
- data/lib/bosh/director/logs_fetcher.rb +2 -3
- data/lib/bosh/director/manifest/changeset.rb +88 -42
- data/lib/bosh/director/manifest/manifest.rb +1 -1
- data/lib/bosh/director/models.rb +3 -0
- data/lib/bosh/director/models/event.rb +18 -0
- data/lib/bosh/director/models/lock.rb +9 -0
- data/lib/bosh/director/models/release_version.rb +3 -1
- data/lib/bosh/director/problem_handlers/base.rb +3 -3
- data/lib/bosh/director/problem_handlers/inactive_disk.rb +4 -4
- data/lib/bosh/director/problem_handlers/missing_disk.rb +3 -3
- data/lib/bosh/director/problem_handlers/missing_vm.rb +1 -1
- data/lib/bosh/director/problem_handlers/mount_info_mismatch.rb +3 -3
- data/lib/bosh/director/problem_handlers/unresponsive_agent.rb +2 -2
- data/lib/bosh/director/problem_resolver.rb +5 -5
- data/lib/bosh/director/problem_scanner/problem_register.rb +1 -1
- data/lib/bosh/director/problem_scanner/scanner.rb +3 -2
- data/lib/bosh/director/scheduler.rb +3 -3
- data/lib/bosh/director/sequel.rb +1 -3
- data/lib/bosh/director/stopper.rb +1 -1
- data/lib/bosh/director/validation_helper.rb +60 -37
- data/lib/bosh/director/version.rb +1 -1
- data/lib/bosh/director/vm_creator.rb +39 -7
- data/lib/bosh/director/vm_deleter.rb +29 -2
- data/lib/bosh/director/vm_metadata_updater.rb +4 -0
- data/lib/bosh/director/worker.rb +52 -0
- metadata +47 -61
- 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,
|
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
|
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
|
-
|
67
|
-
|
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
|
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
|
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
|
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
|
-
|
113
|
-
|
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
|
-
|
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
|
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
|
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
|
-
|
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(
|
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
|
-
|
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
|
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,
|
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,
|
86
|
+
job_manager = Errand::JobManager.new(deployment, job, Config.cloud, logger)
|
87
87
|
|
88
88
|
begin
|
89
89
|
update_instances(job_manager)
|
@@ -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
|
-
|
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
|
-
|
43
|
-
result
|
44
|
-
|
45
|
-
|
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
|
-
|
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
|
-
|
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
|
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
|
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
|
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
|
-
|
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
|
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
|
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
|
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
|
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
|
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
|
-
|
354
|
-
logger.info("Creating new package
|
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
|
-
|
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
|
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
|
-
|
390
|
-
other_compiled_packages = compiled_packages_matching(package,
|
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,
|
404
|
+
def compiled_packages_matching(package, stemcell)
|
410
405
|
other_compiled_packages = []
|
411
406
|
dependency_key = dependency_key(package)
|
412
|
-
|
413
|
-
|
414
|
-
|
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
|
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
|
-
|
584
|
-
logger.info("Creating new template
|
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,
|
595
|
-
logger.info("Creating job template
|
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
|
611
|
-
release_job = ReleaseJob.new(job_meta, @release_model, release_dir,
|
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
|
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
|