From f911eb18d24935001e71631db8f6a0b11cf5c021 Mon Sep 17 00:00:00 2001 From: Jacob Williamson Date: Thu, 7 May 2026 11:24:01 +0100 Subject: [PATCH 1/2] Handle blueapi connection error --- src/daq_queuing_service/api/errors.py | 15 ++++++++++++++- src/daq_queuing_service/app/app.py | 5 ----- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/src/daq_queuing_service/api/errors.py b/src/daq_queuing_service/api/errors.py index e33b5e9..40a107f 100644 --- a/src/daq_queuing_service/api/errors.py +++ b/src/daq_queuing_service/api/errors.py @@ -1,4 +1,8 @@ -from blueapi.client.rest import InvalidParametersError, UnknownPlanError +from blueapi.client.rest import ( + InvalidParametersError, + ServiceUnavailableError, + UnknownPlanError, +) from fastapi import FastAPI, Request from fastapi.responses import JSONResponse @@ -15,6 +19,15 @@ def register_exception_handlers(app: FastAPI): + @app.exception_handler(ServiceUnavailableError) + async def service_unavailable_error( + request: Request, exception: ServiceUnavailableError + ): + return JSONResponse( + status_code=409, + content={"error": "blueapi_unavailable", "message": str(exception)}, + ) + @app.exception_handler(TaskInProgressError) async def task_in_progress_handler( request: Request, exception: TaskInProgressError diff --git a/src/daq_queuing_service/app/app.py b/src/daq_queuing_service/app/app.py index 295fb15..49df90a 100644 --- a/src/daq_queuing_service/app/app.py +++ b/src/daq_queuing_service/app/app.py @@ -18,11 +18,6 @@ from ._config import load_config -LOCAL_BLUEAPI_URL = "http://localhost:8000/" -I15_1_BLUEAPI_URL = "https://i15-1-blueapi.diamond.ac.uk/" -STOMP_URL = "tcp://localhost:61613" - - logging.basicConfig( level=logging.INFO, format="%(asctime)s [%(name)s] %(levelname)s: %(message)s" ) From 1fe951f0d3febc3442571c3ba91f303e88400ae9 Mon Sep 17 00:00:00 2001 From: Jacob Williamson Date: Fri, 8 May 2026 13:26:45 +0100 Subject: [PATCH 2/2] Add log message --- src/daq_queuing_service/api/api.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/daq_queuing_service/api/api.py b/src/daq_queuing_service/api/api.py index 50c0b83..39fb4ff 100644 --- a/src/daq_queuing_service/api/api.py +++ b/src/daq_queuing_service/api/api.py @@ -10,6 +10,7 @@ from fastapi import APIRouter, Request, Response from pydantic import BaseModel +from daq_queuing_service.app._config import AppConfig, load_config from daq_queuing_service.task import ExperimentDefinition, Status, Task from daq_queuing_service.task_queue.queue import ( QueueState, @@ -51,12 +52,12 @@ def _validate_tasks_with_blueapi( task_request_constructor: Callable[[ExperimentDefinition], TaskRequest], ) -> None: errors: dict[int, InvalidParametersError | UnknownPlanError] = {} + LOGGER.info(f"Using blueapi client: {blueapi_client._config}") # type: ignore # noqa for i, task in enumerate(tasks): try: task_response = blueapi_client.create_task( task_request_constructor(task.experiment_definition) ) - print(task_response) blueapi_client.clear_task(task_response.task_id) except (InvalidParametersError, UnknownPlanError) as e: errors[i] = e @@ -82,6 +83,10 @@ def read_root(request: Request): f"Welcome to the daq queuing service. Visit {base_url}docs for Uvicorn API." ) + @router.get("/config") + def get_config() -> AppConfig: + return load_config() + @router.patch("/queue/state") async def update_queue_state(payload: QueueStateUpdate) -> QueueState: return await queue.update_state(**payload.model_dump(exclude_none=True))