diff --git a/pyproject.toml b/pyproject.toml index fa843df..4738496 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -20,6 +20,7 @@ dependencies = [ "fastapi-utils>=0.8.0", "keyring>=25.6.0", "keyring-backend>=0.1.0", + "bubus>=1.5.6", ] [dependency-groups] diff --git a/src/karl/api/v1.py b/src/karl/api/v1.py index 9bbbfbc..3bc8090 100644 --- a/src/karl/api/v1.py +++ b/src/karl/api/v1.py @@ -1,4 +1,7 @@ +import logging + from automapper import mapper, exceptions +from bubus import EventBus from fastapi import APIRouter, Depends from fastapi_utils.cbv import cbv from starlette.responses import JSONResponse, Response @@ -9,7 +12,7 @@ from core.woodpecker import Woodpecker from model.webhook import WoodpeckerEvent router = APIRouter() - +logger = logging.getLogger(__name__) @router.get("/", summary="Main API") async def root(): @@ -19,7 +22,7 @@ async def root(): @cbv(router) class APIv1: woodpecker: Woodpecker = Depends(AutowireSupport.woodpecker) - logger = __import__('logging').getLogger(__name__) + bus: EventBus = Depends(AutowireSupport.bus) def __init__(self): try: # TODO: rejestracja w innym miejscu: klasa jest przeładowywana co żądanie @@ -34,5 +37,5 @@ class APIv1: @router.post("/ci", summary="CI Webhook") async def ci(self, request: Request): - self.woodpecker.on_ci_event(mapper.map(request)) + await self.bus.dispatch(mapper.map(request)) return Response(status_code=201) diff --git a/src/karl/core/events.py b/src/karl/core/events.py new file mode 100644 index 0000000..456968b --- /dev/null +++ b/src/karl/core/events.py @@ -0,0 +1,11 @@ +import logging + +from bubus import EventBus +from injectable import injectable_factory + +logger = logging.getLogger(__name__) + +@injectable_factory(EventBus, singleton=True) +def event_bus_factory() -> EventBus: + logger.info("Creating event bus...") + return EventBus() diff --git a/src/karl/core/injects.py b/src/karl/core/injects.py index 623fa59..e7081a7 100644 --- a/src/karl/core/injects.py +++ b/src/karl/core/injects.py @@ -1,3 +1,4 @@ +from bubus import EventBus from injectable import inject from core.woodpecker import Woodpecker @@ -8,3 +9,7 @@ class AutowireSupport: @staticmethod def woodpecker(): return inject(Woodpecker) + + @staticmethod + def bus(): + return inject(EventBus) diff --git a/src/karl/core/woodpecker.py b/src/karl/core/woodpecker.py index 2e83c07..19ec9df 100644 --- a/src/karl/core/woodpecker.py +++ b/src/karl/core/woodpecker.py @@ -4,6 +4,7 @@ from pathlib import Path from threading import RLock, Thread from typing import Annotated +from bubus import EventBus from injectable import injectable, Autowired, autowired from config import get_settings @@ -65,17 +66,20 @@ class WoodpeckerRunner(Thread): @injectable(singleton=True) class Woodpecker: @autowired - def __init__(self, mo: Annotated[Mo, Autowired]): + def __init__(self, mo: Annotated[Mo, Autowired], + bus: Annotated[EventBus, Autowired]): self._mo = mo + self._bus = bus self._git = GitService() self._docker = DockerService() self._runner: WoodpeckerRunner | None = None self._pending = deque() self._lock = RLock() + bus.on(WoodpeckerEvent, self.on_ci_event) logger.info("Woodpecker initialized.") def on_ci_event(self, event: WoodpeckerEvent): - logger.info(f"Received event: {event}") + logger.info(f"Received event: {event.event_id}") with self._lock: logger.debug("Lock acquired [on-ci-event]") if len(self._pending) > 0 or self._runner is not None: diff --git a/src/karl/model/webhook.py b/src/karl/model/webhook.py index a2ef7dc..e97c073 100644 --- a/src/karl/model/webhook.py +++ b/src/karl/model/webhook.py @@ -1,9 +1,9 @@ -from dataclasses import dataclass from typing import List +from bubus import BaseEvent -@dataclass -class WoodpeckerEvent: + +class WoodpeckerEvent(BaseEvent): _id: str commit: str message: str