bosh-director 1.3173.0 → 1.3177.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (70) hide show
  1. checksums.yaml +4 -4
  2. data/db/migrations/director/20151229184742_add_vm_attributes_to_instance.rb +25 -0
  3. data/db/migrations/director/20160108191637_drop_vm_env_json_from_instance.rb +7 -0
  4. data/lib/bosh/director/api/controllers/base_controller.rb +1 -1
  5. data/lib/bosh/director/api/controllers/deployments_controller.rb +1 -1
  6. data/lib/bosh/director/api/deployment_manager.rb +10 -12
  7. data/lib/bosh/director/api/instance_manager.rb +5 -6
  8. data/lib/bosh/director/api/snapshot_manager.rb +1 -2
  9. data/lib/bosh/director/cloudcheck_helper.rb +30 -52
  10. data/lib/bosh/director/config.rb +2 -1
  11. data/lib/bosh/director/deployment_deleter.rb +0 -21
  12. data/lib/bosh/director/deployment_plan.rb +1 -1
  13. data/lib/bosh/director/deployment_plan/agent_state_migrator.rb +7 -19
  14. data/lib/bosh/director/deployment_plan/assembler.rb +6 -30
  15. data/lib/bosh/director/deployment_plan/compilation_instance_pool.rb +2 -4
  16. data/lib/bosh/director/deployment_plan/dynamic_network.rb +1 -1
  17. data/lib/bosh/director/deployment_plan/instance.rb +6 -46
  18. data/lib/bosh/director/deployment_plan/instance_network_reservations.rb +13 -13
  19. data/lib/bosh/director/deployment_plan/instance_plan.rb +3 -3
  20. data/lib/bosh/director/deployment_plan/instance_plan_factory.rb +12 -4
  21. data/lib/bosh/director/deployment_plan/instance_planner.rb +5 -4
  22. data/lib/bosh/director/deployment_plan/instance_repository.rb +7 -14
  23. data/lib/bosh/director/deployment_plan/instance_spec.rb +2 -2
  24. data/lib/bosh/director/deployment_plan/ip_provider/database_ip_repo.rb +7 -7
  25. data/lib/bosh/director/deployment_plan/ip_provider/in_memory_ip_repo.rb +6 -3
  26. data/lib/bosh/director/deployment_plan/ip_provider/ip_provider.rb +4 -4
  27. data/lib/bosh/director/deployment_plan/job.rb +0 -7
  28. data/lib/bosh/director/deployment_plan/job_migrator.rb +3 -2
  29. data/lib/bosh/director/deployment_plan/manual_network_subnet.rb +1 -1
  30. data/lib/bosh/director/deployment_plan/network_planner/planner.rb +2 -2
  31. data/lib/bosh/director/deployment_plan/network_reservation_repository.rb +20 -0
  32. data/lib/bosh/director/deployment_plan/placement_planner/static_ips_availability_zone_picker.rb +2 -1
  33. data/lib/bosh/director/deployment_plan/planner.rb +2 -17
  34. data/lib/bosh/director/deployment_plan/steps/package_compile_step.rb +1 -1
  35. data/lib/bosh/director/deployment_plan/steps/update_step.rb +1 -21
  36. data/lib/bosh/director/disk_manager.rb +8 -8
  37. data/lib/bosh/director/dns/dns_manager.rb +76 -20
  38. data/lib/bosh/director/errand/job_manager.rb +1 -1
  39. data/lib/bosh/director/instance_deleter.rb +1 -3
  40. data/lib/bosh/director/instance_updater.rb +4 -3
  41. data/lib/bosh/director/job_updater.rb +10 -2
  42. data/lib/bosh/director/jobs/base_job.rb +1 -1
  43. data/lib/bosh/director/jobs/cloud_check/scan_and_fix.rb +3 -3
  44. data/lib/bosh/director/jobs/create_snapshot.rb +1 -1
  45. data/lib/bosh/director/jobs/delete_deployment.rb +1 -1
  46. data/lib/bosh/director/jobs/delete_deployment_snapshots.rb +1 -1
  47. data/lib/bosh/director/jobs/snapshot_deployment.rb +2 -2
  48. data/lib/bosh/director/jobs/vm_state.rb +16 -17
  49. data/lib/bosh/director/models.rb +0 -1
  50. data/lib/bosh/director/models/deployment.rb +0 -3
  51. data/lib/bosh/director/models/instance.rb +17 -10
  52. data/lib/bosh/director/network_reservation.rb +15 -16
  53. data/lib/bosh/director/problem_handlers/inactive_disk.rb +4 -6
  54. data/lib/bosh/director/problem_handlers/missing_disk.rb +3 -5
  55. data/lib/bosh/director/problem_handlers/missing_vm.rb +8 -10
  56. data/lib/bosh/director/problem_handlers/mount_info_mismatch.rb +8 -3
  57. data/lib/bosh/director/problem_handlers/unresponsive_agent.rb +14 -29
  58. data/lib/bosh/director/problem_scanner/disk_scan_stage.rb +1 -4
  59. data/lib/bosh/director/problem_scanner/problem_register.rb +2 -4
  60. data/lib/bosh/director/problem_scanner/scanner.rb +1 -1
  61. data/lib/bosh/director/problem_scanner/vm_scan_stage.rb +17 -35
  62. data/lib/bosh/director/stopper.rb +2 -2
  63. data/lib/bosh/director/version.rb +1 -1
  64. data/lib/bosh/director/vm_creator.rb +15 -33
  65. data/lib/bosh/director/vm_deleter.rb +6 -8
  66. data/lib/bosh/director/vm_metadata_updater.rb +5 -7
  67. data/lib/bosh/director/vm_recreator.rb +3 -2
  68. metadata +19 -18
  69. data/lib/bosh/director/deployment_plan/vm.rb +0 -22
  70. data/lib/bosh/director/models/vm.rb +0 -38
@@ -23,7 +23,7 @@ module Bosh::Director
23
23
  instances += migrated_from_instances
24
24
  end
25
25
 
26
- instances
26
+ instances.uniq
27
27
  end
28
28
 
29
29
  private
@@ -33,7 +33,8 @@ module Bosh::Director
33
33
  migrated_from_instances = []
34
34
 
35
35
  migrated_from_jobs.each do |migrated_from_job|
36
- if @deployment_plan.job(migrated_from_job.name)
36
+ existing_job = @deployment_plan.job(migrated_from_job.name)
37
+ if existing_job && existing_job.name != desired_job.name
37
38
  raise DeploymentInvalidMigratedFromJob,
38
39
  "Failed to migrate job '#{migrated_from_job.name}' to '#{desired_job_name}'. " +
39
40
  'A deployment can not migrate a job and also specify it. ' +
@@ -42,7 +42,7 @@ module Bosh::Director
42
42
  end
43
43
  end
44
44
 
45
- dns_manager = DnsManager.create
45
+ dns_manager = DnsManagerProvider.create
46
46
  dns_spec = safe_property(subnet_spec, 'dns', :class => Array, :optional => true)
47
47
  dns = dns_manager.dns_servers(network_name, dns_spec)
48
48
 
@@ -6,13 +6,13 @@ module Bosh::Director::DeploymentPlan
6
6
  end
7
7
 
8
8
  def network_plan_with_dynamic_reservation(instance_plan, job_network)
9
- reservation = Bosh::Director::DesiredNetworkReservation.new_dynamic(instance_plan.instance, job_network.deployment_network)
9
+ reservation = Bosh::Director::DesiredNetworkReservation.new_dynamic(instance_plan.instance.model, job_network.deployment_network)
10
10
  @logger.debug("Creating new dynamic reservation #{reservation} for instance '#{instance_plan.instance}'")
11
11
  Plan.new(reservation: reservation)
12
12
  end
13
13
 
14
14
  def network_plan_with_static_reservation(instance_plan, job_network, static_ip)
15
- reservation = Bosh::Director::DesiredNetworkReservation.new_static(instance_plan.instance, job_network.deployment_network, static_ip)
15
+ reservation = Bosh::Director::DesiredNetworkReservation.new_static(instance_plan.instance.model, job_network.deployment_network, static_ip)
16
16
  @logger.debug("Creating new static reservation #{reservation} for instance '#{instance_plan.instance}'")
17
17
  Plan.new(reservation: reservation)
18
18
  end
@@ -0,0 +1,20 @@
1
+ module Bosh::Director::DeploymentPlan
2
+ class NetworkReservationRepository
3
+ def initialize(deployment_plan, logger)
4
+ @deployment_plan = deployment_plan
5
+ @logger = logger
6
+ end
7
+
8
+ def fetch_network_reservations(existing_instance_model, existing_instance_state)
9
+ if existing_instance_model.ip_addresses.any?
10
+ InstanceNetworkReservations.create_from_db(existing_instance_model, @deployment_plan, @logger)
11
+ elsif existing_instance_state
12
+ # This is for backwards compatibility when we did not store
13
+ # network reservations in DB and constructed them from instance state
14
+ InstanceNetworkReservations.create_from_state(existing_instance_model, existing_instance_state, @deployment_plan, @logger)
15
+ else
16
+ InstanceNetworkReservations.new(@logger)
17
+ end
18
+ end
19
+ end
20
+ end
@@ -202,7 +202,8 @@ module Bosh
202
202
 
203
203
  def create_existing_instance_plan(desired_instance, existing_instance_model)
204
204
  if desired_instance.nil?
205
- @instance_plan_factory.obsolete_instance_plan(existing_instance_model, desired_instance)
205
+ # potentially a code path that never happens. It had been sending 2 for 1 which should have EXPLODED!!!
206
+ @instance_plan_factory.obsolete_instance_plan(existing_instance_model)
206
207
  else
207
208
  @instance_plan_factory.desired_existing_instance_plan(existing_instance_model, desired_instance)
208
209
  end
@@ -43,9 +43,6 @@ module Bosh::Director
43
43
  # Job instances from the old manifest that are not in the new manifest
44
44
  attr_reader :unneeded_instances
45
45
 
46
- # VMs from the old manifest that are not in the new manifest
47
- attr_accessor :unneeded_vms
48
-
49
46
  # @return [Boolean] Indicates whether VMs should be recreated
50
47
  attr_reader :recreate
51
48
 
@@ -103,7 +100,7 @@ module Bosh::Director
103
100
 
104
101
  def bind_models
105
102
  stemcell_manager = Api::StemcellManager.new
106
- dns_manager = DnsManager.create
103
+ dns_manager = DnsManagerProvider.create
107
104
  assembler = DeploymentPlan::Assembler.new(
108
105
  self,
109
106
  stemcell_manager,
@@ -123,7 +120,7 @@ module Bosh::Director
123
120
  disk_manager = DiskManager.new(cloud, @logger)
124
121
  job_renderer = JobRenderer.create
125
122
  vm_creator = Bosh::Director::VmCreator.new(cloud, @logger, vm_deleter, disk_manager, job_renderer)
126
- dns_manager = DnsManager.create
123
+ dns_manager = DnsManagerProvider.create
127
124
  instance_deleter = Bosh::Director::InstanceDeleter.new(ip_provider, dns_manager, disk_manager)
128
125
  compilation_instance_pool = CompilationInstancePool.new(InstanceReuser.new, vm_creator, self, @logger, instance_deleter)
129
126
  package_compile_step = DeploymentPlan::Steps::PackageCompileStep.new(
@@ -157,12 +154,6 @@ module Bosh::Director
157
154
  end
158
155
  end
159
156
 
160
- # Returns a list of Vms in the deployment (according to DB)
161
- # @return [Array<Models::Vm>]
162
- def vm_models
163
- @model.vms
164
- end
165
-
166
157
  def skip_drain_for_job?(name)
167
158
  @skip_drain.nil? ? false : @skip_drain.for_job(name)
168
159
  end
@@ -197,12 +188,6 @@ module Bosh::Director
197
188
  @releases[name]
198
189
  end
199
190
 
200
- # Adds a VM to deletion queue
201
- # @param [Bosh::Director::Models::Vm] vm VM DB model
202
- def mark_vm_for_deletion(vm)
203
- @unneeded_vms << vm
204
- end
205
-
206
191
  def instance_plans_with_missing_vms
207
192
  jobs_starting_on_deploy.collect_concat do |job|
208
193
  job.instance_plans_with_missing_vms
@@ -67,7 +67,7 @@ module Bosh::Director
67
67
  task_result = nil
68
68
 
69
69
  prepare_vm(stemcell) do |instance|
70
- vm_metadata_updater.update(instance.vm.model, :compiling => package.name)
70
+ vm_metadata_updater.update(instance.model, :compiling => package.name)
71
71
  agent_task =
72
72
  instance.agent_client.compile_package(
73
73
  package.blobstore_id,
@@ -31,9 +31,6 @@ module Bosh::Director
31
31
  private
32
32
 
33
33
  def assemble
34
- @logger.info('Deleting no longer needed VMs')
35
- delete_unneeded_vms
36
-
37
34
  @logger.info('Deleting no longer needed instances')
38
35
  delete_unneeded_instances
39
36
 
@@ -53,23 +50,6 @@ module Bosh::Director
53
50
  )
54
51
  end
55
52
 
56
- def delete_unneeded_vms
57
- unneeded_vms = @deployment_plan.unneeded_vms
58
- return @logger.info('No unneeded vms to delete') if unneeded_vms.empty?
59
-
60
- @event_log.begin_stage('Deleting unneeded VMs', unneeded_vms.size)
61
- ThreadPool.new(max_threads: Config.max_threads, logger: @logger).wrap do |pool|
62
- unneeded_vms.each do |vm_model|
63
- pool.process do
64
- @event_log.track(vm_model.cid) do
65
- @logger.info("Delete unneeded VM #{vm_model.cid}")
66
- @vm_deleter.delete_vm(vm_model)
67
- end
68
- end
69
- end
70
- end
71
- end
72
-
73
53
  def delete_unneeded_instances
74
54
  unneeded_instances = @deployment_plan.unneeded_instances
75
55
  if unneeded_instances.empty?
@@ -77,7 +57,7 @@ module Bosh::Director
77
57
  return
78
58
  end
79
59
  event_log_stage = @event_log.begin_stage('Deleting unneeded instances', unneeded_instances.size)
80
- dns_manager = DnsManager.create
60
+ dns_manager = DnsManagerProvider.create
81
61
  instance_deleter = InstanceDeleter.new(@deployment_plan.ip_provider, dns_manager, @disk_manager)
82
62
  unneeded_instance_plans = unneeded_instances.map do |instance|
83
63
  DeploymentPlan::InstancePlan.new(
@@ -39,10 +39,10 @@ module Bosh::Director
39
39
  instance = instance_plan.instance
40
40
  disk_cid = instance.model.persistent_disk_cid
41
41
  return @logger.info('Skipping disk attaching') if disk_cid.nil?
42
- vm_model = instance.vm.model
42
+ instance_model = instance.model
43
43
  begin
44
- @cloud.attach_disk(vm_model.cid, disk_cid)
45
- AgentClient.with_vm_credentials_and_agent_id(vm_model.credentials, vm_model.agent_id).mount_disk(disk_cid)
44
+ @cloud.attach_disk(instance_model.vm_cid, disk_cid)
45
+ AgentClient.with_vm_credentials_and_agent_id(instance_model.credentials, instance_model.agent_id).mount_disk(disk_cid)
46
46
  rescue => e
47
47
  @logger.warn("Failed to attach disk to new VM: #{e.inspect}")
48
48
  raise e
@@ -156,7 +156,7 @@ module Bosh::Director
156
156
 
157
157
  begin
158
158
  @logger.info("Detaching disk #{disk_cid}")
159
- @cloud.detach_disk(instance.model.vm.cid, disk_cid)
159
+ @cloud.detach_disk(instance.model.vm_cid, disk_cid)
160
160
  rescue Bosh::Clouds::DiskNotAttached
161
161
  if disk.active
162
162
  raise CloudDiskNotAttached,
@@ -212,13 +212,13 @@ module Bosh::Director
212
212
  end
213
213
 
214
214
  def agent(instance)
215
- AgentClient.with_vm_credentials_and_agent_id(instance.vm.model.credentials, instance.vm.model.agent_id)
215
+ AgentClient.with_vm_credentials_and_agent_id(instance.model.credentials, instance.model.agent_id)
216
216
  end
217
217
 
218
218
  def create_and_attach_disk(instance_plan, vm_recreator)
219
219
  instance = instance_plan.instance
220
220
  disk = create_disk(instance_plan)
221
- @cloud.attach_disk(instance.model.vm.cid, disk.disk_cid)
221
+ @cloud.attach_disk(instance.model.vm_cid, disk.disk_cid)
222
222
  return disk
223
223
  rescue Bosh::Clouds::NoDiskSpace => e
224
224
  if e.ok_to_retry
@@ -227,7 +227,7 @@ module Bosh::Director
227
227
  unmount_disk_for(instance_plan)
228
228
  vm_recreator.recreate_vm(instance_plan, disk.disk_cid)
229
229
  begin
230
- @cloud.attach_disk(instance.model.vm.cid, disk.disk_cid)
230
+ @cloud.attach_disk(instance.model.vm_cid, disk.disk_cid)
231
231
  rescue
232
232
  orphan_disk(disk)
233
233
  raise
@@ -255,7 +255,7 @@ module Bosh::Director
255
255
  disk_size = job.persistent_disk_type.disk_size
256
256
  cloud_properties = job.persistent_disk_type.cloud_properties
257
257
 
258
- disk_cid = @cloud.create_disk(disk_size, cloud_properties, instance_model.vm.cid)
258
+ disk_cid = @cloud.create_disk(disk_size, cloud_properties, instance_model.vm_cid)
259
259
  Models::PersistentDisk.create(
260
260
  disk_cid: disk_cid,
261
261
  active: false,
@@ -1,22 +1,76 @@
1
1
  module Bosh::Director
2
- class DnsManager
3
- attr_reader :dns_domain_name
4
-
2
+ class DnsManagerProvider
5
3
  def self.create
6
- dns_config = Config.dns || {}
7
4
  dns_enabled = !!Config.dns_db # to be consistent with current behavior
8
- logger = Config.logger
9
- local_dns_repo = LocalDnsRepo.new(logger)
10
- dns_domain_name = Canonicalizer.canonicalize(dns_config.fetch('domain_name', 'bosh'), :allow_dots => true)
11
- dns_provider = PowerDns.new(dns_domain_name, logger)
5
+ if dns_enabled
6
+ dns_config = Config.dns || {}
7
+ logger = Config.logger
8
+ local_dns_repo = LocalDnsRepo.new(logger)
9
+ dns_domain_name = Canonicalizer.canonicalize(dns_config.fetch('domain_name', 'bosh'), :allow_dots => true)
10
+ dns_provider = PowerDns.new(dns_domain_name, logger)
11
+
12
+ EnabledDnsManager.new(dns_domain_name, dns_config, dns_provider, local_dns_repo, logger)
13
+ else
14
+ DisabledDnsManager.new
15
+ end
16
+ end
17
+ end
18
+
19
+ private
20
+
21
+ class DnsManager
22
+ def configure_nameserver ; end
23
+
24
+ def delete_dns_for_instance(instance_model) ; end
25
+
26
+ def dns_record_name(hostname, job_name, network_name, deployment_name) ; end
27
+
28
+ # build a list of dns servers to use
29
+ def dns_servers(network, dns_spec, add_default_dns = true)
30
+ servers = nil
31
+
32
+ if dns_spec
33
+ servers = []
34
+ dns_spec.each do |dns|
35
+ dns = NetAddr::CIDR.create(dns)
36
+ unless dns.size == 1
37
+ raise NetworkInvalidDns,
38
+ "Invalid DNS for network `#{network}': must be a single IP"
39
+ end
40
+
41
+ servers << dns.ip
42
+ end
43
+ end
12
44
 
13
- new(dns_domain_name, dns_config, dns_enabled, dns_provider, local_dns_repo, logger)
45
+ return servers unless add_default_dns
46
+ add_default_dns_server(servers)
47
+ end
48
+
49
+ def find_dns_record(dns_record_name, ip_address) ; end
50
+
51
+ def find_dns_record_names_by_instance(instance_model) ; end
52
+
53
+ def flush_dns_cache ; end
54
+
55
+ def migrate_legacy_records(instance_model) ; end
56
+
57
+ def update_dns_record_for_instance(instance_model, dns_names_to_ip) ; end
58
+
59
+ private
60
+
61
+ def add_default_dns_server(servers)
62
+ servers
14
63
  end
64
+ end
15
65
 
16
- def initialize(dns_domain_name, dns_config, dns_enabled, dns_provider, local_dns_repo, logger)
66
+ public
67
+
68
+ class EnabledDnsManager < DnsManager
69
+ attr_reader :dns_domain_name
70
+
71
+ def initialize(dns_domain_name, dns_config, dns_provider, local_dns_repo, logger)
17
72
  @dns_domain_name = dns_domain_name
18
73
  @dns_provider = dns_provider
19
- @dns_enabled = dns_enabled
20
74
  @default_server = dns_config['server']
21
75
  @flush_command = dns_config['flush_command']
22
76
  @ip_address = dns_config['address']
@@ -25,12 +79,10 @@ module Bosh::Director
25
79
  end
26
80
 
27
81
  def dns_enabled?
28
- @dns_enabled
82
+ true
29
83
  end
30
84
 
31
85
  def configure_nameserver
32
- return unless dns_enabled?
33
-
34
86
  @dns_provider.create_or_update_nameserver(@ip_address)
35
87
  end
36
88
 
@@ -55,8 +107,6 @@ module Bosh::Director
55
107
  end
56
108
 
57
109
  def migrate_legacy_records(instance_model)
58
- return unless dns_enabled?
59
-
60
110
  return if @local_dns_repo.find(instance_model).any?
61
111
 
62
112
  index_pattern_for_all_networks = dns_record_name(
@@ -81,8 +131,6 @@ module Bosh::Director
81
131
  end
82
132
 
83
133
  def delete_dns_for_instance(instance_model)
84
- return unless dns_enabled?
85
-
86
134
  current_dns_records = @local_dns_repo.find(instance_model)
87
135
  if current_dns_records.empty?
88
136
  # for backwards compatibility when old instances
@@ -150,8 +198,6 @@ module Bosh::Director
150
198
 
151
199
  # add default dns server to an array of dns servers
152
200
  def add_default_dns_server(servers)
153
- return servers unless dns_enabled?
154
-
155
201
  unless @default_server.to_s.empty? || @default_server == '127.0.0.1'
156
202
  (servers ||= []) << @default_server
157
203
  servers.uniq!
@@ -160,4 +206,14 @@ module Bosh::Director
160
206
  servers
161
207
  end
162
208
  end
209
+
210
+ class DisabledDnsManager < DnsManager
211
+ def dns_domain_name
212
+ nil
213
+ end
214
+
215
+ def dns_enabled?
216
+ false
217
+ end
218
+ end
163
219
  end
@@ -39,7 +39,7 @@ module Bosh::Director
39
39
 
40
40
  @logger.info('Deleting errand instances')
41
41
  event_log_stage = @event_log.begin_stage('Deleting errand instances', instance_plans.size, [@job.name])
42
- dns_manager = DnsManager.create
42
+ dns_manager = DnsManagerProvider.create
43
43
  instance_deleter = InstanceDeleter.new(@deployment.ip_provider, dns_manager, @disk_manager)
44
44
  instance_deleter.delete_instance_plans(instance_plans, event_log_stage)
45
45
  end
@@ -16,15 +16,13 @@ module Bosh::Director
16
16
  def delete_instance_plan(instance_plan, event_log_stage)
17
17
  instance_model = instance_plan.new? ? instance_plan.instance.model : instance_plan.existing_instance
18
18
 
19
- @logger.info("Deleting instance '#{instance_model}'")
20
-
21
19
  event_log_stage.advance_and_track(instance_model.to_s) do
22
20
 
23
21
  error_ignorer.with_force_check do
24
22
  stop(instance_plan)
25
23
  end
26
24
 
27
- vm_deleter.delete_for_instance_plan(instance_plan)
25
+ vm_deleter.delete_for_instance(instance_model)
28
26
 
29
27
  unless instance_model.compilation
30
28
  error_ignorer.with_force_check do
@@ -12,7 +12,7 @@ module Bosh::Director
12
12
  job_renderer = JobRenderer.create
13
13
  vm_creator = VmCreator.new(cloud, logger, vm_deleter, disk_manager, job_renderer)
14
14
  vm_recreator = VmRecreator.new(vm_creator, vm_deleter)
15
- dns_manager = DnsManager.create
15
+ dns_manager = DnsManagerProvider.create
16
16
  new(
17
17
  cloud,
18
18
  logger,
@@ -63,7 +63,8 @@ module Bosh::Director
63
63
  @logger.info("Detaching instance #{instance}")
64
64
  unless instance_plan.currently_detached?
65
65
  @disk_manager.unmount_disk_for(instance_plan)
66
- @vm_deleter.delete_for_instance_plan(instance_plan)
66
+ instance_model = instance_plan.new? ? instance_plan.instance.model : instance_plan.existing_instance
67
+ @vm_deleter.delete_for_instance(instance_model)
67
68
  end
68
69
  release_obsolete_ips(instance_plan)
69
70
  instance.update_state
@@ -169,7 +170,7 @@ module Bosh::Director
169
170
  end
170
171
 
171
172
  def agent(instance)
172
- AgentClient.with_vm_credentials_and_agent_id(instance.model.vm.credentials, instance.model.vm.agent_id)
173
+ AgentClient.with_vm_credentials_and_agent_id(instance.model.credentials, instance.model.agent_id)
173
174
  end
174
175
  end
175
176
  end
@@ -41,10 +41,18 @@ module Bosh::Director
41
41
  @logger.info("Found #{instance_plans.size} instances to update")
42
42
  event_log_stage = @event_log.begin_stage('Updating job', instance_plans.size, [ @job.name ])
43
43
 
44
+ ordered_azs = []
45
+ instance_plans.each do | instance_plan |
46
+ unless ordered_azs.include?(instance_plan.instance.availability_zone)
47
+ ordered_azs.push(instance_plan.instance.availability_zone)
48
+ end
49
+ end
50
+
44
51
  instance_plans_by_az = instance_plans.group_by{ |instance_plan| instance_plan.instance.availability_zone }
45
52
  canaries_done = false
46
53
 
47
- instance_plans_by_az.each do |az, az_instance_plans|
54
+ ordered_azs.each do | az |
55
+ az_instance_plans = instance_plans_by_az[az]
48
56
  @logger.info("Starting to update az '#{az}'")
49
57
  ThreadPool.new(:max_threads => @job.update.max_in_flight).wrap do |pool|
50
58
  unless canaries_done
@@ -76,7 +84,7 @@ module Bosh::Director
76
84
  return if unneeded_instances.empty?
77
85
 
78
86
  event_log_stage = @event_log.begin_stage('Deleting unneeded instances', unneeded_instances.size, [@job.name])
79
- dns_manager = DnsManager.create
87
+ dns_manager = DnsManagerProvider.create
80
88
  deleter = InstanceDeleter.new(@deployment_plan.ip_provider, dns_manager, @disk_manager)
81
89
  deleter.delete_instance_plans(unneeded_instance_plans, event_log_stage, max_threads: @job.update.max_in_flight)
82
90