From c56556c3ce1b594fe6303512f3aa94e35f6188b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Bidoul?= Date: Thu, 4 Nov 2021 09:49:45 +0100 Subject: [PATCH] Add stopping state --- src/runboat/db.py | 5 +++-- src/runboat/models.py | 8 ++++++-- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/runboat/db.py b/src/runboat/db.py index c087bc7..4573d22 100644 --- a/src/runboat/db.py +++ b/src/runboat/db.py @@ -162,8 +162,9 @@ class BuildsDb: def oldest_stopped(self, limit: int) -> list[Build]: """Return a list of oldest stopped builds.""" rows = self._con.execute( - "SELECT * FROM builds WHERE status IN (?, ?) ORDER BY last_scaled LIMIT ?", - (BuildStatus.stopped, BuildStatus.failed, limit), + "SELECT * FROM builds WHERE status IN (?, ?, ?) " + "ORDER BY last_scaled LIMIT ?", + (BuildStatus.stopping, BuildStatus.stopped, BuildStatus.failed, limit), ).fetchall() return [self._build_from_row(row) for row in rows] diff --git a/src/runboat/models.py b/src/runboat/models.py index 6b1b572..02f6e71 100644 --- a/src/runboat/models.py +++ b/src/runboat/models.py @@ -17,6 +17,7 @@ _logger = logging.getLogger(__name__) class BuildStatus(str, Enum): stopped = "stopped" # initialization succeeded and 0 replicas + stopping = "stopping" # 0 desired replicas but some are still running starting = "starting" # to initialize or initializing or scaling up started = "started" # running failed = "failed" # initialization failed @@ -101,7 +102,10 @@ class Build(BaseModel): elif init_status == BuildInitStatus.succeeded: replicas = deployment.spec.replicas if not replicas: - return BuildStatus.stopped + if deployment.status.replicas: + return BuildStatus.stopping + else: + return BuildStatus.stopped else: if deployment.status.ready_replicas == replicas: return BuildStatus.started @@ -163,7 +167,7 @@ class Build(BaseModel): _logger.info(f"Marking failed {self} for reinitialization.") await k8s.delete_job(self.name, job_kind=k8s.DeploymentMode.initialize) await self._patch(init_status=BuildInitStatus.todo, desired_replicas=0) - elif self.status == BuildStatus.stopped: + elif self.status in (BuildStatus.stopped, BuildStatus.stopping): _logger.info(f"Starting {self} that was last scaled on {self.last_scaled}.") await self._patch(desired_replicas=1)