Skip to content

Commit d4a6bf7

Browse files
committed
separate logic out into calculators
1 parent 80a458d commit d4a6bf7

File tree

10 files changed

+122
-67
lines changed

10 files changed

+122
-67
lines changed

lib/cloud_controller/deployment_updater/actions/canary.rb

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -16,18 +16,17 @@ def call
1616
deployment.db.transaction do
1717
deployment.lock!
1818
return unless deployment.state == DeploymentModel::PREPAUSED_STATE
19+
return unless Calculators::AllInstancesRoutable.new(deployment, logger).call
1920

2021
ScaleDownSuperseded.new(deployment).call
2122

22-
if Calculators::AllInstancesRoutable.new(deployment, logger).call
23-
deployment.update(
24-
last_healthy_at: Time.now,
25-
state: DeploymentModel::PAUSED_STATE,
26-
status_value: DeploymentModel::ACTIVE_STATUS_VALUE,
27-
status_reason: DeploymentModel::PAUSED_STATUS_REASON
28-
)
29-
logger.info("paused-canary-deployment-for-#{deployment.guid}")
30-
end
23+
deployment.update(
24+
last_healthy_at: Time.now,
25+
state: DeploymentModel::PAUSED_STATE,
26+
status_value: DeploymentModel::ACTIVE_STATUS_VALUE,
27+
status_reason: DeploymentModel::PAUSED_STATUS_REASON
28+
)
29+
logger.info("paused-canary-deployment-for-#{deployment.guid}")
3130
end
3231
end
3332

lib/cloud_controller/deployment_updater/actions/cancel.rb

Lines changed: 5 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
require 'cloud_controller/deployment_updater/calculators/find_interim_web_process'
2+
require 'cloud_controller/deployment_updater/actions/cleanup_web_processes'
3+
14
module VCAP::CloudController
25
module DeploymentUpdater
36
module Actions
@@ -18,12 +21,12 @@ def call
1821

1922
deploying_web_process.lock!
2023

21-
prior_web_process = interim_web_process || app.oldest_web_process
24+
prior_web_process = Calculators::FindInterimWebProcess.new(deployment).call || app.oldest_web_process
2225
prior_web_process.lock!
2326

2427
prior_web_process.update(instances: deployment.original_web_process_instance_count, type: ProcessTypes::WEB)
2528

26-
cleanup_web_processes_except(prior_web_process)
29+
CleanupWebProcesses.new(deployment, prior_web_process).call
2730

2831
deployment.update(
2932
state: DeploymentModel::CANCELED_STATE,
@@ -32,37 +35,6 @@ def call
3235
)
3336
end
3437
end
35-
36-
private
37-
38-
def cleanup_web_processes_except(protected_process)
39-
app.web_processes.
40-
reject { |p| p.guid == protected_process.guid }.
41-
map(&:destroy)
42-
end
43-
44-
def interim_web_process
45-
# Find newest interim web process that (a) belongs to a SUPERSEDED (DEPLOYED) deployment and (b) has at least
46-
# one running instance.
47-
app.web_processes_dataset.
48-
qualify.
49-
join(:deployments, deploying_web_process_guid: :guid).
50-
where(deployments__state: DeploymentModel::DEPLOYED_STATE).
51-
where(deployments__status_reason: DeploymentModel::SUPERSEDED_STATUS_REASON).
52-
order(Sequel.desc(:created_at), Sequel.desc(:id)).
53-
find { |p| running_instance?(p) }
54-
end
55-
56-
def running_instance?(process)
57-
instances = instance_reporters.all_instances_for_app(process)
58-
instances.any? { |_, val| val[:state] == VCAP::CloudController::Diego::LRP_RUNNING }
59-
rescue CloudController::Errors::ApiError # the instances_reporter re-raises InstancesUnavailable as ApiError
60-
false
61-
end
62-
63-
def instance_reporters
64-
CloudController::DependencyLocator.instance.instances_reporters
65-
end
6638
end
6739
end
6840
end
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
module VCAP::CloudController
2+
module DeploymentUpdater
3+
module Actions
4+
class CleanupWebProcesses
5+
attr_reader :deployment, :app, :protected_process
6+
7+
def initialize(deployment, process)
8+
@deployment = deployment
9+
@app = deployment.app
10+
@protected_process = process
11+
end
12+
13+
def call
14+
app.web_processes.
15+
reject { |p| p.guid == protected_process.guid }.
16+
map(&:destroy)
17+
end
18+
end
19+
end
20+
end
21+
end

lib/cloud_controller/deployment_updater/actions/finalize.rb

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
require 'cloud_controller/deployment_updater/actions/cleanup_web_processes'
12
module VCAP::CloudController
23
module DeploymentUpdater
34
module Actions
@@ -13,7 +14,7 @@ def initialize(deployment)
1314
def call
1415
promote_deploying_web_process
1516

16-
cleanup_web_processes_except(deploying_web_process)
17+
CleanupWebProcesses.new(deployment, deploying_web_process).call
1718

1819
update_non_web_processes
1920
restart_non_web_processes
@@ -30,12 +31,6 @@ def promote_deploying_web_process
3031
deploying_web_process.update(type: ProcessTypes::WEB)
3132
end
3233

33-
def cleanup_web_processes_except(protected_process)
34-
app.web_processes.
35-
reject { |p| p.guid == protected_process.guid }.
36-
map(&:destroy)
37-
end
38-
3934
def update_non_web_processes
4035
return if deploying_web_process.revision.nil?
4136

lib/cloud_controller/deployment_updater/actions/scale.rb

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
require 'cloud_controller/deployment_updater/actions/scale_down_old_process'
33
require 'cloud_controller/deployment_updater/actions/finalize'
44
require 'cloud_controller/deployment_updater/calculators/all_instances_routable'
5+
require 'cloud_controller/deployment_updater/calculators/instances_to_scale_up'
6+
require 'cloud_controller/deployment_updater/calculators/instances_to_scale_down'
57

68
module VCAP::CloudController
79
module DeploymentUpdater
@@ -17,16 +19,15 @@ def initialize(deployment, logger)
1719

1820
def call
1921
deployment.db.transaction do
20-
app.lock!
21-
2222
return unless deployment.lock!.state == DeploymentModel::DEPLOYING_STATE
23+
return unless Calculators::AllInstancesRoutable.new(deployment, logger).call
2324

24-
ScaleDownSuperseded.new(deployment).call
25-
25+
app.lock!
2626
oldest_web_process_with_instances.lock!
2727
deploying_web_process.lock!
2828

29-
return unless Calculators::AllInstancesRoutable.new(deployment, logger).call
29+
instances_to_scale_up = Calculators::InstancesToScaleUp.new(deployment).call
30+
instances_to_scale_down = Calculators::InstancesToScaleDown.new(deployment, oldest_web_process_with_instances).call
3031

3132
deployment.update(
3233
last_healthy_at: Time.now,
@@ -40,10 +41,10 @@ def call
4041
return
4142
end
4243

43-
ScaleDownOldProcess.new(deployment).call
44+
ScaleDownSuperseded.new(deployment).call
45+
ScaleDownOldProcess.new(deployment, oldest_web_process_with_instances, instances_to_scale_down).call
4446

45-
instances_to_scale = [deploying_web_process.instances + deployment.max_in_flight, deployment.original_web_process_instance_count].min
46-
deploying_web_process.update(instances: instances_to_scale)
47+
deploying_web_process.update(instances: instances_to_scale_up)
4748
end
4849
end
4950

lib/cloud_controller/deployment_updater/actions/scale_down_old_process.rb

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,30 +2,26 @@ module VCAP::CloudController
22
module DeploymentUpdater
33
module Actions
44
class ScaleDownOldProcess
5-
attr_reader :deployment, :app
5+
attr_reader :deployment, :process, :app, :instances_to_scale_down
66

7-
def initialize(deployment)
7+
def initialize(deployment, process, instances_to_scale_down)
88
@deployment = deployment
99
@app = deployment.app
10+
@process = process
11+
@instances_to_scale_down = instances_to_scale_down
1012
end
1113

1214
def call
13-
process = oldest_web_process_with_instances
14-
1515
if process.instances <= deployment.max_in_flight && is_interim_process?(process)
1616
process.destroy
1717
return
1818
end
1919

20-
process.update(instances: [(process.instances - deployment.max_in_flight), 0].max)
20+
process.update(instances: instances_to_scale_down)
2121
end
2222

2323
private
2424

25-
def oldest_web_process_with_instances
26-
@oldest_web_process_with_instances ||= app.web_processes.select { |process| process.instances > 0 }.min_by { |p| [p.created_at, p.id] }
27-
end
28-
2925
def is_original_web_process?(process)
3026
process == app.oldest_web_process
3127
end
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
module VCAP::CloudController
2+
module DeploymentUpdater
3+
module Calculators
4+
class FindInterimWebProcess
5+
attr_reader :deployment, :app
6+
7+
def initialize(deployment)
8+
@deployment = deployment
9+
@app = deployment.app
10+
end
11+
12+
def call
13+
# Find newest interim web process that (a) belongs to a SUPERSEDED (DEPLOYED) deployment and (b) has at least
14+
# one running instance.
15+
app.web_processes_dataset.
16+
qualify.
17+
join(:deployments, deploying_web_process_guid: :guid).
18+
where(deployments__state: DeploymentModel::DEPLOYED_STATE).
19+
where(deployments__status_reason: DeploymentModel::SUPERSEDED_STATUS_REASON).
20+
order(Sequel.desc(:created_at), Sequel.desc(:id)).
21+
find { |p| running_instance?(p) }
22+
end
23+
24+
def running_instance?(process)
25+
instances = instance_reporters.all_instances_for_app(process)
26+
instances.any? { |_, val| val[:state] == VCAP::CloudController::Diego::LRP_RUNNING }
27+
rescue CloudController::Errors::ApiError # the instances_reporter re-raises InstancesUnavailable as ApiError
28+
false
29+
end
30+
31+
def instance_reporters
32+
CloudController::DependencyLocator.instance.instances_reporters
33+
end
34+
end
35+
end
36+
end
37+
end
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
module VCAP::CloudController
2+
module DeploymentUpdater
3+
module Calculators
4+
class InstancesToScaleDown
5+
attr_reader :deployment, :process
6+
7+
def initialize(deployment, process)
8+
@deployment = deployment
9+
@process = process
10+
end
11+
12+
def call
13+
[(process.instances - deployment.max_in_flight), 0].max
14+
end
15+
end
16+
end
17+
end
18+
end
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
module VCAP::CloudController
2+
module DeploymentUpdater
3+
module Calculators
4+
class InstancesToScaleUp
5+
attr_reader :deployment
6+
7+
def initialize(deployment)
8+
@deployment = deployment
9+
end
10+
11+
def call
12+
[deployment.deploying_web_process.instances + deployment.max_in_flight, deployment.original_web_process_instance_count].min
13+
end
14+
end
15+
end
16+
end
17+
end

lib/cloud_controller/deployment_updater/updater.rb

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,6 @@ def cancel
3737
def with_error_logging(error_message)
3838
yield
3939
rescue StandardError => e
40-
# raise e
4140
error_name = e.is_a?(CloudController::Errors::ApiError) ? e.name : e.class.name
4241
logger.error(
4342
error_message,

0 commit comments

Comments
 (0)