@@ -249,10 +249,14 @@ def restart(self, **kwargs): # noqa
249249 deployments .append (self ._get_job_id (kwargs ['type' ]))
250250 try :
251251 tasks = [
252- functools .partial (
253- self .scheduler ().deployment .restart ,
254- self .id ,
255- deployment
252+ (
253+ functools .partial (
254+ self .scheduler ().deployment .restart ,
255+ self .id ,
256+ deployment
257+ ),
258+ lambda future : self .log (
259+ f'restart { kwargs ['type' ]} callback: { future .result ()} ' ),
256260 ) for deployment in deployments
257261 ]
258262 apply_tasks (tasks )
@@ -273,7 +277,7 @@ def scale(self, user, structure):
273277 app_settings = self .appsettings_set .latest ()
274278 self ._scale (user , structure , release , app_settings )
275279
276- def pipeline (self , release , ptypes = None , force_deploy = False ):
280+ def pipeline (self , release , ptypes , force_deploy = False ):
277281 prefix = f"[pipeline] release { release .version_name } "
278282 try :
279283 if release .build is not None :
@@ -306,7 +310,7 @@ def pipeline(self, release, ptypes=None, force_deploy=False):
306310 state = "crashed" , action = "pipeline" , ptypes = ptypes , exception = str (e ))
307311 self .log (f"{ prefix } pipeline runtime error: { release .exception } " , logging .ERROR )
308312 finally :
309- DeployLock (self .pk ).release (ptypes )
313+ DeployLock (self .pk ).release (ptypes ) # release all locks
310314 release .save (update_fields = ["state" , "failed" ]) # avoid overwriting other fields
311315 self .log (f"{ prefix } run completed..." )
312316
@@ -744,16 +748,20 @@ def _mount(self, user, volume, release, app_settings, structure=None):
744748 'annotations' , {})
745749 self .set_application_config (release , scale_type )
746750 # gather volume proc types to be deployed
747- tasks .append (functools .partial (
748- self .scheduler ().deployment .patch ,
749- namespace = self .id ,
750- name = self ._get_job_id (scale_type ),
751- image = release .get_deploy_image (scale_type ),
752- command = release .get_deploy_command (scale_type ),
753- args = release .get_deploy_args (scale_type ),
754- spec_annotations = spec_annotations ,
755- resource_version = deployment ["metadata" ]["resourceVersion" ],
756- ** data
751+ tasks .append ((
752+ functools .partial (
753+ self .scheduler ().deployment .patch ,
754+ namespace = self .id ,
755+ name = self ._get_job_id (scale_type ),
756+ image = release .get_deploy_image (scale_type ),
757+ command = release .get_deploy_command (scale_type ),
758+ args = release .get_deploy_args (scale_type ),
759+ spec_annotations = spec_annotations ,
760+ resource_version = deployment ["metadata" ]["resourceVersion" ],
761+ ** data
762+ ),
763+ lambda future : self .log (
764+ f'mount { volume } for { scale_type } callback: { future .result ()} ' ),
757765 ))
758766 try :
759767 apply_tasks (tasks )
@@ -769,19 +777,24 @@ def _deploy(self, deploys, ptypes, prev_release,
769777 deploys = OrderedDict (sorted (deploys .items (), key = lambda d : d [1 ].get ('routable' )))
770778 # Check if any proc type has a Deployment in progress
771779 self ._check_deployment_in_progress (deploys , force_deploy )
772-
773780 try :
774781 tasks = []
782+ lock = DeployLock (self .pk )
775783 for scale_type , kwargs in deploys .items ():
776784 self .set_application_config (release , scale_type )
777- tasks .append (functools .partial (
778- self .scheduler ().deploy ,
779- namespace = self .id ,
780- name = self ._get_job_id (scale_type ),
781- image = release .get_deploy_image (scale_type ),
782- command = release .get_deploy_command (scale_type ),
783- args = release .get_deploy_args (scale_type ),
784- ** kwargs
785+ tasks .append ((
786+ functools .partial (
787+ self .scheduler ().deploy ,
788+ namespace = self .id ,
789+ name = self ._get_job_id (scale_type ),
790+ image = release .get_deploy_image (scale_type ),
791+ command = release .get_deploy_command (scale_type ),
792+ args = release .get_deploy_args (scale_type ),
793+ ** kwargs
794+ ),
795+ lambda future : self .log (
796+ f'deploy and unlock callback: { [
797+ future .result (), lock .release ([scale_type ])]} ' ),
785798 ))
786799 try :
787800 apply_tasks (tasks )
@@ -797,7 +810,6 @@ def _deploy(self, deploys, ptypes, prev_release,
797810 self .deploy (prev_release , ptypes , True , False )
798811 # let it bubble up
799812 raise DryccException ('{}\n {}' .format (err , str (e ))) from e
800-
801813 # otherwise just re-raise
802814 raise
803815 except Exception as e :
@@ -876,7 +888,7 @@ def _scale_pods(self, scale_types, release, app_settings):
876888 # create the application config in k8s (secret in this case) for all deploy objects
877889 self .set_application_config (release , scale_type )
878890 # gather all proc types to be deployed
879- tasks .append (
891+ tasks .append ((
880892 functools .partial (
881893 self .scheduler ().scale ,
882894 namespace = self .id ,
@@ -885,8 +897,9 @@ def _scale_pods(self, scale_types, release, app_settings):
885897 command = release .get_deploy_command (scale_type ),
886898 args = release .get_deploy_args (scale_type ),
887899 ** data
888- )
889- )
900+ ),
901+ lambda future : self .log (f'scale { scale_type } callback: { future .result ()} ' ),
902+ ))
890903 try :
891904 apply_tasks (tasks )
892905 except Exception as e :
@@ -1046,10 +1059,9 @@ def _check_deployment_in_progress(self, deploys, force_deploy=False):
10461059 @staticmethod
10471060 def _default_structure (release ):
10481061 """Scale to default structure based on release type"""
1049- structure = {PTYPE_WEB : 1 }
1062+ structure = {}
10501063 for ptype in release .ptypes :
1051- if ptype != PTYPE_WEB :
1052- structure [ptype ] = 0
1064+ structure [ptype ] = 1 if ptype == PTYPE_WEB else 0
10531065 return structure
10541066
10551067 def _scheduler_filter (self , ** kwargs ):
0 commit comments