tests/integration: add more tests for docker outpost
This commit is contained in:
		@ -3,11 +3,13 @@ from shutil import rmtree
 | 
				
			|||||||
from tempfile import mkdtemp
 | 
					from tempfile import mkdtemp
 | 
				
			||||||
from time import sleep
 | 
					from time import sleep
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import yaml
 | 
				
			||||||
from django.test import TestCase
 | 
					from django.test import TestCase
 | 
				
			||||||
from docker import DockerClient, from_env
 | 
					from docker import DockerClient, from_env
 | 
				
			||||||
from docker.models.containers import Container
 | 
					from docker.models.containers import Container
 | 
				
			||||||
from docker.types.healthcheck import Healthcheck
 | 
					from docker.types.healthcheck import Healthcheck
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					from authentik import __version__
 | 
				
			||||||
from authentik.crypto.models import CertificateKeyPair
 | 
					from authentik.crypto.models import CertificateKeyPair
 | 
				
			||||||
from authentik.flows.models import Flow
 | 
					from authentik.flows.models import Flow
 | 
				
			||||||
from authentik.outposts.apps import AuthentikOutpostConfig
 | 
					from authentik.outposts.apps import AuthentikOutpostConfig
 | 
				
			||||||
@ -93,3 +95,14 @@ class OutpostDockerTests(TestCase):
 | 
				
			|||||||
        controller = DockerController(self.outpost, self.service_connection)
 | 
					        controller = DockerController(self.outpost, self.service_connection)
 | 
				
			||||||
        controller.up()
 | 
					        controller.up()
 | 
				
			||||||
        controller.down()
 | 
					        controller.down()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def test_docker_static(self):
 | 
				
			||||||
 | 
					        """test that deployment requires update"""
 | 
				
			||||||
 | 
					        controller = DockerController(self.outpost, self.service_connection)
 | 
				
			||||||
 | 
					        manifest = controller.get_static_deployment()
 | 
				
			||||||
 | 
					        compose = yaml.load(manifest, Loader=yaml.SafeLoader)
 | 
				
			||||||
 | 
					        self.assertEqual(compose["version"], "3.5")
 | 
				
			||||||
 | 
					        self.assertEqual(
 | 
				
			||||||
 | 
					            compose["services"]["authentik_proxy"]["image"],
 | 
				
			||||||
 | 
					            f"beryju/authentik-proxy:{__version__}",
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										108
									
								
								tests/integration/test_proxy_docker.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										108
									
								
								tests/integration/test_proxy_docker.py
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,108 @@
 | 
				
			|||||||
 | 
					"""outpost tests"""
 | 
				
			||||||
 | 
					from shutil import rmtree
 | 
				
			||||||
 | 
					from tempfile import mkdtemp
 | 
				
			||||||
 | 
					from time import sleep
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import yaml
 | 
				
			||||||
 | 
					from django.test import TestCase
 | 
				
			||||||
 | 
					from docker import DockerClient, from_env
 | 
				
			||||||
 | 
					from docker.models.containers import Container
 | 
				
			||||||
 | 
					from docker.types.healthcheck import Healthcheck
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					from authentik import __version__
 | 
				
			||||||
 | 
					from authentik.crypto.models import CertificateKeyPair
 | 
				
			||||||
 | 
					from authentik.flows.models import Flow
 | 
				
			||||||
 | 
					from authentik.outposts.apps import AuthentikOutpostConfig
 | 
				
			||||||
 | 
					from authentik.outposts.models import DockerServiceConnection, Outpost, OutpostType
 | 
				
			||||||
 | 
					from authentik.providers.proxy.controllers.docker import DockerController
 | 
				
			||||||
 | 
					from authentik.providers.proxy.models import ProxyProvider
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class TestProxyDocker(TestCase):
 | 
				
			||||||
 | 
					    """Test Docker Controllers"""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def _start_container(self, ssl_folder: str) -> Container:
 | 
				
			||||||
 | 
					        client: DockerClient = from_env()
 | 
				
			||||||
 | 
					        container = client.containers.run(
 | 
				
			||||||
 | 
					            image="library/docker:dind",
 | 
				
			||||||
 | 
					            detach=True,
 | 
				
			||||||
 | 
					            network_mode="host",
 | 
				
			||||||
 | 
					            remove=True,
 | 
				
			||||||
 | 
					            privileged=True,
 | 
				
			||||||
 | 
					            healthcheck=Healthcheck(
 | 
				
			||||||
 | 
					                test=["CMD", "docker", "info"],
 | 
				
			||||||
 | 
					                interval=5 * 100 * 1000000,
 | 
				
			||||||
 | 
					                start_period=5 * 100 * 1000000,
 | 
				
			||||||
 | 
					            ),
 | 
				
			||||||
 | 
					            environment={"DOCKER_TLS_CERTDIR": "/ssl"},
 | 
				
			||||||
 | 
					            volumes={
 | 
				
			||||||
 | 
					                f"{ssl_folder}/": {
 | 
				
			||||||
 | 
					                    "bind": "/ssl",
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					        while True:
 | 
				
			||||||
 | 
					            container.reload()
 | 
				
			||||||
 | 
					            status = container.attrs.get("State", {}).get("Health", {}).get("Status")
 | 
				
			||||||
 | 
					            if status == "healthy":
 | 
				
			||||||
 | 
					                return container
 | 
				
			||||||
 | 
					            sleep(1)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def setUp(self):
 | 
				
			||||||
 | 
					        super().setUp()
 | 
				
			||||||
 | 
					        self.ssl_folder = mkdtemp()
 | 
				
			||||||
 | 
					        self.container = self._start_container(self.ssl_folder)
 | 
				
			||||||
 | 
					        # Ensure that local connection have been created
 | 
				
			||||||
 | 
					        AuthentikOutpostConfig.init_local_connection()
 | 
				
			||||||
 | 
					        self.provider: ProxyProvider = ProxyProvider.objects.create(
 | 
				
			||||||
 | 
					            name="test",
 | 
				
			||||||
 | 
					            internal_host="http://localhost",
 | 
				
			||||||
 | 
					            external_host="http://localhost",
 | 
				
			||||||
 | 
					            authorization_flow=Flow.objects.first(),
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					        authentication_kp = CertificateKeyPair.objects.create(
 | 
				
			||||||
 | 
					            name="docker-authentication",
 | 
				
			||||||
 | 
					            certificate_data=open(f"{self.ssl_folder}/client/cert.pem").read(),
 | 
				
			||||||
 | 
					            key_data=open(f"{self.ssl_folder}/client/key.pem").read(),
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					        verification_kp = CertificateKeyPair.objects.create(
 | 
				
			||||||
 | 
					            name="docker-verification",
 | 
				
			||||||
 | 
					            certificate_data=open(f"{self.ssl_folder}/client/ca.pem").read(),
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					        self.service_connection = DockerServiceConnection.objects.create(
 | 
				
			||||||
 | 
					            url="https://localhost:2376",
 | 
				
			||||||
 | 
					            tls_verification=verification_kp,
 | 
				
			||||||
 | 
					            tls_authentication=authentication_kp,
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					        self.outpost: Outpost = Outpost.objects.create(
 | 
				
			||||||
 | 
					            name="test",
 | 
				
			||||||
 | 
					            type=OutpostType.PROXY,
 | 
				
			||||||
 | 
					            service_connection=self.service_connection,
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					        self.outpost.providers.add(self.provider)
 | 
				
			||||||
 | 
					        self.outpost.save()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def tearDown(self) -> None:
 | 
				
			||||||
 | 
					        super().tearDown()
 | 
				
			||||||
 | 
					        self.container.kill()
 | 
				
			||||||
 | 
					        try:
 | 
				
			||||||
 | 
					            rmtree(self.ssl_folder)
 | 
				
			||||||
 | 
					        except PermissionError:
 | 
				
			||||||
 | 
					            pass
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def test_docker_controller(self):
 | 
				
			||||||
 | 
					        """test that deployment requires update"""
 | 
				
			||||||
 | 
					        controller = DockerController(self.outpost, self.service_connection)
 | 
				
			||||||
 | 
					        controller.up()
 | 
				
			||||||
 | 
					        controller.down()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def test_docker_static(self):
 | 
				
			||||||
 | 
					        """test that deployment requires update"""
 | 
				
			||||||
 | 
					        controller = DockerController(self.outpost, self.service_connection)
 | 
				
			||||||
 | 
					        manifest = controller.get_static_deployment()
 | 
				
			||||||
 | 
					        compose = yaml.load(manifest, Loader=yaml.SafeLoader)
 | 
				
			||||||
 | 
					        self.assertEqual(compose["version"], "3.5")
 | 
				
			||||||
 | 
					        self.assertEqual(
 | 
				
			||||||
 | 
					            compose["services"]["authentik_proxy"]["image"],
 | 
				
			||||||
 | 
					            f"beryju/authentik-proxy:{__version__}",
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
@ -9,7 +9,7 @@ from authentik.providers.proxy.controllers.kubernetes import ProxyKubernetesCont
 | 
				
			|||||||
from authentik.providers.proxy.models import ProxyProvider
 | 
					from authentik.providers.proxy.models import ProxyProvider
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class TestControllers(TestCase):
 | 
					class TestProxyKubernetes(TestCase):
 | 
				
			||||||
    """Test Controllers"""
 | 
					    """Test Controllers"""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def setUp(self):
 | 
					    def setUp(self):
 | 
				
			||||||
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user