33from django .conf import settings
44from django .db import models
55from django .contrib .auth import get_user_model
6+ from api .utils import dict_diff
67from api .tasks import run_pipeline
78from api .exceptions import DryccException , AlreadyExists
89from scheduler import KubeHTTPException
@@ -108,6 +109,30 @@ def get_deploy_command(self, container_type):
108109 return self .build .dryccfile .get (
109110 'deploy' , {}).get (container_type , {}).get ('command' , [])
110111
112+ def diff_procfile_types (self ):
113+ """
114+ If returning None, it indicates that all procfile_types have changed.
115+ """
116+ def _get_full_deploy (release ):
117+ deploy = {}
118+ for procfile_type , value in release .build .dryccfile ['deploy' ].items ():
119+ value ['image' ] = release .get_deploy_image (procfile_type )
120+ value ['args' ] = release .get_deploy_args (procfile_type )
121+ value ['command' ] = release .get_deploy_command (procfile_type )
122+ deploy [procfile_type ] = value
123+ return deploy
124+
125+ pre_release = self .previous ()
126+ if (pre_release and pre_release .build and
127+ pre_release .build .dryccfile and self .build and self .build .dryccfile ):
128+ deploy = _get_full_deploy (self )
129+ pre_deploy = _get_full_deploy (pre_release )
130+ procfile_types = set ()
131+ for value in dict_diff (deploy , pre_deploy ).values ():
132+ procfile_types = procfile_types .union (value .keys ())
133+ return procfile_types
134+ return None
135+
111136 def log (self , message , level = logging .INFO ):
112137 """Logs a message in the context of this application.
113138
@@ -254,7 +279,7 @@ def cleanup_old(self, procfile_types=None):
254279 )
255280 # base labels
256281 labels = {'heritage' : 'drycc' }
257- if procfile_types :
282+ if procfile_types is not None :
258283 labels ['type__in' ] = procfile_types
259284 # Cleanup controllers
260285 replica_sets_removal = []
@@ -286,7 +311,7 @@ def cleanup_old(self, procfile_types=None):
286311
287312 def _cleanup_stray_pods (self , namespace , procfile_types , latest_version ):
288313 labels = {'heritage' : 'drycc' }
289- if procfile_types :
314+ if procfile_types is not None :
290315 labels ['type__in' ] = procfile_types
291316 pods = self .scheduler ().pod .get (namespace , labels = labels ).json ()['items' ]
292317 if not pods :
@@ -340,7 +365,7 @@ def _cleanup_deployment_secrets_and_configs(self, namespace, procfile_types=None
340365 # http://kubernetes.io/docs/user-guide/labels/#set-based-requirement
341366 'version__notin' : versions
342367 }
343- if procfile_types :
368+ if procfile_types is not None :
344369 labels ['type__in' ] = procfile_types
345370 self .log ('Cleaning up orphaned env var secrets for application {}' .format (namespace ), level = logging .DEBUG ) # noqa
346371 secrets = self .scheduler ().secret .get (namespace , labels = labels ).json ()['items' ]
@@ -361,7 +386,7 @@ def _delete_release_in_scheduler(self, namespace, procfile_types, version):
361386 'app' : namespace ,
362387 'version' : version
363388 }
364- if procfile_types :
389+ if procfile_types is not None :
365390 labels ['type__in' ] = procfile_types
366391 # see if the app config has deploy timeout preference, otherwise use global
367392 timeout = self .config .values .get ('DRYCC_DEPLOY_TIMEOUT' , settings .DRYCC_DEPLOY_TIMEOUT )
0 commit comments