@@ -387,13 +387,21 @@ class ConfigViewSet(ReleasableViewSet):
387387
388388 def post_save (self , config ):
389389 latest_release = config .app .release_set .filter (failed = False ).latest ()
390- if latest_release .build is not None and latest_release . state == "created" :
390+ if latest_release .deploying :
391391 config .delete ()
392392 raise DryccException ('There is an executing pipeline, please wait' )
393393 try :
394394 release = latest_release .new (
395395 self .request .user , config = config , build = latest_release .build )
396- run_deploy .delay (release , config )
396+ procfile_types = set ()
397+ for field , diff in config .diff ().items ():
398+ if field in config .procfile_fields :
399+ for value in diff .values ():
400+ procfile_types .update (value .keys ())
401+ # all_diff_fields changed, deploy all.
402+ procfile_types = procfile_types if procfile_types else None
403+ rollback_on_failure = config .app .appsettings_set .latest ().autorollback
404+ run_deploy .delay (release , procfile_types , False , rollback_on_failure )
397405 except Exception as e :
398406 config .delete ()
399407 if isinstance (e , AlreadyExists ):
@@ -451,15 +459,11 @@ def describe(self, *args, **kwargs):
451459
452460 def restart (self , request , * args , ** kwargs ):
453461 app = self .get_app ()
454- ptypes = []
455- types = request .data .get ("types" , "" ).split ("," )
456- types = [ptype for ptype in set (types ) if ptype != "" ]
457- if not types :
458- # all ptypes need to restart
459- ptypes = app .structure .keys ()
462+ ptypes = set ([ptype for ptype in request .data .get ("types" , "" ).split ("," ) if ptype ])
463+ if not ptypes :
464+ ptypes = app .structure .keys () # all ptypes need to restart
460465 else :
461- ptypes = [ptype for ptype in types if ptype in app .structure ]
462- invalid_ptypes = set (types ) - set (ptypes )
466+ invalid_ptypes = ptypes .difference (app .structure )
463467 if len (invalid_ptypes ) != 0 :
464468 raise DryccException ("process type {} is not included in procfile" .
465469 format (',' .join (invalid_ptypes )))
@@ -470,7 +474,7 @@ def restart(self, request, *args, **kwargs):
470474 def scale (self , request , ** kwargs ):
471475 app = self .get_app ()
472476 latest_release = app .release_set .filter (failed = False ).latest ()
473- if latest_release .build is not None and latest_release . state == "created" :
477+ if latest_release .deploying :
474478 raise DryccException ('There is an executing pipeline, please wait' )
475479 scale_app .delay (app , request .user , request .data )
476480 return Response (status = status .HTTP_204_NO_CONTENT )
@@ -629,12 +633,32 @@ def get_object(self, **kwargs):
629633 qs = self .get_queryset (** kwargs )
630634 return get_object_or_404 (qs , version = self .kwargs ['version' ])
631635
636+ def deploy (self , request , ** kwargs ):
637+ """Deploy the latest release"""
638+ release = self .get_app ().release_set .latest ()
639+ if release .deploying :
640+ raise DryccException ('There is an executing pipeline, please wait' )
641+ procfile_types = set (
642+ [ptype for ptype in request .data .get ("types" , "" ).split ("," ) if ptype ])
643+ if not procfile_types :
644+ procfile_types = release .app .structure .keys () # all procfile_types need to deploy
645+ else :
646+ invalid_procfile_types = procfile_types .difference (release .app .structure )
647+ if len (invalid_procfile_types ) != 0 :
648+ raise DryccException ("process type {} is not included in procfile" .
649+ format (',' .join (invalid_procfile_types )))
650+ rollback_on_failure = release .app .appsettings_set .latest ().autorollback
651+ run_deploy .delay (release , procfile_types , False , rollback_on_failure )
652+ return Response (status = status .HTTP_204_NO_CONTENT )
653+
632654 def rollback (self , request , ** kwargs ):
633655 """
634656 Create a new release as a copy of the state of the compiled slug and config vars of a
635657 previous release.
636658 """
637659 latest_release = self .get_app ().release_set .filter (failed = False ).latest ()
660+ if latest_release .deploying :
661+ raise DryccException ('There is an executing pipeline, please wait' )
638662 new_release = latest_release .rollback (request .user , request .data .get ('version' , None ))
639663 response = {'version' : new_release .version }
640664 return Response (response , status = status .HTTP_201_CREATED )
0 commit comments