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
@@ -31,8 +31,9 @@ module Bosh::Director
31
31
 
32
32
  def description
33
33
  job = @instance.job || "unknown job"
34
+ uuid = @instance.uuid || "unknown id"
34
35
  index = @instance.index || "unknown index"
35
- disk_label = "`#{@disk.disk_cid}' (#{job}/#{index}, #{@disk.size.to_i}M)"
36
+ disk_label = "`#{@disk.disk_cid}' (#{@disk.size.to_i}M) for instance `#{job}/#{uuid} (#{index})'"
36
37
  "Disk #{disk_label} is inactive"
37
38
  end
38
39
 
@@ -82,29 +83,13 @@ module Bosh::Director
82
83
  end
83
84
  end
84
85
 
85
- # FIXME: Currently there is no good way to know if delete_disk
86
- # failed because of cloud error or because disk doesn't exist
87
- # in vsphere_disks.
88
- begin
89
- cloud.delete_disk(@disk.disk_cid)
90
- rescue Bosh::Clouds::DiskNotFound, RuntimeError => e # FIXME
91
- @logger.warn(e)
92
- end
93
-
94
- @disk.destroy
86
+ DiskManager.new(cloud, @logger).orphan_disk(@disk)
95
87
  end
96
88
 
97
89
  def disk_mounted?
98
90
  return false if @vm.nil?
99
-
100
- begin
101
- agent_timeout_guard(@vm) do |agent|
102
- agent.list_disk.include?(@disk.disk_cid)
103
- end
104
- rescue RuntimeError
105
- # old stemcells without 'list_disk' support. We need to play
106
- # conservative and assume that the disk is mounted.
107
- true
91
+ agent_timeout_guard(@vm) do |agent|
92
+ agent.list_disk.include?(@disk.disk_cid)
108
93
  end
109
94
  end
110
95
  end
@@ -41,9 +41,7 @@ module Bosh::Director
41
41
  end
42
42
 
43
43
  def delete_disk_reference
44
- @disk.db.transaction do
45
- @disk.update(active: false)
46
- end
44
+ @disk.update(active: false)
47
45
 
48
46
  # If VM is present we try to unmount and detach disk from VM
49
47
  if @vm && @vm.cid && cloud.has_vm?(@vm.cid)
@@ -74,17 +72,8 @@ module Bosh::Director
74
72
  end
75
73
  end
76
74
 
77
- @logger.debug('Deleting disk snapshots')
78
- Api::SnapshotManager.delete_snapshots(@disk.snapshots)
79
-
80
- begin
81
- @logger.debug('Sending cpi request: delete_disk')
82
- cloud.delete_disk(@disk.disk_cid)
83
- rescue Bosh::Clouds::DiskNotFound
84
- end
75
+ DiskManager.new(cloud, @logger).orphan_disk(@disk)
85
76
 
86
- @logger.debug('Removing disk reference from database')
87
- @disk.destroy
88
77
  end
89
78
  end
90
79
  end
@@ -54,7 +54,7 @@ module Bosh::Director
54
54
  resolution = @resolutions[problem.id.to_s] || handler.auto_resolution
55
55
  problem_summary = "#{problem.type} #{problem.resource_id}"
56
56
  resolution_summary = handler.resolution_plan(resolution)
57
- resolution_summary ||= "no resolution"
57
+ resolution_summary ||= 'no resolution'
58
58
 
59
59
  begin
60
60
  track_and_log("#{problem_summary}: #{resolution_summary}") do
@@ -64,7 +64,7 @@ module Bosh::Director
64
64
  log_resolution_error(problem, e)
65
65
  end
66
66
 
67
- problem.state = "resolved"
67
+ problem.state = 'resolved'
68
68
  problem.save
69
69
  @resolved_count += 1
70
70
 
@@ -45,8 +45,7 @@ module Bosh::Director
45
45
  @event_logger.track_and_log("#{results[:ok]} OK, " +
46
46
  "#{results[:unresponsive]} unresponsive, " +
47
47
  "#{results[:missing]} missing, " +
48
- "#{results[:unbound]} unbound, " +
49
- "#{results[:out_of_sync]} out of sync")
48
+ "#{results[:unbound]} unbound")
50
49
  end
51
50
 
52
51
  private
@@ -59,7 +58,7 @@ module Bosh::Director
59
58
 
60
59
  instance, mounted_disk_cid = @problem_register.get_vm_instance_and_disk(vm)
61
60
 
62
- agent = AgentClient.with_defaults(vm.agent_id, agent_options)
61
+ agent = AgentClient.with_vm(vm, agent_options)
63
62
  begin
64
63
  state = agent.get_state
65
64
 
@@ -69,13 +68,9 @@ module Bosh::Director
69
68
  mounted_disk_cid = disk_list.first
70
69
  rescue Bosh::Director::RpcTimeout
71
70
  mounted_disk_cid = nil
72
- rescue RuntimeError
73
- # For old agents that doesn't implement list_disk we assume the disk is mounted
74
- @logger.info("agent.list_disk failed on agent #{vm.agent_id}")
75
71
  end
76
72
  add_disk_owner(mounted_disk_cid, vm.cid) if mounted_disk_cid
77
73
 
78
- return :out_of_sync if is_out_of_sync_vm?(vm, instance, state)
79
74
  return :unbound if is_unbound_instance_vm?(vm, instance, state)
80
75
  :ok
81
76
  rescue Bosh::Director::RpcTimeout
@@ -103,20 +98,6 @@ module Bosh::Director
103
98
  @agent_disks[disk_cid] << vm_cid
104
99
  end
105
100
 
106
- def is_out_of_sync_vm?(vm, instance, state)
107
- job = state['job'] ? state['job']['name'] : nil
108
- index = state['index']
109
- if state['deployment'] != @deployment.name ||
110
- (instance && (instance.job != job || instance.index != index))
111
- @problem_register.problem_found(:out_of_sync_vm, vm,
112
- deployment: state['deployment'],
113
- job: job, index: index)
114
- true
115
- else
116
- false
117
- end
118
- end
119
-
120
101
  def is_unbound_instance_vm?(vm, instance, state)
121
102
  job = state['job'] ? state['job']['name'] : nil
122
103
  index = state['index']
@@ -42,16 +42,33 @@ module Bosh::Director
42
42
  end
43
43
 
44
44
  @scheduler.cron(scheduled_job['schedule']) do |_|
45
- logger.info("enqueueing `#{scheduled_job['command']}'")
46
45
 
47
- @queue.enqueue('scheduler',
48
- director_job_class,
49
- "scheduled #{scheduled_job['command']}",
50
- scheduled_job['params'])
46
+ should_enqueue = true
47
+ if director_job_class.respond_to?(:has_work)
48
+ logger.debug("Scheduler cron - checking /
49
+ #{director_job_class}.has_work:#{director_job_class.has_work(scheduled_job['params'])} /
50
+ with params #{scheduled_job['params']}")
51
+
52
+ should_enqueue = director_job_class.has_work(scheduled_job['params'])
53
+ end
54
+
55
+ if should_enqueue
56
+ logger.info("enqueueing `#{scheduled_job['command']}'")
57
+
58
+ schedule_message = "scheduled #{scheduled_job['command']}"
59
+ if director_job_class.respond_to?(:schedule_message)
60
+ schedule_message = director_job_class.schedule_message
61
+ end
62
+
63
+ @queue.enqueue('scheduler',
64
+ director_job_class,
65
+ schedule_message,
66
+ scheduled_job['params'])
67
+ end
51
68
  end
52
69
 
53
70
  logger.info("added scheduled job `#{director_job_class}' with interval '#{scheduled_job['schedule']}'")
54
71
  end
55
72
  end
56
73
  end
57
- end
74
+ end
@@ -1,33 +1,39 @@
1
1
  module Bosh::Director
2
- class InstanceUpdater::Stopper
3
- def initialize(instance, agent_client, target_state, skip_drain, config, logger)
4
- @instance = instance
5
- @agent_client = agent_client
2
+ class Stopper
3
+ def initialize(instance_plan, target_state, config, logger)
4
+ @instance_plan = instance_plan
5
+ @instance_model = @instance_plan.new? ? instance_plan.instance.model : instance_plan.existing_instance
6
6
  @target_state = target_state
7
- @skip_drain = skip_drain
8
7
  @config = config
9
8
  @logger = logger
10
9
  end
11
10
 
12
11
  def stop
13
- if @skip_drain
14
- @logger.info("Skipping drain for '#{@instance}'")
12
+ return if @instance_model.compilation || @instance_model.vm.nil?
13
+
14
+ if @instance_plan.skip_drain
15
+ @logger.info("Skipping drain for '#{@instance_model}'")
15
16
  else
16
17
  perform_drain
17
18
  end
18
19
 
19
- @agent_client.stop
20
+ agent_client.stop
20
21
  end
21
22
 
22
23
  private
23
24
 
25
+ def agent_client
26
+ @agent_client ||= AgentClient.with_vm(@instance_model.vm)
27
+ end
28
+
24
29
  def perform_drain
25
- drain_type = shutting_down? ? 'shutdown' : 'update'
30
+ drain_type = needs_drain_to_migrate_data? ? 'shutdown' : 'update'
26
31
 
27
32
  # Apply spec might change after shutdown drain (unlike update drain)
28
33
  # because instance's VM could be reconfigured.
29
34
  # Drain script can still capture intent from non-final apply spec.
30
- drain_time = @agent_client.drain(drain_type, @instance.spec)
35
+ drain_apply_spec = @instance_plan.spec.as_apply_spec
36
+ drain_time = agent_client.drain(drain_type, drain_apply_spec)
31
37
 
32
38
  if drain_time > 0
33
39
  sleep(drain_time)
@@ -36,12 +42,12 @@ module Bosh::Director
36
42
  end
37
43
  end
38
44
 
39
- def shutting_down?
40
- @instance.resource_pool_changed? ||
41
- @instance.persistent_disk_changed? ||
42
- @instance.networks_changed? ||
43
- @target_state == 'stopped' ||
44
- @target_state == 'detached'
45
+ def needs_drain_to_migrate_data?
46
+ @target_state == 'stopped' ||
47
+ @target_state == 'detached' ||
48
+ @instance_plan.needs_shutting_down? ||
49
+ @instance_plan.persistent_disk_changed? ||
50
+ @instance_plan.networks_changed?
45
51
  end
46
52
 
47
53
  def wait_for_dynamic_drain(initial_drain_time)
@@ -50,7 +56,7 @@ module Bosh::Director
50
56
  loop do
51
57
  wait_time = drain_time.abs
52
58
  if wait_time > 0
53
- @logger.info("`#{@instance}' is draining: checking back in #{wait_time}s")
59
+ @logger.info("`#{@instance_model}' is draining: checking back in #{wait_time}s")
54
60
  sleep(wait_time)
55
61
  end
56
62
 
@@ -62,7 +68,7 @@ module Bosh::Director
62
68
  # realistically speaking, all agents have already been updated
63
69
  # to support drain status mechanism and swallowing real errors
64
70
  # would be bad here, as it could mask potential problems.
65
- drain_time = @agent_client.drain('status')
71
+ drain_time = agent_client.drain('status')
66
72
  end
67
73
  end
68
74
  end
@@ -0,0 +1,30 @@
1
+ module Bosh::Director
2
+ class TaggedLogger
3
+ def initialize(logger, *tags)
4
+ @logger = logger
5
+ @tags = tags.map { |t| "[#{t}]" }.join('')
6
+ end
7
+
8
+ def error(message)
9
+ @logger.error(tag_message(message))
10
+ end
11
+
12
+ def info(message)
13
+ @logger.info(tag_message(message))
14
+ end
15
+
16
+ def debug(message)
17
+ @logger.debug(tag_message(message))
18
+ end
19
+
20
+ def warn(message)
21
+ @logger.warn(tag_message(message))
22
+ end
23
+
24
+ private
25
+
26
+ def tag_message(message)
27
+ "#{@tags} #{message}"
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,9 @@
1
+ module Bosh::Director
2
+ class Transactor
3
+ def retryable_transaction(db, &block)
4
+ Bosh::Common.retryable(tries: 3, on: [Sequel::DatabaseError], matching: /Mysql2::Error: Deadlock found when trying to get lock/) do |attempt, e|
5
+ db.transaction(&block) || true
6
+ end
7
+ end
8
+ end
9
+ end
@@ -1,5 +1,5 @@
1
1
  module Bosh
2
2
  module Director
3
- VERSION = '1.3160.0'
3
+ VERSION = '1.3163.0'
4
4
  end
5
5
  end
@@ -5,17 +5,95 @@ module Bosh::Director
5
5
  class VmCreator
6
6
  include EncryptionHelper
7
7
 
8
- def self.create(*args)
9
- new.create(*args)
8
+ def initialize(cloud, logger, vm_deleter, disk_manager, job_renderer)
9
+ @cloud = cloud
10
+ @logger = logger
11
+ @vm_deleter = vm_deleter
12
+ @disk_manager = disk_manager
13
+ @job_renderer = job_renderer
10
14
  end
11
15
 
12
- def initialize
13
- @cloud = Config.cloud
14
- @logger = Config.logger
16
+ def create_for_instance_plans(instance_plans, ip_provider, event_log)
17
+ return @logger.info('No missing vms to create') if instance_plans.empty?
18
+
19
+ total = instance_plans.size
20
+ event_log.begin_stage('Creating missing vms', total)
21
+ ThreadPool.new(max_threads: Config.max_threads, logger: @logger).wrap do |pool|
22
+ instance_plans.each do |instance_plan|
23
+ instance = instance_plan.instance
24
+
25
+ pool.process do
26
+ with_thread_name("create_missing_vm(#{instance}/#{total})") do
27
+ event_log.track(instance.model.to_s) do
28
+ @logger.info('Creating missing VM')
29
+ disks = [instance.model.persistent_disk_cid].compact
30
+ create_for_instance_plan(instance_plan, disks)
31
+
32
+ instance_plan.network_plans
33
+ .select(&:obsolete?)
34
+ .each do |network_plan|
35
+ reservation = network_plan.reservation
36
+ ip_provider.release(reservation)
37
+ end
38
+ instance_plan.release_obsolete_network_plans
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
15
44
  end
16
45
 
17
- def create(deployment, stemcell, cloud_properties, network_settings,
18
- disks=nil, env={})
46
+ def create_for_instance_plan(instance_plan, disks)
47
+ instance = instance_plan.instance
48
+ @logger.info('Creating VM')
49
+
50
+ vm_model = create(
51
+ instance.deployment_model,
52
+ instance.stemcell,
53
+ instance.cloud_properties,
54
+ instance_plan.network_settings_hash,
55
+ disks,
56
+ instance.env,
57
+ )
58
+
59
+ begin
60
+ instance.bind_to_vm_model(vm_model)
61
+ VmMetadataUpdater.build.update(vm_model, {})
62
+
63
+ agent_client = AgentClient.with_vm(vm_model)
64
+ agent_client.wait_until_ready
65
+ instance.update_trusted_certs
66
+ instance.update_cloud_properties!
67
+ rescue Exception => e
68
+ @logger.error("Failed to create/contact VM #{vm_model.cid}: #{e.inspect}")
69
+ if Config.keep_unreachable_vms
70
+ @logger.info("Keeping the VM for debugging")
71
+ else
72
+ @vm_deleter.delete_for_instance_plan(instance_plan)
73
+ end
74
+ raise e
75
+ end
76
+
77
+ @disk_manager.attach_disks_if_needed(instance_plan)
78
+
79
+ apply_initial_vm_state(instance_plan)
80
+
81
+ instance_plan.mark_desired_network_plans_as_existing
82
+ end
83
+
84
+ private
85
+
86
+ def apply_initial_vm_state(instance_plan)
87
+ instance_plan.instance.apply_initial_vm_state(instance_plan.spec)
88
+
89
+ unless instance_plan.instance.compilation?
90
+ # re-render job templates with updated dynamic network settings
91
+ @logger.debug("Re-rendering templates with spec: #{instance_plan.spec.as_template_spec}")
92
+ @job_renderer.render_job_instance(instance_plan)
93
+ end
94
+ end
95
+
96
+ def create(deployment, stemcell, cloud_properties, network_settings, disks, env)
19
97
  vm = nil
20
98
  vm_cid = nil
21
99
 
@@ -24,9 +102,9 @@ module Bosh::Director
24
102
  agent_id = self.class.generate_agent_id
25
103
 
26
104
  options = {
27
- :deployment => deployment,
28
- :agent_id => agent_id,
29
- :env => env
105
+ :deployment => deployment,
106
+ :agent_id => agent_id,
107
+ :env => env
30
108
  }
31
109
 
32
110
  if Config.encryption?
@@ -41,7 +119,7 @@ module Bosh::Director
41
119
  vm_cid = @cloud.create_vm(agent_id, stemcell.cid, cloud_properties, network_settings, disks, env)
42
120
  rescue Bosh::Clouds::VMCreationFailed => e
43
121
  count += 1
44
- logger.error("failed to create VM, retrying (#{count})")
122
+ @logger.error("failed to create VM, retrying (#{count})")
45
123
  retry if e.ok_to_retry && count < Config.max_vm_create_tries
46
124
  raise e
47
125
  end
@@ -50,10 +128,9 @@ module Bosh::Director
50
128
  vm = Models::Vm.new(options)
51
129
 
52
130
  vm.save
53
- VmMetadataUpdater.build.update(vm, {})
54
131
  vm
55
132
  rescue => e
56
- logger.error("error creating vm: #{e.message}")
133
+ @logger.error("error creating vm: #{e.message}")
57
134
  delete_vm(vm_cid) if vm_cid
58
135
  vm.destroy if vm
59
136
  raise e
@@ -62,16 +139,11 @@ module Bosh::Director
62
139
  def delete_vm(vm_cid)
63
140
  @cloud.delete_vm(vm_cid)
64
141
  rescue => e
65
- logger.error("error cleaning up #{vm_cid}: #{e.message}\n#{e.backtrace.join("\n")}")
142
+ @logger.error("error cleaning up #{vm_cid}: #{e.message}\n#{e.backtrace.join("\n")}")
66
143
  end
67
144
 
68
145
  def self.generate_agent_id
69
146
  SecureRandom.uuid
70
147
  end
71
-
72
- def logger
73
- Config.logger
74
- end
75
-
76
148
  end
77
149
  end