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