Skip to content

Commit b40a14b

Browse files
authored
gateway: delete project restarts them first if oudated (#1677)
* gateway: delete project restarts them first if oudated * address review * gateway: wait until restart finish
1 parent f547060 commit b40a14b

File tree

3 files changed

+29
-2
lines changed

3 files changed

+29
-2
lines changed

Cargo.lock

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

gateway/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ rcgen = "0.11.3"
3939
reqwest = { workspace = true }
4040
rustls = "0.21.7"
4141
rustls-pemfile = "1.0.1"
42+
semver = { workspace = true }
4243
serde = { workspace = true, features = ["derive"] }
4344
serde_json = { workspace = true }
4445
sqlx = { workspace = true, features = ["sqlite", "json", "migrate"] }

gateway/src/api/latest.rs

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)