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,81 @@
1
+ module Bosh::Director::DeploymentPlan
2
+ class InMemoryIpRepo
3
+ include Bosh::Director::IpUtil
4
+
5
+ def initialize(logger)
6
+ @logger = Bosh::Director::TaggedLogger.new(logger, 'network-configuration')
7
+ @mutex = Mutex.new
8
+ @ips = []
9
+ @recently_released_ips = []
10
+ end
11
+
12
+ def delete(ip, network_name)
13
+ ip = ip_to_netaddr(ip)
14
+ entry_to_delete = {ip: ip.to_i, network_name: network_name}
15
+
16
+ @logger.debug("Deleting ip '#{ip.ip}' for #{network_name}")
17
+ @mutex.synchronize do
18
+ @ips.delete(entry_to_delete)
19
+ @recently_released_ips << (entry_to_delete)
20
+ end
21
+ end
22
+
23
+ def add(reservation)
24
+ ip = ip_to_netaddr(reservation.ip)
25
+ network_name = reservation.network.name
26
+ @mutex.synchronize do
27
+ add_ip(ip, network_name)
28
+ end
29
+ end
30
+
31
+ def allocate_dynamic_ip(reservation, subnet)
32
+ item = (0...subnet.range.size).find { |i| available_for_dynamic?(subnet.range[i], subnet) }
33
+
34
+ @mutex.synchronize do
35
+ if item.nil?
36
+ entry = @recently_released_ips.find do |entry|
37
+ entry[:network_name] == subnet.network_name && subnet.range.contains?(entry[:ip])
38
+ end
39
+
40
+ ip = ip_to_netaddr(entry[:ip]) unless entry.nil?
41
+ else
42
+ ip = subnet.range[item]
43
+ end
44
+
45
+ add_ip(ip, subnet.network_name) unless ip.nil?
46
+
47
+ ip
48
+ end
49
+ end
50
+
51
+ private
52
+
53
+ def add_ip(ip, network_name)
54
+ entry_to_add = {ip: ip.to_i, network_name: network_name}
55
+
56
+ if @ips.include?(entry_to_add)
57
+ message = "Failed to reserve IP '#{ip.ip}' for '#{network_name}': already reserved"
58
+ @logger.error(message)
59
+ raise Bosh::Director::NetworkReservationAlreadyInUse, message
60
+ end
61
+
62
+ @logger.debug("Reserving ip '#{ip.ip}' for #{network_name}")
63
+
64
+ @ips << entry_to_add
65
+ @recently_released_ips.delete(entry_to_add)
66
+ end
67
+
68
+ def available_for_dynamic?(ip, subnet)
69
+ return false unless subnet.range.contains?(ip)
70
+ return false if subnet.static_ips.include?(ip.to_i)
71
+ return false if subnet.restricted_ips.include?(ip.to_i)
72
+
73
+ @mutex.synchronize do
74
+ return false if @recently_released_ips.include?({ip: ip.to_i, network_name: subnet.network_name})
75
+ return false if @ips.include?({ip: ip.to_i, network_name: subnet.network_name})
76
+ end
77
+
78
+ true
79
+ end
80
+ end
81
+ end
@@ -0,0 +1,153 @@
1
+ module Bosh::Director
2
+ module DeploymentPlan
3
+ class IpProvider
4
+ include IpUtil
5
+
6
+ def initialize(ip_repo, networks, logger)
7
+ @logger = Bosh::Director::TaggedLogger.new(logger, 'network-configuration')
8
+ @ip_repo = ip_repo
9
+ @networks = networks
10
+ end
11
+
12
+ def release(reservation)
13
+ if reservation.ip.nil?
14
+ return if reservation.network.is_a?(DynamicNetwork)
15
+
16
+ @logger.error("Failed to release IP for manual network '#{reservation.network.name}': IP must be provided")
17
+ raise Bosh::Director::NetworkReservationIpMissing, "Can't release reservation without an IP"
18
+ else
19
+ @ip_repo.delete(reservation.ip, reservation.network.name)
20
+ end
21
+ end
22
+
23
+ def reserve(reservation)
24
+ # We should not be calling reserve on reservations that have already been reserved
25
+ return if reservation.reserved?
26
+
27
+ if reservation.network.is_a?(DynamicNetwork)
28
+ reserve_dynamic(reservation)
29
+ return
30
+ end
31
+
32
+ if reservation.network.is_a?(VipNetwork)
33
+ reserve_vip(reservation)
34
+ return
35
+ end
36
+
37
+ # Reserve IP for Manual Network
38
+ if reservation.ip.nil?
39
+ @logger.debug("Allocating dynamic ip for manual network '#{reservation.network.name}'")
40
+
41
+ filter_subnet_by_instance_az(reservation).each do |subnet|
42
+ ip = @ip_repo.allocate_dynamic_ip(reservation, subnet)
43
+
44
+ if ip
45
+ @logger.debug("Reserving dynamic IP '#{format_ip(ip)}' for manual network '#{reservation.network.name}'")
46
+ reservation.resolve_ip(ip)
47
+ reservation.resolve_type(:dynamic)
48
+ reservation.mark_reserved
49
+ return
50
+ end
51
+ end
52
+
53
+ raise NetworkReservationNotEnoughCapacity,
54
+ "Failed to reserve IP for '#{reservation.instance}' for manual network '#{reservation.network.name}': no more available"
55
+
56
+ else
57
+
58
+ ip_string = format_ip(reservation.ip)
59
+ @logger.debug("Reserving #{reservation.desc} for manual network '#{reservation.network.name}'")
60
+
61
+ subnet = reservation.network.find_subnet_containing(reservation.ip)
62
+ if subnet
63
+ if subnet.restricted_ips.include?(reservation.ip.to_i)
64
+ message = "Failed to reserve IP '#{ip_string}' for network '#{subnet.network_name}': IP belongs to reserved range"
65
+ @logger.error(message)
66
+ raise Bosh::Director::NetworkReservationIpReserved, message
67
+ end
68
+
69
+ reserve_manual(reservation, subnet)
70
+ else
71
+ raise NetworkReservationIpOutsideSubnet,
72
+ "Provided static IP '#{ip_string}' does not belong to any subnet in network '#{reservation.network.name}'"
73
+ end
74
+ end
75
+ end
76
+
77
+ def reserve_existing_ips(reservation)
78
+ if reservation.network.is_a?(DynamicNetwork)
79
+ if reservation.network_type == 'dynamic'
80
+ # Marking reservation as reserved so that it keeps existing reservation and
81
+ # does not recreate VM
82
+ reserve_dynamic(reservation)
83
+ end
84
+
85
+ # If previous network type was not dynamic we should release reservation from DB
86
+ return
87
+ end
88
+
89
+ if reservation.network.is_a?(VipNetwork)
90
+ reserve_vip(reservation)
91
+ return
92
+ end
93
+
94
+ @logger.debug('Reserving existing ips')
95
+ network, subnet = find_network_and_subnet_containing(reservation.ip)
96
+ if subnet
97
+ @logger.debug("Marking existing IP #{format_ip(reservation.ip)} as reserved")
98
+ reservation.resolve_network(network)
99
+ reserve_manual(reservation, subnet)
100
+ end
101
+ end
102
+
103
+ private
104
+
105
+ def reserve_manual(reservation, subnet)
106
+ @ip_repo.add(reservation)
107
+
108
+ subnet_az_names = subnet.availability_zone_names.to_a.join(', ')
109
+ if subnet.static_ips.include?(reservation.ip.to_i)
110
+ reservation.resolve_type(:static)
111
+ reservation.mark_reserved
112
+ @logger.debug("Found subnet with azs '#{subnet_az_names}' for #{format_ip(reservation.ip)}. Reserved as static network reservation.")
113
+ else
114
+ reservation.resolve_type(:dynamic)
115
+ reservation.mark_reserved
116
+ @logger.debug("Found subnet with azs '#{subnet_az_names}' for #{format_ip(reservation.ip)}. Reserved as dynamic network reservation.")
117
+ end
118
+ end
119
+
120
+ def reserve_vip(reservation)
121
+ @logger.debug("Reserving IP '#{format_ip(reservation.ip)}' for vip network '#{reservation.network.name}'")
122
+ @ip_repo.add(reservation)
123
+ reservation.resolve_type(:static)
124
+ reservation.mark_reserved
125
+ end
126
+
127
+ def reserve_dynamic(reservation)
128
+ reservation.resolve_type(:dynamic)
129
+ reservation.mark_reserved
130
+ end
131
+
132
+ def filter_subnet_by_instance_az(reservation)
133
+ instance_az = reservation.instance.availability_zone
134
+ if instance_az.nil?
135
+ reservation.network.subnets
136
+ else
137
+ reservation.network.subnets.select do |subnet|
138
+ subnet.availability_zone_names.include?(instance_az.name)
139
+ end
140
+ end
141
+ end
142
+
143
+ def find_network_and_subnet_containing(cidr_ip)
144
+ @networks.values.select(&:manual?).each do |network|
145
+ subnet = network.subnets.find { |subnet| subnet.is_reservable?(cidr_ip) }
146
+ return [network, subnet] if subnet
147
+ end
148
+
149
+ return nil
150
+ end
151
+ end
152
+ end
153
+ end
@@ -0,0 +1,22 @@
1
+ module Bosh::Director
2
+ module DeploymentPlan
3
+ class IpProviderFactory
4
+ def initialize(using_global_networking, logger)
5
+ @using_global_networking = using_global_networking
6
+ @logger = logger
7
+ end
8
+
9
+ def new_ip_provider(networks)
10
+ if @using_global_networking
11
+ @logger.debug('Using database ip repo')
12
+ ip_repo = DatabaseIpRepo.new(@logger)
13
+ else
14
+ @logger.debug('Using in-memory ip repo')
15
+ ip_repo = InMemoryIpRepo.new(@logger)
16
+ end
17
+
18
+ IpProvider.new(ip_repo, networks, @logger)
19
+ end
20
+ end
21
+ end
22
+ end
@@ -25,20 +25,21 @@ module Bosh::Director
25
25
  # @return [String] Job canonical name (mostly for DNS)
26
26
  attr_accessor :canonical_name
27
27
 
28
- # @return [DiskPool] Persistent disk pool (or nil)
29
- attr_accessor :persistent_disk_pool
30
-
31
- # @return [DeploymentPlan] Current deployment plan
32
- attr_accessor :deployment
28
+ # @return [DiskType] Persistent disk type (or nil)
29
+ attr_accessor :persistent_disk_type
33
30
 
34
31
  # @return [DeploymentPlan::ReleaseVersion] Release this job belongs to
35
32
  attr_accessor :release
36
33
 
37
- # @return [DeploymentPlan::ResourcePool] Resource pool this job should
38
- # be run in
39
- attr_accessor :resource_pool
34
+ # @return [DeploymentPlan::Stemcell]
35
+ attr_accessor :stemcell
36
+
37
+ # @return [DeploymentPlan::VmType]
38
+ attr_accessor :vm_type
39
+
40
+ # @return [DeploymentPlan::Env]
41
+ attr_accessor :env
40
42
 
41
- # @return [DeploymentPlan::Network] Job default network
42
43
  attr_accessor :default_network
43
44
 
44
45
  # @return [Array<DeploymentPlan::Template] Templates included into the job
@@ -67,21 +68,25 @@ module Bosh::Director
67
68
  # @return [Hash<Integer, String>] Individual instance expected states
68
69
  attr_accessor :instance_states
69
70
 
71
+ attr_accessor :availability_zones
72
+
70
73
  attr_accessor :all_properties
71
74
 
72
- # @param [Bosh::Director::DeploymentPlan::Planner] deployment Deployment plan
73
- # @param [Hash] job_spec Raw job spec from the deployment manifest
74
- # @param [Bosh::Director::EventLog::Log] event_log Event log for recording deprecations
75
- # @param [Logger] logger Log for director logging
76
- # @return [Bosh::Director::DeploymentPlan::Job]
77
- def self.parse(deployment, job_spec, event_log, logger)
78
- parser = JobSpecParser.new(deployment, event_log, logger)
75
+ attr_accessor :networks
76
+
77
+ attr_accessor :migrated_from
78
+
79
+ attr_accessor :desired_instances
80
+
81
+ attr_reader :link_paths
82
+
83
+ def self.parse(plan, job_spec, event_log, logger)
84
+ parser = JobSpecParser.new(plan, event_log, logger)
79
85
  parser.parse(job_spec)
80
86
  end
81
87
 
82
- # @param [Bosh::Director::DeploymentPlan] deployment Deployment plan
83
- def initialize(deployment)
84
- @deployment = deployment
88
+ def initialize(logger)
89
+ @logger = logger
85
90
 
86
91
  @release = nil
87
92
  @templates = []
@@ -89,16 +94,33 @@ module Bosh::Director
89
94
  @properties = nil # Actual job properties
90
95
 
91
96
  @instances = []
97
+ @desired_instances = []
92
98
  @unneeded_instances = []
93
99
  @instance_states = {}
100
+ @default_network = {}
94
101
 
95
102
  @packages = {}
103
+ @link_paths = {}
104
+ @resolved_links = {}
105
+ @migrated_from = []
106
+ @availability_zones = []
107
+
108
+ @instance_plans = []
96
109
  end
97
110
 
98
111
  def self.is_legacy_spec?(job_spec)
99
112
  !job_spec.has_key?("templates")
100
113
  end
101
114
 
115
+ def add_instance_plans(instance_plans)
116
+ @instance_plans = instance_plans
117
+ end
118
+
119
+ def sorted_instance_plans
120
+ @sorted_instance_plans ||= InstancePlanSorter.new(@logger)
121
+ .sort(@instance_plans.reject(&:obsolete?))
122
+ end
123
+
102
124
  # Takes in a job spec and returns a job spec in the new format, if it
103
125
  # needs to be modified. The new format has "templates" key, which is an
104
126
  # array with each template's data. This is used for job collocation,
@@ -117,6 +139,23 @@ module Bosh::Director
117
139
  job_spec["templates"] = [template]
118
140
  end
119
141
 
142
+
143
+ def obsolete_instance_plans
144
+ @instance_plans.select(&:obsolete?)
145
+ end
146
+
147
+ def instances # to preserve interface for UpdateStep -- switch to instance_plans eventually
148
+ needed_instance_plans.map(&:instance)
149
+ end
150
+
151
+ def needed_instance_plans
152
+ sorted_instance_plans
153
+ end
154
+
155
+ def unneeded_instances
156
+ obsolete_instance_plans.map(&:instance)
157
+ end
158
+
120
159
  # Returns job spec as a Hash. To be used by all instances of the job to
121
160
  # populate agent state.
122
161
  # @return [Hash] Hash representation
@@ -164,9 +203,6 @@ module Bosh::Director
164
203
  result.select { |name, _| run_time_dependencies.include? name }
165
204
  end
166
205
 
167
- # Returns job instance by index
168
- # @param [Integer] index
169
- # @return [DeploymentPlan::Instance] index-th instance
170
206
  def instance(index)
171
207
  @instances[index]
172
208
  end
@@ -174,8 +210,8 @@ module Bosh::Director
174
210
  # Returns the state state of job instance by its index
175
211
  # @param [Integer] index Instance index
176
212
  # @return [String, nil] Instance state (nil if not specified)
177
- def instance_state(index)
178
- @instance_states[index] || @state
213
+ def state_for_instance(instance_model)
214
+ @instance_states[instance_model.uuid] || @instance_states[instance_model.index.to_s] || @state
179
215
  end
180
216
 
181
217
  # Registers compiled package with this job.
@@ -196,14 +232,14 @@ module Bosh::Director
196
232
 
197
233
  def validate_package_names_do_not_collide!
198
234
  releases_by_package_names = templates
199
- .reduce([]) { |memo, t| memo + t.model.package_names.product([t.release]) }
200
- .reduce({}) { |memo, package_name_and_release_version|
201
- package_name = package_name_and_release_version.first
202
- release_version = package_name_and_release_version.last
203
- memo[package_name] ||= Set.new
204
- memo[package_name] << release_version
205
- memo
206
- }
235
+ .reduce([]) { |memo, t| memo + t.model.package_names.product([t.release]) }
236
+ .reduce({}) { |memo, package_name_and_release_version|
237
+ package_name = package_name_and_release_version.first
238
+ release_version = package_name_and_release_version.last
239
+ memo[package_name] ||= Set.new
240
+ memo[package_name] << release_version
241
+ memo
242
+ }
207
243
 
208
244
  releases_by_package_names.each do |package_name, releases|
209
245
  if releases.size > 1
@@ -212,33 +248,35 @@ module Bosh::Director
212
248
  offending_template2 = templates.find { |t| t.release == release2 }
213
249
 
214
250
  raise JobPackageCollision,
215
- "Package name collision detected in job `#{@name}': "\
251
+ "Package name collision detected in job `#{@name}': "\
216
252
  "template `#{release1.name}/#{offending_template1.name}' depends on package `#{release1.name}/#{package_name}', "\
217
253
  "template `#{release2.name}/#{offending_template2.name}' depends on `#{release2.name}/#{package_name}'. " +
218
- 'BOSH cannot currently collocate two packages with identical names from separate releases.'
254
+ 'BOSH cannot currently collocate two packages with identical names from separate releases.'
219
255
  end
220
256
  end
221
257
  end
222
258
 
223
259
  def bind_unallocated_vms
224
260
  instances.each do |instance|
225
- instance.bind_unallocated_vm
226
-
227
- # Now that we know every VM has been allocated and
228
- # instance models are bound, we can sync the state.
229
- instance.sync_state_with_db
261
+ instance.ensure_vm_allocated
230
262
  end
231
263
  end
232
264
 
233
- def bind_instance_networks
234
- instances.each do |instance|
235
- instance.network_reservations.each do |net_name, reservation|
236
- unless reservation.reserved?
237
- network = @deployment.network(net_name)
238
- network.reserve!(reservation, "`#{name}/#{instance.index}'")
239
- instance.vm.use_reservation(reservation) if instance.vm
240
- end
241
- end
265
+ def bind_instances(ip_provider)
266
+ instances.each(&:ensure_model_bound)
267
+ bind_unallocated_vms
268
+ bind_instance_networks(ip_provider)
269
+ end
270
+
271
+ #TODO: Job should not be responsible for reserving IPs. Consider moving this somewhere else? Maybe in the consumer?
272
+ def bind_instance_networks(ip_provider)
273
+ needed_instance_plans
274
+ .flat_map(&:network_plans)
275
+ .reject(&:obsolete?)
276
+ .reject(&:existing?)
277
+ .each do |network_plan|
278
+ reservation = network_plan.reservation
279
+ ip_provider.reserve(reservation)
242
280
  end
243
281
  end
244
282
 
@@ -252,9 +290,34 @@ module Bosh::Director
252
290
 
253
291
  # reverse compatibility: translate disk size into a disk pool
254
292
  def persistent_disk=(disk_size)
255
- disk_pool = DiskPool.new(SecureRandom.uuid)
256
- disk_pool.disk_size = disk_size
257
- @persistent_disk_pool = disk_pool
293
+ @persistent_disk_type = DiskType.new(SecureRandom.uuid, disk_size, {})
294
+ end
295
+
296
+ def instance_plans_with_missing_vms
297
+ needed_instance_plans.reject do |instance_plan|
298
+ instance_plan.instance.vm_created? || instance_plan.instance.state == 'detached'
299
+ end
300
+ end
301
+
302
+ def add_resolved_link(link_name, link_spec)
303
+ @resolved_links[link_name] = link_spec
304
+ end
305
+
306
+ def link_spec
307
+ @resolved_links
308
+ end
309
+
310
+ def link_path(template_name, link_name)
311
+ @link_paths.fetch(template_name, {})[link_name]
312
+ end
313
+
314
+ def add_link_path(template_name, link_name, link_path)
315
+ @link_paths[template_name] ||= {}
316
+ @link_paths[template_name][link_name] = link_path
317
+ end
318
+
319
+ def compilation?
320
+ false
258
321
  end
259
322
 
260
323
  private
@@ -276,8 +339,8 @@ module Bosh::Director
276
339
 
277
340
  raise JobIncompatibleSpecs,
278
341
  "Job `#{name}' has specs with conflicting property definition styles between" +
279
- " its job spec templates. This may occur if colocating jobs, one of which has a spec file including" +
280
- " `properties' and one which doesn't."
342
+ " its job spec templates. This may occur if colocating jobs, one of which has a spec file including" +
343
+ " `properties' and one which doesn't."
281
344
  end
282
345
 
283
346
  def extract_template_properties(collection)