diff --git a/src/karl/core/woodpecker.py b/src/karl/core/woodpecker.py index 3318291..80f133e 100644 --- a/src/karl/core/woodpecker.py +++ b/src/karl/core/woodpecker.py @@ -43,17 +43,21 @@ class WoodpeckerRunner(Thread): result = RunnerResult() try: - service = self.get_service(self._event.files) - if service is None: + services = self.get_service(self._event.files) + if len(services) == 0: logger.info("No service found.") result.success = True else: - service_path = f"{self._root}/compose/{service}/docker-compose.yml" self._git.checkout(self._event.commit) - for file in self._event.files: - if file.__contains__('.mo.'): - self._mo.process(Path(f"{self._root}{file}").absolute()) - self._docker.reload(Path(service_path).absolute()) + paths = [] + for service in services: + service_path = f"{self._root}/compose/{service}/docker-compose.yml" + for file in self._event.files: + if file.__contains__('.mo.'): + self._mo.process(Path(f"{self._root}{file}").absolute()) + paths.append(service_path) + for service_path in paths: + self._docker.reload(Path(service_path).absolute()) result.success = True except Exception as e: result.throwable = e @@ -61,20 +65,14 @@ class WoodpeckerRunner(Thread): asyncio.run(dispatch(result)) @staticmethod - def get_service(files: list[str]) -> str | None: + def get_service(files: list[str]) -> list[str]: supported_files = [] for f in files: f_parts = f.split("/") if f_parts[0] in ["compose", "files"]: supported_files.append(f_parts[1]) - match len(set(supported_files)): - case 0: - return None - case 1: - return supported_files[0] - case _: - logger.error(f"Multiple services were provided: {', '.join(supported_files)}") - raise Exception("Multiple services are not supported.") + # TODO: check service priorities (NGINX last) + return list(dict.fromkeys(supported_files)) @injectable(singleton=True) diff --git a/src/karl/services/containers.py b/src/karl/services/containers.py index 96b2c45..dce9c81 100644 --- a/src/karl/services/containers.py +++ b/src/karl/services/containers.py @@ -15,6 +15,8 @@ class DockerService: def reload(self, compose_path: Path): os.chdir(compose_path.parent) - self._client.compose.ps() - self._client.compose.down(remove_orphans=True) + # TODO: Check if container needs to be reloaded from scratch + # if len(self._client.compose.ps()) > 0: + # self._client.compose.restart() + # return self._client.compose.up(detach=True) diff --git a/src/karl/util/logging.py b/src/karl/util/logging.py index f25ed4e..27a2423 100644 --- a/src/karl/util/logging.py +++ b/src/karl/util/logging.py @@ -32,19 +32,23 @@ class NamingCache: class ApplicationFormatter(Formatter): - def __init__(self, handler_prefix: str = ''): + def __init__(self, handler_prefix: str = '', include_timestamp: bool = True): super().__init__() self._logger_names = NamingCache() self._handler_prefix = handler_prefix + self._include_timestamp = include_timestamp def format(self, record): from datetime import datetime - timestamp = datetime.fromtimestamp(record.created).isoformat(sep=' ', timespec='milliseconds') + if self._include_timestamp: + timestamp = datetime.fromtimestamp(record.created).isoformat(sep=' ', timespec='milliseconds') + ' ' + else: + timestamp = '' level = record.levelname.replace('WARNING', 'WARN').rjust(5) thread_name = record.threadName.replace(' (', '#').replace(')', '').rjust(16)[-16:] # TODO: NamingCache? logger_name = self._logger_names[f"{self._handler_prefix}{record.name}"] message = record.getMessage() - formatted = f"{timestamp} {level} [{thread_name}] {logger_name} : {message}" + formatted = f"{timestamp}{level} [{thread_name}] {logger_name} : {message}" if record.exc_info: formatted += "\n" + self.formatException(record.exc_info) @@ -62,7 +66,7 @@ class HandlerFactory: def create(target: Target, handler_prefix: str = '', file_path: Path = None) -> List[Handler]: def console_handler(prefix: str = ''): handler = StreamHandler() - handler.setFormatter(ApplicationFormatter(prefix)) + handler.setFormatter(ApplicationFormatter(prefix, include_timestamp=False)) handler.setLevel('INFO') return handler diff --git a/tests/test_woodpecker.py b/tests/test_woodpecker.py index 7521d88..9bb4616 100644 --- a/tests/test_woodpecker.py +++ b/tests/test_woodpecker.py @@ -4,8 +4,13 @@ files = [".gitignore", "compose/nginx/docker-compose.yaml", "config/heimdall.kdb "files/nginx/cert/key.mo.pem", "files/nginx/conf.d/default.conf", "files/nginx/conf.d/forge.conf", "files/nginx/conf.d/mqtt.conf", "files/nginx/conf.d/nextcloud.conf", "files/nginx/conf.d/zitadel.conf", "files/nginx/nginx.conf"] +files2 = [".gitignore", "compose/nginx/docker-compose.yaml", "compose/nginx2/docker-compose.yaml"] -def test_get_service(): +def test_get_service_single(): service = woodpecker.WoodpeckerRunner.get_service(files) - assert service == 'nginx' + assert service == ['nginx'] + +def test_get_service_multi(): + services = woodpecker.WoodpeckerRunner.get_service(files2) + assert services == ['nginx', 'nginx2']