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,71 @@
1
+ module Bosh::Director
2
+ module DeploymentPlan
3
+ class InstanceNetworkReservations
4
+ include Enumerable
5
+ include IpUtil
6
+
7
+ def self.create_from_state(instance, state, deployment, logger)
8
+ reservations = new(logger)
9
+ reservations.logger.debug("Creating instance network reservations from agent state for instance '#{instance}'")
10
+
11
+ state.fetch('networks', []).each do |network_name, network_config|
12
+ reservations.add_existing(instance, deployment, network_name, network_config['ip'], '', network_config['type'])
13
+ end
14
+
15
+ reservations
16
+ end
17
+
18
+ def self.create_from_db(instance, deployment, logger)
19
+ reservations = new(logger)
20
+ reservations.logger.debug("Creating instance network reservations from database for instance '#{instance}'")
21
+
22
+ ip_addresses = instance.model.ip_addresses.clone
23
+
24
+ ip_addresses.each do |ip_address|
25
+ reservations.add_existing(instance, deployment, ip_address.network_name, ip_address.address, ip_address.type, 'manual')
26
+ end
27
+
28
+ unless instance.model.spec.nil?
29
+ # Dynamic network reservations are not saved in DB, recreating from instance spec
30
+ instance.model.spec.fetch('networks', []).each do |network_name, network_config|
31
+ next unless network_config['type'] == 'dynamic'
32
+ reservations.add_existing(instance, deployment, network_name, network_config['ip'], '', network_config['type'])
33
+ end
34
+ end
35
+
36
+ reservations
37
+ end
38
+
39
+ def initialize(logger)
40
+ @reservations = []
41
+ @logger = TaggedLogger.new(logger, 'network-configuration')
42
+ end
43
+
44
+ attr_reader :logger
45
+
46
+ def find_for_network(network)
47
+ @reservations.find { |r| r.network == network }
48
+ end
49
+
50
+ def clean
51
+ @reservations = []
52
+ end
53
+
54
+ def each(&block)
55
+ @reservations.each(&block)
56
+ end
57
+
58
+ def delete(reservation)
59
+ @reservations.delete(reservation)
60
+ end
61
+
62
+ def add_existing(instance, deployment, network_name, ip, ip_type, existing_network_type)
63
+ network = deployment.network(network_name) || deployment.deleted_network(network_name)
64
+ @logger.debug("Registering existing reservation with #{ip_type} IP '#{format_ip(ip)}' for instance '#{instance}' on network '#{network.name}'")
65
+ reservation = ExistingNetworkReservation.new(instance, network, ip, existing_network_type)
66
+ deployment.ip_provider.reserve_existing_ips(reservation)
67
+ @reservations << reservation
68
+ end
69
+ end
70
+ end
71
+ end
@@ -0,0 +1,336 @@
1
+ module Bosh
2
+ module Director
3
+ module DeploymentPlan
4
+ class InstancePlan
5
+ def initialize(attrs)
6
+ @existing_instance = attrs.fetch(:existing_instance)
7
+ @desired_instance = attrs.fetch(:desired_instance)
8
+ @instance = attrs.fetch(:instance)
9
+ @network_plans = attrs.fetch(:network_plans, [])
10
+ @skip_drain = attrs.fetch(:skip_drain, false)
11
+ @recreate_deployment = attrs.fetch(:recreate_deployment, false)
12
+ @logger = attrs.fetch(:logger, Config.logger)
13
+ @dns_manager = DnsManager.create
14
+ end
15
+
16
+ attr_reader :desired_instance, :existing_instance, :instance, :skip_drain, :recreate_deployment
17
+
18
+ attr_accessor :network_plans
19
+
20
+ ##
21
+ # @return [Boolean] returns true if the any of the expected specifications
22
+ # differ from the ones provided by the VM
23
+ def changed?
24
+ !changes.empty?
25
+ end
26
+
27
+ ##
28
+ # @return [Set<Symbol>] returns a set of all of the specification differences
29
+ def changes
30
+ return @changes if @changes
31
+
32
+ @changes = Set.new
33
+ @changes << :restart if needs_restart?
34
+ @changes << :recreate if needs_recreate?
35
+ @changes << :cloud_properties if instance.cloud_properties_changed?
36
+ @changes << :stemcell if stemcell_changed?
37
+ @changes << :env if env_changed?
38
+ @changes << :network if networks_changed?
39
+ @changes << :packages if packages_changed?
40
+ @changes << :persistent_disk if persistent_disk_changed?
41
+ @changes << :configuration if instance.configuration_changed?
42
+ @changes << :job if job_changed?
43
+ @changes << :state if state_changed?
44
+ @changes << :dns if dns_changed?
45
+ @changes << :trusted_certs if instance.trusted_certs_changed?
46
+ @changes
47
+ end
48
+
49
+ def persistent_disk_changed?
50
+ if @existing_instance && obsolete?
51
+ return !@existing_instance.persistent_disk.nil?
52
+ end
53
+
54
+ job = @desired_instance.job
55
+ new_disk_size = job.persistent_disk_type ? job.persistent_disk_type.disk_size : 0
56
+ new_disk_cloud_properties = job.persistent_disk_type ? job.persistent_disk_type.cloud_properties : {}
57
+ changed = new_disk_size != disk_size
58
+ log_changes(__method__, "disk size: #{disk_size}", "disk size: #{new_disk_size}", @existing_instance) if changed
59
+ return true if changed
60
+
61
+ changed = new_disk_size != 0 && new_disk_cloud_properties != disk_cloud_properties
62
+ log_changes(__method__, disk_cloud_properties, new_disk_cloud_properties, @existing_instance) if changed
63
+ changed
64
+ end
65
+
66
+ def instance_model
67
+ new? ? instance.model : existing_instance
68
+ end
69
+
70
+ def needs_restart?
71
+ @instance.virtual_state == 'restart'
72
+ end
73
+
74
+ def needs_recreate?
75
+ if @recreate_deployment
76
+ @logger.debug("#{__method__} job deployment is configured with \"recreate\" state")
77
+ true
78
+ else
79
+ @instance.virtual_state == 'recreate'
80
+ end
81
+ end
82
+
83
+ def networks_changed?
84
+ desired_network_plans = network_plans.select(&:desired?)
85
+ obsolete_network_plans = network_plans.select(&:obsolete?)
86
+
87
+ old_network_settings = new? ? {} : @existing_instance.spec['networks']
88
+ new_network_settings = network_settings.to_hash
89
+
90
+ changed = false
91
+ if obsolete_network_plans.any?
92
+ @logger.debug("#{__method__} obsolete reservations: [#{obsolete_network_plans.map(&:reservation).map(&:to_s).join(", ")}]")
93
+ changed = true
94
+ end
95
+
96
+ if desired_network_plans.any?
97
+ @logger.debug("#{__method__} desired reservations: [#{desired_network_plans.map(&:reservation).map(&:to_s).join(", ")}]")
98
+ changed = true
99
+ end
100
+
101
+ if network_settings_changed?(old_network_settings, new_network_settings)
102
+ @logger.debug("#{__method__} network settings changed FROM: #{old_network_settings} TO: #{new_network_settings} on instance #{@existing_instance}")
103
+ changed = true
104
+ end
105
+
106
+ changed
107
+ end
108
+
109
+ def state_changed?
110
+ if instance.state == 'detached' &&
111
+ existing_instance.state != instance.state
112
+ @logger.debug("Instance '#{instance}' needs to be detached")
113
+ return true
114
+ end
115
+
116
+ if instance.state == 'stopped' && instance.current_job_state == 'running' ||
117
+ instance.state == 'started' && instance.current_job_state != 'running'
118
+ @logger.debug("Instance state is '#{instance.state}' and agent reports '#{instance.current_job_state}'")
119
+ return true
120
+ end
121
+
122
+ false
123
+ end
124
+
125
+ def dns_changed?
126
+ return false unless @dns_manager.dns_enabled?
127
+
128
+ network_settings.dns_record_info.any? do |name, ip|
129
+ not_found = @dns_manager.find_dns_record(name, ip).nil?
130
+ @logger.debug("#{__method__} The requested dns record with name '#{name}' and ip '#{ip}' was not found in the db.") if not_found
131
+ not_found
132
+ end
133
+ end
134
+
135
+ def mark_desired_network_plans_as_existing
136
+ network_plans.select(&:desired?).each { |network_plan| network_plan.existing = true }
137
+ end
138
+
139
+ def release_obsolete_network_plans
140
+ network_plans.delete_if(&:obsolete?)
141
+ end
142
+
143
+ def release_all_network_plans
144
+ network_plans.clear
145
+ end
146
+
147
+ def obsolete?
148
+ desired_instance.nil?
149
+ end
150
+
151
+ def new?
152
+ existing_instance.nil?
153
+ end
154
+
155
+ def existing?
156
+ !new? && !obsolete?
157
+ end
158
+
159
+ def network_settings
160
+ desired_reservations = network_plans
161
+ .reject(&:obsolete?)
162
+ .map { |network_plan| network_plan.reservation }
163
+
164
+ DeploymentPlan::NetworkSettings.new(
165
+ @instance.job_name,
166
+ @instance.model.deployment.name,
167
+ @desired_instance.job.default_network,
168
+ desired_reservations,
169
+ @instance.current_state,
170
+ @instance.availability_zone,
171
+ @instance.index,
172
+ @instance.uuid,
173
+ @dns_manager
174
+ )
175
+ end
176
+
177
+ def network_settings_hash
178
+ network_settings.to_hash
179
+ end
180
+
181
+ def network_addresses
182
+ network_settings.network_addresses
183
+ end
184
+
185
+ def needs_shutting_down?
186
+ return true if obsolete?
187
+
188
+ instance.cloud_properties_changed? ||
189
+ stemcell_changed? ||
190
+ env_changed? ||
191
+ needs_recreate?
192
+ end
193
+
194
+ def find_existing_reservation_for_network(network)
195
+ @instance.existing_network_reservations.find_for_network(network)
196
+ end
197
+
198
+ def desired_az_name
199
+ @desired_instance.az ? @desired_instance.az.name : nil
200
+ end
201
+
202
+ def network_plan_for_network(network)
203
+ @network_plans.find { |plan| plan.reservation.network == network }
204
+ end
205
+
206
+ def spec
207
+ return InstanceSpec.create_empty if obsolete?
208
+
209
+ InstanceSpec.create_from_instance_plan(self)
210
+ end
211
+
212
+ def templates
213
+ @desired_instance.job.templates
214
+ end
215
+
216
+ def job_changed?
217
+ job = @desired_instance.job
218
+ return true if @instance.current_job_spec.nil?
219
+
220
+ # The agent job spec could be in legacy form. job_spec cannot be,
221
+ # though, because we got it from the spec function in job.rb which
222
+ # automatically makes it non-legacy.
223
+ converted_current = Job.convert_from_legacy_spec(@instance.current_job_spec)
224
+ changed = job.spec != converted_current
225
+ log_changes(__method__, converted_current, job.spec, @instance) if changed
226
+ changed
227
+ end
228
+
229
+ def packages_changed?
230
+ job = @desired_instance.job
231
+
232
+ changed = job.package_spec != @instance.current_packages
233
+ log_changes(__method__, @instance.current_packages, job.package_spec, @instance) if changed
234
+ changed
235
+ end
236
+
237
+ def currently_detached?
238
+ return false if new?
239
+
240
+ @existing_instance.state == 'detached'
241
+ end
242
+
243
+ def needs_disk?
244
+ job = @desired_instance.job
245
+
246
+ job && job.persistent_disk_type && job.persistent_disk_type.disk_size > 0
247
+ end
248
+
249
+ def persist_current_spec
250
+ instance_model.update(spec: spec.full_spec)
251
+ end
252
+
253
+ private
254
+
255
+ def network_settings_changed?(old_network_settings, new_network_settings)
256
+ return false if old_network_settings == {}
257
+ old_network_settings != new_network_settings
258
+ end
259
+
260
+ def env_changed?
261
+ job = @desired_instance.job
262
+
263
+ if @existing_instance && @existing_instance.env && job.env.spec != @existing_instance.env
264
+ log_changes(__method__, @existing_instance.vm.env, job.env.spec, @existing_instance)
265
+ return true
266
+ end
267
+ false
268
+ end
269
+
270
+ def stemcell_changed?
271
+ if @existing_instance && @instance.stemcell.name != @existing_instance.spec['stemcell']['name']
272
+ log_changes(__method__, @existing_instance.spec['stemcell']['name'], @instance.stemcell.name, @existing_instance)
273
+ return true
274
+ end
275
+
276
+ if @existing_instance && @instance.stemcell.version != @existing_instance.spec['stemcell']['version']
277
+ log_changes(__method__, "version: #{@existing_instance.spec['stemcell']['version']}", "version: #{@instance.stemcell.version}", @existing_instance)
278
+ return true
279
+ end
280
+
281
+ false
282
+ end
283
+
284
+ def log_changes(method_sym, old_state, new_state, instance)
285
+ @logger.debug("#{method_sym} changed FROM: #{old_state} TO: #{new_state} on instance #{instance}")
286
+ end
287
+
288
+ def disk_size
289
+ if @instance.model.nil?
290
+ raise DirectorError, "Instance `#{@instance}' model is not bound"
291
+ end
292
+
293
+ if @instance.model.persistent_disk
294
+ @instance.model.persistent_disk.size
295
+ else
296
+ 0
297
+ end
298
+ end
299
+
300
+ def disk_cloud_properties
301
+ if @instance.model.nil?
302
+ raise DirectorError, "Instance `#{@instance}' model is not bound"
303
+ end
304
+
305
+ if @instance.model.persistent_disk
306
+ @instance.model.persistent_disk.cloud_properties
307
+ else
308
+ {}
309
+ end
310
+ end
311
+ end
312
+
313
+ class ResurrectionInstancePlan < InstancePlan
314
+ def network_settings_hash
315
+ @existing_instance.spec['networks']
316
+ end
317
+
318
+ def spec
319
+ InstanceSpec.create_from_database(@existing_instance.spec, @instance)
320
+ end
321
+
322
+ def needs_disk?
323
+ @existing_instance.persistent_disk_cid
324
+ end
325
+
326
+ def templates
327
+ @existing_instance.templates.map do |template_model|
328
+ template = Template.new(nil, template_model.name)
329
+ template.bind_existing_model(template_model)
330
+ template
331
+ end
332
+ end
333
+ end
334
+ end
335
+ end
336
+ end
@@ -0,0 +1,54 @@
1
+ module Bosh
2
+ module Director
3
+ module DeploymentPlan
4
+ class InstancePlanFactory
5
+ def initialize(instance_repo, states_by_existing_instance, skip_drain_decider, index_assigner, options = {})
6
+ @instance_repo = instance_repo
7
+ @skip_drain_decider = skip_drain_decider
8
+ @recreate_deployment = options.fetch('recreate', false)
9
+ @states_by_existing_instance = states_by_existing_instance
10
+ @index_assigner = index_assigner
11
+ end
12
+
13
+ def obsolete_instance_plan(existing_instance_model)
14
+ InstancePlan.new(
15
+ desired_instance: nil,
16
+ existing_instance: existing_instance_model,
17
+ instance: nil,
18
+ skip_drain: @skip_drain_decider.for_job(existing_instance_model.job),
19
+ recreate_deployment: @recreate_deployment
20
+ )
21
+ end
22
+
23
+ def desired_existing_instance_plan(existing_instance_model, desired_instance)
24
+ existing_instance_state = @states_by_existing_instance[existing_instance_model]
25
+
26
+ desired_instance.index = @index_assigner.assign_index(desired_instance.job.name, existing_instance_model)
27
+
28
+ instance = @instance_repo.fetch_existing(desired_instance, existing_instance_model, existing_instance_state)
29
+ instance.update_description
30
+ InstancePlan.new(
31
+ desired_instance: desired_instance,
32
+ existing_instance: existing_instance_model,
33
+ instance: instance,
34
+ skip_drain: @skip_drain_decider.for_job(desired_instance.job.name),
35
+ recreate_deployment: @recreate_deployment
36
+ )
37
+ end
38
+
39
+ def desired_new_instance_plan(desired_instance)
40
+ desired_instance.index = @index_assigner.assign_index(desired_instance.job.name)
41
+
42
+ instance = @instance_repo.create(desired_instance, desired_instance.index)
43
+ InstancePlan.new(
44
+ desired_instance: desired_instance,
45
+ existing_instance: nil,
46
+ instance: instance,
47
+ skip_drain: @skip_drain_decider.for_job(desired_instance.job.name),
48
+ recreate_deployment: @recreate_deployment
49
+ )
50
+ end
51
+ end
52
+ end
53
+ end
54
+ end