@@ -267,17 +267,42 @@ async fn delete_project(
267267
268268 let project_name = scoped_user. scope . clone ( ) ;
269269 let project = state. service . find_project ( & project_name) . await ?;
270+
270271 let project_id =
271272 Ulid :: from_string ( & project. project_id ) . expect ( "stored project id to be a valid ULID" ) ;
272273
273- // Try to startup destroyed or errored projects
274+ // Try to startup destroyed, errored or outdated projects
274275 let project_deletable = project. state . is_ready ( ) || project. state . is_stopped ( ) ;
275- if !( project_deletable) {
276+ let current_version: semver:: Version = env ! ( "CARGO_PKG_VERSION" )
277+ . parse ( )
278+ . expect ( "to have a valid semver gateway version" ) ;
279+
280+ let version = project
281+ . state
282+ . container ( )
283+ . and_then ( |container_inspect_response| {
284+ container_inspect_response. image . and_then ( |inner| {
285+ inner
286+ . strip_prefix ( "public.ecr.aws/shuttle/deployer:v" )
287+ . and_then ( |x| x. parse :: < semver:: Version > ( ) . ok ( ) )
288+ } )
289+ } )
290+ // Defaulting to a version that introduced a breaking change.
291+ // This was the last one that introduced it at the present
292+ // moment.
293+ . unwrap_or ( semver:: Version :: new ( 0 , 39 , 0 ) ) ;
294+
295+ // We restart the project before deletion everytime
296+ // we detect it is outdated, so that we avoid by default
297+ // breaking changes that can happen on the deployer
298+ // side in the future.
299+ if !project_deletable || version < current_version {
276300 let handle = state
277301 . service
278302 . new_task ( )
279303 . project ( project_name. clone ( ) )
280304 . and_then ( task:: restart ( project_id) )
305+ . and_then ( task:: run_until_done ( ) )
281306 . send ( & state. sender )
282307 . await ?;
283308
0 commit comments