From fc40fe7d72b387bf6a48bac3b7a5f755623d69a3 Mon Sep 17 00:00:00 2001 From: saltydk Date: Sun, 24 Mar 2024 20:16:10 +0100 Subject: [PATCH] docker: add controller readiness check --- roles/docker/tasks/subtasks/controller.yml | 18 ++++++++++++++---- roles/unionfs/tasks/subtasks/docker/daemon.yml | 2 +- scripts/saltbox_docker_controller.py | 10 ++++++++++ 3 files changed, 25 insertions(+), 5 deletions(-) diff --git a/roles/docker/tasks/subtasks/controller.yml b/roles/docker/tasks/subtasks/controller.yml index 623c5164d7..1f49d7a837 100644 --- a/roles/docker/tasks/subtasks/controller.yml +++ b/roles/docker/tasks/subtasks/controller.yml @@ -65,11 +65,21 @@ state: restarted daemon_reload: true -- name: "Controller | Wait for 10 seconds" - ansible.builtin.wait_for: - timeout: "10" +- name: Controller | Wait until Controller is ready + ansible.builtin.uri: + url: "{{ docker_controller_url }}/ping" + method: GET + return_content: yes + status_code: 200,404 + register: result + until: > + (result.status == 200 and (result.content | from_json).get('message') == "pong") or + (result.status == 404 and (result.content | from_json).get('detail') == "Not Found") + retries: 12 + delay: 5 + ignore_errors: yes -- name: Block Docker Controller +- name: Controller | Block Docker Controller ansible.builtin.uri: url: "{{ docker_controller_url }}/block/20" method: POST diff --git a/roles/unionfs/tasks/subtasks/docker/daemon.yml b/roles/unionfs/tasks/subtasks/docker/daemon.yml index 0b9f4448ee..f0048a2712 100644 --- a/roles/unionfs/tasks/subtasks/docker/daemon.yml +++ b/roles/unionfs/tasks/subtasks/docker/daemon.yml @@ -40,7 +40,7 @@ ansible.builtin.wait_for: timeout: 30 -- name: Unblock Docker Controller +- name: Docker | Daemon | Unblock Docker Controller ansible.builtin.uri: url: "{{ docker_controller_url }}/unblock" method: POST diff --git a/scripts/saltbox_docker_controller.py b/scripts/saltbox_docker_controller.py index 5f324cb460..8da9e18a81 100644 --- a/scripts/saltbox_docker_controller.py +++ b/scripts/saltbox_docker_controller.py @@ -11,6 +11,7 @@ # Global flag to indicate shutdown shutdown_flag = False +app_ready = False # Signal handler def signal_handler(signum, frame): @@ -313,6 +314,7 @@ def stop_containers_in_dependency_order(graph: DependencyGraph): # FastAPI Application and API Endpoints @asynccontextmanager async def lifespan(app: FastAPI): + global app_ready try: # Initialization client = docker.from_env() @@ -322,6 +324,7 @@ async def lifespan(app: FastAPI): # Initialize DependencyGraph global graph # Declare graph as global if it's used elsewhere outside this context graph = DependencyGraph() + app_ready = True # Indicate that the app is now ready except Exception as e: logging.error(f"An error occurred during application initialization: {e}") @@ -335,6 +338,13 @@ async def lifespan(app: FastAPI): unblock_task = None +@app.get("/ping") +async def ping(): + if app_ready: + return {"message": "pong"} + raise HTTPException(status_code=503, detail="Application not ready") + + @app.post("/start") async def start_containers(): if is_blocked: