From 25ba93cbfd075b64dba788721f11b79f74a2d921 Mon Sep 17 00:00:00 2001 From: Kevin Veen-Birkenbach Date: Wed, 18 Jun 2025 14:28:06 +0200 Subject: [PATCH] Implemented new filter for image logic in docker-compose.yml.j2 und env.j2 files --- filter_plugins/docker_image.py | 20 ++++++++++ tests/unit/test_docker_image.py | 68 +++++++++++++++++++++++++++++++++ 2 files changed, 88 insertions(+) create mode 100644 filter_plugins/docker_image.py create mode 100644 tests/unit/test_docker_image.py diff --git a/filter_plugins/docker_image.py b/filter_plugins/docker_image.py new file mode 100644 index 00000000..9842df5b --- /dev/null +++ b/filter_plugins/docker_image.py @@ -0,0 +1,20 @@ +# filter_plugins/docker_image.py + +def get_docker_image(applications, application_id, image_key): + app = applications.get(application_id, {}) + docker = app.get("docker", {}) + images = docker.get("images", {}) + versions = docker.get("versions", {}) + version = versions.get(image_key) or app.get("version") + image = images.get(image_key) + + if not image or not version: + raise ValueError(f"Missing image or version for {application_id}:{image_key}") + + return f"{image}:{version}" + +class FilterModule(object): + def filters(self): + return { + 'get_docker_image': get_docker_image, + } diff --git a/tests/unit/test_docker_image.py b/tests/unit/test_docker_image.py new file mode 100644 index 00000000..4e1cb84d --- /dev/null +++ b/tests/unit/test_docker_image.py @@ -0,0 +1,68 @@ +#!/usr/bin/env python3 + +import os +import sys +import unittest + +# Add filter_plugins/ to the import path +sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), "../../..", "filter_plugins"))) + +from docker_image import FilterModule + +class TestGetDockerImage(unittest.TestCase): + def setUp(self): + self.get_docker_image = FilterModule().filters()["get_docker_image"] + + def test_version_from_docker_versions(self): + applications = { + "akaunting": { + "version": "1.0.0", + "docker": { + "images": { "akaunting": "docker.io/akaunting/akaunting" }, + "versions": { "akaunting": "2.0.0" } + } + } + } + result = self.get_docker_image(applications, "akaunting", "akaunting") + self.assertEqual(result, "docker.io/akaunting/akaunting:2.0.0") + + def test_fallback_to_application_version(self): + applications = { + "akaunting": { + "version": "1.2.3", + "docker": { + "images": { "akaunting": "ghcr.io/akaunting/akaunting" }, + "versions": {} + } + } + } + result = self.get_docker_image(applications, "akaunting", "akaunting") + self.assertEqual(result, "ghcr.io/akaunting/akaunting:1.2.3") + + def test_missing_image_raises_error(self): + applications = { + "akaunting": { + "version": "1.0.0", + "docker": { + "images": {}, + "versions": {} + } + } + } + with self.assertRaises(ValueError): + self.get_docker_image(applications, "akaunting", "akaunting") + + def test_missing_version_raises_error(self): + applications = { + "akaunting": { + "docker": { + "images": { "akaunting": "some/image" }, + "versions": {} + } + } + } + with self.assertRaises(ValueError): + self.get_docker_image(applications, "akaunting", "akaunting") + +if __name__ == "__main__": + unittest.main()