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.
Files changed (195) hide show
  1. checksums.yaml +4 -4
  2. data/bin/bosh-director-worker +2 -14
  3. data/db/migrations/director/20150513225143_ip_addresses.rb +11 -0
  4. data/db/migrations/director/20150702004608_add_links.rb +8 -0
  5. data/db/migrations/director/20150708231924_add_link_spec.rb +7 -0
  6. data/db/migrations/director/20150724183256_add_debugging_to_ip_addresses.rb +8 -0
  7. data/db/migrations/director/20150730225029_add_uuid_to_instances.rb +16 -0
  8. data/db/migrations/director/20150803215805_add_availabililty_zone_and_cloud_properties_to_instances.rb +8 -0
  9. data/db/migrations/director/20150804211419_add_compilation_flag_to_instance.rb +7 -0
  10. data/db/migrations/director/20150918003455_add_bootstrap_node_to_instance.rb +7 -0
  11. data/db/migrations/director/20151008232214_add_dns_records.rb +7 -0
  12. data/db/migrations/director/20151015172551_add_orphan_disks_and_snapshots.rb +29 -0
  13. data/db/migrations/director/20151030222853_add_templates_to_instance.rb +10 -0
  14. data/db/migrations/director/20151031001039_add_spec_to_instance.rb +19 -0
  15. data/db/migrations/director/20151109190602_rename_orphan_columns.rb +13 -0
  16. data/lib/bosh/director.rb +19 -9
  17. data/lib/bosh/director/agent_client.rb +0 -17
  18. data/lib/bosh/director/api/cloud_config_manager.rb +7 -5
  19. data/lib/bosh/director/api/controllers/base_controller.rb +3 -2
  20. data/lib/bosh/director/api/controllers/cleanup_controller.rb +15 -0
  21. data/lib/bosh/director/api/controllers/deployments_controller.rb +38 -26
  22. data/lib/bosh/director/api/controllers/disks_controller.rb +20 -0
  23. data/lib/bosh/director/api/controllers/info_controller.rb +2 -2
  24. data/lib/bosh/director/api/controllers/releases_controller.rb +1 -16
  25. data/lib/bosh/director/api/controllers/stemcells_controller.rb +1 -9
  26. data/lib/bosh/director/api/deployment_manager.rb +2 -1
  27. data/lib/bosh/director/api/instance_lookup.rb +17 -0
  28. data/lib/bosh/director/api/instance_manager.rb +20 -10
  29. data/lib/bosh/director/api/release_manager.rb +28 -8
  30. data/lib/bosh/director/api/resurrector_manager.rb +9 -2
  31. data/lib/bosh/director/api/route_configuration.rb +2 -0
  32. data/lib/bosh/director/api/snapshot_manager.rb +9 -5
  33. data/lib/bosh/director/api/stemcell_manager.rb +50 -0
  34. data/lib/bosh/director/app.rb +1 -1
  35. data/lib/bosh/director/cloudcheck_helper.rb +119 -132
  36. data/lib/bosh/director/compile_task.rb +1 -1
  37. data/lib/bosh/director/compile_task_generator.rb +2 -2
  38. data/lib/bosh/director/config.rb +21 -12
  39. data/lib/bosh/director/deployment_deleter.rb +69 -0
  40. data/lib/bosh/director/deployment_plan.rb +35 -4
  41. data/lib/bosh/director/deployment_plan/agent_state_migrator.rb +47 -0
  42. data/lib/bosh/director/deployment_plan/assembler.rb +115 -241
  43. data/lib/bosh/director/deployment_plan/availability_zone.rb +27 -0
  44. data/lib/bosh/director/deployment_plan/cloud_manifest_parser.rb +144 -35
  45. data/lib/bosh/director/deployment_plan/compilation_config.rb +21 -19
  46. data/lib/bosh/director/deployment_plan/compilation_instance_pool.rb +169 -0
  47. data/lib/bosh/director/deployment_plan/deployment_repo.rb +4 -8
  48. data/lib/bosh/director/deployment_plan/deployment_spec_parser.rb +13 -1
  49. data/lib/bosh/director/deployment_plan/deployment_validator.rb +17 -0
  50. data/lib/bosh/director/deployment_plan/desired_instance.rb +15 -0
  51. data/lib/bosh/director/deployment_plan/{disk_pool.rb → disk_type.rb} +14 -19
  52. data/lib/bosh/director/deployment_plan/dynamic_network.rb +105 -53
  53. data/lib/bosh/director/deployment_plan/dynamic_network_subnet.rb +13 -0
  54. data/lib/bosh/director/deployment_plan/env.rb +18 -0
  55. data/lib/bosh/director/deployment_plan/global_network_resolver.rb +77 -0
  56. data/lib/bosh/director/deployment_plan/instance.rb +222 -390
  57. data/lib/bosh/director/deployment_plan/instance_network_reservations.rb +71 -0
  58. data/lib/bosh/director/deployment_plan/instance_plan.rb +336 -0
  59. data/lib/bosh/director/deployment_plan/instance_plan_factory.rb +54 -0
  60. data/lib/bosh/director/deployment_plan/instance_plan_sorter.rb +61 -0
  61. data/lib/bosh/director/deployment_plan/instance_planner.rb +101 -0
  62. data/lib/bosh/director/deployment_plan/instance_repository.rb +36 -0
  63. data/lib/bosh/director/deployment_plan/instance_spec.rb +154 -0
  64. data/lib/bosh/director/deployment_plan/ip_provider/database_ip_repo.rb +136 -0
  65. data/lib/bosh/director/deployment_plan/ip_provider/in_memory_ip_repo.rb +81 -0
  66. data/lib/bosh/director/deployment_plan/ip_provider/ip_provider.rb +153 -0
  67. data/lib/bosh/director/deployment_plan/ip_provider/ip_provider_factory.rb +22 -0
  68. data/lib/bosh/director/deployment_plan/job.rb +116 -53
  69. data/lib/bosh/director/deployment_plan/job_availability_zone_parser.rb +49 -0
  70. data/lib/bosh/director/deployment_plan/job_migrator.rb +90 -0
  71. data/lib/bosh/director/deployment_plan/job_network.rb +42 -0
  72. data/lib/bosh/director/deployment_plan/job_network_parser.rb +118 -0
  73. data/lib/bosh/director/deployment_plan/job_spec_parser.rb +123 -126
  74. data/lib/bosh/director/deployment_plan/links/link.rb +30 -0
  75. data/lib/bosh/director/deployment_plan/links/link_lookup.rb +66 -0
  76. data/lib/bosh/director/deployment_plan/links/link_path.rb +27 -0
  77. data/lib/bosh/director/deployment_plan/links/links_resolver.rb +70 -0
  78. data/lib/bosh/director/deployment_plan/links/template_link.rb +21 -0
  79. data/lib/bosh/director/deployment_plan/manifest_migrator.rb +3 -17
  80. data/lib/bosh/director/deployment_plan/manifest_validator.rb +46 -0
  81. data/lib/bosh/director/deployment_plan/manual_network.rb +70 -97
  82. data/lib/bosh/director/deployment_plan/manual_network_subnet.rb +148 -0
  83. data/lib/bosh/director/deployment_plan/network.rb +50 -39
  84. data/lib/bosh/director/deployment_plan/network_planner.rb +4 -0
  85. data/lib/bosh/director/deployment_plan/network_planner/plan.rb +26 -0
  86. data/lib/bosh/director/deployment_plan/network_planner/planner.rb +21 -0
  87. data/lib/bosh/director/deployment_plan/network_planner/reservation_reconciler.rb +81 -0
  88. data/lib/bosh/director/deployment_plan/network_planner/vip_static_ips_planner.rb +50 -0
  89. data/lib/bosh/director/deployment_plan/network_settings.rb +65 -0
  90. data/lib/bosh/director/deployment_plan/options/skip_drain.rb +7 -0
  91. data/lib/bosh/director/deployment_plan/package_validator.rb +79 -0
  92. data/lib/bosh/director/deployment_plan/placement_planner.rb +8 -0
  93. data/lib/bosh/director/deployment_plan/placement_planner/availability_zone_picker.rb +90 -0
  94. data/lib/bosh/director/deployment_plan/placement_planner/bruteforce_ip_allocation.rb +124 -0
  95. data/lib/bosh/director/deployment_plan/placement_planner/index_assigner.rb +32 -0
  96. data/lib/bosh/director/deployment_plan/placement_planner/networks_to_static_ips.rb +125 -0
  97. data/lib/bosh/director/deployment_plan/placement_planner/placed_desired_instances.rb +40 -0
  98. data/lib/bosh/director/deployment_plan/placement_planner/plan.rb +42 -0
  99. data/lib/bosh/director/deployment_plan/placement_planner/static_ips_availability_zone_picker.rb +237 -0
  100. data/lib/bosh/director/deployment_plan/placement_planner/unplaced_existing_instances.rb +53 -0
  101. data/lib/bosh/director/deployment_plan/planner.rb +186 -74
  102. data/lib/bosh/director/deployment_plan/planner_factory.rb +30 -147
  103. data/lib/bosh/director/deployment_plan/release_version.rb +3 -3
  104. data/lib/bosh/director/deployment_plan/resource_pool.rb +2 -174
  105. data/lib/bosh/director/deployment_plan/stemcell.rb +57 -14
  106. data/lib/bosh/director/deployment_plan/steps/package_compile_step.rb +28 -135
  107. data/lib/bosh/director/deployment_plan/steps/update_step.rb +23 -44
  108. data/lib/bosh/director/deployment_plan/template.rb +15 -4
  109. data/lib/bosh/director/deployment_plan/vip_network.rb +14 -42
  110. data/lib/bosh/director/deployment_plan/vm.rb +1 -99
  111. data/lib/bosh/director/deployment_plan/vm_type.rb +27 -0
  112. data/lib/bosh/director/disk_manager.rb +268 -0
  113. data/lib/bosh/director/dns/canonicalizer.rb +28 -0
  114. data/lib/bosh/director/dns/dns_manager.rb +163 -0
  115. data/lib/bosh/director/dns/local_dns_repo.rb +20 -0
  116. data/lib/bosh/director/dns/powerdns.rb +170 -0
  117. data/lib/bosh/director/errand/job_manager.rb +18 -29
  118. data/lib/bosh/director/error_ignorer.rb +16 -0
  119. data/lib/bosh/director/errors.rb +51 -20
  120. data/lib/bosh/director/event_log.rb +6 -0
  121. data/lib/bosh/director/instance_deleter.rb +53 -81
  122. data/lib/bosh/director/instance_reuser.rb +89 -0
  123. data/lib/bosh/director/instance_updater.rb +139 -281
  124. data/lib/bosh/director/instance_updater/preparer.rb +8 -5
  125. data/lib/bosh/director/instance_updater/state_applier.rb +21 -0
  126. data/lib/bosh/director/ip_util.rb +46 -26
  127. data/lib/bosh/director/job_renderer.rb +22 -10
  128. data/lib/bosh/director/job_runner.rb +1 -4
  129. data/lib/bosh/director/job_updater.rb +47 -35
  130. data/lib/bosh/director/job_updater_factory.rb +5 -4
  131. data/lib/bosh/director/jobs/base_job.rb +8 -0
  132. data/lib/bosh/director/jobs/cleanup_artifacts.rb +93 -0
  133. data/lib/bosh/director/jobs/delete_deployment.rb +10 -154
  134. data/lib/bosh/director/jobs/delete_deployment_snapshots.rb +1 -1
  135. data/lib/bosh/director/jobs/delete_orphan_disks.rb +44 -0
  136. data/lib/bosh/director/jobs/delete_release.rb +19 -196
  137. data/lib/bosh/director/jobs/delete_stemcell.rb +10 -76
  138. data/lib/bosh/director/jobs/export_release.rb +41 -121
  139. data/lib/bosh/director/jobs/fetch_logs.rb +0 -6
  140. data/lib/bosh/director/jobs/helpers.rb +10 -0
  141. data/lib/bosh/director/jobs/helpers/blob_deleter.rb +24 -0
  142. data/lib/bosh/director/jobs/helpers/compiled_package_deleter.rb +24 -0
  143. data/lib/bosh/director/jobs/helpers/name_version_release_deleter.rb +48 -0
  144. data/lib/bosh/director/jobs/helpers/package_deleter.rb +33 -0
  145. data/lib/bosh/director/jobs/helpers/release_deleter.rb +52 -0
  146. data/lib/bosh/director/jobs/helpers/release_version_deleter.rb +115 -0
  147. data/lib/bosh/director/jobs/helpers/releases_to_delete_picker.rb +31 -0
  148. data/lib/bosh/director/jobs/helpers/stemcell_deleter.rb +61 -0
  149. data/lib/bosh/director/jobs/helpers/stemcells_to_delete_picker.rb +30 -0
  150. data/lib/bosh/director/jobs/helpers/template_deleter.rb +20 -0
  151. data/lib/bosh/director/jobs/release/release_job.rb +18 -7
  152. data/lib/bosh/director/jobs/run_errand.rb +57 -36
  153. data/lib/bosh/director/jobs/scheduled_orphan_cleanup.rb +46 -0
  154. data/lib/bosh/director/jobs/ssh.rb +50 -17
  155. data/lib/bosh/director/jobs/update_deployment.rb +29 -11
  156. data/lib/bosh/director/jobs/update_release.rb +25 -4
  157. data/lib/bosh/director/jobs/vm_state.rb +23 -32
  158. data/lib/bosh/director/lock.rb +13 -8
  159. data/lib/bosh/director/logs_fetcher.rb +1 -1
  160. data/lib/bosh/director/models.rb +3 -0
  161. data/lib/bosh/director/models/compiled_package.rb +3 -3
  162. data/lib/bosh/director/models/deployment.rb +10 -0
  163. data/lib/bosh/director/models/instance.rb +77 -1
  164. data/lib/bosh/director/models/ip_address.rb +26 -0
  165. data/lib/bosh/director/models/orphan_disk.rb +23 -0
  166. data/lib/bosh/director/models/orphan_snapshot.rb +14 -0
  167. data/lib/bosh/director/models/template.rb +32 -9
  168. data/lib/bosh/director/models/vm.rb +5 -8
  169. data/lib/bosh/director/network_reservation.rb +69 -99
  170. data/lib/bosh/director/problem_handlers/inactive_disk.rb +5 -20
  171. data/lib/bosh/director/problem_handlers/missing_disk.rb +2 -13
  172. data/lib/bosh/director/problem_resolver.rb +2 -2
  173. data/lib/bosh/director/problem_scanner/vm_scan_stage.rb +2 -21
  174. data/lib/bosh/director/scheduler.rb +23 -6
  175. data/lib/bosh/director/{instance_updater/stopper.rb → stopper.rb} +24 -18
  176. data/lib/bosh/director/tagged_logger.rb +30 -0
  177. data/lib/bosh/director/transactor.rb +9 -0
  178. data/lib/bosh/director/version.rb +1 -1
  179. data/lib/bosh/director/vm_creator.rb +91 -19
  180. data/lib/bosh/director/vm_deleter.rb +25 -0
  181. data/lib/bosh/director/vm_recreator.rb +15 -0
  182. data/lib/cloud/dummy.rb +381 -94
  183. metadata +110 -30
  184. data/lib/bosh/director/deployment_plan/dns_binder.rb +0 -45
  185. data/lib/bosh/director/deployment_plan/instance_vm_binder.rb +0 -37
  186. data/lib/bosh/director/deployment_plan/network_subnet.rb +0 -166
  187. data/lib/bosh/director/deployment_plan/resource_pools.rb +0 -68
  188. data/lib/bosh/director/dns_helper.rb +0 -223
  189. data/lib/bosh/director/instance_updater/network_updater.rb +0 -110
  190. data/lib/bosh/director/instance_updater/vm_updater.rb +0 -189
  191. data/lib/bosh/director/problem_handlers/out_of_sync_vm.rb +0 -64
  192. data/lib/bosh/director/problem_handlers/unbound_instance_vm.rb +0 -85
  193. data/lib/bosh/director/resource_pool_updater.rb +0 -174
  194. data/lib/bosh/director/vm_data.rb +0 -63
  195. 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