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
@@ -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::Blobstore::Client] blobstore
5
+ # @param [Bosh::Clouds] cloud
6
6
  # @param [Bosh::Director::EventLog::Log] event_log
7
7
  # @param [Logger] logger
8
- def initialize(deployment, job, blobstore, event_log, logger)
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 prepare
17
- @job.bind_unallocated_vms
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
- dns_binder = DeploymentPlan::DnsBinder.new(@deployment)
25
- dns_binder.bind_deployment
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
- instances = @job.instances.map(&:model).compact
41
- if instances.empty?
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', instances.size, [@job.name])
48
- instance_deleter = InstanceDeleter.new(@deployment)
49
- instance_deleter.delete_instances(instances, event_log_stage)
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
- # Deallocates all errand VMs
57
- # @return [void]
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
@@ -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
- StemcellSha1DoesNotMatch = err(50005)
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(130010)
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
- JobInvalidInstanceIndex = err(140004)
154
- JobInvalidInstanceState = err(140005)
155
- JobInvalidJobState = err(140006)
156
- JobMissingNetwork = err(140007)
157
- JobInvalidTemplates = err(140008)
158
- JobInvalidLifecycle = err(140009)
159
- JobUnknownDiskPool = err(140010)
160
- JobInvalidPersistentDisk = err(140011)
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
- DeploymentRenamedJobNameStillUsed = err(190004)
185
- DeploymentCanonicalJobNameTaken = err(190005)
186
- DeploymentCanonicalNetworkNameTaken = err(190006)
187
- DeploymentNoNetworks = err(190007)
188
- DeploymentCanonicalNameTaken = err(190008)
189
- DeploymentInvalidNetworkType = err(190009)
190
- DeploymentUnknownTemplate = err(190012)
191
- DeploymentDuplicateDiskPoolName = err(190013)
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
- DiskPoolInvalidDiskSize = err(200001)
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
@@ -112,6 +112,12 @@ module Bosh::Director
112
112
  end
113
113
  end
114
114
 
115
+ class NullStage
116
+ def advance_and_track(_, &blk)
117
+ blk.call
118
+ end
119
+ end
120
+
115
121
  class Task
116
122
  def initialize(stage, name, index)
117
123
  @stage = stage
@@ -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(deployment_plan)
7
- @deployment_plan = deployment_plan
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
- # Deletes a list of instances
14
- # @param [Array<Models::Instance>] instances list of instances to delete
15
- # @param [Hash] options optional list of options controlling concurrency
16
- # @return [void]
17
- def delete_instances(instances, event_log_stage, options = {})
18
- max_threads = options[:max_threads] || Config.max_threads
19
- ThreadPool.new(:max_threads => max_threads).wrap do |pool|
20
- instances.each do |instance|
21
- pool.process { delete_instance(instance, event_log_stage) }
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
- # Deletes a single instance and attached persistent disks
27
- # @param [Models::Instance] instance instance to delete
28
- # @return [void]
29
- def delete_instance(instance, event_log_stage)
30
- vm = instance.vm
31
- @logger.info("Delete unneeded instance: #{vm.cid}")
32
-
33
- event_log_stage.advance_and_track(vm.cid) do
34
- drain(vm.agent_id)
35
- @cloud.delete_vm(vm.cid)
36
- delete_snapshots(instance)
37
- delete_persistent_disks(instance.persistent_disks)
38
- delete_dns(instance.job, instance.index)
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
- # Drain the instance
50
- # @param [String] agent_id agent id
51
- # @return [void]
52
- def drain(agent_id)
53
- agent = AgentClient.with_defaults(agent_id)
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
- def delete_snapshots(instance)
74
- snapshots = instance.persistent_disks.map { |disk| disk.snapshots }.flatten
75
- Bosh::Director::Api::SnapshotManager.delete_snapshots(snapshots)
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
- # Delete persistent disks
79
- # @param [Array<Model::PersistentDisk>] persistent_disks disks
80
- # @return [void]
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
- # Deletes the DNS records
96
- # @param [String] job job name
97
- # @param [Numeric] index job index
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