Skip to content

Commit 5d33b60

Browse files
committed
refactor deployment create
1 parent 943495e commit 5d33b60

File tree

1 file changed

+42
-51
lines changed

1 file changed

+42
-51
lines changed

app/actions/deployment_create.rb

Lines changed: 42 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,9 @@ def create(app:, user_audit_info:, message:)
1313
DeploymentModel.db.transaction do
1414
app.lock!
1515

16+
# Stopped apps will have quota validated since we their process up immediately
17+
validate_quota!(message, app) unless app.stopped?
18+
1619
message.strategy ||= DeploymentModel::ROLLING_STRATEGY
1720

1821
target_state = DeploymentTargetState.new(app, message)
@@ -29,46 +32,43 @@ def create(app:, user_audit_info:, message:)
2932

3033
previous_deployment = DeploymentModel.find(app: app, status_value: DeploymentModel::ACTIVE_STATUS_VALUE)
3134

35+
deployment = create_deployment(
36+
app,
37+
message,
38+
previous_deployment,
39+
previous_droplet,
40+
revision,
41+
target_state,
42+
user_audit_info
43+
)
44+
3245
if app.stopped?
33-
return deployment_for_stopped_app(
34-
app,
35-
message,
36-
previous_deployment,
37-
previous_droplet,
38-
revision,
39-
target_state,
40-
user_audit_info
41-
)
46+
process = app.newest_web_process
47+
else
48+
process_instances = starting_process_instances(deployment, desired_instances(app.oldest_web_process, previous_deployment))
49+
process = create_deployment_process(app, deployment.guid, revision, process_instances)
4250
end
4351

44-
desired_instances = desired_instances(app.oldest_web_process, previous_deployment)
45-
46-
validate_quota!(message, app)
47-
48-
deployment = DeploymentModel.create(
49-
app: app,
50-
state: starting_state(message),
51-
status_value: DeploymentModel::ACTIVE_STATUS_VALUE,
52-
status_reason: DeploymentModel::DEPLOYING_STATUS_REASON,
53-
droplet: target_state.droplet,
54-
previous_droplet: previous_droplet,
55-
original_web_process_instance_count: desired_instances,
56-
revision_guid: revision&.guid,
57-
revision_version: revision&.version,
58-
strategy: message.strategy,
59-
memory_in_mb: message.memory_in_mb,
60-
max_in_flight: message.max_in_flight,
61-
canary_steps: message.options&.dig(:canary, :steps),
62-
web_instances: message.web_instances || desired_instances
63-
)
52+
process.memory = message.memory_in_mb if message.memory_in_mb
6453

65-
MetadataUpdate.update(deployment, message)
54+
if app.stopped?
55+
process.instances = message.web_instances if message.web_instances
6656

67-
supersede_deployment(previous_deployment)
57+
process.save_changes
58+
59+
# Do not create a revision here because AppStart will not handle the rollback case
60+
AppStart.start(app: app, user_audit_info: user_audit_info, create_revision: false)
61+
deployment.update(state: DeploymentModel::DEPLOYED_STATE,
62+
status_value: DeploymentModel::FINALIZED_STATUS_VALUE,
63+
status_reason: DeploymentModel::DEPLOYED_STATUS_REASON)
64+
record_audit_event(deployment, target_state.droplet, user_audit_info, message)
65+
return deployment
66+
end
6867

69-
process_instances = starting_process_instances(deployment, desired_instances)
68+
process.save
69+
70+
supersede_deployment(previous_deployment)
7071

71-
process = create_deployment_process(app, message, deployment.guid, revision, process_instances)
7272
# Need to transition from STOPPED to STARTED to engage the ProcessObserver to desire the LRP.
7373
# It'd be better to do this via Diego::Runner.new(process, config).start,
7474
# but it is nontrivial to get that working in test.
@@ -86,8 +86,8 @@ def create(app:, user_audit_info:, message:)
8686
raise error
8787
end
8888

89-
def create_deployment_process(app, message, deployment_guid, revision, process_instances)
90-
process = clone_existing_web_process(app, message, revision, process_instances)
89+
def create_deployment_process(app, deployment_guid, revision, process_instances)
90+
process = clone_existing_web_process(app, revision, process_instances)
9191

9292
DeploymentProcessModel.create(
9393
deployment_guid: deployment_guid,
@@ -98,7 +98,7 @@ def create_deployment_process(app, message, deployment_guid, revision, process_i
9898
process
9999
end
100100

101-
def clone_existing_web_process(app, message, revision, process_instances)
101+
def clone_existing_web_process(app, revision, process_instances)
102102
web_process = app.newest_web_process
103103
command = if revision
104104
revision.commands_by_process_type[ProcessTypes::WEB]
@@ -111,7 +111,7 @@ def clone_existing_web_process(app, message, revision, process_instances)
111111
state: ProcessModel::STOPPED,
112112
instances: process_instances,
113113
command: command,
114-
memory: message.memory_in_mb || web_process.memory,
114+
memory: web_process.memory,
115115
file_descriptors: web_process.file_descriptors,
116116
disk_quota: web_process.disk_quota,
117117
log_rate_limit: web_process.log_rate_limit,
@@ -181,33 +181,24 @@ def validate_quota!(message, app)
181181
current_web_process.reload
182182
end
183183

184-
def deployment_for_stopped_app(app, message, previous_deployment, previous_droplet, revision, target_state, user_audit_info)
185-
app.newest_web_process.update(instances: message.web_instances) if message.web_instances
186-
app.newest_web_process.update(memory: message.memory_in_mb) if message.memory_in_mb
187-
# Do not create a revision here because AppStart will not handle the rollback case
188-
AppStart.start(app: app, user_audit_info: user_audit_info, create_revision: false)
189-
184+
def create_deployment(app, message, previous_deployment, previous_droplet, revision, target_state, user_audit_info)
190185
deployment = DeploymentModel.create(
191186
app: app,
192-
state: DeploymentModel::DEPLOYED_STATE,
193-
status_value: DeploymentModel::FINALIZED_STATUS_VALUE,
194-
status_reason: DeploymentModel::DEPLOYED_STATUS_REASON,
187+
state: starting_state(message),
188+
status_value: DeploymentModel::ACTIVE_STATUS_VALUE,
189+
status_reason: DeploymentModel::DEPLOYING_STATUS_REASON,
195190
droplet: target_state.droplet,
196191
previous_droplet: previous_droplet,
197192
original_web_process_instance_count: desired_instances(app.oldest_web_process, previous_deployment),
198193
revision_guid: revision&.guid,
199194
revision_version: revision&.version,
200195
strategy: message.strategy,
196+
memory_in_mb: message.memory_in_mb,
201197
max_in_flight: message.max_in_flight,
202198
canary_steps: message.options&.dig(:canary, :steps),
203-
memory_in_mb: message.memory_in_mb,
204199
web_instances: message.web_instances || desired_instances(app.oldest_web_process, previous_deployment)
205200
)
206-
207201
MetadataUpdate.update(deployment, message)
208-
209-
record_audit_event(deployment, target_state.droplet, user_audit_info, message)
210-
211202
deployment
212203
end
213204

0 commit comments

Comments
 (0)