From 1f02cd6f62f8122a33e9c831b113ed87f8538561 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Patrick=20Jos=C3=A9=20Pereira?= Date: Thu, 11 Apr 2024 14:42:28 -0300 Subject: [PATCH] core: services: versionchooser: main: Make set operations to wait for what is already in progress MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Patrick José Pereira --- core/services/versionchooser/main.py | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/core/services/versionchooser/main.py b/core/services/versionchooser/main.py index c0db775820..b8faa3cfca 100755 --- a/core/services/versionchooser/main.py +++ b/core/services/versionchooser/main.py @@ -5,7 +5,9 @@ import aiodocker import connexion from aiohttp import web +from commonwealth.utils.decorators import operation_in_progress_global from commonwealth.utils.logs import InterceptHandler, init_logger +from fastapi import HTTPException, status from loguru import logger from utils.chooser import STATIC_FOLDER, VersionChooser @@ -20,6 +22,15 @@ versionChooser = VersionChooser(aiodocker.Docker()) +def raise_lock(*raise_args: str, **kwargs: int) -> None: + """Raise a 423 HTTP Error status + + Raises: + HTTPException: An operation is already in progress, please wait. + """ + raise HTTPException(status_code=status.HTTP_423_LOCKED, detail="There is an operation already in progress.") + + async def index(_request: web.Request) -> Any: return versionChooser.index() @@ -28,6 +39,7 @@ async def get_version() -> Any: return versionChooser.get_version() +@operation_in_progress_global(callback=raise_lock) async def pull_version(request: web.Request) -> Any: data = await request.json() repository = data["repository"] @@ -35,6 +47,7 @@ async def pull_version(request: web.Request) -> Any: return await versionChooser.pull_version(request, repository, tag) +@operation_in_progress_global(callback=raise_lock) async def set_version(request: web.Request) -> Any: data = await request.json() tag = data["tag"] @@ -42,6 +55,7 @@ async def set_version(request: web.Request) -> Any: return await versionChooser.set_version(repository, tag) +@operation_in_progress_global(callback=raise_lock) async def delete_version(request: web.Request) -> Any: data = await request.json() tag = data["tag"] @@ -61,17 +75,20 @@ async def get_bootstrap_version() -> Any: return await versionChooser.get_bootstrap_version() +@operation_in_progress_global(callback=raise_lock) async def set_bootstrap_version(request: web.Request) -> Any: data = await request.json() tag = data["tag"] return await versionChooser.set_bootstrap_version(tag) +@operation_in_progress_global(callback=raise_lock) async def load(request: web.Request) -> Any: data = await request.read() return await versionChooser.load(data) +@operation_in_progress_global(callback=raise_lock) async def restart() -> Any: return await versionChooser.restart()