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
@@ -2,19 +2,15 @@ module Bosh
|
|
2
2
|
module Director
|
3
3
|
module DeploymentPlan
|
4
4
|
class DeploymentRepo
|
5
|
-
|
6
|
-
def initialize(canonicalizer)
|
7
|
-
@canonicalizer = canonicalizer
|
8
|
-
end
|
9
|
-
|
10
5
|
def find_or_create_by_name(name)
|
11
6
|
deployment = Models::Deployment.find(name: name)
|
12
7
|
return deployment if deployment
|
13
8
|
|
14
|
-
canonical_name =
|
15
|
-
|
9
|
+
canonical_name = Canonicalizer.canonicalize(name)
|
10
|
+
transactor = Transactor.new
|
11
|
+
transactor.retryable_transaction(Models::Deployment.db) do
|
16
12
|
Models::Deployment.each do |other|
|
17
|
-
if
|
13
|
+
if Canonicalizer.canonicalize(other.name) == canonical_name
|
18
14
|
raise DeploymentCanonicalNameTaken,
|
19
15
|
"Invalid deployment name `#{name}', canonical name already taken (`#{canonical_name}')"
|
20
16
|
end
|
@@ -1,7 +1,6 @@
|
|
1
1
|
module Bosh::Director
|
2
2
|
module DeploymentPlan
|
3
3
|
class DeploymentSpecParser
|
4
|
-
include DnsHelper
|
5
4
|
include ValidationHelper
|
6
5
|
|
7
6
|
def initialize(deployment, event_log, logger)
|
@@ -16,6 +15,7 @@ module Bosh::Director
|
|
16
15
|
@deployment_manifest = deployment_manifest
|
17
16
|
@job_states = safe_property(options, 'job_states', :class => Hash, :default => {})
|
18
17
|
|
18
|
+
parse_stemcells
|
19
19
|
parse_properties
|
20
20
|
parse_releases
|
21
21
|
parse_update
|
@@ -26,6 +26,18 @@ module Bosh::Director
|
|
26
26
|
|
27
27
|
private
|
28
28
|
|
29
|
+
def parse_stemcells
|
30
|
+
if @deployment_manifest.has_key?('stemcells')
|
31
|
+
safe_property(@deployment_manifest, 'stemcells', :class => Array).each do |stemcell_hash|
|
32
|
+
alias_val = safe_property(stemcell_hash, 'alias', :class=> String)
|
33
|
+
if @deployment.stemcells.has_key?(alias_val)
|
34
|
+
raise StemcellAliasAlreadyExists, "Duplicate stemcell alias '#{alias_val}'"
|
35
|
+
end
|
36
|
+
@deployment.add_stemcell(Stemcell.new(stemcell_hash))
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
29
41
|
def parse_name
|
30
42
|
safe_property(@deployment_manifest, 'name', :class => String)
|
31
43
|
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module Bosh::Director
|
2
|
+
module DeploymentPlan
|
3
|
+
class DeploymentValidator
|
4
|
+
def validate(deployment)
|
5
|
+
if deployment.vm_types.any? || deployment.stemcells.any?
|
6
|
+
if deployment.resource_pools.any?
|
7
|
+
raise DeploymentInvalidResourceSpecification, "'resource_pools' cannot be specified along with 'stemcells' and/or 'vm_types'"
|
8
|
+
elsif deployment.stemcells.empty?
|
9
|
+
raise DeploymentInvalidResourceSpecification, "Both 'stemcells' and 'vm_types' need to be specified: 'stemcells' is missing"
|
10
|
+
elsif deployment.vm_types.empty?
|
11
|
+
raise DeploymentInvalidResourceSpecification, "Both 'stemcells' and 'vm_types' need to be specified: 'vm_types' is missing"
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module Bosh
|
2
|
+
module Director
|
3
|
+
module DeploymentPlan
|
4
|
+
class DesiredInstance < Struct.new(:job, :deployment, :az, :index)
|
5
|
+
def inspect
|
6
|
+
"<DesiredInstance az=#{self.az ? self.az.name : nil} index=#{self.index}>"
|
7
|
+
end
|
8
|
+
|
9
|
+
def availability_zone
|
10
|
+
self.az.name unless self.az.nil?
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -1,24 +1,24 @@
|
|
1
1
|
module Bosh::Director
|
2
2
|
module DeploymentPlan
|
3
|
-
class
|
3
|
+
class DiskType
|
4
4
|
|
5
|
-
# @return [String] Disk
|
6
|
-
|
5
|
+
# @return [String] Disk types name
|
6
|
+
attr_reader :name
|
7
7
|
|
8
8
|
# @return [Integer] Disk size (or nil)
|
9
|
-
|
9
|
+
attr_reader :disk_size
|
10
10
|
|
11
11
|
# @return [Hash] cloud properties to use when creating VMs.
|
12
|
-
|
12
|
+
attr_reader :cloud_properties
|
13
13
|
|
14
14
|
def self.parse(dp_spec)
|
15
|
-
|
15
|
+
DiskTypesParser.new.parse(dp_spec)
|
16
16
|
end
|
17
17
|
|
18
|
-
def initialize(name)
|
18
|
+
def initialize(name, disk_size, cloud_properties)
|
19
19
|
@name = name
|
20
|
-
@disk_size =
|
21
|
-
@cloud_properties =
|
20
|
+
@disk_size = disk_size
|
21
|
+
@cloud_properties = cloud_properties
|
22
22
|
end
|
23
23
|
|
24
24
|
def spec
|
@@ -31,27 +31,22 @@ module Bosh::Director
|
|
31
31
|
|
32
32
|
private
|
33
33
|
|
34
|
-
class
|
34
|
+
class DiskTypesParser
|
35
35
|
include ValidationHelper
|
36
36
|
|
37
37
|
def parse(dp_spec)
|
38
38
|
name = safe_property(dp_spec, 'name', class: String)
|
39
|
-
disk_pool = DiskPool.new(name)
|
40
|
-
|
41
39
|
disk_size = safe_property(dp_spec, 'disk_size', class: Integer)
|
42
|
-
|
43
40
|
if disk_size < 0
|
44
|
-
raise
|
45
|
-
"Disk
|
41
|
+
raise DiskTypeInvalidDiskSize,
|
42
|
+
"Disk types `#{name}' references an invalid persistent disk size `#{disk_size}'"
|
46
43
|
end
|
47
|
-
disk_pool.disk_size = disk_size
|
48
44
|
|
49
|
-
|
45
|
+
cloud_properties = safe_property(dp_spec, 'cloud_properties', class: Hash, default: {})
|
50
46
|
|
51
|
-
|
47
|
+
DiskType.new(name, disk_size, cloud_properties)
|
52
48
|
end
|
53
49
|
end
|
54
|
-
|
55
50
|
end
|
56
51
|
end
|
57
52
|
end
|
@@ -1,74 +1,118 @@
|
|
1
|
-
# Copyright (c) 2009-2012 VMware, Inc.
|
2
|
-
|
3
1
|
module Bosh::Director
|
4
2
|
module DeploymentPlan
|
5
|
-
class DynamicNetwork <
|
6
|
-
include
|
3
|
+
class DynamicNetwork < NetworkWithSubnets
|
4
|
+
include Bosh::Director::IpUtil
|
5
|
+
extend ValidationHelper
|
7
6
|
|
8
|
-
|
7
|
+
def self.parse(network_spec, availability_zones, logger)
|
8
|
+
name = safe_property(network_spec, 'name', :class => String)
|
9
|
+
Canonicalizer.canonicalize(name)
|
10
|
+
logger = TaggedLogger.new(logger, 'network-configuration')
|
11
|
+
dns_manager = DnsManager.create
|
9
12
|
|
10
|
-
|
11
|
-
|
12
|
-
attr_accessor :cloud_properties
|
13
|
+
validate_network_has_no_key('az', name, network_spec)
|
14
|
+
validate_network_has_no_key('azs', name, network_spec)
|
13
15
|
|
14
|
-
|
15
|
-
|
16
|
-
|
16
|
+
if network_spec.has_key?('subnets')
|
17
|
+
validate_network_has_no_key_while_subnets_present('dns', name, network_spec)
|
18
|
+
validate_network_has_no_key_while_subnets_present('cloud_properties', name, network_spec)
|
17
19
|
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
safe_property(network_spec,
|
27
|
-
|
28
|
-
|
20
|
+
subnets = network_spec['subnets'].map do |subnet_properties|
|
21
|
+
dns_spec = safe_property(subnet_properties, 'dns', :class => Array, :optional => true)
|
22
|
+
dns = dns_manager.dns_servers(subnet_properties['name'], dns_spec)
|
23
|
+
cloud_properties = safe_property(subnet_properties, 'cloud_properties', class: Hash, default: {})
|
24
|
+
subnet_availability_zones = parse_availability_zones(subnet_properties, availability_zones, name)
|
25
|
+
DynamicNetworkSubnet.new(dns, cloud_properties, subnet_availability_zones)
|
26
|
+
end
|
27
|
+
else
|
28
|
+
cloud_properties = safe_property(network_spec, 'cloud_properties', class: Hash, default: {})
|
29
|
+
dns_spec = safe_property(network_spec, 'dns', :class => Array, :optional => true)
|
30
|
+
dns = dns_manager.dns_servers(network_spec['name'], dns_spec)
|
31
|
+
subnets = [DynamicNetworkSubnet.new(dns, cloud_properties, nil)]
|
32
|
+
end
|
33
|
+
|
34
|
+
new(name, subnets, logger)
|
29
35
|
end
|
30
36
|
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
def
|
39
|
-
|
40
|
-
|
41
|
-
|
37
|
+
def self.validate_network_has_no_key_while_subnets_present(key, name, network_spec)
|
38
|
+
if network_spec.has_key?(key)
|
39
|
+
raise NetworkInvalidProperty, "Network '#{name}' must not specify '#{key}' when also specifying 'subnets'. " +
|
40
|
+
"Instead, '#{key}' should be specified on subnet entries."
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def self.validate_network_has_no_key(key, name, network_spec)
|
45
|
+
if network_spec.has_key?(key)
|
46
|
+
raise NetworkInvalidProperty, "Network '#{name}' must not specify '#{key}'."
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def self.parse_availability_zones(spec, availability_zones, name)
|
51
|
+
|
52
|
+
has_availability_zones_key = spec.has_key?('azs')
|
53
|
+
has_availability_zone_key = spec.has_key?('az')
|
54
|
+
|
55
|
+
if has_availability_zone_key && has_availability_zones_key
|
56
|
+
raise Bosh::Director::NetworkInvalidProperty, "Network '#{name}' contains both 'az' and 'azs'. Choose one."
|
57
|
+
end
|
58
|
+
|
59
|
+
if has_availability_zones_key
|
60
|
+
subnet_availability_zones = safe_property(spec, 'azs', class: Array, optional: true)
|
61
|
+
if subnet_availability_zones.empty?
|
62
|
+
raise Bosh::Director::NetworkInvalidProperty, "Network '#{name}' refers to an empty 'azs' array"
|
63
|
+
end
|
64
|
+
subnet_availability_zones.each do |zone|
|
65
|
+
check_validity_of_availability_zone(zone, availability_zones, name)
|
66
|
+
end
|
67
|
+
subnet_availability_zones
|
42
68
|
else
|
43
|
-
|
44
|
-
|
45
|
-
|
69
|
+
availability_zone = safe_property(spec, 'az', class: String, optional: true)
|
70
|
+
check_validity_of_availability_zone(availability_zone, availability_zones, name)
|
71
|
+
availability_zone.nil? ? nil : [availability_zone]
|
46
72
|
end
|
47
|
-
reservation.reserved?
|
48
73
|
end
|
49
74
|
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
def release(reservation)
|
55
|
-
validate_ip(reservation)
|
75
|
+
def self.check_validity_of_availability_zone(availability_zone, availability_zones, name)
|
76
|
+
unless availability_zone.nil? || availability_zones.any? { |az| az.name == availability_zone }
|
77
|
+
raise Bosh::Director::NetworkSubnetUnknownAvailabilityZone, "Network '#{name}' refers to an unknown availability zone '#{availability_zone}'"
|
78
|
+
end
|
56
79
|
end
|
57
80
|
|
81
|
+
def initialize(name, subnets, logger)
|
82
|
+
super(name, logger)
|
83
|
+
@subnets = subnets
|
84
|
+
end
|
85
|
+
|
86
|
+
attr_reader :subnets
|
87
|
+
|
58
88
|
##
|
59
89
|
# Returns the network settings for the specific reservation.
|
60
90
|
#
|
61
91
|
# @param [NetworkReservation] reservation
|
62
92
|
# @param [Array<String>] default_properties
|
93
|
+
# @param [AvailabilityZone] availability zone
|
63
94
|
# @return [Hash] network settings that will be passed to the BOSH Agent
|
64
|
-
def network_settings(reservation, default_properties = VALID_DEFAULTS)
|
65
|
-
|
95
|
+
def network_settings(reservation, default_properties = Network::VALID_DEFAULTS, availability_zone = nil)
|
96
|
+
unless reservation.dynamic?
|
97
|
+
raise NetworkReservationWrongType,
|
98
|
+
"IP '#{format_ip(reservation.ip)}' on network '#{reservation.network.name}' does not belong to dynamic pool"
|
99
|
+
end
|
100
|
+
|
101
|
+
if availability_zone.nil?
|
102
|
+
subnet = subnets.first
|
103
|
+
else
|
104
|
+
subnet = find_subnet_for_az(availability_zone.name)
|
105
|
+
unless subnet
|
106
|
+
raise NetworkSubnetInvalidAvailabilityZone,
|
107
|
+
"Network '#{name}' has no matching subnet for availability zone '#{availability_zone.name}'"
|
108
|
+
end
|
109
|
+
end
|
66
110
|
|
67
111
|
config = {
|
68
112
|
"type" => "dynamic",
|
69
|
-
"cloud_properties" =>
|
113
|
+
"cloud_properties" => subnet.cloud_properties
|
70
114
|
}
|
71
|
-
config["dns"] =
|
115
|
+
config["dns"] = subnet.dns if subnet.dns
|
72
116
|
|
73
117
|
if default_properties
|
74
118
|
config["default"] = default_properties.sort
|
@@ -77,14 +121,22 @@ module Bosh::Director
|
|
77
121
|
config
|
78
122
|
end
|
79
123
|
|
124
|
+
def validate_reference_from_job!(job_network_spec, job_name)
|
125
|
+
if job_network_spec.has_key?('static_ips')
|
126
|
+
raise JobStaticIPNotSupportedOnDynamicNetwork,
|
127
|
+
"Job '#{job_name}' using dynamic network '#{name}' cannot specify static IP(s)"
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
131
|
+
def find_az_names_for_ip(ip)
|
132
|
+
# On dynamic network ip does not belong to any subnet
|
133
|
+
availability_zones
|
134
|
+
end
|
135
|
+
|
80
136
|
private
|
81
137
|
|
82
|
-
def
|
83
|
-
|
84
|
-
raise NetworkReservationInvalidIp,
|
85
|
-
"Invalid IP: `%s', did not match magic DYNAMIC IP" % [
|
86
|
-
reservation.ip]
|
87
|
-
end
|
138
|
+
def find_subnet_for_az(az_name)
|
139
|
+
@subnets.find { |subnet| subnet.availability_zone_names.include?(az_name) }
|
88
140
|
end
|
89
141
|
end
|
90
142
|
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
module Bosh::Director
|
2
|
+
module DeploymentPlan
|
3
|
+
class DynamicNetworkSubnet
|
4
|
+
def initialize(dns, cloud_properties, availability_zone_names)
|
5
|
+
@dns = dns
|
6
|
+
@cloud_properties = cloud_properties
|
7
|
+
@availability_zone_names = availability_zone_names.nil? ? nil : availability_zone_names
|
8
|
+
end
|
9
|
+
|
10
|
+
attr_reader :dns, :cloud_properties, :availability_zone_names
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,77 @@
|
|
1
|
+
module Bosh::Director
|
2
|
+
module DeploymentPlan
|
3
|
+
class NullGlobalNetworkResolver
|
4
|
+
def reserved_legacy_ranges(something)
|
5
|
+
[]
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
9
|
+
class GlobalNetworkResolver
|
10
|
+
include Bosh::Director::ValidationHelper
|
11
|
+
include IpUtil
|
12
|
+
|
13
|
+
def initialize(current_deployment)
|
14
|
+
@current_deployment = current_deployment
|
15
|
+
end
|
16
|
+
|
17
|
+
def reserved_legacy_ranges(network_name)
|
18
|
+
return Set.new unless @current_deployment.using_global_networking?
|
19
|
+
legacy_ranges.fetch(network_name, Set.new)
|
20
|
+
end
|
21
|
+
|
22
|
+
private
|
23
|
+
|
24
|
+
def legacy_ranges
|
25
|
+
@reserved_legacy_ranges ||= begin
|
26
|
+
reserved_legacy_ranges = {}
|
27
|
+
|
28
|
+
other_deployments = Models::Deployment.where(cloud_config_id: nil).
|
29
|
+
exclude(name: @current_deployment.name).
|
30
|
+
exclude(manifest: nil).all
|
31
|
+
|
32
|
+
other_deployments.each do |deployment|
|
33
|
+
add_networks_from_deployment(deployment, reserved_legacy_ranges)
|
34
|
+
end
|
35
|
+
|
36
|
+
reserved_legacy_ranges
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def add_networks_from_deployment(deployment, ranges)
|
41
|
+
networks = safe_property(Psych.load(deployment.manifest), 'networks', :class => Array, :default => [])
|
42
|
+
networks.each do |network_spec|
|
43
|
+
add_network(network_spec, ranges)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def add_network(network_spec, ranges)
|
48
|
+
name = safe_property(network_spec, 'name', :class => String)
|
49
|
+
ranges[name] ||= Set.new
|
50
|
+
|
51
|
+
type = safe_property(network_spec, 'type', :class => String, :default => 'manual')
|
52
|
+
return unless type == 'manual'
|
53
|
+
|
54
|
+
subnets = safe_property(network_spec, 'subnets', :class => Array)
|
55
|
+
subnets.each do |subnet_spec|
|
56
|
+
range_property = safe_property(subnet_spec, 'range', :class => String)
|
57
|
+
range = NetAddr::CIDR.create(range_property)
|
58
|
+
reserved_property = safe_property(subnet_spec, 'reserved', :optional => true)
|
59
|
+
|
60
|
+
reserved_ranges = Set.new([range])
|
61
|
+
|
62
|
+
each_ip(reserved_property) do |ip|
|
63
|
+
addr = NetAddr::CIDRv4.new(ip)
|
64
|
+
range_with_ip = reserved_ranges.find { |r| r.contains?(addr) || r == addr }
|
65
|
+
reserved_ranges.delete(range_with_ip)
|
66
|
+
if range_with_ip != addr
|
67
|
+
remainder = range_with_ip.remainder(addr, Objectify: true)
|
68
|
+
reserved_ranges += Set.new(remainder)
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
ranges[name] += reserved_ranges
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|