From 78b6f0ecb15e8cba687eb4588c5ce19ca32208bc Mon Sep 17 00:00:00 2001 From: Roy Moore Date: Mon, 27 May 2024 08:07:35 +0300 Subject: [PATCH] chore(core): Adds integration testing to the private registry auth feature (DOCKER_AUTH_CONFIG) (#582) Follow up on #566 - Testing using the registry module --- core/tests/test_registry.py | 83 +++++++++++++++++++++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 core/tests/test_registry.py diff --git a/core/tests/test_registry.py b/core/tests/test_registry.py new file mode 100644 index 00000000..384b0669 --- /dev/null +++ b/core/tests/test_registry.py @@ -0,0 +1,83 @@ +"""Integration test using login to a private registry. + +Note: Using the testcontainers-python library to test the Docker registry. +This could be considered a bad practice as it is not recommended to use the same library to test itself. +However, it is a very good use case for DockerRegistryContainer and allows us to test it thoroughly. +""" + +import json +import os +import base64 +import pytest + +from docker.errors import NotFound + +from testcontainers.core.config import testcontainers_config +from testcontainers.core.container import DockerContainer +from testcontainers.core.docker_client import DockerClient +from testcontainers.core.waiting_utils import wait_container_is_ready + +from testcontainers.registry import DockerRegistryContainer + + +def test_missing_on_private_registry(monkeypatch): + username = "user" + password = "pass" + image = "hello-world" + tag = "test" + + with DockerRegistryContainer(username=username, password=password) as registry: + registry_url = registry.get_registry() + + # prepare auth config + creds: bytes = base64.b64encode(f"{username}:{password}".encode("utf-8")) + config = {"auths": {f"{registry_url}": {"auth": creds.decode("utf-8")}}} + monkeypatch.setattr(testcontainers_config, name="docker_auth_config", value=json.dumps(config)) + assert testcontainers_config.docker_auth_config, "docker_auth_config not set" + + with pytest.raises(NotFound): + # Test a container with image from private registry + with DockerContainer(f"{registry_url}/{image}:{tag}") as test_container: + wait_container_is_ready(test_container) + + +@pytest.mark.parametrize( + "image,tag,username,password", + [ + ("nginx", "test", "user", "pass"), + ("hello-world", "latest", "new_user", "new_pass"), + ("alpine", "3.12", None, None), + ], +) +def test_with_private_registry(image, tag, username, password, monkeypatch): + client = DockerClient().client + + with DockerRegistryContainer(username=username, password=password) as registry: + registry_url = registry.get_registry() + + # prepare image + _image = client.images.pull(image) + assert _image.tag(repository=f"{registry_url}/{image}", tag=tag), "Image not tagged" + + # login to private registry + client.login(registry=registry_url, username=username, password=password) + + # push image to private registry + client.images.push(f"{registry_url}/{image}") + + # clear local image so we will pull from private registry + client.images.remove(f"{registry_url}/{image}:{tag}") + + # prepare auth config + creds: bytes = base64.b64encode(f"{username}:{password}".encode("utf-8")) + config = {"auths": {f"{registry_url}": {"auth": creds.decode("utf-8")}}} + monkeypatch.setattr(testcontainers_config, name="docker_auth_config", value=json.dumps(config)) + assert testcontainers_config.docker_auth_config, "docker_auth_config not set" + + # Test a container with image from private registry + with DockerContainer(f"{registry_url}/{image}:{tag}") as test_container: + wait_container_is_ready(test_container) + + # cleanup + client.images.remove(f"{registry_url}/{image}:{tag}") + client.close()