diff --git a/src/karl/api/v1.py b/src/karl/api/v1.py index de85719..2a88c18 100644 --- a/src/karl/api/v1.py +++ b/src/karl/api/v1.py @@ -9,7 +9,7 @@ from starlette.responses import JSONResponse, Response from karl.api.models import Request from karl.core.injects import AutowireSupport from karl.core.woodpecker import Woodpecker -from karl.model.webhook import WoodpeckerEvent +from karl.model.webhook import WoodpeckerEvent, ReloadEvent router = APIRouter() logger = logging.getLogger(__name__) @@ -39,3 +39,10 @@ class APIv1: async def ci(self, request: Request): await self.bus.dispatch(mapper.map(request)) return Response(status_code=201) + + @router.post("/reload", summary="Manual service reload") + async def reload(self, service: str = None): + if service is None: + return Response(status_code=400) + await self.bus.dispatch(ReloadEvent(service=service)) + return Response(status_code=201) diff --git a/src/karl/model/vcs.py b/src/karl/model/vcs.py new file mode 100644 index 0000000..80800bc --- /dev/null +++ b/src/karl/model/vcs.py @@ -0,0 +1,7 @@ +from dataclasses import dataclass + + +@dataclass +class Head: + sha: str + branch: str diff --git a/src/karl/model/webhook.py b/src/karl/model/webhook.py index 6c941ae..5b44d46 100644 --- a/src/karl/model/webhook.py +++ b/src/karl/model/webhook.py @@ -10,3 +10,6 @@ class WoodpeckerEvent(BaseEvent): message: str started: int files: List[str] + +class ReloadEvent(BaseEvent): + service: str diff --git a/src/karl/services/reload.py b/src/karl/services/reload.py new file mode 100644 index 0000000..28997aa --- /dev/null +++ b/src/karl/services/reload.py @@ -0,0 +1,29 @@ +from datetime import datetime +from typing import Annotated + +from bubus import EventBus +from injectable import injectable, autowired, Autowired + +from model.webhook import ReloadEvent, WoodpeckerEvent +from services import GitService + + +@injectable(singleton=True) +class ReloadService: + + @autowired + def __init__(self, bus: Annotated[EventBus, Autowired]): + self._bus = bus + self._bus.on(ReloadEvent, self.on_reload) + self._git = GitService() + + def on_reload(self, event: ReloadEvent): + head = self._git.get_head() + self._bus.dispatch(WoodpeckerEvent( + _id=-1, + commit=head.sha, + ref=head.branch, + message=f"Manual reload of {event.service}", + started=int(datetime.now().timestamp()), + files=[f"compose/{event.service}/docker-compose.yml"] + )) diff --git a/src/karl/services/vcs.py b/src/karl/services/vcs.py index e89836d..8f63c19 100644 --- a/src/karl/services/vcs.py +++ b/src/karl/services/vcs.py @@ -2,6 +2,7 @@ from git import Repo, Remote from injectable import injectable from karl.config import GitConfig, get_settings +from model.vcs import Head @injectable(singleton=True) @@ -27,3 +28,9 @@ class GitService: def checkout(self, sha: str): self._origin.fetch() self._repo.git.checkout(sha) + + def get_head(self) -> Head: + return Head( + self._repo.active_branch.commit.hexsha, + self._repo.active_branch.name + )