@@ -151,13 +151,7 @@ def rollback(self, user, version):
151151 def delete (self , * args , ** kwargs ):
152152 """Delete release DB record and any RCs from the affect release"""
153153 try :
154- labels = {
155- 'app' : self .app .id ,
156- 'version' : 'v{}' .format (self .version )
157- }
158- controllers = self ._scheduler ._get_rcs (self .app .id , labels = labels )
159- for controller in controllers .json ()['items' ]:
160- self ._scheduler ._delete_rc (self .app .id , controller ['metadata' ]['name' ])
154+ self ._delete_release_in_scheduler (self .app .id , self .version )
161155 except KubeHTTPException as e :
162156 # 404 means they were already cleaned up
163157 if e .status_code is not 404 :
@@ -168,6 +162,68 @@ def delete(self, *args, **kwargs):
168162 finally :
169163 super (Release , self ).delete (* args , ** kwargs )
170164
165+ def cleanup_old (self ):
166+ """Cleanup all but the latest release from Kubernetes"""
167+ latest_version = 'v{}' .format (self .version )
168+ log_event (self .app , 'Cleaning up RCS for releases older than {} (latest)' .format (latest_version )) # noqa
169+
170+ # Cleanup controllers
171+ controller_removal = []
172+ controllers = self ._scheduler ._get_rcs (self .app .id ).json ()
173+ for controller in controllers ['items' ]:
174+ current_version = controller ['metadata' ]['labels' ]['version' ]
175+ # skip the latest release
176+ if current_version == latest_version :
177+ continue
178+
179+ # aggregate versions together to removal all at once
180+ if current_version not in controller_removal :
181+ controller_removal .append (current_version )
182+
183+ if controller_removal :
184+ log_event (self .app , 'Found the following versions to cleanup: {}' .format (', ' .join (controller_removal ))) # noqa
185+
186+ for version in controller_removal :
187+ self ._delete_release_in_scheduler (self .app .id , version )
188+
189+ # find stray env secrets to remove that may have been missed
190+ log_event (self .app , 'Cleaning up orphaned environment var secrets' )
191+ labels = {
192+ 'app' : self .app .id ,
193+ 'type' : 'env'
194+ }
195+ secrets = self ._scheduler ._get_secrets (self .app .id , labels = labels ).json ()
196+ for secret in secrets ['items' ]:
197+ current_version = secret ['metadata' ]['labels' ]['version' ]
198+ # skip the latest release
199+ if current_version == latest_version :
200+ continue
201+
202+ self ._scheduler ._delete_secret (self .app .id , secret ['metadata' ]['name' ])
203+
204+ def _delete_release_in_scheduler (self , namespace , version ):
205+ """
206+ Deletes a specific release in k8s
207+
208+ Scale RCs to 0 then delete RCs and the version specific
209+ secret that container the env var
210+ """
211+ labels = {
212+ 'app' : namespace ,
213+ 'version' : 'v{}' .format (version )
214+ }
215+ controllers = self ._scheduler ._get_rcs (namespace , labels = labels )
216+ for controller in controllers .json ()['items' ]:
217+ self ._scheduler ._scale_rc (namespace , controller ['metadata' ]['name' ], 0 )
218+ self ._scheduler ._delete_rc (namespace , controller ['metadata' ]['name' ])
219+
220+ # remove secret that contains env vars for the release
221+ try :
222+ secret_name = "{}-{}-env" .format (namespace , version )
223+ self ._scheduler ._delete_secret (namespace , secret_name )
224+ except KubeHTTPException :
225+ pass
226+
171227 def save (self , * args , ** kwargs ): # noqa
172228 if not self .summary :
173229 self .summary = ''
0 commit comments