diff --git a/tests/bgp/conftest.py b/tests/bgp/conftest.py index 07ad8e153d5..699921ff961 100644 --- a/tests/bgp/conftest.py +++ b/tests/bgp/conftest.py @@ -4,6 +4,7 @@ from tests.common.utilities import wait_until from tests.common.helpers.assertions import pytest_assert as pt_assert from tests.common.helpers.parallel import parallel_run +from tests.common.helpers.parallel import reset_ansible_local_tmp logger = logging.getLogger(__name__) @@ -44,6 +45,7 @@ def setup_bgp_graceful_restart(duthost, nbrhosts): config_facts = duthost.config_facts(host=duthost.hostname, source="running")['ansible_facts'] bgp_neighbors = config_facts.get('BGP_NEIGHBOR', {}) + @reset_ansible_local_tmp def configure_nbr_gr(node=None, results=None): """Target function will be used by multiprocessing for configuring VM hosts. @@ -89,6 +91,7 @@ def configure_nbr_gr(node=None, results=None): yield + @reset_ansible_local_tmp def restore_nbr_gr(node=None, results=None): """Target function will be used by multiprocessing for restoring configuration for the VM hosts. diff --git a/tests/common/helpers/parallel.py b/tests/common/helpers/parallel.py index 05a8e43371f..fb731ea18e0 100644 --- a/tests/common/helpers/parallel.py +++ b/tests/common/helpers/parallel.py @@ -1,6 +1,8 @@ import datetime import logging import os +import shutil +import tempfile import signal from multiprocessing import Process, Manager from tests.common.helpers.assertions import pytest_assert as pt_assert @@ -77,3 +79,28 @@ def parallel_run(target, args, kwargs, nodes, timeout=None): logger.info('Completed running processes for target "{}" in {} seconds'.format(target.__name__, str(delta_time))) return results + + +def reset_ansible_local_tmp(target): + """Decorator for resetting ansible default local tmp dir for parallel multiprocessing.Process + + Args: + target (function): The function to be decorated. + """ + + def wrapper(*args, **kwargs): + + # Reset the ansible default local tmp directory for the current subprocess + # Otherwise, multiple processes could share a same ansible default tmp directory and there could be conflicts + from ansible import constants + prefix = 'ansible-local-{}'.format(os.getpid()) + constants.DEFAULT_LOCAL_TMP = tempfile.mkdtemp(prefix=prefix) + try: + target(*args, **kwargs) + finally: + # User of tempfile.mkdtemp need to take care of cleaning up. + shutil.rmtree(constants.DEFAULT_LOCAL_TMP) + + wrapper.__name__ = target.__name__ + + return wrapper