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,33 @@
1
+ module Bosh::Director::Jobs
2
+ module Helpers
3
+ class PackageDeleter
4
+ def initialize(compiled_package_deleter, blob_deleter, logger)
5
+ @compiled_package_deleter = compiled_package_deleter
6
+ @blob_deleter = blob_deleter
7
+ @logger = logger
8
+ end
9
+
10
+ def delete(package, force)
11
+ errors = []
12
+ @logger.info("Deleting package #{package.name}/#{package.version}")
13
+
14
+ package.compiled_packages.each do |compiled_package|
15
+ errors += @compiled_package_deleter.delete(compiled_package, {'force' => force})
16
+ end
17
+
18
+ delete_successful = true
19
+
20
+ if package.blobstore_id
21
+ delete_successful = @blob_deleter.delete(package.blobstore_id, errors, force)
22
+ end
23
+
24
+ if delete_successful
25
+ package.remove_all_release_versions
26
+ package.destroy
27
+ end
28
+
29
+ errors
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,52 @@
1
+ module Bosh::Director::Jobs
2
+ module Helpers
3
+ class ReleaseDeleter
4
+
5
+ def initialize(package_deleter, template_deleter, event_log, logger)
6
+ @package_deleter = package_deleter
7
+ @template_deleter = template_deleter
8
+ @event_log = event_log
9
+ @logger = logger
10
+ end
11
+
12
+ def delete(release, force)
13
+ errors = []
14
+
15
+ stage = @event_log.begin_stage('Deleting packages', release.packages.count)
16
+ release.packages.each do |package|
17
+ track_and_log(stage, "#{package.name}/#{package.version}") do
18
+ errors += @package_deleter.delete(package, force)
19
+ end
20
+ end
21
+
22
+ stage = @event_log.begin_stage('Deleting jobs', release.templates.count)
23
+ release.templates.each do |template|
24
+ track_and_log(stage, "#{template.name}/#{template.version}") do
25
+ errors += @template_deleter.delete(template, force)
26
+ end
27
+ end
28
+
29
+ if errors.empty? || force
30
+ stage = @event_log.begin_stage('Deleting release versions', release.versions.count)
31
+ release.versions.each do |release_version|
32
+ track_and_log(stage, "#{release.name}/#{release_version.version}") do
33
+ release_version.destroy
34
+ end
35
+ end
36
+ release.destroy
37
+ end
38
+
39
+ errors
40
+ end
41
+
42
+ private
43
+
44
+ def track_and_log(stage, task, log = true)
45
+ stage.advance_and_track(task) do |ticker|
46
+ @logger.info(task) if log
47
+ yield ticker if block_given?
48
+ end
49
+ end
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,115 @@
1
+ module Bosh::Director::Jobs
2
+ module Helpers
3
+ class ReleaseVersionDeleter
4
+
5
+ def initialize(release_deleter, package_deleter, template_deleter, logger, event_log)
6
+ @release_deleter = release_deleter
7
+ @package_deleter = package_deleter
8
+ @template_deleter = template_deleter
9
+ @logger = logger
10
+ @event_log = event_log
11
+ end
12
+
13
+ def delete(release_version, release, force)
14
+ @logger.info('Checking for any deployments still using ' +
15
+ 'this particular release version')
16
+
17
+ deployments = release_version.deployments
18
+
19
+ unless deployments.empty?
20
+ names = deployments.map { |d| d.name }.join(', ')
21
+ raise Bosh::Director::ReleaseVersionInUse,
22
+ "ReleaseVersion `#{release.name}/#{release_version.version}' is still in use by: #{names}"
23
+ end
24
+
25
+ delete_release_version(release_version, force)
26
+ end
27
+
28
+ private
29
+
30
+ def delete_release_version(release_version, force)
31
+ errors = []
32
+
33
+ release = release_version.release
34
+
35
+ packages_to_keep = []
36
+ packages_to_delete = []
37
+ templates_to_keep = []
38
+ templates_to_delete = []
39
+
40
+ # We don't delete packages inside this loop b/c Sequel will also delete
41
+ # them from packages collection we're iterating on which will lead to
42
+ # skipping some packages
43
+ release_version.packages.each do |package|
44
+ if package.release_versions == [release_version]
45
+ packages_to_delete << package
46
+ else
47
+ packages_to_keep << package
48
+ end
49
+ end
50
+
51
+ release_version.templates.each do |template|
52
+ if template.release_versions == [release_version]
53
+ templates_to_delete << template
54
+ else
55
+ templates_to_keep << template
56
+ end
57
+ end
58
+
59
+
60
+ stage = @event_log.begin_stage('Deleting packages', packages_to_delete.count)
61
+ packages_to_delete.each do |package|
62
+ track_and_log(stage, "#{package.name}/#{package.version}") do
63
+ @logger.info("Package #{package.name}/#{package.version} " +
64
+ 'is only used by this release version ' +
65
+ 'and will be deleted')
66
+ errors += @package_deleter.delete(package, force)
67
+ end
68
+ end
69
+
70
+ packages_to_keep.each do |package|
71
+ @logger.info("Keeping package #{package.name}/#{package.version} " +
72
+ 'as it is used by other release versions')
73
+ package.remove_release_version(release_version)
74
+ end
75
+
76
+ stage = @event_log.begin_stage('Deleting jobs', templates_to_delete.count)
77
+ templates_to_delete.each do |template|
78
+ track_and_log(stage, "#{template.name}/#{template.version}") do
79
+ @logger.info("Template #{template.name}/#{template.version} " +
80
+ 'is only used by this release version ' +
81
+ 'and will be deleted')
82
+ errors += @template_deleter.delete(template, force)
83
+ end
84
+ end
85
+
86
+ templates_to_keep.each do |template|
87
+ @logger.info('Keeping job ' +
88
+ "#{template.name}/#{template.version} as it is used " +
89
+ 'by other release versions')
90
+ template.remove_release_version(release_version)
91
+ end
92
+
93
+ @logger.info('Remove all deployments in release version')
94
+ release_version.remove_all_deployments
95
+
96
+ if errors.empty? || force
97
+ release_version.destroy
98
+ end
99
+
100
+ if release.versions.empty?
101
+ errors += @release_deleter.delete(release, force)
102
+ end
103
+
104
+ errors
105
+ end
106
+
107
+ def track_and_log(stage, task)
108
+ stage.advance_and_track(task) do
109
+ @logger.info(task)
110
+ yield
111
+ end
112
+ end
113
+ end
114
+ end
115
+ end
@@ -0,0 +1,31 @@
1
+ module Bosh::Director::Jobs
2
+ module Helpers
3
+ class ReleasesToDeletePicker
4
+ def initialize(release_manager)
5
+ @release_manager = release_manager
6
+ end
7
+
8
+ def pick(releases_to_keep)
9
+ unused_releases = @release_manager
10
+ .get_all_releases
11
+ .map do |release|
12
+ release['release_versions'].reject! { |version| version['currently_deployed'] }
13
+ release
14
+ end
15
+
16
+ unused_releases_to_delete = unused_releases
17
+ .reject{ |release| release['release_versions'].empty? }
18
+ .map do |release|
19
+ release['release_versions'].pop(releases_to_keep)
20
+ release
21
+ end
22
+
23
+ unused_releases_to_delete.map do |release|
24
+ release['release_versions'].map do |version|
25
+ {'name' => release['name'], 'version' => version['version']}
26
+ end
27
+ end.flatten
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,61 @@
1
+ module Bosh::Director::Jobs
2
+ module Helpers
3
+ class StemcellDeleter
4
+ include Bosh::Director::LockHelper
5
+
6
+ def initialize(cloud, compiled_package_deleter, logger, event_log)
7
+ @cloud = cloud
8
+ @compiled_package_deleter = compiled_package_deleter
9
+ @logger = logger
10
+ @event_log = event_log
11
+ end
12
+
13
+ def delete(stemcell, options = {})
14
+ with_stemcell_lock(stemcell.name, stemcell.version) do
15
+ @logger.info('Checking for any deployments still using the stemcell')
16
+ deployments = stemcell.deployments
17
+ unless deployments.empty?
18
+ names = deployments.map { |d| d.name }.join(', ')
19
+ raise Bosh::Director::StemcellInUse,
20
+ "Stemcell `#{stemcell.name}/#{stemcell.version}' is still in use by: #{names}"
21
+ end
22
+
23
+ begin
24
+ @cloud.delete_stemcell(stemcell.cid)
25
+ rescue => e
26
+ raise unless options['force']
27
+ @logger.warn(e.backtrace.join("\n"))
28
+ @logger.info("Force deleting is set, ignoring exception: #{e.message}")
29
+ end
30
+
31
+ @logger.info('Looking for any compiled packages on this stemcell')
32
+ compiled_packages = Bosh::Director::Models::CompiledPackage.filter(:stemcell_id => stemcell.id)
33
+
34
+ stage = @event_log.begin_stage('Deleting compiled packages',
35
+ compiled_packages.count, [stemcell.name, stemcell.version])
36
+ @logger.info('Deleting compiled packages ' +
37
+ "(#{compiled_packages.count}) for `#{stemcell.name}/#{stemcell.version}'")
38
+
39
+ compiled_packages.each do |compiled_package|
40
+ message = "#{compiled_package.name}/#{compiled_package.version}"
41
+ stage.advance_and_track(message) do
42
+ @logger.info(message)
43
+ @compiled_package_deleter.delete(compiled_package, options)
44
+ end
45
+ end
46
+
47
+ stemcell.destroy
48
+ end
49
+ end
50
+
51
+ private
52
+
53
+ def track_and_log(stage, task, log = true)
54
+ stage.advance_and_track(task) do |ticker|
55
+ @logger.info(task) if log
56
+ yield ticker if block_given?
57
+ end
58
+ end
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,30 @@
1
+ module Bosh::Director::Jobs
2
+ module Helpers
3
+ class StemcellsToDeletePicker
4
+ def initialize(stemcell_manager)
5
+ @stemcell_manager = stemcell_manager
6
+ end
7
+
8
+ def pick(stemcells_to_keep)
9
+ unused_stemcell_names_and_versions = @stemcell_manager
10
+ .find_all_stemcells
11
+ .select { |stemcell| stemcell['deployments'].empty? }
12
+
13
+ unused_stemcells_grouped_by_name = unused_stemcell_names_and_versions.inject({}) do |h, stemcell|
14
+ h[stemcell['name']] ||= []
15
+ h[stemcell['name']] << stemcell
16
+ h
17
+ end
18
+
19
+ stemcells_to_versions_to_delete = unused_stemcells_grouped_by_name.each_pair do |_, versions|
20
+ versions.sort! do |sc1, sc2|
21
+ Bosh::Common::Version::StemcellVersion.parse(sc1['version']) <=> Bosh::Common::Version::StemcellVersion.parse(sc2['version'])
22
+ end
23
+ versions.pop(stemcells_to_keep)
24
+ end
25
+
26
+ stemcells_to_versions_to_delete.values.flatten
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,20 @@
1
+ module Bosh::Director::Jobs
2
+ module Helpers
3
+ class TemplateDeleter
4
+ def initialize(blob_deleter, logger)
5
+ @blob_deleter = blob_deleter
6
+ @logger = logger
7
+ end
8
+
9
+ def delete(template, force)
10
+ @logger.info("Deleting job: #{template.name}/#{template.version}")
11
+ errors = []
12
+ if @blob_deleter.delete(template.blobstore_id, errors, force)
13
+ template.remove_all_release_versions
14
+ template.destroy
15
+ end
16
+ errors
17
+ end
18
+ end
19
+ end
20
+ end
@@ -33,6 +33,8 @@ module Bosh::Director
33
33
  template.properties = job_manifest['properties'] if job_manifest['properties']
34
34
 
35
35
  validate_links(job_manifest)
36
+ template.provides = job_manifest['provides'] if job_manifest['provides']
37
+ template.requires = job_manifest['requires'] if job_manifest['requires']
36
38
 
37
39
  template.save
38
40
  end
@@ -146,16 +148,25 @@ module Bosh::Director
146
148
  end
147
149
 
148
150
  def validate_links(job_manifest)
149
- if job_manifest['provides']
150
- if !job_manifest['provides'].is_a?(Array) || job_manifest['provides'].find { |p| !p.is_a?(String) }
151
- raise JobInvalidLinkSpec, "Job `#{@name}' has invalid spec format: 'provides' needs to be an array of strings"
152
- end
151
+ parse_links(job_manifest['provides'], 'provides') if job_manifest['provides']
152
+ parse_links(job_manifest['requires'], 'requires') if job_manifest['requires']
153
+ end
154
+
155
+ def parse_links(links, desc)
156
+ if !links.is_a?(Array)
157
+ raise JobInvalidLinkSpec,
158
+ "Job '#{@name}' has invalid spec format: '#{desc}' must be an array of strings or hashes with name and type"
153
159
  end
154
160
 
155
- if job_manifest['requires']
156
- if !job_manifest['requires'].is_a?(Array) || job_manifest['requires'].find { |p| !p.is_a?(String) }
157
- raise JobInvalidLinkSpec, "Job `#{@name}' has invalid spec format: 'requires' needs to be an array of strings"
161
+ parsed_links = {}
162
+ links.each do |link_spec|
163
+ parsed_link = DeploymentPlan::TemplateLink.parse(link_spec)
164
+ if parsed_links[parsed_link.name]
165
+ raise JobDuplicateLinkName,
166
+ "Job '#{@name}' '#{desc}' specifies links with duplicate name '#{parsed_link.name}'"
158
167
  end
168
+
169
+ parsed_links[parsed_link.name] = true
159
170
  end
160
171
  end
161
172
  end
@@ -15,9 +15,9 @@ module Bosh::Director
15
15
  @errand_name = errand_name
16
16
  @deployment_manager = Api::DeploymentManager.new
17
17
  @instance_manager = Api::InstanceManager.new
18
- @blobstore = App.instance.blobstores.blobstore
19
18
  @keep_alive = keep_alive
20
- log_bundles_cleaner = LogBundlesCleaner.new(@blobstore, 60 * 60 * 24 * 10, logger) # 10 days
19
+ blobstore = App.instance.blobstores.blobstore
20
+ log_bundles_cleaner = LogBundlesCleaner.new(blobstore, 60 * 60 * 24 * 10, logger) # 10 days
21
21
  @logs_fetcher = LogsFetcher.new(event_log, @instance_manager, log_bundles_cleaner, logger)
22
22
  end
23
23
 
@@ -28,24 +28,38 @@ module Bosh::Director
28
28
  with_deployment_lock(deployment_name) do
29
29
  cloud_config_model = deployment_model.cloud_config
30
30
 
31
- planner_factory = DeploymentPlan::PlannerFactory.create(event_log, logger)
32
- deployment = planner_factory.planner(deployment_manifest_hash, cloud_config_model, {})
31
+ deployment = nil
32
+ job = nil
33
33
 
34
- job = deployment.job(@errand_name)
35
- if job.nil?
36
- raise JobNotFound, "Errand `#{@errand_name}' doesn't exist"
37
- end
34
+ event_log.begin_stage('Preparing deployment', 1)
35
+ event_log.track('Preparing deployment') do
36
+ planner_factory = DeploymentPlan::PlannerFactory.create(logger)
37
+ deployment = planner_factory.create_from_manifest(deployment_manifest_hash, cloud_config_model, {})
38
+ deployment.bind_models
39
+ job = deployment.job(@errand_name)
38
40
 
39
- unless job.can_run_as_errand?
40
- raise RunErrandError,
41
- "Job `#{job.name}' is not an errand. To mark a job as an errand " +
42
- "set its lifecycle to 'errand' in the deployment manifest."
43
- end
41
+ if job.nil?
42
+ raise JobNotFound, "Errand `#{@errand_name}' doesn't exist"
43
+ end
44
+
45
+ unless job.can_run_as_errand?
46
+ raise RunErrandError,
47
+ "Job `#{job.name}' is not an errand. To mark a job as an errand " +
48
+ "set its lifecycle to 'errand' in the deployment manifest."
49
+ end
50
+
51
+ if job.instances.empty?
52
+ raise InstanceNotFound, "Instance `#{@deployment_name}/#{@errand_name}/0' doesn't exist"
53
+ end
54
+
55
+ logger.info('Starting to prepare for deployment')
56
+ job.bind_instances(deployment.ip_provider)
44
57
 
45
- if job.instances.empty?
46
- raise InstanceNotFound, "Instance `#{@deployment_name}/#{@errand_name}/0' doesn't exist"
58
+ JobRenderer.create.render_job_instances(job.needed_instance_plans)
47
59
  end
48
60
 
61
+ deployment.compile_packages
62
+
49
63
  runner = Errand::Runner.new(job, result_file, @instance_manager, event_log, @logs_fetcher)
50
64
 
51
65
  cancel_blk = lambda {
@@ -71,44 +85,51 @@ module Bosh::Director
71
85
  private
72
86
 
73
87
  def with_updated_instances(deployment, job, &blk)
74
- rp_updaters = [ResourcePoolUpdater.new(job.resource_pool)]
75
- resource_pools = DeploymentPlan::ResourcePools.new(event_log, rp_updaters)
88
+ job_manager = Errand::JobManager.new(deployment, job, Config.cloud, event_log, logger)
76
89
 
77
- job_manager = Errand::JobManager.new(deployment, job, @blobstore, event_log, logger)
90
+ begin
91
+ update_instances(job_manager)
92
+ block_result = blk.call
93
+ rescue Exception
94
+ cleanup_instances_and_log_error(job_manager)
95
+ raise
96
+ else
97
+ cleanup_instances_and_raise_error(job_manager)
98
+ return block_result
99
+ end
100
+ end
78
101
 
102
+ def cleanup_instances_and_log_error(job_manager)
79
103
  begin
80
- update_instances(resource_pools, job_manager)
81
- blk.call
82
- ensure
83
- if @keep_alive
84
- logger.info('Skipping instances deletion, keep-alive is set')
85
- else
86
- logger.info('Deleting instances')
87
- delete_instances(resource_pools, job_manager)
88
- end
104
+ cleanup_instances_and_raise_error(job_manager)
105
+ rescue Exception => e
106
+ logger.warn("Failed to delete instances: #{e.class}: #{e.message}\n#{e.backtrace.join("\n")}")
89
107
  end
90
108
  end
91
109
 
92
- def update_instances(resource_pools, job_manager)
93
- logger.info('Starting to prepare for deployment')
94
- job_manager.prepare
110
+ def cleanup_instances_and_raise_error(job_manager)
111
+ if @keep_alive
112
+ logger.info('Skipping instances deletion, keep-alive is set')
113
+ else
114
+ logger.info('Deleting instances')
115
+ delete_instances(job_manager)
116
+ end
117
+ end
95
118
 
96
- logger.info('Starting to update resource pool')
97
- resource_pools.update
119
+ def update_instances(job_manager)
120
+ logger.info('Starting to create missing vms')
121
+ job_manager.create_missing_vms
98
122
 
99
123
  logger.info('Starting to update job instances')
100
124
  job_manager.update_instances
101
125
  end
102
126
 
103
- def delete_instances(resource_pools, job_manager)
127
+ def delete_instances(job_manager)
104
128
  @ignore_cancellation = true
105
129
 
106
130
  logger.info('Starting to delete job instances')
107
131
  job_manager.delete_instances
108
132
 
109
- logger.info('Starting to refill resource pool')
110
- resource_pools.refill
111
-
112
133
  @ignore_cancellation = false
113
134
  end
114
135
  end