Generics & visitor pattern?
This commit is contained in:
parent
3845cc7ecf
commit
1440ec51b7
4 changed files with 33 additions and 6 deletions
|
|
@ -1,5 +1,6 @@
|
||||||
|
import logging
|
||||||
import uuid
|
import uuid
|
||||||
from typing import Annotated
|
from typing import Annotated, List
|
||||||
|
|
||||||
from injectable import injectable, autowired, Autowired
|
from injectable import injectable, autowired, Autowired
|
||||||
|
|
||||||
|
|
@ -8,6 +9,7 @@ from app.model.healthcheck import HealthCheck
|
||||||
from app.model.webhook import WebhookEvent
|
from app.model.webhook import WebhookEvent
|
||||||
from app.services import DockerService, GitService, Passwords
|
from app.services import DockerService, GitService, Passwords
|
||||||
|
|
||||||
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
@injectable(singleton=True)
|
@injectable(singleton=True)
|
||||||
class WebhookProcessor(EnqueuedProcessor):
|
class WebhookProcessor(EnqueuedProcessor):
|
||||||
|
|
@ -24,7 +26,21 @@ class WebhookProcessor(EnqueuedProcessor):
|
||||||
def enqueue(self, event: WebhookEvent):
|
def enqueue(self, event: WebhookEvent):
|
||||||
self._enqueue(Task(uuid.UUID(), self, event))
|
self._enqueue(Task(uuid.UUID(), self, event))
|
||||||
|
|
||||||
def _process(self, task: Task) -> Result:
|
def _process(self, task: Task[WebhookEvent]) -> Result:
|
||||||
|
event: WebhookEvent = task.payload
|
||||||
|
# TODO: persist event data
|
||||||
|
commit_hash = self._git.get_new_commit_hash()
|
||||||
|
if commit_hash != event.commit:
|
||||||
|
logger.warning(f"Commit hash mismatch: {commit_hash} != {event.commit}")
|
||||||
|
return Result(task.id, False, "Commit hash mismatch")
|
||||||
|
# TODO: persist commit data
|
||||||
|
service = self._get_service(event.files)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
return Result(task.id, True)
|
||||||
|
|
||||||
|
def _get_service(self, files: List[str]) -> str:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
@property
|
@property
|
||||||
|
|
|
||||||
|
|
@ -3,15 +3,17 @@ import uuid
|
||||||
from abc import ABC, abstractmethod
|
from abc import ABC, abstractmethod
|
||||||
from dataclasses import dataclass
|
from dataclasses import dataclass
|
||||||
from multiprocessing import Queue, Process
|
from multiprocessing import Queue, Process
|
||||||
|
from typing import TypeVar
|
||||||
|
|
||||||
from injectable import injectable
|
from injectable import injectable
|
||||||
|
|
||||||
|
T = TypeVar('T')
|
||||||
|
|
||||||
@dataclass
|
@dataclass
|
||||||
class Task:
|
class Task[T]:
|
||||||
_id: uuid.UUID
|
id: uuid.UUID
|
||||||
processor: 'EnqueuedProcessor'
|
processor: 'EnqueuedProcessor'
|
||||||
payload: object
|
payload: T
|
||||||
|
|
||||||
@dataclass
|
@dataclass
|
||||||
class Result:
|
class Result:
|
||||||
|
|
|
||||||
|
|
@ -1,14 +1,19 @@
|
||||||
|
import logging
|
||||||
|
|
||||||
import docker
|
import docker
|
||||||
from docker.models.containers import Container
|
from docker.models.containers import Container
|
||||||
from injectable import injectable
|
from injectable import injectable
|
||||||
|
|
||||||
from app.model.containers import Tree, Compose, SimpleContainer
|
from app.model.containers import Tree, Compose, SimpleContainer
|
||||||
|
|
||||||
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
@injectable(singleton=True)
|
@injectable(singleton=True)
|
||||||
class DockerService:
|
class DockerService:
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self._client = docker.from_env()
|
self._client = docker.from_env()
|
||||||
|
# logger.info(f"Docker client initialized. Plugins: {self._client.plugins()}")
|
||||||
self._tree = self._init_tree()
|
self._tree = self._init_tree()
|
||||||
|
|
||||||
def _init_tree(self) -> Tree:
|
def _init_tree(self) -> Tree:
|
||||||
|
|
|
||||||
|
|
@ -13,15 +13,19 @@ class GitService:
|
||||||
self._repo.git.checkout(self._settings.git.branch)
|
self._repo.git.checkout(self._settings.git.branch)
|
||||||
self._origin: Remote = self._repo.remotes.origin
|
self._origin: Remote = self._repo.remotes.origin
|
||||||
|
|
||||||
|
|
||||||
def get_modified_compose(self) -> str | None:
|
def get_modified_compose(self) -> str | None:
|
||||||
self._update()
|
self._update()
|
||||||
return self._diff()
|
return self._diff()
|
||||||
|
|
||||||
|
def get_new_commit_hash(self) -> str:
|
||||||
|
self._update()
|
||||||
|
return self._repo.head.commit.hexsha
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def _check_preconditions(config: GitConfig) -> Repo:
|
def _check_preconditions(config: GitConfig) -> Repo:
|
||||||
def clone():
|
def clone():
|
||||||
return Repo.clone_from(config.url, config.path, branch=config.branch)
|
return Repo.clone_from(config.url, config.path, branch=config.branch)
|
||||||
|
|
||||||
import os
|
import os
|
||||||
if not config.path.exists():
|
if not config.path.exists():
|
||||||
return clone()
|
return clone()
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue