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
@@ -1,16 +1,19 @@
|
|
1
1
|
module Bosh::Director
|
2
2
|
class InstanceUpdater::Preparer
|
3
|
-
def initialize(
|
4
|
-
@
|
3
|
+
def initialize(instance_plan, agent_client, logger)
|
4
|
+
@instance_plan = instance_plan
|
5
5
|
@agent_client = agent_client
|
6
6
|
@logger = logger
|
7
7
|
end
|
8
8
|
|
9
9
|
def prepare
|
10
|
-
|
10
|
+
instance = @instance_plan.instance
|
11
|
+
# If resource pool has changed or instance will be recreated/detached
|
11
12
|
# there is no point in preparing current VM for future since it will be destroyed.
|
12
|
-
|
13
|
-
|
13
|
+
unless @instance_plan.needs_shutting_down? || instance.state == 'detached'
|
14
|
+
|
15
|
+
apply_spec = DeploymentPlan::InstanceSpec.create_from_instance_plan(@instance_plan).as_apply_spec
|
16
|
+
@agent_client.prepare(apply_spec)
|
14
17
|
end
|
15
18
|
rescue RpcRemoteException => e
|
16
19
|
if e.message =~ /unknown message/
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module Bosh::Director
|
2
|
+
class InstanceUpdater::StateApplier
|
3
|
+
def initialize(instance_plan, agent_client, rendered_job_templates_cleaner)
|
4
|
+
@instance_plan = instance_plan
|
5
|
+
@instance = @instance_plan.instance
|
6
|
+
@agent_client = agent_client
|
7
|
+
@rendered_job_templates_cleaner = rendered_job_templates_cleaner
|
8
|
+
end
|
9
|
+
|
10
|
+
def apply
|
11
|
+
@instance.apply_vm_state(@instance_plan.spec)
|
12
|
+
@instance.update_templates(@instance_plan.templates)
|
13
|
+
@rendered_job_templates_cleaner.clean
|
14
|
+
|
15
|
+
if @instance.state == 'started'
|
16
|
+
@agent_client.run_script('pre-start', {})
|
17
|
+
@agent_client.start
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -1,5 +1,3 @@
|
|
1
|
-
# Copyright (c) 2009-2012 VMware, Inc.
|
2
|
-
|
3
1
|
module Bosh::Director
|
4
2
|
module IpUtil
|
5
3
|
|
@@ -17,29 +15,6 @@ module Bosh::Director
|
|
17
15
|
end
|
18
16
|
end
|
19
17
|
|
20
|
-
def process_range(range)
|
21
|
-
parts = range.split("-")
|
22
|
-
parts.each { |part| part.strip! }
|
23
|
-
if parts.size == 1
|
24
|
-
range = NetAddr::CIDR.create(parts[0])
|
25
|
-
first_ip = range.first(:Objectify => true).to_i
|
26
|
-
last_ip = range.last(:Objectify => true).to_i
|
27
|
-
(first_ip .. last_ip).each do |ip|
|
28
|
-
yield ip
|
29
|
-
end
|
30
|
-
elsif parts.size == 2
|
31
|
-
first_ip = NetAddr::CIDR.create(parts[0])
|
32
|
-
last_ip = NetAddr::CIDR.create(parts[1])
|
33
|
-
raise ArgumentError unless first_ip.size == 1
|
34
|
-
raise ArgumentError unless last_ip.size == 1
|
35
|
-
(first_ip.to_i .. last_ip.to_i).each do |ip|
|
36
|
-
yield ip
|
37
|
-
end
|
38
|
-
else
|
39
|
-
raise ArgumentError
|
40
|
-
end
|
41
|
-
end
|
42
|
-
|
43
18
|
def ip_to_i(ip)
|
44
19
|
unless ip.kind_of?(Integer)
|
45
20
|
unless ip.kind_of?(NetAddr::CIDR)
|
@@ -63,5 +38,50 @@ module Bosh::Director
|
|
63
38
|
ip_to_netaddr(ip).ip
|
64
39
|
end
|
65
40
|
|
41
|
+
private
|
42
|
+
|
43
|
+
def process_range(range)
|
44
|
+
parts = range.split("-")
|
45
|
+
parts.each { |part| part.strip! }
|
46
|
+
if parts.size == 1
|
47
|
+
range = NetAddr::CIDR.create(parts[0])
|
48
|
+
first_ip = range.first(:Objectify => true).to_i
|
49
|
+
last_ip = range.last(:Objectify => true).to_i
|
50
|
+
(first_ip .. last_ip).each do |ip|
|
51
|
+
yield ip
|
52
|
+
end
|
53
|
+
elsif parts.size == 2
|
54
|
+
first_ip = NetAddr::CIDR.create(parts[0])
|
55
|
+
last_ip = NetAddr::CIDR.create(parts[1])
|
56
|
+
unless first_ip.size == 1 && last_ip.size == 1
|
57
|
+
raise NetworkInvalidIpRangeFormat, "Invalid IP range format: #{range}"
|
58
|
+
end
|
59
|
+
(first_ip.to_i .. last_ip.to_i).each do |ip|
|
60
|
+
yield ip
|
61
|
+
end
|
62
|
+
else
|
63
|
+
raise NetworkInvalidIpRangeFormat,
|
64
|
+
"Invalid IP range format: #{range}"
|
65
|
+
end
|
66
|
+
rescue ArgumentError, NetAddr::ValidationError => e
|
67
|
+
raise NetworkInvalidIpRangeFormat, e.message
|
68
|
+
end
|
69
|
+
class CIDRIP
|
70
|
+
def initialize(ip)
|
71
|
+
if ip.kind_of?(NetAddr::CIDR)
|
72
|
+
@cidr = ip
|
73
|
+
else
|
74
|
+
@cidr = NetAddr::CIDR.create(ip)
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
def to_i
|
79
|
+
@cidr.to_i
|
80
|
+
end
|
81
|
+
|
82
|
+
def to_s
|
83
|
+
@cidr.ip.to_s
|
84
|
+
end
|
85
|
+
end
|
66
86
|
end
|
67
|
-
end
|
87
|
+
end
|
@@ -3,21 +3,33 @@ require 'bosh/director/core/templates/job_instance_renderer'
|
|
3
3
|
|
4
4
|
module Bosh::Director
|
5
5
|
class JobRenderer
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
@blobstore = blobstore
|
6
|
+
def self.create
|
7
|
+
new(App.instance.blobstores.blobstore, Config.logger)
|
8
|
+
end
|
10
9
|
|
11
|
-
|
12
|
-
@
|
10
|
+
def initialize(blobstore, logger)
|
11
|
+
@blobstore = blobstore
|
12
|
+
@logger = logger
|
13
13
|
end
|
14
14
|
|
15
|
-
def render_job_instances
|
16
|
-
|
15
|
+
def render_job_instances(instance_plan)
|
16
|
+
instance_plan.each { |instance_plan| render_job_instance(instance_plan) }
|
17
17
|
end
|
18
18
|
|
19
|
-
def render_job_instance(
|
20
|
-
|
19
|
+
def render_job_instance(instance_plan)
|
20
|
+
instance = instance_plan.instance
|
21
|
+
|
22
|
+
if instance_plan.templates.empty?
|
23
|
+
@logger.debug("Skipping rendering templates for '#{instance}', no templates")
|
24
|
+
return
|
25
|
+
end
|
26
|
+
|
27
|
+
@logger.debug("Rendering templates for instance #{instance}")
|
28
|
+
|
29
|
+
job_template_loader = Core::Templates::JobTemplateLoader.new(@logger)
|
30
|
+
|
31
|
+
instance_renderer = Core::Templates::JobInstanceRenderer.new(instance_plan.templates, job_template_loader)
|
32
|
+
rendered_job_instance = instance_renderer.render(instance_plan.spec.as_template_spec)
|
21
33
|
|
22
34
|
configuration_hash = rendered_job_instance.configuration_hash
|
23
35
|
|
@@ -67,10 +67,7 @@ module Bosh::Director
|
|
67
67
|
Config.redis_logger = redis_task_logger
|
68
68
|
|
69
69
|
Config.db.logger = @task_logger
|
70
|
-
|
71
|
-
if Config.dns_enabled?
|
72
|
-
Config.dns_db.logger = @task_logger
|
73
|
-
end
|
70
|
+
Config.dns_db.logger = @task_logger if Config.dns_db
|
74
71
|
|
75
72
|
cpi_log = File.join(log_dir, 'cpi')
|
76
73
|
Config.cloud_options['properties'] ||= {}
|
@@ -3,75 +3,88 @@ module Bosh::Director
|
|
3
3
|
# @param [Bosh::Director::DeploymentPlan::Planner] deployment_plan
|
4
4
|
# @param [Bosh::Director::DeploymentPlan::Job] job
|
5
5
|
# @param [Bosh::Director::JobRenderer] job_renderer
|
6
|
-
def initialize(deployment_plan, job,
|
6
|
+
def initialize(deployment_plan, job, links_resolver, disk_manager)
|
7
7
|
@deployment_plan = deployment_plan
|
8
8
|
@job = job
|
9
|
-
@
|
9
|
+
@links_resolver = links_resolver
|
10
10
|
|
11
11
|
@logger = Config.logger
|
12
12
|
@event_log = Config.event_log
|
13
|
+
@disk_manager = disk_manager
|
13
14
|
end
|
14
15
|
|
15
16
|
def update
|
16
17
|
@logger.info('Deleting no longer needed instances')
|
17
18
|
delete_unneeded_instances
|
18
19
|
|
19
|
-
|
20
|
-
|
21
|
-
|
20
|
+
instance_plans = @job.needed_instance_plans.select do | instance_plan |
|
21
|
+
if instance_plan.changed?
|
22
|
+
true
|
23
|
+
else
|
24
|
+
# no changes necessary for the agent, but some metadata may have
|
25
|
+
# changed (i.e. vm_type.name), so push state to the db regardless
|
26
|
+
instance_plan.persist_current_spec
|
27
|
+
false
|
28
|
+
end
|
22
29
|
end
|
23
30
|
|
24
|
-
if
|
25
|
-
@logger.info("No instances to update for
|
31
|
+
if instance_plans.empty?
|
32
|
+
@logger.info("No instances to update for '#{@job.name}'")
|
26
33
|
return
|
27
34
|
end
|
28
35
|
|
29
|
-
|
30
|
-
|
36
|
+
instance_plans.each do |instance_plan|
|
37
|
+
changes = instance_plan.changes
|
38
|
+
@logger.debug("Need to update instance '#{instance_plan.instance}', changes: #{changes.to_a.join(', ').inspect}")
|
39
|
+
end
|
40
|
+
|
41
|
+
@logger.info("Found #{instance_plans.size} instances to update")
|
42
|
+
event_log_stage = @event_log.begin_stage('Updating job', instance_plans.size, [ @job.name ])
|
31
43
|
|
32
44
|
ThreadPool.new(:max_threads => @job.update.max_in_flight).wrap do |pool|
|
33
|
-
num_canaries = [ @job.update.canaries,
|
45
|
+
num_canaries = [ @job.update.canaries, instance_plans.size ].min
|
34
46
|
@logger.info("Starting canary update num_canaries=#{num_canaries}")
|
35
|
-
update_canaries(pool,
|
47
|
+
update_canaries(pool, instance_plans, num_canaries, event_log_stage)
|
36
48
|
|
37
49
|
@logger.info('Waiting for canaries to update')
|
38
50
|
pool.wait
|
39
51
|
|
40
|
-
@logger.info(
|
52
|
+
@logger.info('Finished canary update')
|
41
53
|
|
42
|
-
@logger.info(
|
43
|
-
update_instances(pool,
|
54
|
+
@logger.info('Continuing the rest of the update')
|
55
|
+
update_instances(pool, instance_plans, event_log_stage)
|
44
56
|
end
|
45
57
|
|
46
|
-
@logger.info(
|
58
|
+
@logger.info('Finished the rest of the update')
|
47
59
|
end
|
48
60
|
|
49
61
|
private
|
50
62
|
|
51
63
|
def delete_unneeded_instances
|
64
|
+
unneeded_instance_plans = @job.obsolete_instance_plans
|
52
65
|
unneeded_instances = @job.unneeded_instances
|
53
66
|
return if unneeded_instances.empty?
|
54
67
|
|
55
|
-
event_log_stage = @event_log.begin_stage(
|
56
|
-
|
57
|
-
deleter.
|
68
|
+
event_log_stage = @event_log.begin_stage('Deleting unneeded instances', unneeded_instances.size, [@job.name])
|
69
|
+
dns_manager = DnsManager.create
|
70
|
+
deleter = InstanceDeleter.new(@deployment_plan.ip_provider, dns_manager, @disk_manager)
|
71
|
+
deleter.delete_instance_plans(unneeded_instance_plans, event_log_stage, max_threads: @job.update.max_in_flight)
|
58
72
|
|
59
|
-
@logger.info(
|
73
|
+
@logger.info('Deleted no longer needed instances')
|
60
74
|
end
|
61
75
|
|
62
|
-
def update_canaries(pool,
|
76
|
+
def update_canaries(pool, instance_plans, num_canaries, event_log_stage)
|
63
77
|
num_canaries.times do
|
64
|
-
|
65
|
-
pool.process { update_canary_instance(
|
78
|
+
instance_plan = instance_plans.shift
|
79
|
+
pool.process { update_canary_instance(instance_plan, event_log_stage) }
|
66
80
|
end
|
67
81
|
end
|
68
82
|
|
69
|
-
def update_canary_instance(
|
70
|
-
|
71
|
-
|
72
|
-
with_thread_name("canary_update(#{desc})") do
|
83
|
+
def update_canary_instance(instance_plan, event_log_stage)
|
84
|
+
event_log_stage.advance_and_track("#{instance_plan.instance.model} (canary)") do
|
85
|
+
with_thread_name("canary_update(#{instance_plan.instance.model})") do
|
73
86
|
begin
|
74
|
-
InstanceUpdater.
|
87
|
+
InstanceUpdater.new_instance_updater(@deployment_plan.ip_provider).update(instance_plan, :canary => true)
|
75
88
|
rescue Exception => e
|
76
89
|
@logger.error("Error updating canary instance: #{e.inspect}\n#{e.backtrace.join("\n")}")
|
77
90
|
raise
|
@@ -80,18 +93,17 @@ module Bosh::Director
|
|
80
93
|
end
|
81
94
|
end
|
82
95
|
|
83
|
-
def update_instances(pool,
|
84
|
-
|
85
|
-
pool.process { update_instance(
|
96
|
+
def update_instances(pool, instance_plans, event_log_stage)
|
97
|
+
instance_plans.each do |instance_plan|
|
98
|
+
pool.process { update_instance(instance_plan, event_log_stage) }
|
86
99
|
end
|
87
100
|
end
|
88
101
|
|
89
|
-
def update_instance(
|
90
|
-
|
91
|
-
|
92
|
-
with_thread_name("instance_update(#{desc})") do
|
102
|
+
def update_instance(instance_plan, event_log_stage)
|
103
|
+
event_log_stage.advance_and_track("#{instance_plan.instance.model}") do
|
104
|
+
with_thread_name("instance_update(#{instance_plan.instance.model})") do
|
93
105
|
begin
|
94
|
-
InstanceUpdater.
|
106
|
+
InstanceUpdater.new_instance_updater(@deployment_plan.ip_provider).update(instance_plan)
|
95
107
|
rescue Exception => e
|
96
108
|
@logger.error("Error updating instance: #{e.inspect}\n#{e.backtrace.join("\n")}")
|
97
109
|
raise
|
@@ -1,12 +1,13 @@
|
|
1
1
|
module Bosh::Director
|
2
2
|
class JobUpdaterFactory
|
3
|
-
def initialize(
|
4
|
-
@
|
3
|
+
def initialize(cloud, logger)
|
4
|
+
@cloud = cloud
|
5
|
+
@logger = logger
|
5
6
|
end
|
6
7
|
|
7
8
|
def new_job_updater(deployment_plan, job)
|
8
|
-
|
9
|
-
JobUpdater.new(deployment_plan, job,
|
9
|
+
links_resolver = DeploymentPlan::LinksResolver.new(deployment_plan, @logger)
|
10
|
+
JobUpdater.new(deployment_plan, job, links_resolver, DiskManager.new(@cloud, @logger))
|
10
11
|
end
|
11
12
|
end
|
12
13
|
end
|
@@ -10,6 +10,10 @@ module Bosh::Director
|
|
10
10
|
Bosh::Director::JobRunner.new(self, task_id).run(*args)
|
11
11
|
end
|
12
12
|
|
13
|
+
def self.schedule_message
|
14
|
+
"scheduled #{name.split('::').last}"
|
15
|
+
end
|
16
|
+
|
13
17
|
attr_accessor :task_id
|
14
18
|
|
15
19
|
def logger
|
@@ -24,6 +28,10 @@ module Bosh::Director
|
|
24
28
|
@result_file ||= Config.result
|
25
29
|
end
|
26
30
|
|
31
|
+
def dns_manager
|
32
|
+
@dns_manager ||= DnsManager.create
|
33
|
+
end
|
34
|
+
|
27
35
|
# @return [Boolean] Has task been cancelled?
|
28
36
|
def task_cancelled?
|
29
37
|
return false if task_id.nil?
|
@@ -0,0 +1,93 @@
|
|
1
|
+
module Bosh::Director
|
2
|
+
module Jobs
|
3
|
+
class CleanupArtifacts < BaseJob
|
4
|
+
include Bosh::Director::LockHelper
|
5
|
+
|
6
|
+
@queue = :normal
|
7
|
+
|
8
|
+
def self.job_type
|
9
|
+
:delete_artifacts
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.enqueue(username, config, job_queue)
|
13
|
+
description = config['remove_all'] ? 'clean up all' : 'clean up'
|
14
|
+
job_queue.enqueue(username, Jobs::CleanupArtifacts, description, [config])
|
15
|
+
end
|
16
|
+
|
17
|
+
def initialize(config)
|
18
|
+
@config = config
|
19
|
+
@disk_manager = DiskManager.new(Config.cloud, Config.logger)
|
20
|
+
release_manager = Api::ReleaseManager.new
|
21
|
+
@stemcell_manager = Api::StemcellManager.new
|
22
|
+
blobstore = App.instance.blobstores.blobstore
|
23
|
+
cloud = Config.cloud
|
24
|
+
blob_deleter = Jobs::Helpers::BlobDeleter.new(blobstore, logger)
|
25
|
+
compiled_package_deleter = Jobs::Helpers::CompiledPackageDeleter.new(blob_deleter, logger)
|
26
|
+
@stemcell_deleter = Jobs::Helpers::StemcellDeleter.new(cloud, compiled_package_deleter, logger, event_log)
|
27
|
+
@releases_to_delete_picker = Jobs::Helpers::ReleasesToDeletePicker.new(release_manager)
|
28
|
+
@stemcells_to_delete_picker = Jobs::Helpers::StemcellsToDeletePicker.new(@stemcell_manager)
|
29
|
+
package_deleter = Helpers::PackageDeleter.new(compiled_package_deleter, blob_deleter, logger)
|
30
|
+
template_deleter = Helpers::TemplateDeleter.new(blob_deleter, logger)
|
31
|
+
release_deleter = Helpers::ReleaseDeleter.new(package_deleter, template_deleter, event_log, logger)
|
32
|
+
release_version_deleter =
|
33
|
+
Helpers::ReleaseVersionDeleter.new(release_deleter, package_deleter, template_deleter, logger, event_log)
|
34
|
+
@name_version_release_deleter =
|
35
|
+
Helpers::NameVersionReleaseDeleter.new(release_deleter, release_manager, release_version_deleter, logger)
|
36
|
+
end
|
37
|
+
|
38
|
+
def perform
|
39
|
+
if @config['remove_all']
|
40
|
+
releases_to_keep, stemcells_to_keep = 0, 0
|
41
|
+
else
|
42
|
+
releases_to_keep, stemcells_to_keep = 2, 2
|
43
|
+
end
|
44
|
+
|
45
|
+
unused_release_name_and_version = @releases_to_delete_picker.pick(releases_to_keep)
|
46
|
+
release_stage = event_log.begin_stage('Deleting releases', unused_release_name_and_version.count)
|
47
|
+
ThreadPool.new(:max_threads => Config.max_threads).wrap do |pool|
|
48
|
+
unused_release_name_and_version.each do |name_and_version|
|
49
|
+
pool.process do
|
50
|
+
name = name_and_version['name']
|
51
|
+
version = name_and_version['version']
|
52
|
+
release_stage.advance_and_track("#{name}/#{version}") do
|
53
|
+
with_release_lock(name, :timeout => 10) do
|
54
|
+
@name_version_release_deleter.find_and_delete_release(name, version, false)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
stemcells_to_delete = @stemcells_to_delete_picker.pick(stemcells_to_keep)
|
62
|
+
stemcell_stage = event_log.begin_stage('Deleting stemcells', stemcells_to_delete.count)
|
63
|
+
ThreadPool.new(:max_threads => Config.max_threads).wrap do |pool|
|
64
|
+
stemcells_to_delete.each do |stemcell|
|
65
|
+
pool.process do
|
66
|
+
stemcell_stage.advance_and_track("#{stemcell['name']}/#{stemcell['version']}") do
|
67
|
+
stemcell_to_delete = @stemcell_manager.find_by_name_and_version(stemcell['name'], stemcell['version'])
|
68
|
+
@stemcell_deleter.delete(stemcell_to_delete)
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
orphan_disks = []
|
75
|
+
if @config['remove_all']
|
76
|
+
orphan_disks = Models::OrphanDisk.all
|
77
|
+
orphan_disk_stage = event_log.begin_stage('Deleting orphaned disks', orphan_disks.count)
|
78
|
+
ThreadPool.new(:max_threads => Config.max_threads).wrap do |pool|
|
79
|
+
orphan_disks.each do |orphan_disk|
|
80
|
+
pool.process do
|
81
|
+
orphan_disk_stage.advance_and_track("#{orphan_disk.disk_cid}") do
|
82
|
+
@disk_manager.delete_orphan_disk(orphan_disk)
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
"Deleted #{unused_release_name_and_version.count} release(s), #{stemcells_to_delete.count} stemcell(s), #{orphan_disks.count} orphaned disk(s)"
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|