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,7 +1,6 @@
1
1
  module Bosh::Director
2
2
  module Jobs
3
3
  class DeleteDeployment < BaseJob
4
- include DnsHelper
5
4
  include LockHelper
6
5
 
7
6
  @queue = :normal
@@ -12,174 +11,31 @@ module Bosh::Director
12
11
 
13
12
  def initialize(deployment_name, options = {})
14
13
  @deployment_name = deployment_name
15
- @force = options["force"]
16
- @keep_snapshots = options["keep_snapshots"]
14
+ @force = options['force']
15
+ @keep_snapshots = options['keep_snapshots']
17
16
  @cloud = Config.cloud
18
17
  @deployment_manager = Api::DeploymentManager.new
19
- @blobstore = App.instance.blobstores.blobstore
20
18
  end
21
19
 
22
20
  def perform
23
21
  logger.info("Deleting: #{@deployment_name}")
24
22
 
25
- deployment = find_deployment(@deployment_name)
26
-
27
- logger.info("Acquiring deployment lock: #{deployment.name}")
28
-
29
23
  with_deployment_lock(@deployment_name) do
30
- # Make sure it wasn't deleted
31
- deployment = find_deployment(@deployment_name)
32
-
33
- ThreadPool.new(:max_threads => Config.max_threads).wrap do |pool|
34
- delete_instances(deployment, pool)
35
- pool.wait
36
- delete_vms(deployment, pool)
37
- end
24
+ deployment_model = @deployment_manager.find_by_name(@deployment_name)
38
25
 
39
- event_log.begin_stage("Removing deployment artifacts", 3)
40
- track_and_log("Detach stemcells") do
41
- deployment.remove_all_stemcells
42
- end
26
+ ip_provider = DeploymentPlan::IpProviderFactory.new(true, logger)
43
27
 
44
- track_and_log("Detaching releases") do
45
- deployment.remove_all_release_versions
46
- end
28
+ dns_manager = DnsManager.create
29
+ disk_manager = DiskManager.new(@cloud, logger)
30
+ instance_deleter = InstanceDeleter.new(ip_provider, dns_manager, disk_manager, force: @force)
31
+ deployment_deleter = DeploymentDeleter.new(event_log, logger, dns_manager, Config.max_threads)
47
32
 
48
- event_log.begin_stage("Deleting properties",
49
- deployment.properties.count)
50
- logger.info("Deleting deployment properties")
51
- deployment.properties.each do |property|
52
- event_log.track(property.name) do
53
- property.destroy
54
- end
55
- end
33
+ vm_deleter = Bosh::Director::VmDeleter.new(@cloud, logger, force: @force)
34
+ deployment_deleter.delete(deployment_model, instance_deleter, vm_deleter)
56
35
 
57
- track_and_log("Delete DNS records") do
58
- delete_dns(@deployment_name)
59
- end
60
-
61
- track_and_log("Destroy deployment") do
62
- deployment.destroy
63
- end
64
36
  "/deployments/#{@deployment_name}"
65
37
  end
66
38
  end
67
-
68
- def find_deployment(name)
69
- @deployment_manager.find_by_name(name)
70
- end
71
-
72
- def delete_instances(deployment, pool)
73
- instances = deployment.job_instances
74
- event_log.begin_stage("Deleting instances", instances.count)
75
-
76
- instances.each do |instance|
77
- pool.process do
78
- desc = "#{instance.job}/#{instance.index}"
79
- event_log.track(desc) do
80
- logger.info("Deleting #{desc}")
81
- delete_instance(instance)
82
- end
83
- end
84
- end
85
- end
86
-
87
- def delete_vms(deployment, pool)
88
- vms = deployment.vms
89
- event_log.begin_stage("Deleting idle VMs", vms.count)
90
-
91
- vms.each do |vm|
92
- pool.process do
93
- event_log.track("#{vm.cid}") do
94
- logger.info("Deleting idle vm #{vm.cid}")
95
- delete_vm(vm)
96
- end
97
- end
98
- end
99
- end
100
-
101
- def delete_instance(instance)
102
- desc = "#{instance.job}/#{instance.index}"
103
- with_thread_name("delete_instance(#{desc})") do
104
- logger.info("Deleting instance: #{desc}")
105
-
106
- vm = instance.vm
107
-
108
- if vm && vm.agent_id
109
- ignoring_errors_when_forced do
110
- agent = AgentClient.with_defaults(vm.agent_id)
111
- agent.stop
112
- end
113
- end
114
-
115
- instance.persistent_disks.each do |disk|
116
- if disk.active && vm && vm.cid && disk.disk_cid
117
- if vm.agent_id
118
- ignoring_errors_when_forced do
119
- agent = AgentClient.with_defaults(vm.agent_id)
120
- agent.unmount_disk(disk.disk_cid)
121
- end
122
- end
123
-
124
- ignoring_errors_when_forced do
125
- # If persistent disk has been mounted but
126
- # clean_shutdown above did not unmount it
127
- # properly (i.e. for wedged deployment),
128
- # detach_disk might hang indefinitely.
129
- # Right now it's up to cloudcheck handle
130
- # that but 'force' might be added to CPI
131
- # in the future.
132
- @cloud.detach_disk(vm.cid, disk.disk_cid)
133
- end
134
- end
135
-
136
- if disk.disk_cid
137
- ignoring_errors_when_forced do
138
- delete_snapshots(disk)
139
- @cloud.delete_disk(disk.disk_cid)
140
- end
141
- end
142
-
143
- disk.destroy
144
- end
145
-
146
- ignoring_errors_when_forced do
147
- RenderedJobTemplatesCleaner.new(instance, @blobstore, @logger).clean_all
148
- end
149
-
150
- instance.destroy
151
-
152
- delete_vm(vm) if vm
153
- end
154
- end
155
-
156
- def delete_snapshots(disk)
157
- @keep_snapshots ? disk.snapshots.each(&:delete) : Api::SnapshotManager.delete_snapshots(disk.snapshots)
158
- end
159
-
160
- def delete_vm(vm)
161
- if vm.cid
162
- ignoring_errors_when_forced do
163
- @cloud.delete_vm(vm.cid)
164
- end
165
- end
166
- vm.destroy
167
- end
168
-
169
- def delete_dns(name)
170
- if Config.dns_enabled?
171
- record_pattern = ["%", canonical(name), dns_domain_name].join(".")
172
- delete_dns_records(record_pattern)
173
- end
174
- end
175
-
176
- def ignoring_errors_when_forced
177
- yield
178
- rescue => e
179
- raise unless @force
180
- logger.warn(e.backtrace.join("\n"))
181
- logger.info("Force deleting is set, ignoring exception")
182
- end
183
39
  end
184
40
  end
185
41
  end
@@ -31,4 +31,4 @@ module Bosh::Director
31
31
  end
32
32
  end
33
33
  end
34
- end
34
+ end
@@ -0,0 +1,44 @@
1
+ module Bosh::Director
2
+ module Jobs
3
+ class DeleteOrphanDisks < BaseJob
4
+
5
+ @queue = :normal
6
+
7
+ def self.job_type
8
+ :delete_orphan_disks
9
+ end
10
+
11
+ def self.enqueue(username, orphan_disk_cids, job_queue)
12
+ persistent_disk_cids = orphan_disk_cids.select do |disk_cid|
13
+ Bosh::Director::Models::PersistentDisk.where(disk_cid: disk_cid).any?
14
+ end
15
+ if persistent_disk_cids.any?
16
+ raise DeletingPersistentDiskError, "Deleting persistent disk is not supported: #{persistent_disk_cids}"
17
+ end
18
+
19
+ job_queue.enqueue(username, Jobs::DeleteOrphanDisks, 'delete orphan disks', [orphan_disk_cids])
20
+ end
21
+
22
+ def initialize(orphan_disk_cids)
23
+ @orphan_disk_cids = orphan_disk_cids
24
+ @disk_manager = Bosh::Director::DiskManager.new(Config.cloud, Config.logger)
25
+ end
26
+
27
+ def perform
28
+ event_log.begin_stage('Deleting orphaned disks', @orphan_disk_cids.count)
29
+
30
+ ThreadPool.new(:max_threads => Config.max_threads).wrap do |pool|
31
+ @orphan_disk_cids.each do |orphan_disk_cid|
32
+ pool.process do
33
+ event_log.track("Deleting orphaned disk #{orphan_disk_cid}") do
34
+ @disk_manager.delete_orphan_disk_by_disk_cid(orphan_disk_cid)
35
+ end
36
+ end
37
+ end
38
+ end
39
+
40
+ "orphaned disk(s) #{@orphan_disk_cids.join(', ')} deleted"
41
+ end
42
+ end
43
+ end
44
+ end
@@ -1,5 +1,3 @@
1
- # Copyright (c) 2009-2012 VMware, Inc.
2
-
3
1
  module Bosh::Director
4
2
  module Jobs
5
3
  class DeleteRelease < BaseJob
@@ -13,212 +11,37 @@ module Bosh::Director
13
11
 
14
12
  def initialize(name, options = {})
15
13
  @name = name
16
- @blobstore = options.fetch(:blobstore) { App.instance.blobstores.blobstore }
17
- @errors = []
18
- @force = !!options["force"]
19
- @version = options["version"]
20
- @release_manager = Api::ReleaseManager.new
21
- end
22
-
23
- def delete_release_version(release_version)
24
- release = release_version.release
25
-
26
- packages_to_keep = []
27
- packages_to_delete = []
28
- templates_to_keep = []
29
- templates_to_delete = []
30
-
31
- # We don't delete packages inside this loop b/c Sequel will also delete
32
- # them from packages collection we're iterating on which will lead to
33
- # skipping some packages
34
- release_version.packages.each do |package|
35
- if package.release_versions == [ release_version ]
36
- packages_to_delete << package
37
- else
38
- packages_to_keep << package
39
- end
40
- end
41
-
42
- release_version.templates.each do |template|
43
- if template.release_versions == [ release_version ]
44
- templates_to_delete << template
45
- else
46
- templates_to_keep << template
47
- end
48
- end
49
-
50
- event_log.begin_stage("Deleting packages", packages_to_delete.count)
51
- packages_to_delete.each do |package|
52
- track_and_log("#{package.name}/#{package.version}") do
53
- logger.info("Package #{package.name}/#{package.version} " +
54
- "is only used by this release version " +
55
- "and will be deleted")
56
- delete_package(package)
57
- end
58
- end
59
-
60
- packages_to_keep.each do |package|
61
- logger.info("Keeping package #{package.name}/#{package.version} " +
62
- "as it is used by other release versions")
63
- package.remove_release_version(release_version)
64
- end
65
-
66
- event_log.begin_stage("Deleting jobs", templates_to_delete.count)
67
- templates_to_delete.each do |template|
68
- track_and_log("#{template.name}/#{template.version}") do
69
- logger.info("Template #{template.name}/#{template.version} " +
70
- "is only used by this release version " +
71
- "and will be deleted")
72
- delete_template(template)
73
- end
74
- end
14
+ @force = !!options['force']
15
+ @version = options['version']
75
16
 
76
- templates_to_keep.each do |template|
77
- logger.info("Keeping job " +
78
- "#{template.name}/#{template.version} as it is used " +
79
- "by other release versions")
80
- template.remove_release_version(release_version)
81
- end
82
-
83
- logger.info("Remove all deployments in release version")
84
- release_version.remove_all_deployments
85
-
86
- if @errors.empty? || @force
87
- release_version.destroy
88
- end
89
-
90
- if release.versions.empty?
91
- delete_release(release)
92
- end
93
- end
94
-
95
- def delete_release(release)
96
- event_log.begin_stage("Deleting packages", release.packages.count)
97
- release.packages.each do |package|
98
- track_and_log("#{package.name}/#{package.version}") do
99
- delete_package(package)
100
- end
101
- end
102
-
103
- event_log.begin_stage("Deleting jobs", release.templates.count)
104
- release.templates.each do |template|
105
- track_and_log("#{template.name}/#{template.version}") do
106
- delete_template(template)
107
- end
108
- end
109
-
110
- if @errors.empty? || @force
111
- event_log.begin_stage("Deleting release versions",
112
- release.versions.count)
113
-
114
- release.versions.each do |release_version|
115
- track_and_log("#{release.name}/#{release_version.version}") do
116
- release_version.destroy
117
- end
118
- end
119
-
120
- release.destroy
121
- end
122
- end
123
-
124
- def delete_package(package)
125
- compiled_packages = package.compiled_packages
126
-
127
- logger.info("Deleting package #{package.name}/#{package.version}")
128
-
129
- compiled_packages.each do |compiled_package|
130
- stemcell = compiled_package.stemcell
131
- logger.info("Deleting compiled package " +
132
- "(#{compiled_package.blobstore_id}) " +
133
- "#{package.name}/#{package.version} " +
134
- "for #{stemcell.name}/#{stemcell.version}")
135
-
136
- if delete_blobstore_id(compiled_package.blobstore_id)
137
- compiled_package.destroy
138
- end
139
- end
140
-
141
- if delete_blobstore_id(package.blobstore_id, true)
142
- package.remove_all_release_versions
143
- package.destroy
144
- end
145
- end
146
-
147
- def delete_template(template)
148
- logger.info("Deleting job: #{template.name}/#{template.version}")
149
-
150
- if delete_blobstore_id(template.blobstore_id)
151
- template.remove_all_release_versions
152
- template.destroy
153
- end
17
+ blobstore = options.fetch(:blobstore) { App.instance.blobstores.blobstore }
18
+ blob_deleter = Helpers::BlobDeleter.new(blobstore, logger)
19
+ compiled_package_deleter = Helpers::CompiledPackageDeleter.new(blob_deleter, logger)
20
+ package_deleter = Helpers::PackageDeleter.new(compiled_package_deleter, blob_deleter, logger)
21
+ template_deleter = Helpers::TemplateDeleter.new(blob_deleter, logger)
22
+ release_deleter = Helpers::ReleaseDeleter.new(package_deleter, template_deleter, event_log, logger)
23
+ release_version_deleter =
24
+ Helpers::ReleaseVersionDeleter.new(release_deleter, package_deleter, template_deleter, logger, event_log)
25
+ release_manager = Api::ReleaseManager.new
26
+ @name_version_release_deleter = Helpers::NameVersionReleaseDeleter.new(release_deleter, release_manager, release_version_deleter, logger)
154
27
  end
155
28
 
156
29
  def perform
157
- logger.info("Processing delete release")
30
+ logger.info('Processing delete release')
158
31
 
159
- with_release_lock(@name, :timeout => 10) do
160
- logger.info("Looking up release: #{@name}")
161
- release = @release_manager.find_by_name(@name)
162
- logger.info("Found release: #{release.name}")
32
+ errors = nil
163
33
 
164
- if @version
165
- logger.info("Looking up release version `#{release.name}/#{@version}'")
166
- release_version = @release_manager.find_version(release, @version)
167
- # found version may be different than the requested version, due to version formatting
168
- logger.info("Found release version: `#{release.name}/#{release_version.version}'")
169
- logger.info("Checking for any deployments still using " +
170
- "this particular release version")
171
-
172
- deployments = release_version.deployments
173
-
174
- unless deployments.empty?
175
- names = deployments.map{ |d| d.name }.join(", ")
176
- raise ReleaseVersionInUse,
177
- "ReleaseVersion `#{release.name}/#{release_version.version}' is still in use by: #{names}"
178
- end
179
-
180
- delete_release_version(release_version)
181
- else
182
- logger.info("Checking for any deployments still using the release")
183
- deployments = release.versions.map { |version|
184
- version.deployments
185
- }.flatten.uniq
186
-
187
- unless deployments.empty?
188
- names = deployments.map { |d| d.name }.join(", ")
189
- raise ReleaseInUse,
190
- "Release `#{release.name}' is still in use by: #{names}"
191
- end
192
-
193
- delete_release(release)
194
- end
34
+ with_release_lock(@name, :timeout => 10) do
35
+ errors = @name_version_release_deleter.find_and_delete_release(@name, @version, @force)
195
36
  end
196
37
 
197
- unless @errors.empty?
198
- errors = @errors.map { |e| e.to_s }.join(", ")
199
- raise ReleaseDeleteFailed, "Can't delete release: #{errors}"
38
+ unless errors.empty?
39
+ error_strings = errors.map { |e| e.to_s }.join(', ')
40
+ raise ReleaseDeleteFailed, "Can't delete release: #{error_strings}"
200
41
  end
201
42
 
202
43
  "/release/#{@name}"
203
44
  end
204
-
205
- def delete_blobstore_id(blobstore_id, nil_id_allowed = false)
206
- if blobstore_id.nil? && nil_id_allowed
207
- return true
208
- end
209
-
210
- deleted = false
211
- begin
212
- @blobstore.delete(blobstore_id)
213
- deleted = true
214
- rescue Exception => e
215
- logger.warn("Could not delete from blobstore: #{e}\n " + e.backtrace.join("\n"))
216
- @errors << e
217
- end
218
-
219
- return deleted || @force
220
- end
221
-
222
45
  end
223
46
  end
224
47
  end