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,46 @@
1
+ module Bosh::Director
2
+ module Jobs
3
+ class ScheduledOrphanCleanup < BaseJob
4
+ @queue = :normal
5
+
6
+ def self.job_type
7
+ :scheduled_orphan_cleanup
8
+ end
9
+
10
+ def self.has_work(params)
11
+ time = time_days_ago(params.first['max_orphaned_age_in_days'])
12
+ Models::OrphanDisk.where('created_at < ?', time).any?
13
+ end
14
+
15
+ def self.time_days_ago(days)
16
+ Time.now - (days * 24 * 60 * 60)
17
+ end
18
+
19
+ def self.schedule_message
20
+ "clean up orphan disks"
21
+ end
22
+
23
+ def initialize(params = {})
24
+ logger.debug("ScheduledOrphanCleanup initialized with params: #{params.inspect}")
25
+ @max_orphaned_age_in_days = params['max_orphaned_age_in_days']
26
+ cloud = params.fetch(:cloud) { Config.cloud }
27
+ @disk_manager = DiskManager.new(cloud, logger)
28
+ end
29
+
30
+ def perform
31
+ time = self.class.time_days_ago(@max_orphaned_age_in_days)
32
+ logger.info("Started cleanup of orphan disks and orphan snapshots older than #{time}")
33
+
34
+ old_orphans = Models::OrphanDisk.where('created_at < ?', time)
35
+ old_orphans_count = old_orphans.count
36
+ stage = event_log.begin_stage('Deleting orphan disks', old_orphans_count)
37
+ old_orphans.each do |old_orphan|
38
+ stage.advance_and_track("#{old_orphan.disk_cid}") do
39
+ @disk_manager.delete_orphan_disk(old_orphan)
40
+ end
41
+ end
42
+ "Deleted #{old_orphans_count} orphaned disk(s) older than #{time}"
43
+ end
44
+ end
45
+ end
46
+ 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 Ssh < BaseJob
@@ -13,7 +11,7 @@ module Bosh::Director
13
11
 
14
12
  def initialize(deployment_id, options = {})
15
13
  @deployment_id = deployment_id
16
- @target = options["target"]
14
+ @target_payload = options["target"]
17
15
  @command = options["command"]
18
16
  @params = options["params"]
19
17
  @blobstore = options.fetch(:blobstore) { App.instance.blobstores.blobstore }
@@ -21,29 +19,25 @@ module Bosh::Director
21
19
  end
22
20
 
23
21
  def perform
24
- job = @target["job"]
25
- indexes = @target["indexes"]
26
-
27
- filter = {
28
- :deployment_id => @deployment_id
29
- }
22
+ target = Target.new(@target_payload)
30
23
 
31
- if indexes && indexes.size > 0
32
- filter[:index] = indexes
33
- end
24
+ filter = { deployment_id: @deployment_id }
25
+ filter[:job] = target.job if target.job
34
26
 
35
- if job
36
- filter[:job] = job
37
- end
27
+ filter.merge!(target.id_filter)
38
28
 
39
29
  instances = @instance_manager.filter_by(filter)
40
30
 
41
31
  ssh_info = instances.map do |instance|
42
32
  agent = @instance_manager.agent_client_for(instance)
43
33
 
44
- logger.info("ssh #{@command} `#{instance.job}/#{instance.index}'")
34
+ logger.info("ssh #{@command} `#{instance.job}/#{instance.uuid}'")
45
35
  result = agent.ssh(@command, @params)
46
- result["index"] = instance.index
36
+ if target.ids_provided?
37
+ result["id"] = instance.uuid
38
+ else
39
+ result["index"] = instance.index
40
+ end
47
41
 
48
42
  if Config.default_ssh_options
49
43
  result["gateway_host"] = Config.default_ssh_options["gateway_host"]
@@ -59,6 +53,45 @@ module Bosh::Director
59
53
  # task result
60
54
  nil
61
55
  end
56
+
57
+ private
58
+
59
+ class Target
60
+ attr_reader :job, :indexes, :ids
61
+
62
+ def initialize(target_payload)
63
+ @job = target_payload['job']
64
+ @ids = target_payload['ids']
65
+ @indexes = target_payload['indexes']
66
+ end
67
+
68
+ def ids_provided?
69
+ @ids && @ids.size > 0
70
+ end
71
+
72
+ def indexes_provided?
73
+ @indexes && @indexes.size > 0
74
+ end
75
+
76
+ def id_filter
77
+ if !ids_provided? && indexes_provided?
78
+ # for backwards compatibility with old cli
79
+ return {index: @indexes}
80
+ end
81
+
82
+ filter = Hash.new { |h,k| h[k] = [] }
83
+
84
+ @ids.each do |id|
85
+ if id.to_s =~ /^\d+$/
86
+ filter[:index] << id.to_i
87
+ else
88
+ filter[:uuid] << id
89
+ end
90
+ end
91
+
92
+ filter
93
+ end
94
+ end
62
95
  end
63
96
  end
64
97
  end
@@ -18,18 +18,35 @@ module Bosh::Director
18
18
 
19
19
  def perform
20
20
  logger.info('Reading deployment manifest')
21
+
21
22
  manifest_text = File.read(@manifest_file_path)
22
23
  logger.debug("Manifest:\n#{manifest_text}")
23
24
  deployment_manifest_hash = Psych.load(manifest_text)
25
+
26
+ cloud_config_model = Bosh::Director::Models::CloudConfig[@cloud_config_id]
27
+ if cloud_config_model.nil?
28
+ logger.debug("No cloud config uploaded yet.")
29
+ else
30
+ logger.debug("Cloud config:\n#{cloud_config_model.manifest}")
31
+ end
32
+
24
33
  deployment_name = deployment_manifest_hash['name']
25
34
  with_deployment_lock(deployment_name) do
26
35
  @notifier = DeploymentPlan::Notifier.new(deployment_name, Config.nats_rpc, logger)
27
36
  @notifier.send_start_event
28
37
 
29
- cloud_config_model = Bosh::Director::Models::CloudConfig[@cloud_config_id]
30
- planner_factory = DeploymentPlan::PlannerFactory.create(event_log, logger)
31
- deployment_plan = planner_factory.planner(deployment_manifest_hash, cloud_config_model, @options)
38
+ deployment_plan = nil
39
+
40
+ event_log.begin_stage('Preparing deployment', 1)
41
+ event_log.track('Preparing deployment') do
42
+ planner_factory = DeploymentPlan::PlannerFactory.create(logger)
43
+ deployment_plan = planner_factory.create_from_manifest(deployment_manifest_hash, cloud_config_model, @options)
44
+ deployment_plan.bind_models
45
+ end
32
46
 
47
+ deployment_plan.compile_packages
48
+
49
+ render_job_templates(deployment_plan.jobs_starting_on_deploy)
33
50
  update_step(deployment_plan).perform
34
51
  @notifier.send_end_event
35
52
  logger.info('Finished updating deployment')
@@ -53,18 +70,12 @@ module Bosh::Director
53
70
  # Job tasks
54
71
 
55
72
  def update_step(deployment_plan)
56
- resource_pool_updaters = deployment_plan.resource_pools.map do |resource_pool|
57
- ResourcePoolUpdater.new(resource_pool)
58
- end
59
- resource_pools = DeploymentPlan::ResourcePools.new(event_log, resource_pool_updaters)
60
73
  DeploymentPlan::Steps::UpdateStep.new(
61
74
  self,
62
75
  event_log,
63
- resource_pools,
64
76
  deployment_plan,
65
77
  multi_job_updater,
66
- Config.cloud,
67
- App.instance.blobstores.blobstore
78
+ Config.cloud
68
79
  )
69
80
  end
70
81
 
@@ -72,7 +83,14 @@ module Bosh::Director
72
83
 
73
84
  def multi_job_updater
74
85
  @multi_job_updater ||= begin
75
- DeploymentPlan::BatchMultiJobUpdater.new(JobUpdaterFactory.new(@blobstore))
86
+ DeploymentPlan::BatchMultiJobUpdater.new(JobUpdaterFactory.new(Config.cloud, logger))
87
+ end
88
+ end
89
+
90
+ def render_job_templates(jobs)
91
+ job_renderer = JobRenderer.create
92
+ jobs.each do |job|
93
+ job_renderer.render_job_instances(job.needed_instance_plans)
76
94
  end
77
95
  end
78
96
  end
@@ -383,6 +383,7 @@ module Bosh::Director
383
383
  all_compiled_packages.each do |compiled_package_spec|
384
384
  package = compiled_package_spec[:package]
385
385
  stemcell = compiled_package_spec[:stemcell]
386
+ compiled_pkg_tgz = File.join(release_dir, 'compiled_packages', "#{package.name}.tgz")
386
387
 
387
388
  existing_compiled_package = Models::CompiledPackage.where(:package_id => package.id, :stemcell_id => stemcell.id)
388
389
  if existing_compiled_package.empty?
@@ -390,9 +391,14 @@ module Bosh::Director
390
391
  package_desc = "#{package.name}/#{package.version} for #{stemcell.name}/#{stemcell.version}"
391
392
  event_log.track(package_desc) do
392
393
  other_compiled_package = get_other_compiled_package(package, packages_existing_from_other_releases, stemcell)
394
+ if @fix && !other_compiled_package.nil?
395
+ fix_compiled_package(other_compiled_package, compiled_pkg_tgz)
396
+ end
393
397
  create_compiled_package(package, stemcell, release_dir, other_compiled_package)
394
398
  had_effect = true
395
399
  end
400
+ elsif @fix
401
+ fix_compiled_package(existing_compiled_package.first, compiled_pkg_tgz)
396
402
  end
397
403
  end
398
404
 
@@ -437,7 +443,6 @@ module Bosh::Director
437
443
  if other_compiled_package.nil?
438
444
  tgz = File.join(release_dir, 'compiled_packages', "#{package.name}.tgz")
439
445
  validate_tgz(tgz, "#{package.name}.tgz")
440
-
441
446
  blobstore_id = BlobUtil.create_blob(tgz)
442
447
  sha1 = Digest::SHA1.file(tgz).hexdigest
443
448
  else
@@ -493,7 +498,7 @@ module Bosh::Director
493
498
  package.sha1 = package_meta['sha1']
494
499
 
495
500
  if package.blobstore_id != nil
496
- fix_compiled_packages package
501
+ delete_compiled_packages package
497
502
  validate_tgz(package_tgz, desc)
498
503
  fix_package(package, package_tgz)
499
504
  return true
@@ -501,7 +506,7 @@ module Bosh::Director
501
506
 
502
507
  if existing_blob
503
508
  pkg = Models::Package.where(blobstore_id: existing_blob).first
504
- fix_compiled_packages package
509
+ delete_compiled_packages package
505
510
  fix_package(pkg, package_tgz)
506
511
  package.blobstore_id = BlobUtil.copy_blob(pkg.blobstore_id)
507
512
  return true
@@ -647,9 +652,10 @@ module Bosh::Director
647
652
  package.blobstore_id = BlobUtil.create_blob(package_tgz)
648
653
  logger.info("Re-created package '#{package.name}/#{package.version}' \
649
654
  with blobstore_id '#{package.blobstore_id}'")
655
+ package.save
650
656
  end
651
657
 
652
- def fix_compiled_packages(package)
658
+ def delete_compiled_packages(package)
653
659
  package.compiled_packages.each do |compiled_pkg|
654
660
  unless BlobUtil.verify_blob(compiled_pkg.blobstore_id, compiled_pkg.sha1)
655
661
  logger.info("Deleting compiled package '#{compiled_pkg.name}' \
@@ -665,6 +671,21 @@ for '#{compiled_pkg.stemcell.name}/#{compiled_pkg.stemcell.version}' with blobst
665
671
  end
666
672
  end
667
673
  end
674
+
675
+ def fix_compiled_package(compiled_pkg, compiled_pkg_tgz)
676
+ begin
677
+ logger.info("Deleting compiled package '#{compiled_pkg.name}/#{compiled_pkg.version}' \
678
+ for '#{compiled_pkg.stemcell.name}/#{compiled_pkg.stemcell.version}' with blobstore_id '#{compiled_pkg.blobstore_id}'")
679
+ BlobUtil.delete_blob compiled_pkg.blobstore_id
680
+ rescue Bosh::Blobstore::BlobstoreError => e
681
+ logger.info("Error deleting compiled package '#{compiled_pkg.name}' \
682
+ with blobstore_id '#{compiled_pkg.blobstore_id}' #{e.inspect}")
683
+ end
684
+ compiled_pkg.blobstore_id = BlobUtil.create_blob(compiled_pkg_tgz)
685
+ logger.info("Re-created compiled package '#{compiled_pkg.name}/#{compiled_pkg.version}' \
686
+ with blobstore_id '#{compiled_pkg.blobstore_id}'")
687
+ compiled_pkg.save
688
+ end
668
689
  end
669
690
  end
670
691
  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 VmState < BaseJob
@@ -11,15 +9,12 @@ module Bosh::Director
11
9
  :vms
12
10
  end
13
11
 
14
- # @param [Integer] deployment_id Deployment id
15
12
  def initialize(deployment_id, format)
16
13
  @deployment_id = deployment_id
17
14
  @format = format
18
15
  end
19
16
 
20
17
  def perform
21
- @domain = Models::Dns::Domain.find(name: Config.dns_domain_name, type: "NATIVE") if Config.dns_enabled?
22
-
23
18
  vms = Models::Vm.filter(:deployment_id => @deployment_id)
24
19
  ThreadPool.new(:max_threads => Config.max_threads).wrap do |pool|
25
20
  vms.each do |vm|
@@ -37,62 +32,58 @@ module Bosh::Director
37
32
  def process_vm(vm)
38
33
  ips = []
39
34
  dns_records = []
40
- job_name = nil
41
35
  job_state = nil
42
- resource_pool = nil
43
36
  job_vitals = nil
44
- job_index = nil
45
37
  processes = []
46
38
 
47
39
  begin
48
40
  agent = AgentClient.with_vm(vm, :timeout => TIMEOUT)
49
41
  agent_state = agent.get_state(@format)
50
- agent_state["networks"].each_value do |network|
51
- ips << network["ip"]
42
+ agent_state['networks'].each_value do |network|
43
+ ips << network['ip']
52
44
  end
53
45
 
54
- job_index = get_index(agent_state)
55
-
56
- job_name = agent_state["job"]["name"] if agent_state["job"]
57
- job_state = agent_state["job_state"]
58
- if agent_state["resource_pool"]
59
- resource_pool = agent_state["resource_pool"]["name"]
46
+ job_state = agent_state['job_state']
47
+ if agent_state['vitals']
48
+ job_vitals = agent_state['vitals']
60
49
  end
61
- if agent_state["vitals"]
62
- job_vitals = agent_state["vitals"]
63
- end
64
- processes = agent_state["processes"] if agent_state["processes"]
50
+ processes = agent_state['processes'] if agent_state['processes']
65
51
  rescue Bosh::Director::RpcTimeout
66
- job_state = "unresponsive agent"
52
+ job_state = 'unresponsive agent'
67
53
  end
68
54
 
69
- if @domain
70
- ips.each do |ip|
71
- records = Models::Dns::Record.filter(domain_id: @domain.id, type: "A", content: ip)
72
- dns_records << records.collect { |record| record.name } unless records.empty?
73
- end
55
+ if dns_manager.dns_enabled?
56
+ dns_records = dns_manager.find_dns_record_names_by_instance(vm.instance)
57
+ dns_records.sort_by! { |name| -(name.split('.').first.length) }
74
58
  end
75
59
 
60
+ vm_apply_spec = vm.instance ? vm.instance.spec : {}
61
+ vm_type_name = vm_apply_spec && vm_apply_spec['vm_type'] ? vm_apply_spec['vm_type']['name'] : nil
62
+
76
63
  {
77
64
  :vm_cid => vm.cid,
78
65
  :disk_cid => vm.instance ? vm.instance.persistent_disk_cid : nil,
79
66
  :ips => ips,
80
- :dns => dns_records.flatten,
67
+ :dns => dns_records,
81
68
  :agent_id => vm.agent_id,
82
- :job_name => job_name,
83
- :index => job_index,
69
+ :job_name => vm.instance ? vm.instance.job : nil,
70
+ :index => vm.instance ? vm.instance.index : nil,
84
71
  :job_state => job_state,
85
- :resource_pool => resource_pool,
72
+ :resource_pool => vm_type_name,
73
+ :vm_type => vm_type_name,
86
74
  :vitals => job_vitals,
87
75
  :processes => processes,
88
- :resurrection_paused => vm.instance ? vm.instance.resurrection_paused : nil,
76
+ :resurrection_paused => vm.instance ? vm.instance.resurrection_paused : nil,
77
+ :az => vm.instance ? vm.instance.availability_zone : nil,
78
+ :id => vm.instance ? vm.instance.uuid : nil,
79
+ :bootstrap => vm.instance ? vm.instance.bootstrap : false
89
80
  }
90
81
  end
91
82
 
92
83
  private
93
84
 
94
85
  def get_index(agent_state)
95
- index = agent_state["index"]
86
+ index = agent_state['index']
96
87
 
97
88
  # Postgres cannot coerce an empty string to integer, and fails on Models::Instance.find
98
89
  index = nil if index.is_a?(String) && index.empty?
@@ -93,7 +93,7 @@ module Bosh::Director
93
93
  end
94
94
  end
95
95
 
96
- raise TimeoutError if Time.now - started > @timeout
96
+ raise TimeoutError, "Redis lock #{@name} is acquired by another thread" if Time.now - started > @timeout
97
97
 
98
98
  sleep(0.5)
99
99
 
@@ -110,15 +110,20 @@ module Bosh::Director
110
110
 
111
111
  redis.watch(@name)
112
112
  existing_lock = redis.get(@name)
113
- lock_id = existing_lock.split(":")[1]
114
- if lock_id == @id
115
- redis.multi do
116
- redis.del(@name)
117
- end
118
- else
113
+ if existing_lock.nil?
114
+ @logger.debug("Lost lock #@name")
119
115
  redis.unwatch
116
+ else
117
+ lock_id = existing_lock.split(":")[1]
118
+ if lock_id == @id
119
+ redis.multi do
120
+ redis.del(@name)
121
+ end
122
+ else
123
+ redis.unwatch
124
+ end
125
+ @logger.debug("Deleted lock: #@name")
120
126
  end
121
- @logger.debug("Deleted lock: #@name")
122
127
  end
123
128
 
124
129
  def lock_expired?(lock)
@@ -21,7 +21,7 @@ module Bosh::Director
21
21
  agent = @instance_manager.agent_client_for(instance)
22
22
  blobstore_id = nil
23
23
 
24
- stage = @event_log.begin_stage("Fetching logs for #{instance.job}/#{instance.index}", 1)
24
+ stage = @event_log.begin_stage("Fetching logs for #{instance.job}/#{instance.uuid} (#{instance.index})", 1)
25
25
  stage.advance_and_track('Finding and packing log files') do
26
26
  fetch_logs_result = agent.fetch_logs(log_type, filters)
27
27
  blobstore_id = fetch_logs_result['blobstore_id']