1
0
mirror of https://github.com/thib8956/nginx-proxy synced 2025-08-23 07:51:56 +00:00

tests: DockerComposer contextmanager improvements

-Improve the DockerComposer contextmanager to make sure teardown happens by using try except block.
-Move the self. declarations up so we are sure they are set even if an exception occurs.
-set self._networks
This commit is contained in:
Niek
2025-02-27 13:37:28 +01:00
parent 65b4804f7d
commit 557069583d

View File

@@ -471,34 +471,57 @@ def connect_to_all_networks() -> List[Network]:
class DockerComposer(contextlib.AbstractContextManager): class DockerComposer(contextlib.AbstractContextManager):
def __init__(self): def __init__(self):
logging.debug("DockerComposer __init__")
self._networks = None self._networks = None
self._docker_compose_files = None self._docker_compose_files = None
self._project_name = None self._project_name = None
def __exit__(self, *exc_info): def __exit__(self, *exc_info):
logging.debug("DockerComposer __exit__")
self._down() self._down()
def _down(self): def _down(self):
logging.debug(f"DockerComposer _down {self._docker_compose_files} {self._project_name} {self._networks}")
if self._docker_compose_files is None: if self._docker_compose_files is None:
logging.debug("docker_compose_files is None, nothing to cleanup")
return return
for network in self._networks: if self._networks:
disconnect_from_network(network) for network in self._networks:
disconnect_from_network(network)
docker_compose_down(self._docker_compose_files, self._project_name) docker_compose_down(self._docker_compose_files, self._project_name)
self._docker_compose_file = None self._docker_compose_file = None
self._project_name = None self._project_name = None
self._networks = []
def compose(self, docker_compose_files: List[str], project_name: str): def compose(self, docker_compose_files: List[str], project_name: str):
if docker_compose_files == self._docker_compose_files and project_name == self._project_name: if docker_compose_files == self._docker_compose_files and project_name == self._project_name:
logging.info(f"Skipping compose: {docker_compose_files} (already running under project {project_name})")
return
if docker_compose_files is None or project_name is None:
logging.info(f"Skipping compose: no compose file specified")
return return
self._down() self._down()
if docker_compose_files is None or project_name is None:
return
docker_compose_up(docker_compose_files, project_name)
self._networks = connect_to_all_networks()
wait_for_nginxproxy_to_be_ready()
time.sleep(3) # give time to containers to be ready
self._docker_compose_files = docker_compose_files self._docker_compose_files = docker_compose_files
self._project_name = project_name self._project_name = project_name
logging.debug(f"DockerComposer compose {self._docker_compose_files} {self._project_name} {self._networks}")
try:
docker_compose_up(docker_compose_files, project_name)
self._networks = connect_to_all_networks()
wait_for_nginxproxy_to_be_ready()
time.sleep(3) # give time to containers to be ready
except docker.errors.APIError as e:
logging.error(f"Docker API error ({e.status_code}): {e.explanation}")
logging.debug(f"Full error message: {str(e)}")
self._down() # Ensure proper cleanup even on failure
pytest.fail(f"Docker Compose setup failed due to Docker API error: {e.explanation}")
except RuntimeError as e:
logging.error(f"RuntimeEror encountered in: {project_name}")
logging.debug(f"Full error message: {str(e)}")
self._down() # Ensure proper cleanup even on failure
pytest.fail(f"Docker Compose setup failed due to RuntimeError in: {project_name}")
############################################################################### ###############################################################################