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,16 +1,19 @@
1
1
  module Bosh::Director
2
2
  class InstanceUpdater::Preparer
3
- def initialize(instance, agent_client, logger)
4
- @instance = instance
3
+ def initialize(instance_plan, agent_client, logger)
4
+ @instance_plan = instance_plan
5
5
  @agent_client = agent_client
6
6
  @logger = logger
7
7
  end
8
8
 
9
9
  def prepare
10
- # If resource pool has changed or instance will be detached
10
+ instance = @instance_plan.instance
11
+ # If resource pool has changed or instance will be recreated/detached
11
12
  # there is no point in preparing current VM for future since it will be destroyed.
12
- if !@instance.resource_pool_changed? && @instance.state != 'detached'
13
- @agent_client.prepare(@instance.spec)
13
+ unless @instance_plan.needs_shutting_down? || instance.state == 'detached'
14
+
15
+ apply_spec = DeploymentPlan::InstanceSpec.create_from_instance_plan(@instance_plan).as_apply_spec
16
+ @agent_client.prepare(apply_spec)
14
17
  end
15
18
  rescue RpcRemoteException => e
16
19
  if e.message =~ /unknown message/
@@ -0,0 +1,21 @@
1
+ module Bosh::Director
2
+ class InstanceUpdater::StateApplier
3
+ def initialize(instance_plan, agent_client, rendered_job_templates_cleaner)
4
+ @instance_plan = instance_plan
5
+ @instance = @instance_plan.instance
6
+ @agent_client = agent_client
7
+ @rendered_job_templates_cleaner = rendered_job_templates_cleaner
8
+ end
9
+
10
+ def apply
11
+ @instance.apply_vm_state(@instance_plan.spec)
12
+ @instance.update_templates(@instance_plan.templates)
13
+ @rendered_job_templates_cleaner.clean
14
+
15
+ if @instance.state == 'started'
16
+ @agent_client.run_script('pre-start', {})
17
+ @agent_client.start
18
+ end
19
+ end
20
+ end
21
+ end
@@ -1,5 +1,3 @@
1
- # Copyright (c) 2009-2012 VMware, Inc.
2
-
3
1
  module Bosh::Director
4
2
  module IpUtil
5
3
 
@@ -17,29 +15,6 @@ module Bosh::Director
17
15
  end
18
16
  end
19
17
 
20
- def process_range(range)
21
- parts = range.split("-")
22
- parts.each { |part| part.strip! }
23
- if parts.size == 1
24
- range = NetAddr::CIDR.create(parts[0])
25
- first_ip = range.first(:Objectify => true).to_i
26
- last_ip = range.last(:Objectify => true).to_i
27
- (first_ip .. last_ip).each do |ip|
28
- yield ip
29
- end
30
- elsif parts.size == 2
31
- first_ip = NetAddr::CIDR.create(parts[0])
32
- last_ip = NetAddr::CIDR.create(parts[1])
33
- raise ArgumentError unless first_ip.size == 1
34
- raise ArgumentError unless last_ip.size == 1
35
- (first_ip.to_i .. last_ip.to_i).each do |ip|
36
- yield ip
37
- end
38
- else
39
- raise ArgumentError
40
- end
41
- end
42
-
43
18
  def ip_to_i(ip)
44
19
  unless ip.kind_of?(Integer)
45
20
  unless ip.kind_of?(NetAddr::CIDR)
@@ -63,5 +38,50 @@ module Bosh::Director
63
38
  ip_to_netaddr(ip).ip
64
39
  end
65
40
 
41
+ private
42
+
43
+ def process_range(range)
44
+ parts = range.split("-")
45
+ parts.each { |part| part.strip! }
46
+ if parts.size == 1
47
+ range = NetAddr::CIDR.create(parts[0])
48
+ first_ip = range.first(:Objectify => true).to_i
49
+ last_ip = range.last(:Objectify => true).to_i
50
+ (first_ip .. last_ip).each do |ip|
51
+ yield ip
52
+ end
53
+ elsif parts.size == 2
54
+ first_ip = NetAddr::CIDR.create(parts[0])
55
+ last_ip = NetAddr::CIDR.create(parts[1])
56
+ unless first_ip.size == 1 && last_ip.size == 1
57
+ raise NetworkInvalidIpRangeFormat, "Invalid IP range format: #{range}"
58
+ end
59
+ (first_ip.to_i .. last_ip.to_i).each do |ip|
60
+ yield ip
61
+ end
62
+ else
63
+ raise NetworkInvalidIpRangeFormat,
64
+ "Invalid IP range format: #{range}"
65
+ end
66
+ rescue ArgumentError, NetAddr::ValidationError => e
67
+ raise NetworkInvalidIpRangeFormat, e.message
68
+ end
69
+ class CIDRIP
70
+ def initialize(ip)
71
+ if ip.kind_of?(NetAddr::CIDR)
72
+ @cidr = ip
73
+ else
74
+ @cidr = NetAddr::CIDR.create(ip)
75
+ end
76
+ end
77
+
78
+ def to_i
79
+ @cidr.to_i
80
+ end
81
+
82
+ def to_s
83
+ @cidr.ip.to_s
84
+ end
85
+ end
66
86
  end
67
- end
87
+ end
@@ -3,21 +3,33 @@ require 'bosh/director/core/templates/job_instance_renderer'
3
3
 
4
4
  module Bosh::Director
5
5
  class JobRenderer
6
- # @param [DeploymentPlan::Job]
7
- def initialize(job, blobstore)
8
- @job = job
9
- @blobstore = blobstore
6
+ def self.create
7
+ new(App.instance.blobstores.blobstore, Config.logger)
8
+ end
10
9
 
11
- job_template_loader = Core::Templates::JobTemplateLoader.new(Config.logger)
12
- @instance_renderer = Core::Templates::JobInstanceRenderer.new(@job.templates, job_template_loader)
10
+ def initialize(blobstore, logger)
11
+ @blobstore = blobstore
12
+ @logger = logger
13
13
  end
14
14
 
15
- def render_job_instances
16
- @job.instances.each { |instance| render_job_instance(instance) }
15
+ def render_job_instances(instance_plan)
16
+ instance_plan.each { |instance_plan| render_job_instance(instance_plan) }
17
17
  end
18
18
 
19
- def render_job_instance(instance)
20
- rendered_job_instance = @instance_renderer.render(instance.spec)
19
+ def render_job_instance(instance_plan)
20
+ instance = instance_plan.instance
21
+
22
+ if instance_plan.templates.empty?
23
+ @logger.debug("Skipping rendering templates for '#{instance}', no templates")
24
+ return
25
+ end
26
+
27
+ @logger.debug("Rendering templates for instance #{instance}")
28
+
29
+ job_template_loader = Core::Templates::JobTemplateLoader.new(@logger)
30
+
31
+ instance_renderer = Core::Templates::JobInstanceRenderer.new(instance_plan.templates, job_template_loader)
32
+ rendered_job_instance = instance_renderer.render(instance_plan.spec.as_template_spec)
21
33
 
22
34
  configuration_hash = rendered_job_instance.configuration_hash
23
35
 
@@ -67,10 +67,7 @@ module Bosh::Director
67
67
  Config.redis_logger = redis_task_logger
68
68
 
69
69
  Config.db.logger = @task_logger
70
-
71
- if Config.dns_enabled?
72
- Config.dns_db.logger = @task_logger
73
- end
70
+ Config.dns_db.logger = @task_logger if Config.dns_db
74
71
 
75
72
  cpi_log = File.join(log_dir, 'cpi')
76
73
  Config.cloud_options['properties'] ||= {}
@@ -3,75 +3,88 @@ module Bosh::Director
3
3
  # @param [Bosh::Director::DeploymentPlan::Planner] deployment_plan
4
4
  # @param [Bosh::Director::DeploymentPlan::Job] job
5
5
  # @param [Bosh::Director::JobRenderer] job_renderer
6
- def initialize(deployment_plan, job, job_renderer)
6
+ def initialize(deployment_plan, job, links_resolver, disk_manager)
7
7
  @deployment_plan = deployment_plan
8
8
  @job = job
9
- @job_renderer = job_renderer
9
+ @links_resolver = links_resolver
10
10
 
11
11
  @logger = Config.logger
12
12
  @event_log = Config.event_log
13
+ @disk_manager = disk_manager
13
14
  end
14
15
 
15
16
  def update
16
17
  @logger.info('Deleting no longer needed instances')
17
18
  delete_unneeded_instances
18
19
 
19
- instances = []
20
- @job.instances.each do |instance|
21
- instances << instance if instance.changed?
20
+ instance_plans = @job.needed_instance_plans.select do | instance_plan |
21
+ if instance_plan.changed?
22
+ true
23
+ else
24
+ # no changes necessary for the agent, but some metadata may have
25
+ # changed (i.e. vm_type.name), so push state to the db regardless
26
+ instance_plan.persist_current_spec
27
+ false
28
+ end
22
29
  end
23
30
 
24
- if instances.empty?
25
- @logger.info("No instances to update for `#{@job.name}'")
31
+ if instance_plans.empty?
32
+ @logger.info("No instances to update for '#{@job.name}'")
26
33
  return
27
34
  end
28
35
 
29
- @logger.info("Found #{instances.size} instances to update")
30
- event_log_stage = @event_log.begin_stage("Updating job", instances.size, [ @job.name ])
36
+ instance_plans.each do |instance_plan|
37
+ changes = instance_plan.changes
38
+ @logger.debug("Need to update instance '#{instance_plan.instance}', changes: #{changes.to_a.join(', ').inspect}")
39
+ end
40
+
41
+ @logger.info("Found #{instance_plans.size} instances to update")
42
+ event_log_stage = @event_log.begin_stage('Updating job', instance_plans.size, [ @job.name ])
31
43
 
32
44
  ThreadPool.new(:max_threads => @job.update.max_in_flight).wrap do |pool|
33
- num_canaries = [ @job.update.canaries, instances.size ].min
45
+ num_canaries = [ @job.update.canaries, instance_plans.size ].min
34
46
  @logger.info("Starting canary update num_canaries=#{num_canaries}")
35
- update_canaries(pool, instances, num_canaries, event_log_stage)
47
+ update_canaries(pool, instance_plans, num_canaries, event_log_stage)
36
48
 
37
49
  @logger.info('Waiting for canaries to update')
38
50
  pool.wait
39
51
 
40
- @logger.info("Finished canary update")
52
+ @logger.info('Finished canary update')
41
53
 
42
- @logger.info("Continuing the rest of the update")
43
- update_instances(pool, instances, event_log_stage)
54
+ @logger.info('Continuing the rest of the update')
55
+ update_instances(pool, instance_plans, event_log_stage)
44
56
  end
45
57
 
46
- @logger.info("Finished the rest of the update")
58
+ @logger.info('Finished the rest of the update')
47
59
  end
48
60
 
49
61
  private
50
62
 
51
63
  def delete_unneeded_instances
64
+ unneeded_instance_plans = @job.obsolete_instance_plans
52
65
  unneeded_instances = @job.unneeded_instances
53
66
  return if unneeded_instances.empty?
54
67
 
55
- event_log_stage = @event_log.begin_stage("Deleting unneeded instances", unneeded_instances.size, [@job.name])
56
- deleter = InstanceDeleter.new(@deployment_plan)
57
- deleter.delete_instances(unneeded_instances, event_log_stage, max_threads: @job.update.max_in_flight)
68
+ event_log_stage = @event_log.begin_stage('Deleting unneeded instances', unneeded_instances.size, [@job.name])
69
+ dns_manager = DnsManager.create
70
+ deleter = InstanceDeleter.new(@deployment_plan.ip_provider, dns_manager, @disk_manager)
71
+ deleter.delete_instance_plans(unneeded_instance_plans, event_log_stage, max_threads: @job.update.max_in_flight)
58
72
 
59
- @logger.info("Deleted no longer needed instances")
73
+ @logger.info('Deleted no longer needed instances')
60
74
  end
61
75
 
62
- def update_canaries(pool, instances, num_canaries, event_log_stage)
76
+ def update_canaries(pool, instance_plans, num_canaries, event_log_stage)
63
77
  num_canaries.times do
64
- instance = instances.shift
65
- pool.process { update_canary_instance(instance, event_log_stage) }
78
+ instance_plan = instance_plans.shift
79
+ pool.process { update_canary_instance(instance_plan, event_log_stage) }
66
80
  end
67
81
  end
68
82
 
69
- def update_canary_instance(instance, event_log_stage)
70
- desc = "#{@job.name}/#{instance.index}"
71
- event_log_stage.advance_and_track("#{desc} (canary)") do |ticker|
72
- with_thread_name("canary_update(#{desc})") do
83
+ def update_canary_instance(instance_plan, event_log_stage)
84
+ event_log_stage.advance_and_track("#{instance_plan.instance.model} (canary)") do
85
+ with_thread_name("canary_update(#{instance_plan.instance.model})") do
73
86
  begin
74
- InstanceUpdater.new(instance, ticker, @job_renderer).update(:canary => true)
87
+ InstanceUpdater.new_instance_updater(@deployment_plan.ip_provider).update(instance_plan, :canary => true)
75
88
  rescue Exception => e
76
89
  @logger.error("Error updating canary instance: #{e.inspect}\n#{e.backtrace.join("\n")}")
77
90
  raise
@@ -80,18 +93,17 @@ module Bosh::Director
80
93
  end
81
94
  end
82
95
 
83
- def update_instances(pool, instances, event_log_stage)
84
- instances.each do |instance|
85
- pool.process { update_instance(instance, event_log_stage) }
96
+ def update_instances(pool, instance_plans, event_log_stage)
97
+ instance_plans.each do |instance_plan|
98
+ pool.process { update_instance(instance_plan, event_log_stage) }
86
99
  end
87
100
  end
88
101
 
89
- def update_instance(instance, event_log_stage)
90
- desc = "#{@job.name}/#{instance.index}"
91
- event_log_stage.advance_and_track(desc) do |ticker|
92
- with_thread_name("instance_update(#{desc})") do
102
+ def update_instance(instance_plan, event_log_stage)
103
+ event_log_stage.advance_and_track("#{instance_plan.instance.model}") do
104
+ with_thread_name("instance_update(#{instance_plan.instance.model})") do
93
105
  begin
94
- InstanceUpdater.new(instance, ticker, @job_renderer).update
106
+ InstanceUpdater.new_instance_updater(@deployment_plan.ip_provider).update(instance_plan)
95
107
  rescue Exception => e
96
108
  @logger.error("Error updating instance: #{e.inspect}\n#{e.backtrace.join("\n")}")
97
109
  raise
@@ -1,12 +1,13 @@
1
1
  module Bosh::Director
2
2
  class JobUpdaterFactory
3
- def initialize(blobstore)
4
- @blobstore = blobstore
3
+ def initialize(cloud, logger)
4
+ @cloud = cloud
5
+ @logger = logger
5
6
  end
6
7
 
7
8
  def new_job_updater(deployment_plan, job)
8
- job_renderer = JobRenderer.new(job, @blobstore)
9
- JobUpdater.new(deployment_plan, job, job_renderer)
9
+ links_resolver = DeploymentPlan::LinksResolver.new(deployment_plan, @logger)
10
+ JobUpdater.new(deployment_plan, job, links_resolver, DiskManager.new(@cloud, @logger))
10
11
  end
11
12
  end
12
13
  end
@@ -10,6 +10,10 @@ module Bosh::Director
10
10
  Bosh::Director::JobRunner.new(self, task_id).run(*args)
11
11
  end
12
12
 
13
+ def self.schedule_message
14
+ "scheduled #{name.split('::').last}"
15
+ end
16
+
13
17
  attr_accessor :task_id
14
18
 
15
19
  def logger
@@ -24,6 +28,10 @@ module Bosh::Director
24
28
  @result_file ||= Config.result
25
29
  end
26
30
 
31
+ def dns_manager
32
+ @dns_manager ||= DnsManager.create
33
+ end
34
+
27
35
  # @return [Boolean] Has task been cancelled?
28
36
  def task_cancelled?
29
37
  return false if task_id.nil?
@@ -0,0 +1,93 @@
1
+ module Bosh::Director
2
+ module Jobs
3
+ class CleanupArtifacts < BaseJob
4
+ include Bosh::Director::LockHelper
5
+
6
+ @queue = :normal
7
+
8
+ def self.job_type
9
+ :delete_artifacts
10
+ end
11
+
12
+ def self.enqueue(username, config, job_queue)
13
+ description = config['remove_all'] ? 'clean up all' : 'clean up'
14
+ job_queue.enqueue(username, Jobs::CleanupArtifacts, description, [config])
15
+ end
16
+
17
+ def initialize(config)
18
+ @config = config
19
+ @disk_manager = DiskManager.new(Config.cloud, Config.logger)
20
+ release_manager = Api::ReleaseManager.new
21
+ @stemcell_manager = Api::StemcellManager.new
22
+ blobstore = App.instance.blobstores.blobstore
23
+ cloud = Config.cloud
24
+ blob_deleter = Jobs::Helpers::BlobDeleter.new(blobstore, logger)
25
+ compiled_package_deleter = Jobs::Helpers::CompiledPackageDeleter.new(blob_deleter, logger)
26
+ @stemcell_deleter = Jobs::Helpers::StemcellDeleter.new(cloud, compiled_package_deleter, logger, event_log)
27
+ @releases_to_delete_picker = Jobs::Helpers::ReleasesToDeletePicker.new(release_manager)
28
+ @stemcells_to_delete_picker = Jobs::Helpers::StemcellsToDeletePicker.new(@stemcell_manager)
29
+ package_deleter = Helpers::PackageDeleter.new(compiled_package_deleter, blob_deleter, logger)
30
+ template_deleter = Helpers::TemplateDeleter.new(blob_deleter, logger)
31
+ release_deleter = Helpers::ReleaseDeleter.new(package_deleter, template_deleter, event_log, logger)
32
+ release_version_deleter =
33
+ Helpers::ReleaseVersionDeleter.new(release_deleter, package_deleter, template_deleter, logger, event_log)
34
+ @name_version_release_deleter =
35
+ Helpers::NameVersionReleaseDeleter.new(release_deleter, release_manager, release_version_deleter, logger)
36
+ end
37
+
38
+ def perform
39
+ if @config['remove_all']
40
+ releases_to_keep, stemcells_to_keep = 0, 0
41
+ else
42
+ releases_to_keep, stemcells_to_keep = 2, 2
43
+ end
44
+
45
+ unused_release_name_and_version = @releases_to_delete_picker.pick(releases_to_keep)
46
+ release_stage = event_log.begin_stage('Deleting releases', unused_release_name_and_version.count)
47
+ ThreadPool.new(:max_threads => Config.max_threads).wrap do |pool|
48
+ unused_release_name_and_version.each do |name_and_version|
49
+ pool.process do
50
+ name = name_and_version['name']
51
+ version = name_and_version['version']
52
+ release_stage.advance_and_track("#{name}/#{version}") do
53
+ with_release_lock(name, :timeout => 10) do
54
+ @name_version_release_deleter.find_and_delete_release(name, version, false)
55
+ end
56
+ end
57
+ end
58
+ end
59
+ end
60
+
61
+ stemcells_to_delete = @stemcells_to_delete_picker.pick(stemcells_to_keep)
62
+ stemcell_stage = event_log.begin_stage('Deleting stemcells', stemcells_to_delete.count)
63
+ ThreadPool.new(:max_threads => Config.max_threads).wrap do |pool|
64
+ stemcells_to_delete.each do |stemcell|
65
+ pool.process do
66
+ stemcell_stage.advance_and_track("#{stemcell['name']}/#{stemcell['version']}") do
67
+ stemcell_to_delete = @stemcell_manager.find_by_name_and_version(stemcell['name'], stemcell['version'])
68
+ @stemcell_deleter.delete(stemcell_to_delete)
69
+ end
70
+ end
71
+ end
72
+ end
73
+
74
+ orphan_disks = []
75
+ if @config['remove_all']
76
+ orphan_disks = Models::OrphanDisk.all
77
+ orphan_disk_stage = event_log.begin_stage('Deleting orphaned disks', orphan_disks.count)
78
+ ThreadPool.new(:max_threads => Config.max_threads).wrap do |pool|
79
+ orphan_disks.each do |orphan_disk|
80
+ pool.process do
81
+ orphan_disk_stage.advance_and_track("#{orphan_disk.disk_cid}") do
82
+ @disk_manager.delete_orphan_disk(orphan_disk)
83
+ end
84
+ end
85
+ end
86
+ end
87
+ end
88
+
89
+ "Deleted #{unused_release_name_and_version.count} release(s), #{stemcells_to_delete.count} stemcell(s), #{orphan_disks.count} orphaned disk(s)"
90
+ end
91
+ end
92
+ end
93
+ end