From 68af49c9ee7ad6129faa8ab268270b95f31c2d62 Mon Sep 17 00:00:00 2001 From: Florian Katerndahl Date: Thu, 23 Jul 2026 15:10:39 +0200 Subject: [PATCH 1/3] Set job status to dismissed in case the dismiss endpoint is called (close #174) - Explicitly set the `status` field for both the local backend and the airflow backend --- wraptile/src/wraptile/services/airflow/airflow_service.py | 4 +++- wraptile/src/wraptile/services/local/local_service.py | 1 + 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/wraptile/src/wraptile/services/airflow/airflow_service.py b/wraptile/src/wraptile/services/airflow/airflow_service.py index aa8f7070..8e0ec499 100644 --- a/wraptile/src/wraptile/services/airflow/airflow_service.py +++ b/wraptile/src/wraptile/services/airflow/airflow_service.py @@ -228,7 +228,9 @@ async def dismiss_job(self, job_id: str, *args, **kwargs) -> JobInfo: raise ServiceException( e.status, e.reason, exception=e, is_job_problem=True ) from e - return self.dag_run_to_job_info(dag_run) + job_info: JobInfo = self.dag_run_to_job_info(dag_run) + job_info.status = JobStatus.dismissed + return job_info async def get_job_results(self, job_id: str, *args, **kwargs) -> JobResults: dag_id = self.get_dag_id_from_job_id(job_id) diff --git a/wraptile/src/wraptile/services/local/local_service.py b/wraptile/src/wraptile/services/local/local_service.py index a1c61aa7..ae949834 100644 --- a/wraptile/src/wraptile/services/local/local_service.py +++ b/wraptile/src/wraptile/services/local/local_service.py @@ -162,6 +162,7 @@ async def dismiss_job(self, job_id: str, *args, **_kwargs) -> JobInfo: del self.jobs[job_id] self.job_results.pop(job_id, None) self.job_uses_processes.pop(job_id, None) + job.job_info.status = JobStatus.dismissed return job.job_info async def get_job_results(self, job_id: str, *args, **_kwargs) -> JobResults: From 1a487ee8a4a2b8cf18fea62de44d7a048e33e855 Mon Sep 17 00:00:00 2001 From: Florian Katerndahl Date: Thu, 23 Jul 2026 15:19:30 +0200 Subject: [PATCH 2/3] document change in CHANGES.md --- CHANGES.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGES.md b/CHANGES.md index 804d320f..35acb58f 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -39,6 +39,10 @@ no longer read the developer's real `~/.eozilla/config`, which could inject a logged-in token into the request headers and fail the assertion that an unauthenticated client sends none. (#167) +- Successful dismissal of jobs via a DELETE request to the `/jobs/{jobID}` + endpoint returns a `JobInfo` object whose `status` field is always set + to "dismissed" as per requirement `/req/dismiss/job-dismiss-success` + of the OGC API - Processes - Part 1: Core specification. (#174) ### Other changes From 030cbd30da58a9144888e8a22f808bbcf2c79807 Mon Sep 17 00:00:00 2001 From: Florian Katerndahl Date: Tue, 28 Jul 2026 16:41:39 +0200 Subject: [PATCH 3/3] adapt tests for fixed job status value after job dismissal --- .../services/local/test_local_service.py | 23 +++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/wraptile/tests/services/local/test_local_service.py b/wraptile/tests/services/local/test_local_service.py index a92eaacd..fd5ed521 100644 --- a/wraptile/tests/services/local/test_local_service.py +++ b/wraptile/tests/services/local/test_local_service.py @@ -240,12 +240,27 @@ async def test_dismiss_running_job_cancels_future(self): job_info = await self.service.dismiss_job( job_id=job_info.jobID, request=self.get_request() ) - self.assertIn( - job_info.status, - {JobStatus.accepted, JobStatus.running, JobStatus.dismissed}, - ) + self.assertEqual(job_info.status, JobStatus.dismissed) self.assertTrue(self.service.jobs[job_info.jobID].cancelled) + async def test_dismiss_running_job_leaves_entry(self): + job_info = await self.service.execute_process( + process_id="sleep_a_while", + process_request=ProcessRequest(inputs={"duration": 0.5}), + request=self.get_request(), + ) + job_info = await self.service.dismiss_job( + job_id=job_info.jobID, request=self.get_request() + ) + queried_job = await self.service.get_job( + job_info.jobID, request=self.get_request() + ) + self.assertIsInstance(queried_job, JobInfo) + self.assertEqual(job_info.status, JobStatus.dismissed) + self.assertEqual(queried_job.status, JobStatus.dismissed) + self.assertEqual("sleep_a_while", queried_job.processID) + self.assertEqual(job_info.jobID, queried_job.jobID) + async def test_dismiss_finished_job_removes_cached_state(self): job_info = await self.service.execute_process( process_id="primes_between",