bosh-director 1.5.0.pre.1113

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (180) hide show
  1. data/CHANGELOG +34 -0
  2. data/bin/bosh-director +36 -0
  3. data/bin/bosh-director-console +84 -0
  4. data/bin/bosh-director-drain-workers +42 -0
  5. data/bin/bosh-director-migrate +58 -0
  6. data/bin/bosh-director-scheduler +27 -0
  7. data/bin/bosh-director-worker +76 -0
  8. data/db/migrations/README +1 -0
  9. data/db/migrations/director/20110209010747_initial.rb +118 -0
  10. data/db/migrations/director/20110406055800_add_task_user.rb +9 -0
  11. data/db/migrations/director/20110518225809_remove_cid_constrain.rb +13 -0
  12. data/db/migrations/director/20110617211923_add_deployments_release_versions.rb +32 -0
  13. data/db/migrations/director/20110622212607_add_task_checkpoint_timestamp.rb +9 -0
  14. data/db/migrations/director/20110628023039_add_state_to_instances.rb +21 -0
  15. data/db/migrations/director/20110709012332_add_disk_size_to_instances.rb +9 -0
  16. data/db/migrations/director/20110906183441_add_log_bundles.rb +11 -0
  17. data/db/migrations/director/20110907194830_add_logs_json_to_templates.rb +9 -0
  18. data/db/migrations/director/20110915205610_add_persistent_disks.rb +51 -0
  19. data/db/migrations/director/20111005180929_add_properties.rb +14 -0
  20. data/db/migrations/director/20111110024617_add_deployment_problems.rb +24 -0
  21. data/db/migrations/director/20111216214145_recreate_support_for_vms.rb +9 -0
  22. data/db/migrations/director/20120102084027_add_credentials_to_vms.rb +7 -0
  23. data/db/migrations/director/20120427235217_allow_multiple_releases_per_deployment.rb +36 -0
  24. data/db/migrations/director/20120524175805_add_task_type.rb +44 -0
  25. data/db/migrations/director/20120614001930_delete_redundant_deployment_release_relation.rb +34 -0
  26. data/db/migrations/director/20120822004528_add_fingerprint_to_templates_and_packages.rb +17 -0
  27. data/db/migrations/director/20120830191244_add_properties_to_templates.rb +9 -0
  28. data/db/migrations/director/20121106190739_persist_vm_env.rb +9 -0
  29. data/db/migrations/director/20130222232131_add_sha1_to_stemcells.rb +9 -0
  30. data/db/migrations/director/20130312211407_add_commit_hash_to_release_versions.rb +19 -0
  31. data/db/migrations/director/20130409235338_snapshot.rb +15 -0
  32. data/db/migrations/director/20130530164918_add_paused_flag_to_instance.rb +14 -0
  33. data/db/migrations/director/20130531172604_add_director_attributes.rb +13 -0
  34. data/db/migrations/dns/20120123234908_initial.rb +27 -0
  35. data/lib/bosh/director.rb +133 -0
  36. data/lib/bosh/director/agent_client.rb +78 -0
  37. data/lib/bosh/director/api.rb +29 -0
  38. data/lib/bosh/director/api/api_helper.rb +81 -0
  39. data/lib/bosh/director/api/backup_manager.rb +15 -0
  40. data/lib/bosh/director/api/controller.rb +639 -0
  41. data/lib/bosh/director/api/controller_helpers.rb +34 -0
  42. data/lib/bosh/director/api/deployment_lookup.rb +13 -0
  43. data/lib/bosh/director/api/deployment_manager.rb +60 -0
  44. data/lib/bosh/director/api/http_constants.rb +16 -0
  45. data/lib/bosh/director/api/instance_lookup.rb +44 -0
  46. data/lib/bosh/director/api/instance_manager.rb +63 -0
  47. data/lib/bosh/director/api/problem_manager.rb +40 -0
  48. data/lib/bosh/director/api/property_manager.rb +69 -0
  49. data/lib/bosh/director/api/release_manager.rb +59 -0
  50. data/lib/bosh/director/api/resource_manager.rb +69 -0
  51. data/lib/bosh/director/api/resurrector_manager.rb +15 -0
  52. data/lib/bosh/director/api/snapshot_manager.rb +94 -0
  53. data/lib/bosh/director/api/stemcell_manager.rb +50 -0
  54. data/lib/bosh/director/api/task_helper.rb +46 -0
  55. data/lib/bosh/director/api/task_manager.rb +64 -0
  56. data/lib/bosh/director/api/user_manager.rb +72 -0
  57. data/lib/bosh/director/api/vm_state_manager.rb +11 -0
  58. data/lib/bosh/director/app.rb +35 -0
  59. data/lib/bosh/director/blob_util.rb +87 -0
  60. data/lib/bosh/director/blobstores.rb +29 -0
  61. data/lib/bosh/director/client.rb +156 -0
  62. data/lib/bosh/director/cloudcheck_helper.rb +204 -0
  63. data/lib/bosh/director/compile_task.rb +157 -0
  64. data/lib/bosh/director/config.rb +370 -0
  65. data/lib/bosh/director/configuration_hasher.rb +114 -0
  66. data/lib/bosh/director/cycle_helper.rb +36 -0
  67. data/lib/bosh/director/db_backup.rb +22 -0
  68. data/lib/bosh/director/db_backup/adapter.rb +3 -0
  69. data/lib/bosh/director/db_backup/adapter/mysql2.rb +27 -0
  70. data/lib/bosh/director/db_backup/adapter/postgres.rb +36 -0
  71. data/lib/bosh/director/db_backup/adapter/sqlite.rb +17 -0
  72. data/lib/bosh/director/db_backup/error.rb +10 -0
  73. data/lib/bosh/director/deployment_plan.rb +26 -0
  74. data/lib/bosh/director/deployment_plan/assembler.rb +430 -0
  75. data/lib/bosh/director/deployment_plan/compilation_config.rb +54 -0
  76. data/lib/bosh/director/deployment_plan/compiled_package.rb +35 -0
  77. data/lib/bosh/director/deployment_plan/dynamic_network.rb +91 -0
  78. data/lib/bosh/director/deployment_plan/idle_vm.rb +109 -0
  79. data/lib/bosh/director/deployment_plan/instance.rb +413 -0
  80. data/lib/bosh/director/deployment_plan/job.rb +470 -0
  81. data/lib/bosh/director/deployment_plan/manual_network.rb +137 -0
  82. data/lib/bosh/director/deployment_plan/network.rb +74 -0
  83. data/lib/bosh/director/deployment_plan/network_subnet.rb +167 -0
  84. data/lib/bosh/director/deployment_plan/planner.rb +288 -0
  85. data/lib/bosh/director/deployment_plan/preparer.rb +52 -0
  86. data/lib/bosh/director/deployment_plan/release.rb +126 -0
  87. data/lib/bosh/director/deployment_plan/resource_pool.rb +143 -0
  88. data/lib/bosh/director/deployment_plan/resource_pools.rb +68 -0
  89. data/lib/bosh/director/deployment_plan/stemcell.rb +56 -0
  90. data/lib/bosh/director/deployment_plan/template.rb +94 -0
  91. data/lib/bosh/director/deployment_plan/update_config.rb +80 -0
  92. data/lib/bosh/director/deployment_plan/updater.rb +55 -0
  93. data/lib/bosh/director/deployment_plan/vip_network.rb +79 -0
  94. data/lib/bosh/director/dns_helper.rb +204 -0
  95. data/lib/bosh/director/download_helper.rb +44 -0
  96. data/lib/bosh/director/duration.rb +36 -0
  97. data/lib/bosh/director/encryption_helper.rb +10 -0
  98. data/lib/bosh/director/errors.rb +198 -0
  99. data/lib/bosh/director/event_log.rb +136 -0
  100. data/lib/bosh/director/ext.rb +64 -0
  101. data/lib/bosh/director/hash_string_vals.rb +13 -0
  102. data/lib/bosh/director/instance_deleter.rb +109 -0
  103. data/lib/bosh/director/instance_updater.rb +506 -0
  104. data/lib/bosh/director/ip_util.rb +67 -0
  105. data/lib/bosh/director/job_queue.rb +16 -0
  106. data/lib/bosh/director/job_runner.rb +162 -0
  107. data/lib/bosh/director/job_updater.rb +121 -0
  108. data/lib/bosh/director/jobs/backup.rb +86 -0
  109. data/lib/bosh/director/jobs/base_job.rb +66 -0
  110. data/lib/bosh/director/jobs/cloud_check/apply_resolutions.rb +46 -0
  111. data/lib/bosh/director/jobs/cloud_check/scan.rb +38 -0
  112. data/lib/bosh/director/jobs/cloud_check/scan_and_fix.rb +73 -0
  113. data/lib/bosh/director/jobs/create_snapshot.rb +23 -0
  114. data/lib/bosh/director/jobs/delete_deployment.rb +183 -0
  115. data/lib/bosh/director/jobs/delete_deployment_snapshots.rb +34 -0
  116. data/lib/bosh/director/jobs/delete_release.rb +219 -0
  117. data/lib/bosh/director/jobs/delete_snapshots.rb +23 -0
  118. data/lib/bosh/director/jobs/delete_stemcell.rb +102 -0
  119. data/lib/bosh/director/jobs/fetch_logs.rb +99 -0
  120. data/lib/bosh/director/jobs/scheduled_backup.rb +38 -0
  121. data/lib/bosh/director/jobs/snapshot_deployment.rb +61 -0
  122. data/lib/bosh/director/jobs/snapshot_deployments.rb +23 -0
  123. data/lib/bosh/director/jobs/snapshot_self.rb +43 -0
  124. data/lib/bosh/director/jobs/ssh.rb +59 -0
  125. data/lib/bosh/director/jobs/update_deployment.rb +110 -0
  126. data/lib/bosh/director/jobs/update_release.rb +672 -0
  127. data/lib/bosh/director/jobs/update_stemcell.rb +109 -0
  128. data/lib/bosh/director/jobs/vm_state.rb +89 -0
  129. data/lib/bosh/director/lock.rb +133 -0
  130. data/lib/bosh/director/lock_helper.rb +92 -0
  131. data/lib/bosh/director/models.rb +29 -0
  132. data/lib/bosh/director/models/compiled_package.rb +33 -0
  133. data/lib/bosh/director/models/deployment.rb +22 -0
  134. data/lib/bosh/director/models/deployment_problem.rb +49 -0
  135. data/lib/bosh/director/models/deployment_property.rb +21 -0
  136. data/lib/bosh/director/models/director_attribute.rb +9 -0
  137. data/lib/bosh/director/models/dns.rb +9 -0
  138. data/lib/bosh/director/models/dns/domain.rb +9 -0
  139. data/lib/bosh/director/models/dns/record.rb +7 -0
  140. data/lib/bosh/director/models/helpers/model_helper.rb +7 -0
  141. data/lib/bosh/director/models/instance.rb +28 -0
  142. data/lib/bosh/director/models/log_bundle.rb +10 -0
  143. data/lib/bosh/director/models/package.rb +30 -0
  144. data/lib/bosh/director/models/persistent_disk.rb +13 -0
  145. data/lib/bosh/director/models/release.rb +17 -0
  146. data/lib/bosh/director/models/release_version.rb +16 -0
  147. data/lib/bosh/director/models/snapshot.rb +13 -0
  148. data/lib/bosh/director/models/stemcell.rb +18 -0
  149. data/lib/bosh/director/models/task.rb +10 -0
  150. data/lib/bosh/director/models/template.rb +44 -0
  151. data/lib/bosh/director/models/user.rb +11 -0
  152. data/lib/bosh/director/models/vm.rb +42 -0
  153. data/lib/bosh/director/nats_rpc.rb +54 -0
  154. data/lib/bosh/director/network_reservation.rb +121 -0
  155. data/lib/bosh/director/next_rebase_version.rb +20 -0
  156. data/lib/bosh/director/package_compiler.rb +423 -0
  157. data/lib/bosh/director/problem_handlers/base.rb +153 -0
  158. data/lib/bosh/director/problem_handlers/inactive_disk.rb +112 -0
  159. data/lib/bosh/director/problem_handlers/invalid_problem.rb +28 -0
  160. data/lib/bosh/director/problem_handlers/missing_vm.rb +34 -0
  161. data/lib/bosh/director/problem_handlers/mount_info_mismatch.rb +62 -0
  162. data/lib/bosh/director/problem_handlers/out_of_sync_vm.rb +64 -0
  163. data/lib/bosh/director/problem_handlers/unbound_instance_vm.rb +85 -0
  164. data/lib/bosh/director/problem_handlers/unresponsive_agent.rb +78 -0
  165. data/lib/bosh/director/problem_resolver.rb +103 -0
  166. data/lib/bosh/director/problem_scanner.rb +268 -0
  167. data/lib/bosh/director/resource_pool_updater.rb +216 -0
  168. data/lib/bosh/director/scheduler.rb +57 -0
  169. data/lib/bosh/director/sequel.rb +13 -0
  170. data/lib/bosh/director/tar_gzipper.rb +47 -0
  171. data/lib/bosh/director/task_result_file.rb +19 -0
  172. data/lib/bosh/director/thread_pool.rb +8 -0
  173. data/lib/bosh/director/validation_helper.rb +55 -0
  174. data/lib/bosh/director/version.rb +7 -0
  175. data/lib/bosh/director/vm_creator.rb +80 -0
  176. data/lib/bosh/director/vm_data.rb +63 -0
  177. data/lib/bosh/director/vm_metadata_updater.rb +29 -0
  178. data/lib/bosh/director/vm_reuser.rb +63 -0
  179. data/lib/cloud/dummy.rb +149 -0
  180. metadata +664 -0
@@ -0,0 +1,66 @@
1
+ # Copyright (c) 2009-2012 VMware, Inc.
2
+
3
+ module Bosh::Director
4
+ module Jobs
5
+ class BaseJob
6
+
7
+ def self.job_type
8
+ raise NotImplementedError.new('Subclasses must return a symbol representing type')
9
+ end
10
+
11
+ def self.perform(task_id, *args)
12
+ Bosh::Director::JobRunner.new(self, task_id).run(*args)
13
+ end
14
+
15
+ attr_accessor :task_id
16
+
17
+ def logger
18
+ @logger ||= Config.logger
19
+ end
20
+
21
+ def event_log
22
+ @event_log ||= Config.event_log
23
+ end
24
+
25
+ def result_file
26
+ @result_file ||= Config.result
27
+ end
28
+
29
+ # @return [Boolean] Has task been cancelled?
30
+ def task_cancelled?
31
+ return false if task_id.nil?
32
+ task = task_manager.find_task(task_id)
33
+ task && (task.state == "cancelling" || task.state == "timeout")
34
+ end
35
+
36
+ def task_checkpoint
37
+ if task_cancelled?
38
+ raise TaskCancelled, "Task #{task_id} cancelled"
39
+ end
40
+ end
41
+
42
+ def begin_stage(stage_name, n_steps)
43
+ event_log.begin_stage(stage_name, n_steps)
44
+ logger.info(stage_name)
45
+ end
46
+
47
+ def track_and_log(task, log = true)
48
+ event_log.track(task) do |ticker|
49
+ logger.info(task) if log
50
+ yield ticker if block_given?
51
+ end
52
+ end
53
+
54
+ def single_step_stage(stage_name)
55
+ begin_stage(stage_name, 1)
56
+ track_and_log(stage_name, false) { yield }
57
+ end
58
+
59
+ private
60
+
61
+ def task_manager
62
+ @task_manager ||= Api::TaskManager.new
63
+ end
64
+ end
65
+ end
66
+ end
@@ -0,0 +1,46 @@
1
+ # Copyright (c) 2009-2012 VMware, Inc.
2
+
3
+ module Bosh::Director
4
+ module Jobs
5
+ module CloudCheck
6
+ class ApplyResolutions < BaseJob
7
+ include LockHelper
8
+
9
+ @queue = :normal
10
+
11
+ def self.job_type
12
+ :cck_apply
13
+ end
14
+
15
+ # @param [String] deployment_name Deployment name
16
+ # @param [Hash] resolutions Problem resolutions
17
+ def initialize(deployment_name, resolutions)
18
+ @deployment_manager = Api::DeploymentManager.new
19
+ @deployment = @deployment_manager.find_by_name(deployment_name)
20
+
21
+ unless resolutions.kind_of?(Hash)
22
+ raise CloudcheckInvalidResolutionFormat,
23
+ "Invalid format for resolutions, Hash expected, #{resolutions.class} is given"
24
+ end
25
+
26
+ # Normalizing problem ids
27
+ @resolutions =
28
+ resolutions.inject({}) { |hash, (problem_id, solution_name)|
29
+ hash[problem_id.to_s] = solution_name
30
+ hash
31
+ }
32
+
33
+ @problem_resolver = ProblemResolver.new(@deployment)
34
+ end
35
+
36
+ def perform
37
+ with_deployment_lock(@deployment) do
38
+ count = @problem_resolver.apply_resolutions(@resolutions)
39
+ "#{count} resolved"
40
+ end
41
+ end
42
+
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,38 @@
1
+ # Copyright (c) 2009-2012 VMware, Inc.
2
+
3
+ module Bosh::Director
4
+ module Jobs
5
+ module CloudCheck
6
+ class Scan < BaseJob
7
+ include LockHelper
8
+
9
+ @queue = :normal
10
+
11
+ def self.job_type
12
+ :cck_scan
13
+ end
14
+
15
+ # @param [String] deployment_name Deployment name
16
+ def initialize(deployment_name)
17
+ @deployment_manager = Api::DeploymentManager.new
18
+ @deployment = @deployment_manager.find_by_name(deployment_name)
19
+ end
20
+
21
+ def perform
22
+ begin
23
+ with_deployment_lock(@deployment, :timeout => 0) do
24
+ scanner = ProblemScanner.new(@deployment)
25
+ scanner.reset
26
+ scanner.scan_vms
27
+ scanner.scan_disks
28
+
29
+ "scan complete"
30
+ end
31
+ rescue Lock::TimeoutError
32
+ raise "Unable to get deployment lock, maybe a deployment is in progress. Try again later."
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,73 @@
1
+ # This job is used by the resurrector health monitor plugin, to notify the director that
2
+ # it needs to scan the job(s) for problems (only unresponsive agents) and then try to
3
+ # automatically try to fix it by recreating the job.
4
+ module Bosh::Director
5
+ module Jobs
6
+ module CloudCheck
7
+ class ScanAndFix < BaseJob
8
+ include LockHelper
9
+
10
+ attr_reader :filtered_jobs
11
+
12
+ @queue = :normal
13
+
14
+ def self.job_type
15
+ :cck_scan_and_fix
16
+ end
17
+
18
+ def initialize(deployment_name, jobs, fix_stateful_jobs=false)
19
+ @deployment_manager = Api::DeploymentManager.new
20
+ @instance_manager = Bosh::Director::Api::InstanceManager.new
21
+ @deployment = @deployment_manager.find_by_name(deployment_name)
22
+ @jobs = jobs # {j1 => [i1, i2, ...], j2 => [i1, i2, ...]}
23
+ @fix_stateful_jobs = fix_stateful_jobs
24
+ end
25
+
26
+ def perform
27
+ jobs = filtered_jobs
28
+
29
+ begin
30
+ with_deployment_lock(@deployment, :timeout => 0) do
31
+
32
+ scanner = ProblemScanner.new(@deployment)
33
+ scanner.reset(jobs)
34
+ scanner.scan_vms(jobs)
35
+
36
+ resolver = ProblemResolver.new(@deployment)
37
+ resolver.apply_resolutions(resolutions(jobs))
38
+
39
+ "scan and fix complete"
40
+ end
41
+ rescue Lock::TimeoutError
42
+ raise "Unable to get deployment lock, maybe a deployment is in progress. Try again later."
43
+ end
44
+ end
45
+
46
+ def resolutions(jobs)
47
+ all_resolutions = {}
48
+ jobs.each do |job, index|
49
+ instance = @instance_manager.find_by_name(@deployment.name, job, index)
50
+ next if instance.resurrection_paused
51
+ problems = Models::DeploymentProblem.filter(deployment: @deployment, resource_id: instance.vm.id, state: 'open')
52
+ problems.each do |problem|
53
+ if problem.type == 'unresponsive_agent' || problem.type == 'missing_vm'
54
+ all_resolutions[problem.id.to_s] = :recreate_vm
55
+ end
56
+ end
57
+ end
58
+
59
+ all_resolutions
60
+ end
61
+
62
+ def filtered_jobs
63
+ return @jobs if @fix_stateful_jobs
64
+
65
+ @jobs.reject do |job, index|
66
+ instance = @instance_manager.find_by_name(@deployment.name, job, index)
67
+ instance.persistent_disk
68
+ end
69
+ end
70
+ end
71
+ end
72
+ end
73
+ end
@@ -0,0 +1,23 @@
1
+ module Bosh::Director
2
+ module Jobs
3
+ class CreateSnapshot < BaseJob
4
+
5
+ @queue = :normal
6
+
7
+ def self.job_type
8
+ :create_snapshot
9
+ end
10
+
11
+ def initialize(instance_id, options)
12
+ @instance = Bosh::Director::Api::InstanceManager.new.find_instance(instance_id)
13
+ @options = options
14
+ end
15
+
16
+ def perform
17
+ logger.info("taking snapshot of: #{@instance.job}/#{@instance.index} (#{@instance.vm.cid})")
18
+ snapshot_cids = Bosh::Director::Api::SnapshotManager.take_snapshot(@instance, @options)
19
+ "snapshot(s) #{snapshot_cids.join(', ')} created"
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,183 @@
1
+ # Copyright (c) 2009-2012 VMware, Inc.
2
+
3
+ module Bosh::Director
4
+ module Jobs
5
+ class DeleteDeployment < BaseJob
6
+ include DnsHelper
7
+ include LockHelper
8
+
9
+ @queue = :normal
10
+
11
+ def self.job_type
12
+ :delete_deployment
13
+ end
14
+
15
+ def initialize(deployment_name, options = {})
16
+ @deployment_name = deployment_name
17
+ @force = options["force"]
18
+ @keep_snapshots = options["keep_snapshots"]
19
+ @cloud = Config.cloud
20
+ @deployment_manager = Api::DeploymentManager.new
21
+ end
22
+
23
+ def perform
24
+ logger.info("Deleting: #{@deployment_name}")
25
+
26
+ deployment = find_deployment(@deployment_name)
27
+
28
+ logger.info("Acquiring deployment lock: #{deployment.name}")
29
+
30
+ with_deployment_lock(@deployment_name) do
31
+ # Make sure it wasn't deleted
32
+ deployment = find_deployment(@deployment_name)
33
+
34
+ ThreadPool.new(:max_threads => Config.max_threads).wrap do |pool|
35
+ delete_instances(deployment, pool)
36
+ pool.wait
37
+ delete_vms(deployment, pool)
38
+ end
39
+
40
+ event_log.begin_stage("Removing deployment artifacts", 3)
41
+ track_and_log("Detach stemcells") do
42
+ deployment.remove_all_stemcells
43
+ end
44
+
45
+ track_and_log("Detaching releases") do
46
+ deployment.remove_all_release_versions
47
+ end
48
+
49
+ event_log.begin_stage("Deleting properties",
50
+ deployment.properties.count)
51
+ logger.info("Deleting deployment properties")
52
+ deployment.properties.each do |property|
53
+ event_log.track(property.name) do
54
+ property.destroy
55
+ end
56
+ end
57
+
58
+ track_and_log("Delete DNS records") do
59
+ delete_dns(@deployment_name)
60
+ end
61
+
62
+ track_and_log("Destroy deployment") do
63
+ deployment.destroy
64
+ end
65
+ "/deployments/#{@deployment_name}"
66
+ end
67
+ end
68
+
69
+ def find_deployment(name)
70
+ @deployment_manager.find_by_name(name)
71
+ end
72
+
73
+ def delete_instances(deployment, pool)
74
+ instances = deployment.job_instances
75
+ event_log.begin_stage("Deleting instances", instances.count)
76
+
77
+ instances.each do |instance|
78
+ pool.process do
79
+ desc = "#{instance.job}/#{instance.index}"
80
+ event_log.track(desc) do
81
+ logger.info("Deleting #{desc}")
82
+ delete_instance(instance)
83
+ end
84
+ end
85
+ end
86
+ end
87
+
88
+ def delete_vms(deployment, pool)
89
+ vms = deployment.vms
90
+ event_log.begin_stage("Deleting idle VMs", vms.count)
91
+
92
+ vms.each do |vm|
93
+ pool.process do
94
+ event_log.track("#{vm.cid}") do
95
+ logger.info("Deleting idle vm #{vm.cid}")
96
+ delete_vm(vm)
97
+ end
98
+ end
99
+ end
100
+ end
101
+
102
+ def delete_instance(instance)
103
+ desc = "#{instance.job}/#{instance.index}"
104
+ with_thread_name("delete_instance(#{desc})") do
105
+ logger.info("Deleting instance: #{desc}")
106
+
107
+ vm = instance.vm
108
+
109
+ if vm && vm.agent_id
110
+ ignoring_errors_when_forced do
111
+ agent = AgentClient.new(vm.agent_id)
112
+ agent.stop
113
+ end
114
+ end
115
+
116
+ instance.persistent_disks.each do |disk|
117
+ if disk.active && vm && vm.cid && disk.disk_cid
118
+ if vm.agent_id
119
+ ignoring_errors_when_forced do
120
+ agent = AgentClient.new(vm.agent_id)
121
+ agent.unmount_disk(disk.disk_cid)
122
+ end
123
+ end
124
+
125
+ ignoring_errors_when_forced do
126
+ # If persistent disk has been mounted but
127
+ # clean_shutdown above did not unmount it
128
+ # properly (i.e. for wedged deployment),
129
+ # detach_disk might hang indefinitely.
130
+ # Right now it's up to cloudcheck handle
131
+ # that but 'force' might be added to CPI
132
+ # in the future.
133
+ @cloud.detach_disk(vm.cid, disk.disk_cid)
134
+ end
135
+ end
136
+
137
+ if disk.disk_cid
138
+ ignoring_errors_when_forced do
139
+ delete_snapshots(disk)
140
+ @cloud.delete_disk(disk.disk_cid)
141
+ end
142
+ end
143
+
144
+ disk.destroy
145
+ end
146
+
147
+ instance.destroy
148
+
149
+ delete_vm(vm) if vm
150
+ end
151
+ end
152
+
153
+ def delete_snapshots(disk)
154
+ @keep_snapshots ? disk.snapshots.each(&:delete) : Api::SnapshotManager.delete_snapshots(disk.snapshots)
155
+ end
156
+
157
+ def delete_vm(vm)
158
+ if vm.cid
159
+ ignoring_errors_when_forced do
160
+ @cloud.delete_vm(vm.cid)
161
+ end
162
+ end
163
+
164
+ vm.destroy
165
+ end
166
+
167
+ def delete_dns(name)
168
+ if Config.dns_enabled?
169
+ record_pattern = ["%", canonical(name), dns_domain_name].join(".")
170
+ delete_dns_records(record_pattern)
171
+ end
172
+ end
173
+
174
+ def ignoring_errors_when_forced
175
+ yield
176
+ rescue => e
177
+ raise unless @force
178
+ logger.warn(e.backtrace.join("\n"))
179
+ logger.info("Force deleting is set, ignoring exception")
180
+ end
181
+ end
182
+ end
183
+ end
@@ -0,0 +1,34 @@
1
+ module Bosh::Director
2
+ module Jobs
3
+ class DeleteDeploymentSnapshots < BaseJob
4
+ @queue = :normal
5
+
6
+ attr_reader :deployment
7
+
8
+ def self.job_type
9
+ :delete_deployment_snapshots
10
+ end
11
+
12
+ def initialize(deployment_name)
13
+ @deployment = deployment_manager.find_by_name(deployment_name)
14
+ end
15
+
16
+ def deployment_manager
17
+ @deployment_manager ||= Bosh::Director::Api::DeploymentManager.new
18
+ end
19
+
20
+ def perform
21
+ logger.info("deleting snapshots of deployment: #{deployment.name}")
22
+ deployment.job_instances.each do |instance|
23
+ snapshots = instance.persistent_disks.map { |disk| disk.snapshots }.flatten
24
+ if snapshots.any?
25
+ logger.info("deleting snapshots of: #{instance.job}/#{instance.index} (#{instance.vm.cid})")
26
+ Bosh::Director::Api::SnapshotManager.delete_snapshots(snapshots)
27
+ end
28
+ end
29
+
30
+ "snapshots of deployment `#{deployment.name}' deleted"
31
+ end
32
+ end
33
+ end
34
+ end