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.
- checksums.yaml +4 -4
- data/bin/bosh-director-worker +2 -14
- data/db/migrations/director/20150513225143_ip_addresses.rb +11 -0
- data/db/migrations/director/20150702004608_add_links.rb +8 -0
- data/db/migrations/director/20150708231924_add_link_spec.rb +7 -0
- data/db/migrations/director/20150724183256_add_debugging_to_ip_addresses.rb +8 -0
- data/db/migrations/director/20150730225029_add_uuid_to_instances.rb +16 -0
- data/db/migrations/director/20150803215805_add_availabililty_zone_and_cloud_properties_to_instances.rb +8 -0
- data/db/migrations/director/20150804211419_add_compilation_flag_to_instance.rb +7 -0
- data/db/migrations/director/20150918003455_add_bootstrap_node_to_instance.rb +7 -0
- data/db/migrations/director/20151008232214_add_dns_records.rb +7 -0
- data/db/migrations/director/20151015172551_add_orphan_disks_and_snapshots.rb +29 -0
- data/db/migrations/director/20151030222853_add_templates_to_instance.rb +10 -0
- data/db/migrations/director/20151031001039_add_spec_to_instance.rb +19 -0
- data/db/migrations/director/20151109190602_rename_orphan_columns.rb +13 -0
- data/lib/bosh/director.rb +19 -9
- data/lib/bosh/director/agent_client.rb +0 -17
- data/lib/bosh/director/api/cloud_config_manager.rb +7 -5
- data/lib/bosh/director/api/controllers/base_controller.rb +3 -2
- data/lib/bosh/director/api/controllers/cleanup_controller.rb +15 -0
- data/lib/bosh/director/api/controllers/deployments_controller.rb +38 -26
- data/lib/bosh/director/api/controllers/disks_controller.rb +20 -0
- data/lib/bosh/director/api/controllers/info_controller.rb +2 -2
- data/lib/bosh/director/api/controllers/releases_controller.rb +1 -16
- data/lib/bosh/director/api/controllers/stemcells_controller.rb +1 -9
- data/lib/bosh/director/api/deployment_manager.rb +2 -1
- data/lib/bosh/director/api/instance_lookup.rb +17 -0
- data/lib/bosh/director/api/instance_manager.rb +20 -10
- data/lib/bosh/director/api/release_manager.rb +28 -8
- data/lib/bosh/director/api/resurrector_manager.rb +9 -2
- data/lib/bosh/director/api/route_configuration.rb +2 -0
- data/lib/bosh/director/api/snapshot_manager.rb +9 -5
- data/lib/bosh/director/api/stemcell_manager.rb +50 -0
- data/lib/bosh/director/app.rb +1 -1
- data/lib/bosh/director/cloudcheck_helper.rb +119 -132
- data/lib/bosh/director/compile_task.rb +1 -1
- data/lib/bosh/director/compile_task_generator.rb +2 -2
- data/lib/bosh/director/config.rb +21 -12
- data/lib/bosh/director/deployment_deleter.rb +69 -0
- data/lib/bosh/director/deployment_plan.rb +35 -4
- data/lib/bosh/director/deployment_plan/agent_state_migrator.rb +47 -0
- data/lib/bosh/director/deployment_plan/assembler.rb +115 -241
- data/lib/bosh/director/deployment_plan/availability_zone.rb +27 -0
- data/lib/bosh/director/deployment_plan/cloud_manifest_parser.rb +144 -35
- data/lib/bosh/director/deployment_plan/compilation_config.rb +21 -19
- data/lib/bosh/director/deployment_plan/compilation_instance_pool.rb +169 -0
- data/lib/bosh/director/deployment_plan/deployment_repo.rb +4 -8
- data/lib/bosh/director/deployment_plan/deployment_spec_parser.rb +13 -1
- data/lib/bosh/director/deployment_plan/deployment_validator.rb +17 -0
- data/lib/bosh/director/deployment_plan/desired_instance.rb +15 -0
- data/lib/bosh/director/deployment_plan/{disk_pool.rb → disk_type.rb} +14 -19
- data/lib/bosh/director/deployment_plan/dynamic_network.rb +105 -53
- data/lib/bosh/director/deployment_plan/dynamic_network_subnet.rb +13 -0
- data/lib/bosh/director/deployment_plan/env.rb +18 -0
- data/lib/bosh/director/deployment_plan/global_network_resolver.rb +77 -0
- data/lib/bosh/director/deployment_plan/instance.rb +222 -390
- data/lib/bosh/director/deployment_plan/instance_network_reservations.rb +71 -0
- data/lib/bosh/director/deployment_plan/instance_plan.rb +336 -0
- data/lib/bosh/director/deployment_plan/instance_plan_factory.rb +54 -0
- data/lib/bosh/director/deployment_plan/instance_plan_sorter.rb +61 -0
- data/lib/bosh/director/deployment_plan/instance_planner.rb +101 -0
- data/lib/bosh/director/deployment_plan/instance_repository.rb +36 -0
- data/lib/bosh/director/deployment_plan/instance_spec.rb +154 -0
- data/lib/bosh/director/deployment_plan/ip_provider/database_ip_repo.rb +136 -0
- data/lib/bosh/director/deployment_plan/ip_provider/in_memory_ip_repo.rb +81 -0
- data/lib/bosh/director/deployment_plan/ip_provider/ip_provider.rb +153 -0
- data/lib/bosh/director/deployment_plan/ip_provider/ip_provider_factory.rb +22 -0
- data/lib/bosh/director/deployment_plan/job.rb +116 -53
- data/lib/bosh/director/deployment_plan/job_availability_zone_parser.rb +49 -0
- data/lib/bosh/director/deployment_plan/job_migrator.rb +90 -0
- data/lib/bosh/director/deployment_plan/job_network.rb +42 -0
- data/lib/bosh/director/deployment_plan/job_network_parser.rb +118 -0
- data/lib/bosh/director/deployment_plan/job_spec_parser.rb +123 -126
- data/lib/bosh/director/deployment_plan/links/link.rb +30 -0
- data/lib/bosh/director/deployment_plan/links/link_lookup.rb +66 -0
- data/lib/bosh/director/deployment_plan/links/link_path.rb +27 -0
- data/lib/bosh/director/deployment_plan/links/links_resolver.rb +70 -0
- data/lib/bosh/director/deployment_plan/links/template_link.rb +21 -0
- data/lib/bosh/director/deployment_plan/manifest_migrator.rb +3 -17
- data/lib/bosh/director/deployment_plan/manifest_validator.rb +46 -0
- data/lib/bosh/director/deployment_plan/manual_network.rb +70 -97
- data/lib/bosh/director/deployment_plan/manual_network_subnet.rb +148 -0
- data/lib/bosh/director/deployment_plan/network.rb +50 -39
- data/lib/bosh/director/deployment_plan/network_planner.rb +4 -0
- data/lib/bosh/director/deployment_plan/network_planner/plan.rb +26 -0
- data/lib/bosh/director/deployment_plan/network_planner/planner.rb +21 -0
- data/lib/bosh/director/deployment_plan/network_planner/reservation_reconciler.rb +81 -0
- data/lib/bosh/director/deployment_plan/network_planner/vip_static_ips_planner.rb +50 -0
- data/lib/bosh/director/deployment_plan/network_settings.rb +65 -0
- data/lib/bosh/director/deployment_plan/options/skip_drain.rb +7 -0
- data/lib/bosh/director/deployment_plan/package_validator.rb +79 -0
- data/lib/bosh/director/deployment_plan/placement_planner.rb +8 -0
- data/lib/bosh/director/deployment_plan/placement_planner/availability_zone_picker.rb +90 -0
- data/lib/bosh/director/deployment_plan/placement_planner/bruteforce_ip_allocation.rb +124 -0
- data/lib/bosh/director/deployment_plan/placement_planner/index_assigner.rb +32 -0
- data/lib/bosh/director/deployment_plan/placement_planner/networks_to_static_ips.rb +125 -0
- data/lib/bosh/director/deployment_plan/placement_planner/placed_desired_instances.rb +40 -0
- data/lib/bosh/director/deployment_plan/placement_planner/plan.rb +42 -0
- data/lib/bosh/director/deployment_plan/placement_planner/static_ips_availability_zone_picker.rb +237 -0
- data/lib/bosh/director/deployment_plan/placement_planner/unplaced_existing_instances.rb +53 -0
- data/lib/bosh/director/deployment_plan/planner.rb +186 -74
- data/lib/bosh/director/deployment_plan/planner_factory.rb +30 -147
- data/lib/bosh/director/deployment_plan/release_version.rb +3 -3
- data/lib/bosh/director/deployment_plan/resource_pool.rb +2 -174
- data/lib/bosh/director/deployment_plan/stemcell.rb +57 -14
- data/lib/bosh/director/deployment_plan/steps/package_compile_step.rb +28 -135
- data/lib/bosh/director/deployment_plan/steps/update_step.rb +23 -44
- data/lib/bosh/director/deployment_plan/template.rb +15 -4
- data/lib/bosh/director/deployment_plan/vip_network.rb +14 -42
- data/lib/bosh/director/deployment_plan/vm.rb +1 -99
- data/lib/bosh/director/deployment_plan/vm_type.rb +27 -0
- data/lib/bosh/director/disk_manager.rb +268 -0
- data/lib/bosh/director/dns/canonicalizer.rb +28 -0
- data/lib/bosh/director/dns/dns_manager.rb +163 -0
- data/lib/bosh/director/dns/local_dns_repo.rb +20 -0
- data/lib/bosh/director/dns/powerdns.rb +170 -0
- data/lib/bosh/director/errand/job_manager.rb +18 -29
- data/lib/bosh/director/error_ignorer.rb +16 -0
- data/lib/bosh/director/errors.rb +51 -20
- data/lib/bosh/director/event_log.rb +6 -0
- data/lib/bosh/director/instance_deleter.rb +53 -81
- data/lib/bosh/director/instance_reuser.rb +89 -0
- data/lib/bosh/director/instance_updater.rb +139 -281
- data/lib/bosh/director/instance_updater/preparer.rb +8 -5
- data/lib/bosh/director/instance_updater/state_applier.rb +21 -0
- data/lib/bosh/director/ip_util.rb +46 -26
- data/lib/bosh/director/job_renderer.rb +22 -10
- data/lib/bosh/director/job_runner.rb +1 -4
- data/lib/bosh/director/job_updater.rb +47 -35
- data/lib/bosh/director/job_updater_factory.rb +5 -4
- data/lib/bosh/director/jobs/base_job.rb +8 -0
- data/lib/bosh/director/jobs/cleanup_artifacts.rb +93 -0
- data/lib/bosh/director/jobs/delete_deployment.rb +10 -154
- data/lib/bosh/director/jobs/delete_deployment_snapshots.rb +1 -1
- data/lib/bosh/director/jobs/delete_orphan_disks.rb +44 -0
- data/lib/bosh/director/jobs/delete_release.rb +19 -196
- data/lib/bosh/director/jobs/delete_stemcell.rb +10 -76
- data/lib/bosh/director/jobs/export_release.rb +41 -121
- data/lib/bosh/director/jobs/fetch_logs.rb +0 -6
- data/lib/bosh/director/jobs/helpers.rb +10 -0
- data/lib/bosh/director/jobs/helpers/blob_deleter.rb +24 -0
- data/lib/bosh/director/jobs/helpers/compiled_package_deleter.rb +24 -0
- data/lib/bosh/director/jobs/helpers/name_version_release_deleter.rb +48 -0
- data/lib/bosh/director/jobs/helpers/package_deleter.rb +33 -0
- data/lib/bosh/director/jobs/helpers/release_deleter.rb +52 -0
- data/lib/bosh/director/jobs/helpers/release_version_deleter.rb +115 -0
- data/lib/bosh/director/jobs/helpers/releases_to_delete_picker.rb +31 -0
- data/lib/bosh/director/jobs/helpers/stemcell_deleter.rb +61 -0
- data/lib/bosh/director/jobs/helpers/stemcells_to_delete_picker.rb +30 -0
- data/lib/bosh/director/jobs/helpers/template_deleter.rb +20 -0
- data/lib/bosh/director/jobs/release/release_job.rb +18 -7
- data/lib/bosh/director/jobs/run_errand.rb +57 -36
- data/lib/bosh/director/jobs/scheduled_orphan_cleanup.rb +46 -0
- data/lib/bosh/director/jobs/ssh.rb +50 -17
- data/lib/bosh/director/jobs/update_deployment.rb +29 -11
- data/lib/bosh/director/jobs/update_release.rb +25 -4
- data/lib/bosh/director/jobs/vm_state.rb +23 -32
- data/lib/bosh/director/lock.rb +13 -8
- data/lib/bosh/director/logs_fetcher.rb +1 -1
- data/lib/bosh/director/models.rb +3 -0
- data/lib/bosh/director/models/compiled_package.rb +3 -3
- data/lib/bosh/director/models/deployment.rb +10 -0
- data/lib/bosh/director/models/instance.rb +77 -1
- data/lib/bosh/director/models/ip_address.rb +26 -0
- data/lib/bosh/director/models/orphan_disk.rb +23 -0
- data/lib/bosh/director/models/orphan_snapshot.rb +14 -0
- data/lib/bosh/director/models/template.rb +32 -9
- data/lib/bosh/director/models/vm.rb +5 -8
- data/lib/bosh/director/network_reservation.rb +69 -99
- data/lib/bosh/director/problem_handlers/inactive_disk.rb +5 -20
- data/lib/bosh/director/problem_handlers/missing_disk.rb +2 -13
- data/lib/bosh/director/problem_resolver.rb +2 -2
- data/lib/bosh/director/problem_scanner/vm_scan_stage.rb +2 -21
- data/lib/bosh/director/scheduler.rb +23 -6
- data/lib/bosh/director/{instance_updater/stopper.rb → stopper.rb} +24 -18
- data/lib/bosh/director/tagged_logger.rb +30 -0
- data/lib/bosh/director/transactor.rb +9 -0
- data/lib/bosh/director/version.rb +1 -1
- data/lib/bosh/director/vm_creator.rb +91 -19
- data/lib/bosh/director/vm_deleter.rb +25 -0
- data/lib/bosh/director/vm_recreator.rb +15 -0
- data/lib/cloud/dummy.rb +381 -94
- metadata +110 -30
- data/lib/bosh/director/deployment_plan/dns_binder.rb +0 -45
- data/lib/bosh/director/deployment_plan/instance_vm_binder.rb +0 -37
- data/lib/bosh/director/deployment_plan/network_subnet.rb +0 -166
- data/lib/bosh/director/deployment_plan/resource_pools.rb +0 -68
- data/lib/bosh/director/dns_helper.rb +0 -223
- data/lib/bosh/director/instance_updater/network_updater.rb +0 -110
- data/lib/bosh/director/instance_updater/vm_updater.rb +0 -189
- data/lib/bosh/director/problem_handlers/out_of_sync_vm.rb +0 -64
- data/lib/bosh/director/problem_handlers/unbound_instance_vm.rb +0 -85
- data/lib/bosh/director/resource_pool_updater.rb +0 -174
- data/lib/bosh/director/vm_data.rb +0 -63
- 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 [
|
29
|
-
attr_accessor :
|
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::
|
38
|
-
|
39
|
-
|
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
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
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
|
-
|
83
|
-
|
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
|
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
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
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
|
-
|
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
|
-
|
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.
|
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
|
234
|
-
instances.each
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
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
|
-
|
256
|
-
|
257
|
-
|
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
|
-
|
280
|
-
|
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)
|