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