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,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
|