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
@@ -1,68 +0,0 @@
|
|
1
|
-
module Bosh::Director
|
2
|
-
module DeploymentPlan
|
3
|
-
class ResourcePools
|
4
|
-
def initialize(event_log, resource_pool_updaters)
|
5
|
-
@event_log = event_log
|
6
|
-
@resource_pool_updaters = resource_pool_updaters
|
7
|
-
end
|
8
|
-
|
9
|
-
def update
|
10
|
-
ThreadPool.new(:max_threads => Config.max_threads).wrap do |thread_pool|
|
11
|
-
# Delete extra VMs across resource pools
|
12
|
-
event_log.begin_stage('Deleting extra VMs', sum_across_pools(:extra_vm_count))
|
13
|
-
resource_pool_updaters.each do |updater|
|
14
|
-
updater.delete_extra_vms(thread_pool)
|
15
|
-
end
|
16
|
-
thread_pool.wait
|
17
|
-
|
18
|
-
# Delete outdated idle vms across resource pools, outdated allocated
|
19
|
-
# VMs are handled by instance updater
|
20
|
-
event_log.begin_stage('Deleting outdated idle VMs', sum_across_pools(:outdated_idle_vm_count))
|
21
|
-
|
22
|
-
resource_pool_updaters.each do |updater|
|
23
|
-
updater.delete_outdated_idle_vms(thread_pool)
|
24
|
-
end
|
25
|
-
thread_pool.wait
|
26
|
-
|
27
|
-
# Create missing VMs across resource pools phase 1:
|
28
|
-
# only creates VMs that have been bound to instances
|
29
|
-
# to avoid refilling the resource pool before instances
|
30
|
-
# that are no longer needed have been deleted.
|
31
|
-
event_log.begin_stage('Creating bound missing VMs', sum_across_pools(:bound_missing_vm_count))
|
32
|
-
resource_pool_updaters.each do |updater|
|
33
|
-
updater.create_bound_missing_vms(thread_pool)
|
34
|
-
end
|
35
|
-
end
|
36
|
-
end
|
37
|
-
|
38
|
-
def refill
|
39
|
-
# Instance updaters might have added some idle vms
|
40
|
-
# so they can be returned to resource pool. In that case
|
41
|
-
# we need to pre-allocate network settings for all of them.
|
42
|
-
resource_pool_updaters.each do |resource_pool_updater|
|
43
|
-
resource_pool_updater.reserve_networks
|
44
|
-
end
|
45
|
-
|
46
|
-
event_log.begin_stage('Refilling resource pools', sum_across_pools(:missing_vm_count))
|
47
|
-
ThreadPool.new(:max_threads => Config.max_threads).wrap do |thread_pool|
|
48
|
-
# Create missing VMs across resource pools phase 2:
|
49
|
-
# should be called after all instance updaters are finished to
|
50
|
-
# create additional VMs in order to balance resource pools
|
51
|
-
resource_pool_updaters.each do |resource_pool_updater|
|
52
|
-
resource_pool_updater.create_missing_vms(thread_pool)
|
53
|
-
end
|
54
|
-
end
|
55
|
-
end
|
56
|
-
|
57
|
-
private
|
58
|
-
|
59
|
-
attr_reader :event_log, :resource_pool_updaters
|
60
|
-
|
61
|
-
def sum_across_pools(counting_method)
|
62
|
-
resource_pool_updaters.inject(0) do |sum, updater|
|
63
|
-
sum + updater.send(counting_method.to_sym)
|
64
|
-
end
|
65
|
-
end
|
66
|
-
end
|
67
|
-
end
|
68
|
-
end
|
@@ -1,223 +0,0 @@
|
|
1
|
-
module Bosh::Director
|
2
|
-
module DnsHelper
|
3
|
-
|
4
|
-
# primary_ns contact serial refresh retry expire minimum
|
5
|
-
SOA = "localhost hostmaster@localhost 0 10800 604800 30"
|
6
|
-
TTL_5M = 300
|
7
|
-
TTL_4H = 3600 * 4
|
8
|
-
|
9
|
-
# @param [String] ip IP address
|
10
|
-
# @return [String] reverse dns domain name for an IP
|
11
|
-
def reverse_domain(ip)
|
12
|
-
reverse(ip, 2)
|
13
|
-
end
|
14
|
-
|
15
|
-
# @param [String] ip IP address
|
16
|
-
# @return [String] reverse dns name for an IP used for a PTR record
|
17
|
-
def reverse_host(ip)
|
18
|
-
reverse(ip, 3)
|
19
|
-
end
|
20
|
-
|
21
|
-
def canonical(string)
|
22
|
-
# a-z, 0-9, -, case insensitive, and must start with a letter
|
23
|
-
string = string.downcase.gsub(/_/, "-").gsub(/[^a-z0-9-]/, "")
|
24
|
-
if string =~ /^(\d|-)/
|
25
|
-
raise DnsInvalidCanonicalName,
|
26
|
-
"Invalid DNS canonical name `#{string}', must begin with a letter"
|
27
|
-
end
|
28
|
-
if string =~ /-$/
|
29
|
-
raise DnsInvalidCanonicalName,
|
30
|
-
"Invalid DNS canonical name `#{string}', can't end with a hyphen"
|
31
|
-
end
|
32
|
-
string
|
33
|
-
end
|
34
|
-
|
35
|
-
# build a list of dns servers to use
|
36
|
-
def dns_servers(network, spec, add_default_dns = true)
|
37
|
-
servers = nil
|
38
|
-
dns_property = safe_property(spec, "dns",
|
39
|
-
:class => Array, :optional => true)
|
40
|
-
if dns_property
|
41
|
-
servers = []
|
42
|
-
dns_property.each do |dns|
|
43
|
-
dns = NetAddr::CIDR.create(dns)
|
44
|
-
unless dns.size == 1
|
45
|
-
invalid_dns(network, "must be a single IP")
|
46
|
-
end
|
47
|
-
|
48
|
-
servers << dns.ip
|
49
|
-
end
|
50
|
-
end
|
51
|
-
|
52
|
-
return servers unless add_default_dns
|
53
|
-
|
54
|
-
add_default_dns_server(servers)
|
55
|
-
end
|
56
|
-
|
57
|
-
# returns the default DNS server
|
58
|
-
def default_dns_server
|
59
|
-
Config.dns["server"] if Config.dns
|
60
|
-
end
|
61
|
-
|
62
|
-
# add default dns server to an array of dns servers
|
63
|
-
def add_default_dns_server(servers)
|
64
|
-
return servers unless Config.dns_enabled?
|
65
|
-
|
66
|
-
default_server = default_dns_server
|
67
|
-
if default_server && default_server != "127.0.0.1"
|
68
|
-
(servers ||= []) << default_server
|
69
|
-
servers.uniq!
|
70
|
-
end
|
71
|
-
|
72
|
-
servers
|
73
|
-
end
|
74
|
-
|
75
|
-
# returns the DNS domain name
|
76
|
-
def dns_domain_name
|
77
|
-
Config.dns_domain_name
|
78
|
-
end
|
79
|
-
|
80
|
-
# returns the DNS name server record
|
81
|
-
def dns_ns_record
|
82
|
-
"ns.#{dns_domain_name}"
|
83
|
-
end
|
84
|
-
|
85
|
-
# create/update DNS A record
|
86
|
-
def update_dns_a_record(domain, name, ip_address)
|
87
|
-
record = Models::Dns::Record.find(:domain_id => domain.id,
|
88
|
-
:name => name)
|
89
|
-
if record.nil?
|
90
|
-
record = Models::Dns::Record.new(:domain_id => domain.id,
|
91
|
-
:name => name, :type => "A",
|
92
|
-
:ttl => TTL_5M)
|
93
|
-
end
|
94
|
-
record.content = ip_address
|
95
|
-
record.change_date = Time.now.to_i
|
96
|
-
record.save
|
97
|
-
end
|
98
|
-
|
99
|
-
# create/update DNS PTR records (for reverse lookups)
|
100
|
-
def update_dns_ptr_record(name, ip_address)
|
101
|
-
reverse_domain = reverse_domain(ip_address)
|
102
|
-
reverse_host = reverse_host(ip_address)
|
103
|
-
|
104
|
-
rdomain = Models::Dns::Domain.safe_find_or_create(:name => reverse_domain,
|
105
|
-
:type => "NATIVE")
|
106
|
-
Models::Dns::Record.find_or_create(:domain_id => rdomain.id,
|
107
|
-
:name => reverse_domain,
|
108
|
-
:type =>'SOA', :content => SOA,
|
109
|
-
:ttl => TTL_4H)
|
110
|
-
|
111
|
-
Models::Dns::Record.find_or_create(:domain_id => rdomain.id,
|
112
|
-
:name => reverse_domain,
|
113
|
-
:type =>'NS', :ttl => TTL_4H,
|
114
|
-
:content => dns_ns_record)
|
115
|
-
|
116
|
-
record = Models::Dns::Record.find(:content => name, :type =>'PTR')
|
117
|
-
|
118
|
-
# delete the record if the IP address changed
|
119
|
-
if record && record.name != reverse_host
|
120
|
-
id = record.domain_id
|
121
|
-
record.destroy
|
122
|
-
record = nil
|
123
|
-
|
124
|
-
# delete the domain if the domain id changed and it's empty
|
125
|
-
if id != rdomain.id
|
126
|
-
delete_empty_domain(Models::Dns::Domain[id])
|
127
|
-
end
|
128
|
-
end
|
129
|
-
|
130
|
-
unless record
|
131
|
-
record = Models::Dns::Record.new(:domain_id => rdomain.id,
|
132
|
-
:name => reverse_host,
|
133
|
-
:type =>'PTR', :ttl => TTL_5M)
|
134
|
-
end
|
135
|
-
record.content = name
|
136
|
-
record.change_date = Time.now.to_i
|
137
|
-
record.save
|
138
|
-
end
|
139
|
-
|
140
|
-
# deletes all DNS records matching the pattern
|
141
|
-
# @param [String] record_pattern SQL pattern
|
142
|
-
# @param [Integer] domain_id domain record id
|
143
|
-
def delete_dns_records(record_pattern, domain_id=nil)
|
144
|
-
records = Models::Dns::Record.filter(:name.like(record_pattern))
|
145
|
-
if domain_id
|
146
|
-
records = records.filter(:domain_id => domain_id)
|
147
|
-
end
|
148
|
-
|
149
|
-
# delete A records and collect all IPs for later
|
150
|
-
ips = []
|
151
|
-
records.each do |record|
|
152
|
-
ips << record.content
|
153
|
-
@logger.info("Deleting DNS record: #{record.name}")
|
154
|
-
record.destroy
|
155
|
-
end
|
156
|
-
|
157
|
-
# delete PTR records from IP list
|
158
|
-
ips.each do |ip|
|
159
|
-
records = Models::Dns::Record.filter(:name.like(reverse_host(ip)))
|
160
|
-
records.each do |record|
|
161
|
-
@logger.info("Deleting reverse DNS record: #{record.name}")
|
162
|
-
record.destroy
|
163
|
-
end
|
164
|
-
end
|
165
|
-
|
166
|
-
# see if any of the reverse domains are empty and should be deleted
|
167
|
-
ips.each do |ip|
|
168
|
-
reverse = reverse_domain(ip)
|
169
|
-
rdomain = Models::Dns::Domain.filter(:name => reverse,
|
170
|
-
:type => "NATIVE")
|
171
|
-
rdomain.each do |domain|
|
172
|
-
delete_empty_domain(domain)
|
173
|
-
end
|
174
|
-
end
|
175
|
-
end
|
176
|
-
|
177
|
-
def delete_empty_domain(domain)
|
178
|
-
# If the count is 2, it means we only have the NS & SOA record
|
179
|
-
# and the domain is "empty" and can be deleted
|
180
|
-
if domain.records.size == 2
|
181
|
-
@logger.info("Deleting empty reverse domain #{domain.name}")
|
182
|
-
|
183
|
-
# Since DNS domain can be deleted by multiple threads
|
184
|
-
# it's possible for database to return 0 rows modified result.
|
185
|
-
# In this specific case that's a valid return value
|
186
|
-
# but Sequel usually considers that an error.
|
187
|
-
# ('Attempt to delete object did not result in a single row modification')
|
188
|
-
domain.require_modification = false
|
189
|
-
|
190
|
-
# Cascaded - all records are removed
|
191
|
-
domain.destroy
|
192
|
-
end
|
193
|
-
end
|
194
|
-
|
195
|
-
# @param [String] network name
|
196
|
-
# @param [String] reason
|
197
|
-
# @raise NetworkInvalidDns
|
198
|
-
def invalid_dns(network, reason)
|
199
|
-
raise NetworkInvalidDns,
|
200
|
-
"Invalid DNS for network `#{network}': #{reason}"
|
201
|
-
end
|
202
|
-
|
203
|
-
# Purge cached DNS records
|
204
|
-
def flush_dns_cache
|
205
|
-
flush_command = Config.dns['flush_command']
|
206
|
-
if flush_command && !flush_command.empty?
|
207
|
-
stdout, stderr, status = Open3.capture3(flush_command)
|
208
|
-
if status == 0
|
209
|
-
@logger.debug("Flushed #{stdout.chomp} records from DNS cache")
|
210
|
-
else
|
211
|
-
@logger.warn("Failed to flush DNS cache: #{stderr.chomp}")
|
212
|
-
end
|
213
|
-
end
|
214
|
-
end
|
215
|
-
|
216
|
-
private
|
217
|
-
|
218
|
-
def reverse(ip, n)
|
219
|
-
octets = ip.split(/\./)
|
220
|
-
"#{octets[0..n].reverse.join(".")}.in-addr.arpa"
|
221
|
-
end
|
222
|
-
end
|
223
|
-
end
|
@@ -1,110 +0,0 @@
|
|
1
|
-
module Bosh::Director
|
2
|
-
class InstanceUpdater::NetworkUpdater
|
3
|
-
def initialize(instance, vm_model, agent_client, vm_updater, cloud, logger)
|
4
|
-
@instance = instance
|
5
|
-
@vm_model = vm_model
|
6
|
-
@agent_client = agent_client
|
7
|
-
@vm_updater = vm_updater
|
8
|
-
@cloud = cloud
|
9
|
-
@logger = logger
|
10
|
-
end
|
11
|
-
|
12
|
-
def update
|
13
|
-
unless @instance.networks_changed?
|
14
|
-
@logger.info('Skipping network re-configuration')
|
15
|
-
return [@vm_model, @agent_client]
|
16
|
-
end
|
17
|
-
|
18
|
-
network_settings = @instance.network_settings
|
19
|
-
|
20
|
-
strategies = [
|
21
|
-
ConfigureNetworksStrategy.new(@agent_client, network_settings, @logger),
|
22
|
-
PrepareNetworkChangeStrategy.new(@agent_client, network_settings, @logger),
|
23
|
-
]
|
24
|
-
|
25
|
-
@logger.info("Planning to reconfigure network with settings: #{network_settings}")
|
26
|
-
selected_strategy = strategies.find { |s| s.before_configure_networks }
|
27
|
-
|
28
|
-
@cloud.configure_networks(@vm_model.cid, network_settings)
|
29
|
-
|
30
|
-
selected_strategy.after_configure_networks
|
31
|
-
|
32
|
-
[@vm_model, @agent_client]
|
33
|
-
|
34
|
-
rescue Bosh::Clouds::NotSupported => e
|
35
|
-
@logger.info("Failed reconfiguring existing VM: #{e.inspect}")
|
36
|
-
|
37
|
-
# If configure_networks CPI method cannot reconfigure VM networking
|
38
|
-
# (e.g. when the security groups change on AWS)
|
39
|
-
# it raises Bosh::Clouds::NotSupported to indicate new VM is needed.
|
40
|
-
@logger.info('Creating VM with new network configurations')
|
41
|
-
@instance.recreate = true
|
42
|
-
@vm_updater.update(nil)
|
43
|
-
end
|
44
|
-
|
45
|
-
private
|
46
|
-
|
47
|
-
# Newer agents support prepare_configure_networks/configure_networks messages
|
48
|
-
class ConfigureNetworksStrategy
|
49
|
-
def initialize(agent_client, network_settings, logger)
|
50
|
-
@agent_client = agent_client
|
51
|
-
@network_settings = network_settings
|
52
|
-
@logger = logger
|
53
|
-
end
|
54
|
-
|
55
|
-
def before_configure_networks
|
56
|
-
@agent_client.prepare_configure_networks(@network_settings)
|
57
|
-
true
|
58
|
-
rescue RpcRemoteException => e
|
59
|
-
@logger.info("Agent returned error from prepare_configure_networks: #{e.inspect}")
|
60
|
-
raise unless e.message =~ /unknown message/
|
61
|
-
false
|
62
|
-
end
|
63
|
-
|
64
|
-
def after_configure_networks
|
65
|
-
# Some CPIs might power off and then power on vm to reconfigure network adapters,
|
66
|
-
# so Director needs to wait for agent to become responsive
|
67
|
-
@logger.info('Waiting for agent to become responsive')
|
68
|
-
@agent_client.wait_until_ready
|
69
|
-
|
70
|
-
# Agent's configure_networks is a long running task
|
71
|
-
# hence we do not need to wait_until_ready after it
|
72
|
-
@agent_client.configure_networks(@network_settings)
|
73
|
-
end
|
74
|
-
end
|
75
|
-
|
76
|
-
# Older agents only support prepare_network_change
|
77
|
-
class PrepareNetworkChangeStrategy
|
78
|
-
def initialize(agent_client, network_settings, logger)
|
79
|
-
@agent_client = agent_client
|
80
|
-
@network_settings = network_settings
|
81
|
-
@logger = logger
|
82
|
-
end
|
83
|
-
|
84
|
-
def before_configure_networks
|
85
|
-
true
|
86
|
-
end
|
87
|
-
|
88
|
-
def after_configure_networks
|
89
|
-
# Some CPIs might power off and then power on vm to reconfigure network adapters,
|
90
|
-
# so Director needs to wait for agent to become responsive
|
91
|
-
@logger.info('Waiting for agent to become responsive')
|
92
|
-
@agent_client.wait_until_ready
|
93
|
-
|
94
|
-
# Once CPI has configured the vm and stored the new network settings at the registry,
|
95
|
-
# we restart the agent via a 'prepare_network_change' message in order for the agent
|
96
|
-
# to pick up the new network settings.
|
97
|
-
@agent_client.prepare_network_change(@network_settings)
|
98
|
-
|
99
|
-
# Since current implementation of prepare_network_change is to kill the agent
|
100
|
-
# we need to wait until the agent is ready. However, we want to avoid
|
101
|
-
# talking to the old agent, so we need to wait for it to die.
|
102
|
-
@logger.info('Sleeping after prepare_network_change message')
|
103
|
-
sleep(5)
|
104
|
-
|
105
|
-
@logger.info('Waiting for agent to become responsive')
|
106
|
-
@agent_client.wait_until_ready
|
107
|
-
end
|
108
|
-
end
|
109
|
-
end
|
110
|
-
end
|
@@ -1,189 +0,0 @@
|
|
1
|
-
module Bosh::Director
|
2
|
-
class InstanceUpdater::VmUpdater
|
3
|
-
def initialize(instance, vm_model, agent_client, job_renderer, cloud, max_update_tries, logger)
|
4
|
-
@instance = instance
|
5
|
-
@vm_model = vm_model
|
6
|
-
@agent_client = agent_client
|
7
|
-
@job_renderer = job_renderer
|
8
|
-
@cloud = cloud
|
9
|
-
@max_update_tries = max_update_tries
|
10
|
-
@logger = logger
|
11
|
-
end
|
12
|
-
|
13
|
-
def update(new_disk_cid)
|
14
|
-
if !@instance.resource_pool_changed? && !new_disk_cid
|
15
|
-
@logger.info('Skipping VM update')
|
16
|
-
return [@vm_model, @agent_client]
|
17
|
-
end
|
18
|
-
|
19
|
-
disk_detacher = DiskDetacher.new(@instance, @vm_model, @agent_client, @cloud, @logger)
|
20
|
-
disk_detacher.detach
|
21
|
-
|
22
|
-
@max_update_tries.times do |try|
|
23
|
-
vm_deleter = VmDeleter.new(@instance, @vm_model, @cloud, @logger)
|
24
|
-
vm_deleter.delete
|
25
|
-
|
26
|
-
vm_creator = VmCreator.new(@instance, @cloud, @logger)
|
27
|
-
@vm_model, @agent_client = vm_creator.create(new_disk_cid)
|
28
|
-
|
29
|
-
begin
|
30
|
-
disk_attacher = DiskAttacher.new(@instance, @vm_model, @agent_client, @cloud, @logger)
|
31
|
-
disk_attacher.attach
|
32
|
-
break
|
33
|
-
rescue Bosh::Clouds::NoDiskSpace => e
|
34
|
-
if e.ok_to_retry && try < @max_update_tries-1
|
35
|
-
@logger.warn("Retrying attach disk operation #{try}: #{e.inspect}")
|
36
|
-
else
|
37
|
-
@logger.warn("Failed to attach disk to new VM: #{e.inspect}")
|
38
|
-
raise CloudNotEnoughDiskSpace,
|
39
|
-
"Not enough disk space to update `#{@instance}'"
|
40
|
-
end
|
41
|
-
end
|
42
|
-
end
|
43
|
-
|
44
|
-
@instance.apply_vm_state
|
45
|
-
@job_renderer.render_job_instance(@instance)
|
46
|
-
|
47
|
-
[@vm_model, @agent_client]
|
48
|
-
end
|
49
|
-
|
50
|
-
def detach
|
51
|
-
@logger.info('Detaching VM')
|
52
|
-
|
53
|
-
disk_detacher = DiskDetacher.new(@instance, @vm_model, @agent_client, @cloud, @logger)
|
54
|
-
disk_detacher.detach
|
55
|
-
|
56
|
-
vm_deleter = VmDeleter.new(@instance, @vm_model, @cloud, @logger)
|
57
|
-
vm_deleter.delete
|
58
|
-
end
|
59
|
-
|
60
|
-
def attach_missing_disk
|
61
|
-
if !@instance.model.persistent_disk_cid || @instance.disk_currently_attached?
|
62
|
-
@logger.info('Skipping attaching missing VM')
|
63
|
-
return
|
64
|
-
end
|
65
|
-
|
66
|
-
begin
|
67
|
-
disk_attacher = DiskAttacher.new(@instance, @vm_model, @agent_client, @cloud, @logger)
|
68
|
-
disk_attacher.attach
|
69
|
-
rescue Bosh::Clouds::NoDiskSpace => e
|
70
|
-
@logger.warn("Failed attaching missing disk first time: #{e.inspect}")
|
71
|
-
update(@instance.model.persistent_disk_cid)
|
72
|
-
end
|
73
|
-
end
|
74
|
-
|
75
|
-
private
|
76
|
-
|
77
|
-
class VmCreator
|
78
|
-
def initialize(instance, cloud, logger)
|
79
|
-
@instance = instance
|
80
|
-
@cloud = cloud
|
81
|
-
@logger = logger
|
82
|
-
end
|
83
|
-
|
84
|
-
def create(new_disk_id)
|
85
|
-
@logger.info('Creating VM')
|
86
|
-
vm_model = new_vm_model(new_disk_id)
|
87
|
-
|
88
|
-
begin
|
89
|
-
@instance.bind_to_vm_model(vm_model)
|
90
|
-
|
91
|
-
agent_client = AgentClient.with_defaults(vm_model.agent_id)
|
92
|
-
agent_client.wait_until_ready
|
93
|
-
agent_client.update_settings(Bosh::Director::Config.trusted_certs)
|
94
|
-
vm_model.update(:trusted_certs_sha1 => Digest::SHA1.hexdigest(Bosh::Director::Config.trusted_certs))
|
95
|
-
rescue Exception => e
|
96
|
-
@logger.error("Failed to create/contact VM #{vm_model.cid}: #{e.inspect}")
|
97
|
-
VmDeleter.new(@instance, vm_model, @cloud, @logger).delete
|
98
|
-
raise e
|
99
|
-
end
|
100
|
-
|
101
|
-
[vm_model, agent_client]
|
102
|
-
end
|
103
|
-
|
104
|
-
def new_vm_model(new_disk_id)
|
105
|
-
deployment = @instance.job.deployment
|
106
|
-
resource_pool = @instance.job.resource_pool
|
107
|
-
|
108
|
-
Bosh::Director::VmCreator.create(
|
109
|
-
deployment.model,
|
110
|
-
resource_pool.stemcell.model,
|
111
|
-
resource_pool.cloud_properties,
|
112
|
-
@instance.network_settings,
|
113
|
-
[@instance.model.persistent_disk_cid, new_disk_id].compact,
|
114
|
-
resource_pool.env,
|
115
|
-
)
|
116
|
-
end
|
117
|
-
end
|
118
|
-
|
119
|
-
class VmDeleter
|
120
|
-
def initialize(instance, vm_model, cloud, logger)
|
121
|
-
@instance = instance
|
122
|
-
@vm_model = vm_model
|
123
|
-
@cloud = cloud
|
124
|
-
@logger = logger
|
125
|
-
end
|
126
|
-
|
127
|
-
def delete
|
128
|
-
@logger.info('Deleting VM')
|
129
|
-
|
130
|
-
@cloud.delete_vm(@vm_model.cid)
|
131
|
-
|
132
|
-
@instance.model.db.transaction do
|
133
|
-
@instance.model.vm = nil
|
134
|
-
@instance.model.save
|
135
|
-
|
136
|
-
@vm_model.destroy
|
137
|
-
end
|
138
|
-
end
|
139
|
-
end
|
140
|
-
|
141
|
-
class DiskAttacher
|
142
|
-
def initialize(instance, vm_model, agent_client, cloud, logger)
|
143
|
-
@instance = instance
|
144
|
-
@vm_model = vm_model
|
145
|
-
@agent_client = agent_client
|
146
|
-
@cloud = cloud
|
147
|
-
@logger = logger
|
148
|
-
end
|
149
|
-
|
150
|
-
def attach
|
151
|
-
if @instance.model.persistent_disk_cid.nil?
|
152
|
-
@logger.info('Skipping disk attaching')
|
153
|
-
return
|
154
|
-
end
|
155
|
-
|
156
|
-
@cloud.attach_disk(@vm_model.cid, @instance.model.persistent_disk_cid)
|
157
|
-
|
158
|
-
@agent_client.mount_disk(@instance.model.persistent_disk_cid)
|
159
|
-
end
|
160
|
-
end
|
161
|
-
|
162
|
-
class DiskDetacher
|
163
|
-
def initialize(instance, vm_model, agent_client, cloud, logger)
|
164
|
-
@instance = instance
|
165
|
-
@vm_model = vm_model
|
166
|
-
@agent_client = agent_client
|
167
|
-
@cloud = cloud
|
168
|
-
@logger = logger
|
169
|
-
end
|
170
|
-
|
171
|
-
def detach
|
172
|
-
disk_list = @agent_client.list_disk
|
173
|
-
if disk_list.empty?
|
174
|
-
@logger.info('Skipping disk detaching')
|
175
|
-
return
|
176
|
-
end
|
177
|
-
|
178
|
-
if @instance.model.persistent_disk_cid.nil?
|
179
|
-
raise AgentUnexpectedDisk,
|
180
|
-
"`#{@instance}' VM has disk attached but it's not reflected in director DB"
|
181
|
-
end
|
182
|
-
|
183
|
-
@agent_client.unmount_disk(@instance.model.persistent_disk_cid)
|
184
|
-
|
185
|
-
@cloud.detach_disk(@vm_model.cid, @instance.model.persistent_disk_cid)
|
186
|
-
end
|
187
|
-
end
|
188
|
-
end
|
189
|
-
end
|