feat: new event bus
This commit is contained in:
parent
e1a03e555e
commit
7808a66342
6 changed files with 32 additions and 8 deletions
|
|
@ -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]
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
11
src/karl/core/events.py
Normal file
11
src/karl/core/events.py
Normal file
|
|
@ -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()
|
||||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue