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
@@ -0,0 +1,20 @@
|
|
1
|
+
module Bosh::Director
|
2
|
+
class LocalDnsRepo
|
3
|
+
|
4
|
+
def initialize(logger)
|
5
|
+
@logger = logger
|
6
|
+
end
|
7
|
+
|
8
|
+
def find(instance_model)
|
9
|
+
instance_model.dns_record_names.to_a
|
10
|
+
end
|
11
|
+
|
12
|
+
def create_or_update(instance_model, dns_record_names)
|
13
|
+
instance_model.update(dns_record_names: dns_record_names)
|
14
|
+
end
|
15
|
+
|
16
|
+
def delete(instance_model)
|
17
|
+
instance_model.update(dns_record_names: [])
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,170 @@
|
|
1
|
+
module Bosh::Director
|
2
|
+
class PowerDns
|
3
|
+
SOA = 'localhost hostmaster@localhost 0 10800 604800 30'
|
4
|
+
TTL_5M = 300
|
5
|
+
TTL_4H = 3600 * 4
|
6
|
+
TTL_5H = 3600 * 5
|
7
|
+
|
8
|
+
def initialize(domain_name, logger)
|
9
|
+
@domain_name = domain_name
|
10
|
+
@logger = logger
|
11
|
+
end
|
12
|
+
|
13
|
+
def find_dns_record(dns_record_name, ip_address)
|
14
|
+
Models::Dns::Record.find(name: dns_record_name, type: 'A', content: ip_address)
|
15
|
+
end
|
16
|
+
|
17
|
+
def find_dns_records_by_ip(ip_address)
|
18
|
+
domain_id = find_domain_id
|
19
|
+
return [] unless domain_id
|
20
|
+
|
21
|
+
Models::Dns::Record.filter(domain_id: domain_id, type: 'A', content: ip_address)
|
22
|
+
end
|
23
|
+
|
24
|
+
def create_or_update_nameserver(ip_address)
|
25
|
+
create_or_update_domain
|
26
|
+
create_or_update_record(@domain_name, SOA, TTL_5M, 'SOA')
|
27
|
+
create_or_update_record(@domain_name, "ns.#{@domain_name}", TTL_4H, 'NS')
|
28
|
+
create_or_update_record("ns.#{@domain_name}", ip_address, TTL_5H, 'A')
|
29
|
+
end
|
30
|
+
|
31
|
+
def create_or_update_dns_records(dns_record_name, ip_address)
|
32
|
+
create_or_update_record(dns_record_name, ip_address, TTL_5M, 'A')
|
33
|
+
update_ptr_record(dns_record_name, ip_address)
|
34
|
+
end
|
35
|
+
|
36
|
+
def find_dns_records_by_pattern(record_pattern)
|
37
|
+
records = Models::Dns::Record.filter(:name.like(record_pattern))
|
38
|
+
records.filter(:domain_id => find_domain_id).all
|
39
|
+
end
|
40
|
+
|
41
|
+
def delete(record_pattern)
|
42
|
+
records = find_dns_records_by_pattern(record_pattern)
|
43
|
+
|
44
|
+
# delete A records and collect all IPs for later
|
45
|
+
ips = []
|
46
|
+
records.each do |record|
|
47
|
+
ips << record.content
|
48
|
+
Models::Dns::Record.filter(:content.like(record.name)).each do |ptr|
|
49
|
+
@logger.info("Deleting reverse DNS record: #{ptr.name} -> #{ptr.content}")
|
50
|
+
ptr.destroy
|
51
|
+
end
|
52
|
+
@logger.info("Deleting DNS record: #{record.name}")
|
53
|
+
record.destroy
|
54
|
+
end
|
55
|
+
|
56
|
+
# see if any of the reverse domains are empty and should be deleted
|
57
|
+
ips.each do |ip|
|
58
|
+
reverse = reverse_domain(ip)
|
59
|
+
rdomain = Models::Dns::Domain.filter(name: reverse,
|
60
|
+
type: 'NATIVE')
|
61
|
+
rdomain.each do |domain|
|
62
|
+
delete_empty_domain(domain)
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
private
|
68
|
+
|
69
|
+
def create_or_update_domain
|
70
|
+
Models::Dns::Domain.safe_find_or_create(name: @domain_name, type: 'NATIVE')
|
71
|
+
end
|
72
|
+
|
73
|
+
def create_or_update_record(dns_record_name, ip_address, ttl, type)
|
74
|
+
record = Models::Dns::Record.find(name: dns_record_name, type: type)
|
75
|
+
if record.nil?
|
76
|
+
domain = create_or_update_domain
|
77
|
+
record = Models::Dns::Record.new(domain_id: domain.id,
|
78
|
+
name: dns_record_name, type: type,
|
79
|
+
ttl: ttl)
|
80
|
+
end
|
81
|
+
record.content = ip_address
|
82
|
+
record.change_date = Time.now.to_i
|
83
|
+
record.save
|
84
|
+
end
|
85
|
+
|
86
|
+
# create/update DNS PTR records (for reverse lookups)
|
87
|
+
def update_ptr_record(record_name, ip_address)
|
88
|
+
reverse_domain = reverse_domain(ip_address)
|
89
|
+
reverse_host = reverse_host(ip_address)
|
90
|
+
|
91
|
+
rdomain = Models::Dns::Domain.safe_find_or_create(name: reverse_domain,
|
92
|
+
type: 'NATIVE')
|
93
|
+
Models::Dns::Record.find_or_create(domain_id: rdomain.id,
|
94
|
+
name: reverse_domain,
|
95
|
+
type: 'SOA', content: SOA,
|
96
|
+
ttl: TTL_4H)
|
97
|
+
|
98
|
+
Models::Dns::Record.find_or_create(domain_id: rdomain.id,
|
99
|
+
name: reverse_domain,
|
100
|
+
type: 'NS', ttl: TTL_4H,
|
101
|
+
content: "ns.#{@domain_name}")
|
102
|
+
|
103
|
+
record = Models::Dns::Record.find(content: record_name, type: 'PTR')
|
104
|
+
|
105
|
+
# delete the record if the IP address changed
|
106
|
+
if record && record.name != reverse_host
|
107
|
+
id = record.domain_id
|
108
|
+
record.destroy
|
109
|
+
record = nil
|
110
|
+
|
111
|
+
# delete the domain if the domain id changed and it's empty
|
112
|
+
if id != rdomain.id
|
113
|
+
delete_empty_domain(Models::Dns::Domain[id])
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
unless record
|
118
|
+
record = Models::Dns::Record.new(domain_id: rdomain.id,
|
119
|
+
name: reverse_host,
|
120
|
+
type: 'PTR', ttl: TTL_5M)
|
121
|
+
end
|
122
|
+
record.content = record_name
|
123
|
+
record.change_date = Time.now.to_i
|
124
|
+
record.save
|
125
|
+
end
|
126
|
+
|
127
|
+
def find_domain_id
|
128
|
+
dns_domain = Models::Dns::Domain.find(
|
129
|
+
:name => @domain_name,
|
130
|
+
:type => 'NATIVE',
|
131
|
+
)
|
132
|
+
dns_domain.nil? ? nil : dns_domain.id
|
133
|
+
end
|
134
|
+
|
135
|
+
# @param [String] ip IP address
|
136
|
+
# @return [String] reverse dns name for an IP used for a PTR record
|
137
|
+
def reverse_host(ip)
|
138
|
+
reverse(ip, 4)
|
139
|
+
end
|
140
|
+
|
141
|
+
# @param [String] ip IP address
|
142
|
+
# @return [String] reverse dns domain name for an IP
|
143
|
+
def reverse_domain(ip)
|
144
|
+
reverse(ip, 3)
|
145
|
+
end
|
146
|
+
|
147
|
+
def reverse(ip, n)
|
148
|
+
octets = ip.split(/\./)
|
149
|
+
"#{octets[0..(n-1)].reverse.join(".")}.in-addr.arpa"
|
150
|
+
end
|
151
|
+
|
152
|
+
def delete_empty_domain(domain)
|
153
|
+
# If the count is 2, it means we only have the NS & SOA record
|
154
|
+
# and the domain is "empty" and can be deleted
|
155
|
+
if domain.records.size == 2
|
156
|
+
@logger.info("Deleting empty reverse domain #{domain.name}")
|
157
|
+
|
158
|
+
# Since DNS domain can be deleted by multiple threads
|
159
|
+
# it's possible for database to return 0 rows modified result.
|
160
|
+
# In this specific case that's a valid return value
|
161
|
+
# but Sequel usually considers that an error.
|
162
|
+
# ('Attempt to delete object did not result in a single row modification')
|
163
|
+
domain.require_modification = false
|
164
|
+
|
165
|
+
# Cascaded - all records are removed
|
166
|
+
domain.destroy
|
167
|
+
end
|
168
|
+
end
|
169
|
+
end
|
170
|
+
end
|
@@ -2,63 +2,52 @@ module Bosh::Director
|
|
2
2
|
class Errand::JobManager
|
3
3
|
# @param [Bosh::Director::DeploymentPlan::Planner] deployment
|
4
4
|
# @param [Bosh::Director::DeploymentPlan::Job] job
|
5
|
-
# @param [Bosh::
|
5
|
+
# @param [Bosh::Clouds] cloud
|
6
6
|
# @param [Bosh::Director::EventLog::Log] event_log
|
7
7
|
# @param [Logger] logger
|
8
|
-
def initialize(deployment, job,
|
8
|
+
def initialize(deployment, job, cloud, event_log, logger)
|
9
9
|
@deployment = deployment
|
10
10
|
@job = job
|
11
|
-
@blobstore = blobstore
|
12
11
|
@event_log = event_log
|
13
12
|
@logger = logger
|
13
|
+
vm_deleter = Bosh::Director::VmDeleter.new(cloud, logger)
|
14
|
+
@disk_manager = DiskManager.new(cloud, logger)
|
15
|
+
@job_renderer = JobRenderer.create
|
16
|
+
@vm_creator = Bosh::Director::VmCreator.new(cloud, logger, vm_deleter, @disk_manager, @job_renderer)
|
14
17
|
end
|
15
18
|
|
16
|
-
def
|
17
|
-
@job.
|
18
|
-
@job.bind_instance_networks
|
19
|
+
def create_missing_vms
|
20
|
+
@vm_creator.create_for_instance_plans(@job.instance_plans_with_missing_vms, @deployment.ip_provider, @event_log)
|
19
21
|
end
|
20
22
|
|
21
23
|
# Creates/updates all errand job instances
|
22
24
|
# @return [void]
|
23
25
|
def update_instances
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
instance_vm_binder = DeploymentPlan::InstanceVmBinder.new(@event_log)
|
28
|
-
instance_vm_binder.bind_instance_vms(@job.instances)
|
29
|
-
|
30
|
-
job_renderer = JobRenderer.new(@job, @blobstore)
|
31
|
-
job_renderer.render_job_instances
|
32
|
-
|
33
|
-
job_updater = JobUpdater.new(@deployment, @job, job_renderer)
|
26
|
+
links_resolver = DeploymentPlan::LinksResolver.new(@deployment, @logger)
|
27
|
+
job_updater = JobUpdater.new(@deployment, @job, links_resolver, @disk_manager)
|
34
28
|
job_updater.update
|
35
29
|
end
|
36
30
|
|
37
31
|
# Deletes all errand job instances
|
38
32
|
# @return [void]
|
39
33
|
def delete_instances
|
40
|
-
|
41
|
-
if
|
34
|
+
instance_plans = bound_instance_plans
|
35
|
+
if instance_plans.empty?
|
42
36
|
@logger.info('No errand instances to delete')
|
43
37
|
return
|
44
38
|
end
|
45
39
|
|
46
40
|
@logger.info('Deleting errand instances')
|
47
|
-
event_log_stage = @event_log.begin_stage('Deleting errand instances',
|
48
|
-
|
49
|
-
instance_deleter.
|
50
|
-
|
51
|
-
deallocate_vms
|
41
|
+
event_log_stage = @event_log.begin_stage('Deleting errand instances', instance_plans.size, [@job.name])
|
42
|
+
dns_manager = DnsManager.create
|
43
|
+
instance_deleter = InstanceDeleter.new(@deployment.ip_provider, dns_manager, @disk_manager)
|
44
|
+
instance_deleter.delete_instance_plans(instance_plans, event_log_stage)
|
52
45
|
end
|
53
46
|
|
54
47
|
private
|
55
48
|
|
56
|
-
|
57
|
-
|
58
|
-
def deallocate_vms
|
59
|
-
@logger.info('Deallocating errand VMs')
|
60
|
-
instance_vm_cids = @job.instances.map { |instance| instance.model.vm.cid }
|
61
|
-
instance_vm_cids.each { |cid| @job.resource_pool.deallocate_vm(cid) }
|
49
|
+
def bound_instance_plans
|
50
|
+
@job.needed_instance_plans.reject { |instance_plan| instance_plan.instance.model.nil? }
|
62
51
|
end
|
63
52
|
end
|
64
53
|
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module Bosh::Director
|
2
|
+
class ErrorIgnorer
|
3
|
+
def initialize(force, logger)
|
4
|
+
@force = force
|
5
|
+
@logger = logger
|
6
|
+
end
|
7
|
+
|
8
|
+
def with_force_check
|
9
|
+
yield
|
10
|
+
rescue => e
|
11
|
+
raise unless @force
|
12
|
+
@logger.warn(e.backtrace.join("\n"))
|
13
|
+
@logger.info('Force deleting is set, ignoring exception')
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
data/lib/bosh/director/errors.rb
CHANGED
@@ -89,10 +89,13 @@ module Bosh::Director
|
|
89
89
|
StemcellAlreadyExists = err(50002)
|
90
90
|
StemcellNotFound = err(50003, NOT_FOUND)
|
91
91
|
StemcellInUse = err(50004)
|
92
|
-
|
92
|
+
StemcellAliasAlreadyExists = err(50005)
|
93
|
+
StemcellBothNameAndOS = err(50006)
|
94
|
+
StemcellSha1DoesNotMatch = err(50007)
|
93
95
|
|
94
96
|
PackageInvalidArchive = err(60000)
|
95
97
|
PackageMissingSourceCode = err(60001)
|
98
|
+
CompiledPackageDeletionFailed = err(60002)
|
96
99
|
|
97
100
|
# Models
|
98
101
|
DeploymentNotFound = err(70000, NOT_FOUND)
|
@@ -122,6 +125,7 @@ module Bosh::Director
|
|
122
125
|
JobPackageCollision = err(80011)
|
123
126
|
JobInvalidPackageSpec = err(80012)
|
124
127
|
JobInvalidLinkSpec = err(80013)
|
128
|
+
JobDuplicateLinkName = err(80014)
|
125
129
|
|
126
130
|
ResourceError = err(100001)
|
127
131
|
ResourceNotFound = err(100002, NOT_FOUND)
|
@@ -132,6 +136,7 @@ module Bosh::Director
|
|
132
136
|
PropertyNotFound = err(110003, NOT_FOUND)
|
133
137
|
|
134
138
|
CompilationConfigUnknownNetwork = err(120001)
|
139
|
+
CompilationConfigInvalidAvailabilityZone = err(120002)
|
135
140
|
|
136
141
|
# Manifest parsing: network section
|
137
142
|
NetworkReservationInvalidIp = err(130001)
|
@@ -144,20 +149,30 @@ module Bosh::Director
|
|
144
149
|
NetworkReservationAlreadyInUse = err(130008)
|
145
150
|
NetworkReservationWrongType = err(130009)
|
146
151
|
NetworkReservationError = err(130010)
|
147
|
-
NetworkReservationNotEnoughCapacity = err(
|
152
|
+
NetworkReservationNotEnoughCapacity = err(130011)
|
153
|
+
NetworkReservationIpOutsideSubnet = err(130012)
|
154
|
+
NetworkReservationIpReserved = err(130013)
|
148
155
|
|
149
156
|
# Manifest parsing: job section
|
150
157
|
JobMissingRelease = err(140001)
|
151
158
|
JobUnknownRelease = err(140002)
|
152
159
|
JobUnknownResourcePool = err(140003)
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
160
|
+
JobUnknownVmType = err(140004)
|
161
|
+
JobUnknownStemcell = err(140005)
|
162
|
+
JobInvalidInstanceIndex = err(140006)
|
163
|
+
JobInvalidInstanceState = err(140007)
|
164
|
+
JobInvalidJobState = err(140008)
|
165
|
+
JobMissingNetwork = err(140009)
|
166
|
+
JobInvalidTemplates = err(140010)
|
167
|
+
JobInvalidLifecycle = err(140011)
|
168
|
+
JobUnknownDiskType = err(140012)
|
169
|
+
JobInvalidPersistentDisk = err(140013)
|
170
|
+
JobMissingLink = err(140014)
|
171
|
+
UnusedProvidedLink = err(140015)
|
172
|
+
JobInvalidAvailabilityZone = err(140016)
|
173
|
+
JobMissingAvailabilityZones = err(140017)
|
174
|
+
JobUnknownAvailabilityZone = err(140018)
|
175
|
+
JobAmbiguousEnv = err(140019)
|
161
176
|
|
162
177
|
# Manifest parsing: job networks section
|
163
178
|
JobUnknownNetwork = err(150001)
|
@@ -165,6 +180,10 @@ module Bosh::Director
|
|
165
180
|
JobNetworkInvalidDefault = err(150003)
|
166
181
|
JobNetworkMultipleDefaults = err(150004)
|
167
182
|
JobNetworkMissingDefault = err(150005)
|
183
|
+
JobNetworkMissingRequiredAvailabilityZone= err(150006)
|
184
|
+
JobStaticIpsFromInvalidAvailabilityZone= err(150007)
|
185
|
+
JobStaticIPNotSupportedOnDynamicNetwork= err(150008)
|
186
|
+
JobInvalidStaticIPs = err(150009)
|
168
187
|
|
169
188
|
NetworkOverlappingSubnets = err(160001)
|
170
189
|
NetworkInvalidRange = err(160002)
|
@@ -172,6 +191,10 @@ module Bosh::Director
|
|
172
191
|
NetworkInvalidDns = err(160004)
|
173
192
|
NetworkReservedIpOutOfRange = err(160005)
|
174
193
|
NetworkStaticIpOutOfRange = err(160006)
|
194
|
+
NetworkSubnetUnknownAvailabilityZone = err(160007)
|
195
|
+
NetworkInvalidProperty = err(160008)
|
196
|
+
NetworkSubnetInvalidAvailabilityZone = err(160009)
|
197
|
+
NetworkInvalidIpRangeFormat = err(160010)
|
175
198
|
|
176
199
|
ResourcePoolUnknownNetwork = err(170001)
|
177
200
|
ResourcePoolNotEnoughCapacity = err(170002)
|
@@ -181,18 +204,24 @@ module Bosh::Director
|
|
181
204
|
DeploymentAmbiguousReleaseSpec = err(190001)
|
182
205
|
DeploymentDuplicateReleaseName = err(190002)
|
183
206
|
DeploymentDuplicateResourcePoolName = err(190003)
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
207
|
+
DeploymentDuplicateVmTypeName = err(190004)
|
208
|
+
DeploymentRenamedJobNameStillUsed = err(190005)
|
209
|
+
DeploymentCanonicalJobNameTaken = err(190006)
|
210
|
+
DeploymentCanonicalNetworkNameTaken = err(190007)
|
211
|
+
DeploymentNoNetworks = err(190008)
|
212
|
+
DeploymentCanonicalNameTaken = err(190009)
|
213
|
+
DeploymentInvalidNetworkType = err(190010)
|
214
|
+
DeploymentUnknownTemplate = err(190011)
|
215
|
+
DeploymentInvalidDiskSpecification = err(190012)
|
216
|
+
DeploymentDuplicateDiskTypeName = err(190013)
|
192
217
|
DeploymentInvalidProperty = err(190014)
|
193
218
|
DeploymentNoResourcePools = err(190015)
|
219
|
+
DeploymentInvalidLink = err(190016)
|
220
|
+
DeploymentDuplicateAvailabilityZoneName = err(190017)
|
221
|
+
DeploymentInvalidMigratedFromJob = err(190018)
|
222
|
+
DeploymentInvalidResourceSpecification = err(190019)
|
194
223
|
|
195
|
-
|
224
|
+
DiskTypeInvalidDiskSize = err(200001)
|
196
225
|
|
197
226
|
CloudDiskNotAttached = err(390001)
|
198
227
|
CloudDiskMissing = err(390002)
|
@@ -218,7 +247,6 @@ module Bosh::Director
|
|
218
247
|
|
219
248
|
DnsInvalidCanonicalName = err(420001)
|
220
249
|
|
221
|
-
PackageCompilationNetworkNotReserved = err(430001)
|
222
250
|
PackageCompilationNotEnoughWorkersForReuse = err(430002)
|
223
251
|
PackageCompilationNotFound = err(430003)
|
224
252
|
|
@@ -232,4 +260,7 @@ module Bosh::Director
|
|
232
260
|
|
233
261
|
# Run errand errors
|
234
262
|
RunErrandError = err(510000)
|
263
|
+
|
264
|
+
#Deleting Disk
|
265
|
+
DeletingPersistentDiskError = err(520000)
|
235
266
|
end
|
@@ -1,107 +1,79 @@
|
|
1
1
|
module Bosh::Director
|
2
2
|
# Coordinates the safe deletion of an instance and all associates resources.
|
3
3
|
class InstanceDeleter
|
4
|
-
include DnsHelper
|
5
4
|
|
6
|
-
def initialize(
|
7
|
-
@
|
5
|
+
def initialize(ip_provider, dns_manager, disk_manager, options={})
|
6
|
+
@ip_provider = ip_provider
|
7
|
+
@dns_manager = dns_manager
|
8
|
+
@disk_manager = disk_manager
|
8
9
|
@cloud = Config.cloud
|
9
10
|
@logger = Config.logger
|
10
11
|
@blobstore = App.instance.blobstores.blobstore
|
12
|
+
|
13
|
+
@force = options.fetch(:force, false)
|
11
14
|
end
|
12
15
|
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
16
|
+
def delete_instance_plan(instance_plan, event_log_stage)
|
17
|
+
instance_model = instance_plan.new? ? instance_plan.instance.model : instance_plan.existing_instance
|
18
|
+
|
19
|
+
@logger.info("Deleting instance '#{instance_model}'")
|
20
|
+
|
21
|
+
event_log_stage.advance_and_track(instance_model.to_s) do
|
22
|
+
|
23
|
+
error_ignorer.with_force_check do
|
24
|
+
stop(instance_plan)
|
22
25
|
end
|
23
|
-
end
|
24
|
-
end
|
25
26
|
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
RenderedJobTemplatesCleaner.new(instance, @blobstore, @logger).clean_all
|
41
|
-
|
42
|
-
vm.db.transaction do
|
43
|
-
instance.destroy
|
44
|
-
vm.destroy
|
27
|
+
vm_deleter.delete_for_instance_plan(instance_plan)
|
28
|
+
|
29
|
+
unless instance_model.compilation
|
30
|
+
error_ignorer.with_force_check do
|
31
|
+
@disk_manager.delete_persistent_disks(instance_model)
|
32
|
+
end
|
33
|
+
|
34
|
+
error_ignorer.with_force_check do
|
35
|
+
@dns_manager.delete_dns_for_instance(instance_model)
|
36
|
+
end
|
37
|
+
|
38
|
+
error_ignorer.with_force_check do
|
39
|
+
RenderedJobTemplatesCleaner.new(instance_model, @blobstore, @logger).clean_all
|
40
|
+
end
|
45
41
|
end
|
42
|
+
|
43
|
+
instance_plan.network_plans.each do |network_plan|
|
44
|
+
reservation = network_plan.reservation
|
45
|
+
@ip_provider.release(reservation) if reservation.reserved?
|
46
|
+
end
|
47
|
+
instance_plan.release_all_network_plans
|
48
|
+
|
49
|
+
instance_model.destroy
|
46
50
|
end
|
47
51
|
end
|
48
52
|
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
drain_time = agent.drain("shutdown")
|
56
|
-
while drain_time < 0
|
57
|
-
drain_time = drain_time.abs
|
58
|
-
begin
|
59
|
-
@logger.info("Drain - check back in #{drain_time} seconds")
|
60
|
-
sleep(drain_time)
|
61
|
-
drain_time = agent.drain("status")
|
62
|
-
rescue => e
|
63
|
-
@logger.warn("Failed to check drain-status: #{e.inspect}")
|
64
|
-
raise if e.kind_of?(Bosh::Director::TaskCancelled)
|
65
|
-
break
|
53
|
+
def delete_instance_plans(instance_plans, event_log_stage, options = {})
|
54
|
+
max_threads = options[:max_threads] || Config.max_threads
|
55
|
+
ThreadPool.new(:max_threads => max_threads).wrap do |pool|
|
56
|
+
instance_plans.each do |instance_plan|
|
57
|
+
pool.process { delete_instance_plan(instance_plan, event_log_stage) }
|
66
58
|
end
|
67
59
|
end
|
68
|
-
|
69
|
-
sleep(drain_time)
|
70
|
-
agent.stop
|
71
60
|
end
|
72
61
|
|
73
|
-
|
74
|
-
|
75
|
-
|
62
|
+
private
|
63
|
+
|
64
|
+
def stop(instance_plan)
|
65
|
+
stopper = Stopper.new(instance_plan, 'stopped', Config, @logger)
|
66
|
+
stopper.stop
|
76
67
|
end
|
77
68
|
|
78
|
-
#
|
79
|
-
|
80
|
-
|
81
|
-
def delete_persistent_disks(persistent_disks)
|
82
|
-
persistent_disks.each do |disk|
|
83
|
-
@logger.info("Deleting disk: `#{disk.disk_cid}', " +
|
84
|
-
"#{disk.active ? "active" : "inactive"}")
|
85
|
-
begin
|
86
|
-
@cloud.delete_disk(disk.disk_cid)
|
87
|
-
rescue Bosh::Clouds::DiskNotFound => e
|
88
|
-
@logger.warn("Disk not found: #{disk.disk_cid}")
|
89
|
-
raise if disk.active
|
90
|
-
end
|
91
|
-
disk.destroy
|
92
|
-
end
|
69
|
+
# FIXME: why do we hate dependency injection?
|
70
|
+
def error_ignorer
|
71
|
+
@error_ignorer ||= ErrorIgnorer.new(@force, @logger)
|
93
72
|
end
|
94
73
|
|
95
|
-
#
|
96
|
-
|
97
|
-
|
98
|
-
# @return [void]
|
99
|
-
def delete_dns(job, index)
|
100
|
-
if Config.dns_enabled?
|
101
|
-
record_pattern = [index, canonical(job), "%",
|
102
|
-
@deployment_plan.canonical_name, dns_domain_name].join(".")
|
103
|
-
delete_dns_records(record_pattern, @deployment_plan.dns_domain.id)
|
104
|
-
end
|
74
|
+
# FIXME: why do we hate dependency injection?
|
75
|
+
def vm_deleter
|
76
|
+
@vm_deleter ||= VmDeleter.new(@cloud, @logger, {force: @force})
|
105
77
|
end
|
106
78
|
end
|
107
79
|
end
|