bosh-director 1.3160.0 → 1.3163.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-worker +2 -14
- data/db/migrations/director/20150513225143_ip_addresses.rb +11 -0
- data/db/migrations/director/20150702004608_add_links.rb +8 -0
- data/db/migrations/director/20150708231924_add_link_spec.rb +7 -0
- data/db/migrations/director/20150724183256_add_debugging_to_ip_addresses.rb +8 -0
- data/db/migrations/director/20150730225029_add_uuid_to_instances.rb +16 -0
- data/db/migrations/director/20150803215805_add_availabililty_zone_and_cloud_properties_to_instances.rb +8 -0
- data/db/migrations/director/20150804211419_add_compilation_flag_to_instance.rb +7 -0
- data/db/migrations/director/20150918003455_add_bootstrap_node_to_instance.rb +7 -0
- data/db/migrations/director/20151008232214_add_dns_records.rb +7 -0
- data/db/migrations/director/20151015172551_add_orphan_disks_and_snapshots.rb +29 -0
- data/db/migrations/director/20151030222853_add_templates_to_instance.rb +10 -0
- data/db/migrations/director/20151031001039_add_spec_to_instance.rb +19 -0
- data/db/migrations/director/20151109190602_rename_orphan_columns.rb +13 -0
- data/lib/bosh/director.rb +19 -9
- data/lib/bosh/director/agent_client.rb +0 -17
- data/lib/bosh/director/api/cloud_config_manager.rb +7 -5
- data/lib/bosh/director/api/controllers/base_controller.rb +3 -2
- data/lib/bosh/director/api/controllers/cleanup_controller.rb +15 -0
- data/lib/bosh/director/api/controllers/deployments_controller.rb +38 -26
- data/lib/bosh/director/api/controllers/disks_controller.rb +20 -0
- data/lib/bosh/director/api/controllers/info_controller.rb +2 -2
- data/lib/bosh/director/api/controllers/releases_controller.rb +1 -16
- data/lib/bosh/director/api/controllers/stemcells_controller.rb +1 -9
- data/lib/bosh/director/api/deployment_manager.rb +2 -1
- data/lib/bosh/director/api/instance_lookup.rb +17 -0
- data/lib/bosh/director/api/instance_manager.rb +20 -10
- data/lib/bosh/director/api/release_manager.rb +28 -8
- data/lib/bosh/director/api/resurrector_manager.rb +9 -2
- data/lib/bosh/director/api/route_configuration.rb +2 -0
- data/lib/bosh/director/api/snapshot_manager.rb +9 -5
- data/lib/bosh/director/api/stemcell_manager.rb +50 -0
- data/lib/bosh/director/app.rb +1 -1
- data/lib/bosh/director/cloudcheck_helper.rb +119 -132
- data/lib/bosh/director/compile_task.rb +1 -1
- data/lib/bosh/director/compile_task_generator.rb +2 -2
- data/lib/bosh/director/config.rb +21 -12
- data/lib/bosh/director/deployment_deleter.rb +69 -0
- data/lib/bosh/director/deployment_plan.rb +35 -4
- data/lib/bosh/director/deployment_plan/agent_state_migrator.rb +47 -0
- data/lib/bosh/director/deployment_plan/assembler.rb +115 -241
- data/lib/bosh/director/deployment_plan/availability_zone.rb +27 -0
- data/lib/bosh/director/deployment_plan/cloud_manifest_parser.rb +144 -35
- data/lib/bosh/director/deployment_plan/compilation_config.rb +21 -19
- data/lib/bosh/director/deployment_plan/compilation_instance_pool.rb +169 -0
- data/lib/bosh/director/deployment_plan/deployment_repo.rb +4 -8
- data/lib/bosh/director/deployment_plan/deployment_spec_parser.rb +13 -1
- data/lib/bosh/director/deployment_plan/deployment_validator.rb +17 -0
- data/lib/bosh/director/deployment_plan/desired_instance.rb +15 -0
- data/lib/bosh/director/deployment_plan/{disk_pool.rb → disk_type.rb} +14 -19
- data/lib/bosh/director/deployment_plan/dynamic_network.rb +105 -53
- data/lib/bosh/director/deployment_plan/dynamic_network_subnet.rb +13 -0
- data/lib/bosh/director/deployment_plan/env.rb +18 -0
- data/lib/bosh/director/deployment_plan/global_network_resolver.rb +77 -0
- data/lib/bosh/director/deployment_plan/instance.rb +222 -390
- data/lib/bosh/director/deployment_plan/instance_network_reservations.rb +71 -0
- data/lib/bosh/director/deployment_plan/instance_plan.rb +336 -0
- data/lib/bosh/director/deployment_plan/instance_plan_factory.rb +54 -0
- data/lib/bosh/director/deployment_plan/instance_plan_sorter.rb +61 -0
- data/lib/bosh/director/deployment_plan/instance_planner.rb +101 -0
- data/lib/bosh/director/deployment_plan/instance_repository.rb +36 -0
- data/lib/bosh/director/deployment_plan/instance_spec.rb +154 -0
- data/lib/bosh/director/deployment_plan/ip_provider/database_ip_repo.rb +136 -0
- data/lib/bosh/director/deployment_plan/ip_provider/in_memory_ip_repo.rb +81 -0
- data/lib/bosh/director/deployment_plan/ip_provider/ip_provider.rb +153 -0
- data/lib/bosh/director/deployment_plan/ip_provider/ip_provider_factory.rb +22 -0
- data/lib/bosh/director/deployment_plan/job.rb +116 -53
- data/lib/bosh/director/deployment_plan/job_availability_zone_parser.rb +49 -0
- data/lib/bosh/director/deployment_plan/job_migrator.rb +90 -0
- data/lib/bosh/director/deployment_plan/job_network.rb +42 -0
- data/lib/bosh/director/deployment_plan/job_network_parser.rb +118 -0
- data/lib/bosh/director/deployment_plan/job_spec_parser.rb +123 -126
- data/lib/bosh/director/deployment_plan/links/link.rb +30 -0
- data/lib/bosh/director/deployment_plan/links/link_lookup.rb +66 -0
- data/lib/bosh/director/deployment_plan/links/link_path.rb +27 -0
- data/lib/bosh/director/deployment_plan/links/links_resolver.rb +70 -0
- data/lib/bosh/director/deployment_plan/links/template_link.rb +21 -0
- data/lib/bosh/director/deployment_plan/manifest_migrator.rb +3 -17
- data/lib/bosh/director/deployment_plan/manifest_validator.rb +46 -0
- data/lib/bosh/director/deployment_plan/manual_network.rb +70 -97
- data/lib/bosh/director/deployment_plan/manual_network_subnet.rb +148 -0
- data/lib/bosh/director/deployment_plan/network.rb +50 -39
- data/lib/bosh/director/deployment_plan/network_planner.rb +4 -0
- data/lib/bosh/director/deployment_plan/network_planner/plan.rb +26 -0
- data/lib/bosh/director/deployment_plan/network_planner/planner.rb +21 -0
- data/lib/bosh/director/deployment_plan/network_planner/reservation_reconciler.rb +81 -0
- data/lib/bosh/director/deployment_plan/network_planner/vip_static_ips_planner.rb +50 -0
- data/lib/bosh/director/deployment_plan/network_settings.rb +65 -0
- data/lib/bosh/director/deployment_plan/options/skip_drain.rb +7 -0
- data/lib/bosh/director/deployment_plan/package_validator.rb +79 -0
- data/lib/bosh/director/deployment_plan/placement_planner.rb +8 -0
- data/lib/bosh/director/deployment_plan/placement_planner/availability_zone_picker.rb +90 -0
- data/lib/bosh/director/deployment_plan/placement_planner/bruteforce_ip_allocation.rb +124 -0
- data/lib/bosh/director/deployment_plan/placement_planner/index_assigner.rb +32 -0
- data/lib/bosh/director/deployment_plan/placement_planner/networks_to_static_ips.rb +125 -0
- data/lib/bosh/director/deployment_plan/placement_planner/placed_desired_instances.rb +40 -0
- data/lib/bosh/director/deployment_plan/placement_planner/plan.rb +42 -0
- data/lib/bosh/director/deployment_plan/placement_planner/static_ips_availability_zone_picker.rb +237 -0
- data/lib/bosh/director/deployment_plan/placement_planner/unplaced_existing_instances.rb +53 -0
- data/lib/bosh/director/deployment_plan/planner.rb +186 -74
- data/lib/bosh/director/deployment_plan/planner_factory.rb +30 -147
- data/lib/bosh/director/deployment_plan/release_version.rb +3 -3
- data/lib/bosh/director/deployment_plan/resource_pool.rb +2 -174
- data/lib/bosh/director/deployment_plan/stemcell.rb +57 -14
- data/lib/bosh/director/deployment_plan/steps/package_compile_step.rb +28 -135
- data/lib/bosh/director/deployment_plan/steps/update_step.rb +23 -44
- data/lib/bosh/director/deployment_plan/template.rb +15 -4
- data/lib/bosh/director/deployment_plan/vip_network.rb +14 -42
- data/lib/bosh/director/deployment_plan/vm.rb +1 -99
- data/lib/bosh/director/deployment_plan/vm_type.rb +27 -0
- data/lib/bosh/director/disk_manager.rb +268 -0
- data/lib/bosh/director/dns/canonicalizer.rb +28 -0
- data/lib/bosh/director/dns/dns_manager.rb +163 -0
- data/lib/bosh/director/dns/local_dns_repo.rb +20 -0
- data/lib/bosh/director/dns/powerdns.rb +170 -0
- data/lib/bosh/director/errand/job_manager.rb +18 -29
- data/lib/bosh/director/error_ignorer.rb +16 -0
- data/lib/bosh/director/errors.rb +51 -20
- data/lib/bosh/director/event_log.rb +6 -0
- data/lib/bosh/director/instance_deleter.rb +53 -81
- data/lib/bosh/director/instance_reuser.rb +89 -0
- data/lib/bosh/director/instance_updater.rb +139 -281
- data/lib/bosh/director/instance_updater/preparer.rb +8 -5
- data/lib/bosh/director/instance_updater/state_applier.rb +21 -0
- data/lib/bosh/director/ip_util.rb +46 -26
- data/lib/bosh/director/job_renderer.rb +22 -10
- data/lib/bosh/director/job_runner.rb +1 -4
- data/lib/bosh/director/job_updater.rb +47 -35
- data/lib/bosh/director/job_updater_factory.rb +5 -4
- data/lib/bosh/director/jobs/base_job.rb +8 -0
- data/lib/bosh/director/jobs/cleanup_artifacts.rb +93 -0
- data/lib/bosh/director/jobs/delete_deployment.rb +10 -154
- data/lib/bosh/director/jobs/delete_deployment_snapshots.rb +1 -1
- data/lib/bosh/director/jobs/delete_orphan_disks.rb +44 -0
- data/lib/bosh/director/jobs/delete_release.rb +19 -196
- data/lib/bosh/director/jobs/delete_stemcell.rb +10 -76
- data/lib/bosh/director/jobs/export_release.rb +41 -121
- data/lib/bosh/director/jobs/fetch_logs.rb +0 -6
- data/lib/bosh/director/jobs/helpers.rb +10 -0
- data/lib/bosh/director/jobs/helpers/blob_deleter.rb +24 -0
- data/lib/bosh/director/jobs/helpers/compiled_package_deleter.rb +24 -0
- data/lib/bosh/director/jobs/helpers/name_version_release_deleter.rb +48 -0
- data/lib/bosh/director/jobs/helpers/package_deleter.rb +33 -0
- data/lib/bosh/director/jobs/helpers/release_deleter.rb +52 -0
- data/lib/bosh/director/jobs/helpers/release_version_deleter.rb +115 -0
- data/lib/bosh/director/jobs/helpers/releases_to_delete_picker.rb +31 -0
- data/lib/bosh/director/jobs/helpers/stemcell_deleter.rb +61 -0
- data/lib/bosh/director/jobs/helpers/stemcells_to_delete_picker.rb +30 -0
- data/lib/bosh/director/jobs/helpers/template_deleter.rb +20 -0
- data/lib/bosh/director/jobs/release/release_job.rb +18 -7
- data/lib/bosh/director/jobs/run_errand.rb +57 -36
- data/lib/bosh/director/jobs/scheduled_orphan_cleanup.rb +46 -0
- data/lib/bosh/director/jobs/ssh.rb +50 -17
- data/lib/bosh/director/jobs/update_deployment.rb +29 -11
- data/lib/bosh/director/jobs/update_release.rb +25 -4
- data/lib/bosh/director/jobs/vm_state.rb +23 -32
- data/lib/bosh/director/lock.rb +13 -8
- data/lib/bosh/director/logs_fetcher.rb +1 -1
- data/lib/bosh/director/models.rb +3 -0
- data/lib/bosh/director/models/compiled_package.rb +3 -3
- data/lib/bosh/director/models/deployment.rb +10 -0
- data/lib/bosh/director/models/instance.rb +77 -1
- data/lib/bosh/director/models/ip_address.rb +26 -0
- data/lib/bosh/director/models/orphan_disk.rb +23 -0
- data/lib/bosh/director/models/orphan_snapshot.rb +14 -0
- data/lib/bosh/director/models/template.rb +32 -9
- data/lib/bosh/director/models/vm.rb +5 -8
- data/lib/bosh/director/network_reservation.rb +69 -99
- data/lib/bosh/director/problem_handlers/inactive_disk.rb +5 -20
- data/lib/bosh/director/problem_handlers/missing_disk.rb +2 -13
- data/lib/bosh/director/problem_resolver.rb +2 -2
- data/lib/bosh/director/problem_scanner/vm_scan_stage.rb +2 -21
- data/lib/bosh/director/scheduler.rb +23 -6
- data/lib/bosh/director/{instance_updater/stopper.rb → stopper.rb} +24 -18
- data/lib/bosh/director/tagged_logger.rb +30 -0
- data/lib/bosh/director/transactor.rb +9 -0
- data/lib/bosh/director/version.rb +1 -1
- data/lib/bosh/director/vm_creator.rb +91 -19
- data/lib/bosh/director/vm_deleter.rb +25 -0
- data/lib/bosh/director/vm_recreator.rb +15 -0
- data/lib/cloud/dummy.rb +381 -94
- metadata +110 -30
- data/lib/bosh/director/deployment_plan/dns_binder.rb +0 -45
- data/lib/bosh/director/deployment_plan/instance_vm_binder.rb +0 -37
- data/lib/bosh/director/deployment_plan/network_subnet.rb +0 -166
- data/lib/bosh/director/deployment_plan/resource_pools.rb +0 -68
- data/lib/bosh/director/dns_helper.rb +0 -223
- data/lib/bosh/director/instance_updater/network_updater.rb +0 -110
- data/lib/bosh/director/instance_updater/vm_updater.rb +0 -189
- data/lib/bosh/director/problem_handlers/out_of_sync_vm.rb +0 -64
- data/lib/bosh/director/problem_handlers/unbound_instance_vm.rb +0 -85
- data/lib/bosh/director/resource_pool_updater.rb +0 -174
- data/lib/bosh/director/vm_data.rb +0 -63
- data/lib/bosh/director/vm_reuser.rb +0 -63
@@ -31,8 +31,9 @@ module Bosh::Director
|
|
31
31
|
|
32
32
|
def description
|
33
33
|
job = @instance.job || "unknown job"
|
34
|
+
uuid = @instance.uuid || "unknown id"
|
34
35
|
index = @instance.index || "unknown index"
|
35
|
-
disk_label = "`#{@disk.disk_cid}' (#{job}/#{
|
36
|
+
disk_label = "`#{@disk.disk_cid}' (#{@disk.size.to_i}M) for instance `#{job}/#{uuid} (#{index})'"
|
36
37
|
"Disk #{disk_label} is inactive"
|
37
38
|
end
|
38
39
|
|
@@ -82,29 +83,13 @@ module Bosh::Director
|
|
82
83
|
end
|
83
84
|
end
|
84
85
|
|
85
|
-
|
86
|
-
# failed because of cloud error or because disk doesn't exist
|
87
|
-
# in vsphere_disks.
|
88
|
-
begin
|
89
|
-
cloud.delete_disk(@disk.disk_cid)
|
90
|
-
rescue Bosh::Clouds::DiskNotFound, RuntimeError => e # FIXME
|
91
|
-
@logger.warn(e)
|
92
|
-
end
|
93
|
-
|
94
|
-
@disk.destroy
|
86
|
+
DiskManager.new(cloud, @logger).orphan_disk(@disk)
|
95
87
|
end
|
96
88
|
|
97
89
|
def disk_mounted?
|
98
90
|
return false if @vm.nil?
|
99
|
-
|
100
|
-
|
101
|
-
agent_timeout_guard(@vm) do |agent|
|
102
|
-
agent.list_disk.include?(@disk.disk_cid)
|
103
|
-
end
|
104
|
-
rescue RuntimeError
|
105
|
-
# old stemcells without 'list_disk' support. We need to play
|
106
|
-
# conservative and assume that the disk is mounted.
|
107
|
-
true
|
91
|
+
agent_timeout_guard(@vm) do |agent|
|
92
|
+
agent.list_disk.include?(@disk.disk_cid)
|
108
93
|
end
|
109
94
|
end
|
110
95
|
end
|
@@ -41,9 +41,7 @@ module Bosh::Director
|
|
41
41
|
end
|
42
42
|
|
43
43
|
def delete_disk_reference
|
44
|
-
@disk.
|
45
|
-
@disk.update(active: false)
|
46
|
-
end
|
44
|
+
@disk.update(active: false)
|
47
45
|
|
48
46
|
# If VM is present we try to unmount and detach disk from VM
|
49
47
|
if @vm && @vm.cid && cloud.has_vm?(@vm.cid)
|
@@ -74,17 +72,8 @@ module Bosh::Director
|
|
74
72
|
end
|
75
73
|
end
|
76
74
|
|
77
|
-
@logger.
|
78
|
-
Api::SnapshotManager.delete_snapshots(@disk.snapshots)
|
79
|
-
|
80
|
-
begin
|
81
|
-
@logger.debug('Sending cpi request: delete_disk')
|
82
|
-
cloud.delete_disk(@disk.disk_cid)
|
83
|
-
rescue Bosh::Clouds::DiskNotFound
|
84
|
-
end
|
75
|
+
DiskManager.new(cloud, @logger).orphan_disk(@disk)
|
85
76
|
|
86
|
-
@logger.debug('Removing disk reference from database')
|
87
|
-
@disk.destroy
|
88
77
|
end
|
89
78
|
end
|
90
79
|
end
|
@@ -54,7 +54,7 @@ module Bosh::Director
|
|
54
54
|
resolution = @resolutions[problem.id.to_s] || handler.auto_resolution
|
55
55
|
problem_summary = "#{problem.type} #{problem.resource_id}"
|
56
56
|
resolution_summary = handler.resolution_plan(resolution)
|
57
|
-
resolution_summary ||=
|
57
|
+
resolution_summary ||= 'no resolution'
|
58
58
|
|
59
59
|
begin
|
60
60
|
track_and_log("#{problem_summary}: #{resolution_summary}") do
|
@@ -64,7 +64,7 @@ module Bosh::Director
|
|
64
64
|
log_resolution_error(problem, e)
|
65
65
|
end
|
66
66
|
|
67
|
-
problem.state =
|
67
|
+
problem.state = 'resolved'
|
68
68
|
problem.save
|
69
69
|
@resolved_count += 1
|
70
70
|
|
@@ -45,8 +45,7 @@ module Bosh::Director
|
|
45
45
|
@event_logger.track_and_log("#{results[:ok]} OK, " +
|
46
46
|
"#{results[:unresponsive]} unresponsive, " +
|
47
47
|
"#{results[:missing]} missing, " +
|
48
|
-
"#{results[:unbound]} unbound
|
49
|
-
"#{results[:out_of_sync]} out of sync")
|
48
|
+
"#{results[:unbound]} unbound")
|
50
49
|
end
|
51
50
|
|
52
51
|
private
|
@@ -59,7 +58,7 @@ module Bosh::Director
|
|
59
58
|
|
60
59
|
instance, mounted_disk_cid = @problem_register.get_vm_instance_and_disk(vm)
|
61
60
|
|
62
|
-
agent = AgentClient.
|
61
|
+
agent = AgentClient.with_vm(vm, agent_options)
|
63
62
|
begin
|
64
63
|
state = agent.get_state
|
65
64
|
|
@@ -69,13 +68,9 @@ module Bosh::Director
|
|
69
68
|
mounted_disk_cid = disk_list.first
|
70
69
|
rescue Bosh::Director::RpcTimeout
|
71
70
|
mounted_disk_cid = nil
|
72
|
-
rescue RuntimeError
|
73
|
-
# For old agents that doesn't implement list_disk we assume the disk is mounted
|
74
|
-
@logger.info("agent.list_disk failed on agent #{vm.agent_id}")
|
75
71
|
end
|
76
72
|
add_disk_owner(mounted_disk_cid, vm.cid) if mounted_disk_cid
|
77
73
|
|
78
|
-
return :out_of_sync if is_out_of_sync_vm?(vm, instance, state)
|
79
74
|
return :unbound if is_unbound_instance_vm?(vm, instance, state)
|
80
75
|
:ok
|
81
76
|
rescue Bosh::Director::RpcTimeout
|
@@ -103,20 +98,6 @@ module Bosh::Director
|
|
103
98
|
@agent_disks[disk_cid] << vm_cid
|
104
99
|
end
|
105
100
|
|
106
|
-
def is_out_of_sync_vm?(vm, instance, state)
|
107
|
-
job = state['job'] ? state['job']['name'] : nil
|
108
|
-
index = state['index']
|
109
|
-
if state['deployment'] != @deployment.name ||
|
110
|
-
(instance && (instance.job != job || instance.index != index))
|
111
|
-
@problem_register.problem_found(:out_of_sync_vm, vm,
|
112
|
-
deployment: state['deployment'],
|
113
|
-
job: job, index: index)
|
114
|
-
true
|
115
|
-
else
|
116
|
-
false
|
117
|
-
end
|
118
|
-
end
|
119
|
-
|
120
101
|
def is_unbound_instance_vm?(vm, instance, state)
|
121
102
|
job = state['job'] ? state['job']['name'] : nil
|
122
103
|
index = state['index']
|
@@ -42,16 +42,33 @@ module Bosh::Director
|
|
42
42
|
end
|
43
43
|
|
44
44
|
@scheduler.cron(scheduled_job['schedule']) do |_|
|
45
|
-
logger.info("enqueueing `#{scheduled_job['command']}'")
|
46
45
|
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
46
|
+
should_enqueue = true
|
47
|
+
if director_job_class.respond_to?(:has_work)
|
48
|
+
logger.debug("Scheduler cron - checking /
|
49
|
+
#{director_job_class}.has_work:#{director_job_class.has_work(scheduled_job['params'])} /
|
50
|
+
with params #{scheduled_job['params']}")
|
51
|
+
|
52
|
+
should_enqueue = director_job_class.has_work(scheduled_job['params'])
|
53
|
+
end
|
54
|
+
|
55
|
+
if should_enqueue
|
56
|
+
logger.info("enqueueing `#{scheduled_job['command']}'")
|
57
|
+
|
58
|
+
schedule_message = "scheduled #{scheduled_job['command']}"
|
59
|
+
if director_job_class.respond_to?(:schedule_message)
|
60
|
+
schedule_message = director_job_class.schedule_message
|
61
|
+
end
|
62
|
+
|
63
|
+
@queue.enqueue('scheduler',
|
64
|
+
director_job_class,
|
65
|
+
schedule_message,
|
66
|
+
scheduled_job['params'])
|
67
|
+
end
|
51
68
|
end
|
52
69
|
|
53
70
|
logger.info("added scheduled job `#{director_job_class}' with interval '#{scheduled_job['schedule']}'")
|
54
71
|
end
|
55
72
|
end
|
56
73
|
end
|
57
|
-
end
|
74
|
+
end
|
@@ -1,33 +1,39 @@
|
|
1
1
|
module Bosh::Director
|
2
|
-
class
|
3
|
-
def initialize(
|
4
|
-
@
|
5
|
-
@
|
2
|
+
class Stopper
|
3
|
+
def initialize(instance_plan, target_state, config, logger)
|
4
|
+
@instance_plan = instance_plan
|
5
|
+
@instance_model = @instance_plan.new? ? instance_plan.instance.model : instance_plan.existing_instance
|
6
6
|
@target_state = target_state
|
7
|
-
@skip_drain = skip_drain
|
8
7
|
@config = config
|
9
8
|
@logger = logger
|
10
9
|
end
|
11
10
|
|
12
11
|
def stop
|
13
|
-
if @
|
14
|
-
|
12
|
+
return if @instance_model.compilation || @instance_model.vm.nil?
|
13
|
+
|
14
|
+
if @instance_plan.skip_drain
|
15
|
+
@logger.info("Skipping drain for '#{@instance_model}'")
|
15
16
|
else
|
16
17
|
perform_drain
|
17
18
|
end
|
18
19
|
|
19
|
-
|
20
|
+
agent_client.stop
|
20
21
|
end
|
21
22
|
|
22
23
|
private
|
23
24
|
|
25
|
+
def agent_client
|
26
|
+
@agent_client ||= AgentClient.with_vm(@instance_model.vm)
|
27
|
+
end
|
28
|
+
|
24
29
|
def perform_drain
|
25
|
-
drain_type =
|
30
|
+
drain_type = needs_drain_to_migrate_data? ? 'shutdown' : 'update'
|
26
31
|
|
27
32
|
# Apply spec might change after shutdown drain (unlike update drain)
|
28
33
|
# because instance's VM could be reconfigured.
|
29
34
|
# Drain script can still capture intent from non-final apply spec.
|
30
|
-
|
35
|
+
drain_apply_spec = @instance_plan.spec.as_apply_spec
|
36
|
+
drain_time = agent_client.drain(drain_type, drain_apply_spec)
|
31
37
|
|
32
38
|
if drain_time > 0
|
33
39
|
sleep(drain_time)
|
@@ -36,12 +42,12 @@ module Bosh::Director
|
|
36
42
|
end
|
37
43
|
end
|
38
44
|
|
39
|
-
def
|
40
|
-
@
|
41
|
-
@
|
42
|
-
@
|
43
|
-
@
|
44
|
-
@
|
45
|
+
def needs_drain_to_migrate_data?
|
46
|
+
@target_state == 'stopped' ||
|
47
|
+
@target_state == 'detached' ||
|
48
|
+
@instance_plan.needs_shutting_down? ||
|
49
|
+
@instance_plan.persistent_disk_changed? ||
|
50
|
+
@instance_plan.networks_changed?
|
45
51
|
end
|
46
52
|
|
47
53
|
def wait_for_dynamic_drain(initial_drain_time)
|
@@ -50,7 +56,7 @@ module Bosh::Director
|
|
50
56
|
loop do
|
51
57
|
wait_time = drain_time.abs
|
52
58
|
if wait_time > 0
|
53
|
-
@logger.info("`#{@
|
59
|
+
@logger.info("`#{@instance_model}' is draining: checking back in #{wait_time}s")
|
54
60
|
sleep(wait_time)
|
55
61
|
end
|
56
62
|
|
@@ -62,7 +68,7 @@ module Bosh::Director
|
|
62
68
|
# realistically speaking, all agents have already been updated
|
63
69
|
# to support drain status mechanism and swallowing real errors
|
64
70
|
# would be bad here, as it could mask potential problems.
|
65
|
-
drain_time =
|
71
|
+
drain_time = agent_client.drain('status')
|
66
72
|
end
|
67
73
|
end
|
68
74
|
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module Bosh::Director
|
2
|
+
class TaggedLogger
|
3
|
+
def initialize(logger, *tags)
|
4
|
+
@logger = logger
|
5
|
+
@tags = tags.map { |t| "[#{t}]" }.join('')
|
6
|
+
end
|
7
|
+
|
8
|
+
def error(message)
|
9
|
+
@logger.error(tag_message(message))
|
10
|
+
end
|
11
|
+
|
12
|
+
def info(message)
|
13
|
+
@logger.info(tag_message(message))
|
14
|
+
end
|
15
|
+
|
16
|
+
def debug(message)
|
17
|
+
@logger.debug(tag_message(message))
|
18
|
+
end
|
19
|
+
|
20
|
+
def warn(message)
|
21
|
+
@logger.warn(tag_message(message))
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
25
|
+
|
26
|
+
def tag_message(message)
|
27
|
+
"#{@tags} #{message}"
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,9 @@
|
|
1
|
+
module Bosh::Director
|
2
|
+
class Transactor
|
3
|
+
def retryable_transaction(db, &block)
|
4
|
+
Bosh::Common.retryable(tries: 3, on: [Sequel::DatabaseError], matching: /Mysql2::Error: Deadlock found when trying to get lock/) do |attempt, e|
|
5
|
+
db.transaction(&block) || true
|
6
|
+
end
|
7
|
+
end
|
8
|
+
end
|
9
|
+
end
|
@@ -5,17 +5,95 @@ module Bosh::Director
|
|
5
5
|
class VmCreator
|
6
6
|
include EncryptionHelper
|
7
7
|
|
8
|
-
def
|
9
|
-
|
8
|
+
def initialize(cloud, logger, vm_deleter, disk_manager, job_renderer)
|
9
|
+
@cloud = cloud
|
10
|
+
@logger = logger
|
11
|
+
@vm_deleter = vm_deleter
|
12
|
+
@disk_manager = disk_manager
|
13
|
+
@job_renderer = job_renderer
|
10
14
|
end
|
11
15
|
|
12
|
-
def
|
13
|
-
@
|
14
|
-
|
16
|
+
def create_for_instance_plans(instance_plans, ip_provider, event_log)
|
17
|
+
return @logger.info('No missing vms to create') if instance_plans.empty?
|
18
|
+
|
19
|
+
total = instance_plans.size
|
20
|
+
event_log.begin_stage('Creating missing vms', total)
|
21
|
+
ThreadPool.new(max_threads: Config.max_threads, logger: @logger).wrap do |pool|
|
22
|
+
instance_plans.each do |instance_plan|
|
23
|
+
instance = instance_plan.instance
|
24
|
+
|
25
|
+
pool.process do
|
26
|
+
with_thread_name("create_missing_vm(#{instance}/#{total})") do
|
27
|
+
event_log.track(instance.model.to_s) do
|
28
|
+
@logger.info('Creating missing VM')
|
29
|
+
disks = [instance.model.persistent_disk_cid].compact
|
30
|
+
create_for_instance_plan(instance_plan, disks)
|
31
|
+
|
32
|
+
instance_plan.network_plans
|
33
|
+
.select(&:obsolete?)
|
34
|
+
.each do |network_plan|
|
35
|
+
reservation = network_plan.reservation
|
36
|
+
ip_provider.release(reservation)
|
37
|
+
end
|
38
|
+
instance_plan.release_obsolete_network_plans
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
15
44
|
end
|
16
45
|
|
17
|
-
def
|
18
|
-
|
46
|
+
def create_for_instance_plan(instance_plan, disks)
|
47
|
+
instance = instance_plan.instance
|
48
|
+
@logger.info('Creating VM')
|
49
|
+
|
50
|
+
vm_model = create(
|
51
|
+
instance.deployment_model,
|
52
|
+
instance.stemcell,
|
53
|
+
instance.cloud_properties,
|
54
|
+
instance_plan.network_settings_hash,
|
55
|
+
disks,
|
56
|
+
instance.env,
|
57
|
+
)
|
58
|
+
|
59
|
+
begin
|
60
|
+
instance.bind_to_vm_model(vm_model)
|
61
|
+
VmMetadataUpdater.build.update(vm_model, {})
|
62
|
+
|
63
|
+
agent_client = AgentClient.with_vm(vm_model)
|
64
|
+
agent_client.wait_until_ready
|
65
|
+
instance.update_trusted_certs
|
66
|
+
instance.update_cloud_properties!
|
67
|
+
rescue Exception => e
|
68
|
+
@logger.error("Failed to create/contact VM #{vm_model.cid}: #{e.inspect}")
|
69
|
+
if Config.keep_unreachable_vms
|
70
|
+
@logger.info("Keeping the VM for debugging")
|
71
|
+
else
|
72
|
+
@vm_deleter.delete_for_instance_plan(instance_plan)
|
73
|
+
end
|
74
|
+
raise e
|
75
|
+
end
|
76
|
+
|
77
|
+
@disk_manager.attach_disks_if_needed(instance_plan)
|
78
|
+
|
79
|
+
apply_initial_vm_state(instance_plan)
|
80
|
+
|
81
|
+
instance_plan.mark_desired_network_plans_as_existing
|
82
|
+
end
|
83
|
+
|
84
|
+
private
|
85
|
+
|
86
|
+
def apply_initial_vm_state(instance_plan)
|
87
|
+
instance_plan.instance.apply_initial_vm_state(instance_plan.spec)
|
88
|
+
|
89
|
+
unless instance_plan.instance.compilation?
|
90
|
+
# re-render job templates with updated dynamic network settings
|
91
|
+
@logger.debug("Re-rendering templates with spec: #{instance_plan.spec.as_template_spec}")
|
92
|
+
@job_renderer.render_job_instance(instance_plan)
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
def create(deployment, stemcell, cloud_properties, network_settings, disks, env)
|
19
97
|
vm = nil
|
20
98
|
vm_cid = nil
|
21
99
|
|
@@ -24,9 +102,9 @@ module Bosh::Director
|
|
24
102
|
agent_id = self.class.generate_agent_id
|
25
103
|
|
26
104
|
options = {
|
27
|
-
|
28
|
-
|
29
|
-
|
105
|
+
:deployment => deployment,
|
106
|
+
:agent_id => agent_id,
|
107
|
+
:env => env
|
30
108
|
}
|
31
109
|
|
32
110
|
if Config.encryption?
|
@@ -41,7 +119,7 @@ module Bosh::Director
|
|
41
119
|
vm_cid = @cloud.create_vm(agent_id, stemcell.cid, cloud_properties, network_settings, disks, env)
|
42
120
|
rescue Bosh::Clouds::VMCreationFailed => e
|
43
121
|
count += 1
|
44
|
-
logger.error("failed to create VM, retrying (#{count})")
|
122
|
+
@logger.error("failed to create VM, retrying (#{count})")
|
45
123
|
retry if e.ok_to_retry && count < Config.max_vm_create_tries
|
46
124
|
raise e
|
47
125
|
end
|
@@ -50,10 +128,9 @@ module Bosh::Director
|
|
50
128
|
vm = Models::Vm.new(options)
|
51
129
|
|
52
130
|
vm.save
|
53
|
-
VmMetadataUpdater.build.update(vm, {})
|
54
131
|
vm
|
55
132
|
rescue => e
|
56
|
-
logger.error("error creating vm: #{e.message}")
|
133
|
+
@logger.error("error creating vm: #{e.message}")
|
57
134
|
delete_vm(vm_cid) if vm_cid
|
58
135
|
vm.destroy if vm
|
59
136
|
raise e
|
@@ -62,16 +139,11 @@ module Bosh::Director
|
|
62
139
|
def delete_vm(vm_cid)
|
63
140
|
@cloud.delete_vm(vm_cid)
|
64
141
|
rescue => e
|
65
|
-
logger.error("error cleaning up #{vm_cid}: #{e.message}\n#{e.backtrace.join("\n")}")
|
142
|
+
@logger.error("error cleaning up #{vm_cid}: #{e.message}\n#{e.backtrace.join("\n")}")
|
66
143
|
end
|
67
144
|
|
68
145
|
def self.generate_agent_id
|
69
146
|
SecureRandom.uuid
|
70
147
|
end
|
71
|
-
|
72
|
-
def logger
|
73
|
-
Config.logger
|
74
|
-
end
|
75
|
-
|
76
148
|
end
|
77
149
|
end
|