From 1f45d701d4c005b419d4418a7d8c7736e876136f Mon Sep 17 00:00:00 2001 From: Mehmet Nuri Deveci <5735811+mndeveci@users.noreply.github.com> Date: Tue, 3 Oct 2023 17:20:48 -0700 Subject: [PATCH 01/22] chore: run local tests in parallel --- tests/integration/local/common_utils.py | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/tests/integration/local/common_utils.py b/tests/integration/local/common_utils.py index 0dbb23aa7c..2650a8ad1b 100644 --- a/tests/integration/local/common_utils.py +++ b/tests/integration/local/common_utils.py @@ -1,5 +1,6 @@ # Common utils between local tests import logging +import os import random import time @@ -7,6 +8,9 @@ START_WAIT_TIME_SECONDS = 300 +PYTEST_WORKER_COUNT = os.environ.get("PYTEST_XDIST_WORKER_COUNT", 4) +PYTEST_WORKER_ID = os.environ.get("PYTEST_XDIST_WORKER", 0) + class InvalidAddressException(Exception): pass @@ -34,5 +38,15 @@ def wait_for_local_process(process, port, collect_output=False) -> str: return output +def get_pytest_worker_id(): + return int(PYTEST_WORKER_ID[2:]) + + def random_port(): - return random.randint(30000, 40000) + start_port = 30000 + end_port = 40000 + + port_window = (end_port - start_port) / PYTEST_WORKER_COUNT + port_worker_start = int(start_port + (get_pytest_worker_id() * port_window)) + port_worker_end = int(port_worker_start + port_window) + return random.randint(port_worker_start, port_worker_end) From da5e6c6f9805a34a96e42a4315e54058e7130247 Mon Sep 17 00:00:00 2001 From: Mehmet Nuri Deveci <5735811+mndeveci@users.noreply.github.com> Date: Tue, 3 Oct 2023 17:22:36 -0700 Subject: [PATCH 02/22] parse int --- tests/integration/local/common_utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/integration/local/common_utils.py b/tests/integration/local/common_utils.py index 2650a8ad1b..e2f14baee4 100644 --- a/tests/integration/local/common_utils.py +++ b/tests/integration/local/common_utils.py @@ -8,7 +8,7 @@ START_WAIT_TIME_SECONDS = 300 -PYTEST_WORKER_COUNT = os.environ.get("PYTEST_XDIST_WORKER_COUNT", 4) +PYTEST_WORKER_COUNT = int(os.environ.get("PYTEST_XDIST_WORKER_COUNT", 4)) PYTEST_WORKER_ID = os.environ.get("PYTEST_XDIST_WORKER", 0) From 281c633d31caf770efdafebdb44e72f010cedfa1 Mon Sep 17 00:00:00 2001 From: Mehmet Nuri Deveci <5735811+mndeveci@users.noreply.github.com> Date: Tue, 3 Oct 2023 17:38:50 -0700 Subject: [PATCH 03/22] log container details --- tests/integration/local/start_lambda/test_start_lambda.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tests/integration/local/start_lambda/test_start_lambda.py b/tests/integration/local/start_lambda/test_start_lambda.py index 79393ce8eb..0aba8b9393 100644 --- a/tests/integration/local/start_lambda/test_start_lambda.py +++ b/tests/integration/local/start_lambda/test_start_lambda.py @@ -1,3 +1,4 @@ +import logging import uuid from concurrent.futures import ThreadPoolExecutor, as_completed from time import time, sleep @@ -15,6 +16,8 @@ from samcli.commands.local.cli_common.invoke_context import ContainersInitializationMode from .start_lambda_api_integ_base import StartLambdaIntegBaseClass, WatchWarmContainersIntegBaseClass +LOG = logging.getLogger(__name__) + class TestParallelRequests(StartLambdaIntegBaseClass): template_path = "/testdata/invoke/template.yml" @@ -310,6 +313,7 @@ def setUp(self): def count_running_containers(self): running_containers = 0 for container in self.docker_client.containers.list(): + LOG.info(f"Container: {container}") _, output = container.exec_run(["bash", "-c", "'printenv'"]) if f"MODE={self.mode_env_variable}" in str(output): running_containers += 1 From 4616be451a68d23642ac964ef3ac1ebeb3e6fa9d Mon Sep 17 00:00:00 2001 From: Mehmet Nuri Deveci <5735811+mndeveci@users.noreply.github.com> Date: Wed, 4 Oct 2023 17:09:17 -0700 Subject: [PATCH 04/22] add error checking for worker id --- tests/integration/local/common_utils.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/tests/integration/local/common_utils.py b/tests/integration/local/common_utils.py index e2f14baee4..3ac26dd9f5 100644 --- a/tests/integration/local/common_utils.py +++ b/tests/integration/local/common_utils.py @@ -39,7 +39,10 @@ def wait_for_local_process(process, port, collect_output=False) -> str: def get_pytest_worker_id(): - return int(PYTEST_WORKER_ID[2:]) + try: + return int(PYTEST_WORKER_ID[2:]) + except TypeError: + return 0 def random_port(): From d886a27d1c01487c32718261202544c20050e5b8 Mon Sep 17 00:00:00 2001 From: Mehmet Nuri Deveci <5735811+mndeveci@users.noreply.github.com> Date: Wed, 4 Oct 2023 17:10:05 -0700 Subject: [PATCH 05/22] display container object as dict --- tests/integration/local/start_lambda/test_start_lambda.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/integration/local/start_lambda/test_start_lambda.py b/tests/integration/local/start_lambda/test_start_lambda.py index 0aba8b9393..a680c4620d 100644 --- a/tests/integration/local/start_lambda/test_start_lambda.py +++ b/tests/integration/local/start_lambda/test_start_lambda.py @@ -313,7 +313,7 @@ def setUp(self): def count_running_containers(self): running_containers = 0 for container in self.docker_client.containers.list(): - LOG.info(f"Container: {container}") + LOG.info(f"Container: {container.__dict__}") _, output = container.exec_run(["bash", "-c", "'printenv'"]) if f"MODE={self.mode_env_variable}" in str(output): running_containers += 1 From 873951ef9d6a0d4949fe482b03d5ae85f6ce56b9 Mon Sep 17 00:00:00 2001 From: Mehmet Nuri Deveci <5735811+mndeveci@users.noreply.github.com> Date: Wed, 4 Oct 2023 17:13:14 -0700 Subject: [PATCH 06/22] json dump --- tests/integration/local/start_lambda/test_start_lambda.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/integration/local/start_lambda/test_start_lambda.py b/tests/integration/local/start_lambda/test_start_lambda.py index a680c4620d..21fdb9245a 100644 --- a/tests/integration/local/start_lambda/test_start_lambda.py +++ b/tests/integration/local/start_lambda/test_start_lambda.py @@ -313,7 +313,7 @@ def setUp(self): def count_running_containers(self): running_containers = 0 for container in self.docker_client.containers.list(): - LOG.info(f"Container: {container.__dict__}") + LOG.info(f"Container: {json.dumps(container.__dict__)}") _, output = container.exec_run(["bash", "-c", "'printenv'"]) if f"MODE={self.mode_env_variable}" in str(output): running_containers += 1 From 6d24279169ff539c15fd524504764f5ae7963acf Mon Sep 17 00:00:00 2001 From: Mehmet Nuri Deveci <5735811+mndeveci@users.noreply.github.com> Date: Wed, 4 Oct 2023 23:39:30 -0700 Subject: [PATCH 07/22] run in tmp folder --- .../local/start_lambda/start_lambda_api_integ_base.py | 9 +++++++++ .../integration/local/start_lambda/test_start_lambda.py | 1 - 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/tests/integration/local/start_lambda/start_lambda_api_integ_base.py b/tests/integration/local/start_lambda/start_lambda_api_integ_base.py index a6cdb4f838..c59247cf71 100644 --- a/tests/integration/local/start_lambda/start_lambda_api_integ_base.py +++ b/tests/integration/local/start_lambda/start_lambda_api_integ_base.py @@ -1,5 +1,6 @@ import shutil import uuid +from shutil import rmtree from typing import Optional, Dict, List from unittest import TestCase, skipIf import threading @@ -11,6 +12,7 @@ import docker from docker.errors import APIError +from samcli.lib.utils.osutils import copytree from tests.integration.local.common_utils import random_port, InvalidAddressException, wait_for_local_process from tests.testing_utils import ( SKIP_DOCKER_TESTS, @@ -45,6 +47,12 @@ class StartLambdaIntegBaseClass(TestCase): def setUpClass(cls): # This is the directory for tests/integration which will be used to file the testdata # files for integ tests + scratch_dir = str(Path(__file__).resolve().parent.joinpath(".tmp", str(uuid.uuid4()).replace("-", "")[:10])) + shutil.rmtree(scratch_dir, ignore_errors=True) + os.makedirs(scratch_dir) + copytree(str(Path(cls.integration_dir).joinpath("testdata")), scratch_dir) + cls.integration_dir = scratch_dir + cls.template = cls.integration_dir + cls.template_path cls.working_dir = str(Path(cls.template).resolve().parents[0]) cls.env_var_path = cls.integration_dir + "/testdata/invoke/vars.json" @@ -179,6 +187,7 @@ def tearDownClass(cls): # After all the tests run, we need to kill the start_lambda process. cls.stop_reading_thread = True kill_process(cls.start_lambda_process) + rmtree(cls.integration_dir) class WatchWarmContainersIntegBaseClass(StartLambdaIntegBaseClass): diff --git a/tests/integration/local/start_lambda/test_start_lambda.py b/tests/integration/local/start_lambda/test_start_lambda.py index 21fdb9245a..01a479fd3f 100644 --- a/tests/integration/local/start_lambda/test_start_lambda.py +++ b/tests/integration/local/start_lambda/test_start_lambda.py @@ -313,7 +313,6 @@ def setUp(self): def count_running_containers(self): running_containers = 0 for container in self.docker_client.containers.list(): - LOG.info(f"Container: {json.dumps(container.__dict__)}") _, output = container.exec_run(["bash", "-c", "'printenv'"]) if f"MODE={self.mode_env_variable}" in str(output): running_containers += 1 From 9ba468ea30bc2493f4cc11be3932c1444cd55a92 Mon Sep 17 00:00:00 2001 From: Mehmet Nuri Deveci <5735811+mndeveci@users.noreply.github.com> Date: Wed, 4 Oct 2023 23:40:36 -0700 Subject: [PATCH 08/22] add testdata folder --- .../local/start_lambda/start_lambda_api_integ_base.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/integration/local/start_lambda/start_lambda_api_integ_base.py b/tests/integration/local/start_lambda/start_lambda_api_integ_base.py index c59247cf71..1d71ea6478 100644 --- a/tests/integration/local/start_lambda/start_lambda_api_integ_base.py +++ b/tests/integration/local/start_lambda/start_lambda_api_integ_base.py @@ -47,7 +47,7 @@ class StartLambdaIntegBaseClass(TestCase): def setUpClass(cls): # This is the directory for tests/integration which will be used to file the testdata # files for integ tests - scratch_dir = str(Path(__file__).resolve().parent.joinpath(".tmp", str(uuid.uuid4()).replace("-", "")[:10])) + scratch_dir = str(Path(__file__).resolve().parent.joinpath(".tmp", str(uuid.uuid4()).replace("-", "")[:10], "testdata")) shutil.rmtree(scratch_dir, ignore_errors=True) os.makedirs(scratch_dir) copytree(str(Path(cls.integration_dir).joinpath("testdata")), scratch_dir) From 785f44f40868820c0feba6e59ebd3f4b68d51f47 Mon Sep 17 00:00:00 2001 From: Mehmet Nuri Deveci <5735811+mndeveci@users.noreply.github.com> Date: Wed, 4 Oct 2023 23:41:55 -0700 Subject: [PATCH 09/22] fix paths --- .../local/start_lambda/start_lambda_api_integ_base.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/integration/local/start_lambda/start_lambda_api_integ_base.py b/tests/integration/local/start_lambda/start_lambda_api_integ_base.py index 1d71ea6478..9cb75cb664 100644 --- a/tests/integration/local/start_lambda/start_lambda_api_integ_base.py +++ b/tests/integration/local/start_lambda/start_lambda_api_integ_base.py @@ -47,11 +47,11 @@ class StartLambdaIntegBaseClass(TestCase): def setUpClass(cls): # This is the directory for tests/integration which will be used to file the testdata # files for integ tests - scratch_dir = str(Path(__file__).resolve().parent.joinpath(".tmp", str(uuid.uuid4()).replace("-", "")[:10], "testdata")) + scratch_dir = Path(__file__).resolve().parent.joinpath(".tmp", str(uuid.uuid4()).replace("-", "")[:10], "testdata") shutil.rmtree(scratch_dir, ignore_errors=True) os.makedirs(scratch_dir) - copytree(str(Path(cls.integration_dir).joinpath("testdata")), scratch_dir) - cls.integration_dir = scratch_dir + copytree(str(Path(cls.integration_dir).joinpath("testdata")), str(scratch_dir)) + cls.integration_dir = scratch_dir.parent cls.template = cls.integration_dir + cls.template_path cls.working_dir = str(Path(cls.template).resolve().parents[0]) From 2df03fb6906ec8c56335d039769e0d9ec3e53bf8 Mon Sep 17 00:00:00 2001 From: Mehmet Nuri Deveci <5735811+mndeveci@users.noreply.github.com> Date: Wed, 4 Oct 2023 23:42:35 -0700 Subject: [PATCH 10/22] fix paths v2 --- .../local/start_lambda/start_lambda_api_integ_base.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/integration/local/start_lambda/start_lambda_api_integ_base.py b/tests/integration/local/start_lambda/start_lambda_api_integ_base.py index 9cb75cb664..999e99cbb4 100644 --- a/tests/integration/local/start_lambda/start_lambda_api_integ_base.py +++ b/tests/integration/local/start_lambda/start_lambda_api_integ_base.py @@ -51,7 +51,7 @@ def setUpClass(cls): shutil.rmtree(scratch_dir, ignore_errors=True) os.makedirs(scratch_dir) copytree(str(Path(cls.integration_dir).joinpath("testdata")), str(scratch_dir)) - cls.integration_dir = scratch_dir.parent + cls.integration_dir = str(scratch_dir.parent) cls.template = cls.integration_dir + cls.template_path cls.working_dir = str(Path(cls.template).resolve().parents[0]) From a4f7be2faf36049ab8345562e211eaf9d661bc23 Mon Sep 17 00:00:00 2001 From: Mehmet Nuri Deveci <5735811+mndeveci@users.noreply.github.com> Date: Wed, 4 Oct 2023 23:59:10 -0700 Subject: [PATCH 11/22] fix paths v23 --- .../start_lambda/start_lambda_api_integ_base.py | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/tests/integration/local/start_lambda/start_lambda_api_integ_base.py b/tests/integration/local/start_lambda/start_lambda_api_integ_base.py index 999e99cbb4..4b5cd8e1de 100644 --- a/tests/integration/local/start_lambda/start_lambda_api_integ_base.py +++ b/tests/integration/local/start_lambda/start_lambda_api_integ_base.py @@ -199,16 +199,15 @@ class WatchWarmContainersIntegBaseClass(StartLambdaIntegBaseClass): @classmethod def setUpClass(cls): cls.temp_path = str(uuid.uuid4()).replace("-", "")[:10] - working_dir = str(Path(cls.integration_dir).resolve().joinpath(cls.temp_path)) + working_dir = Path(cls.integration_dir).resolve().joinpath("testdata", ".tmp", cls.temp_path) if Path(working_dir).resolve().exists(): shutil.rmtree(working_dir, ignore_errors=True) - os.mkdir(working_dir) - os.mkdir(Path(cls.integration_dir).resolve().joinpath(cls.temp_path).joinpath("dir")) - cls.template_path = f"/{cls.temp_path}/template.yaml" - cls.code_path = f"/{cls.temp_path}/main.py" - cls.code_path2 = f"/{cls.temp_path}/dir/main2.py" - cls.docker_file_path = f"/{cls.temp_path}/Dockerfile" - cls.docker_file_path2 = f"/{cls.temp_path}/Dockerfile2" + os.makedirs(working_dir.joinpath("dir")) + cls.template_path = f"/testdata/.tmp/{cls.temp_path}/template.yaml" + cls.code_path = f"/testdata/.tmp/{cls.temp_path}/main.py" + cls.code_path2 = f"/testdata/.tmp/{cls.temp_path}/dir/main2.py" + cls.docker_file_path = f"/testdata/.tmp/{cls.temp_path}/Dockerfile" + cls.docker_file_path2 = f"/testdata/.tmp/{cls.temp_path}/Dockerfile2" if cls.template_content: cls._write_file_content(cls.template_path, cls.template_content) From db70156d8a67ae453503875a134e08dcc29482d6 Mon Sep 17 00:00:00 2001 From: Mehmet Nuri Deveci <5735811+mndeveci@users.noreply.github.com> Date: Thu, 5 Oct 2023 00:15:41 -0700 Subject: [PATCH 12/22] set class vars in correct place --- .../local/start_api/test_start_api.py | 23 ++++++------------- .../local/start_lambda/test_start_lambda.py | 19 ++++++--------- 2 files changed, 14 insertions(+), 28 deletions(-) diff --git a/tests/integration/local/start_api/test_start_api.py b/tests/integration/local/start_api/test_start_api.py index c43936031d..3b07df75d3 100644 --- a/tests/integration/local/start_api/test_start_api.py +++ b/tests/integration/local/start_api/test_start_api.py @@ -2126,6 +2126,13 @@ def test_swagger_got_parsed_and_api_is_reachable_and_payload_version_is_2(self): class TestWarmContainersBaseClass(StartApiIntegBaseClass): + + @classmethod + def setUpClass(cls): + cls.mode_env_variable = str(uuid.uuid4()) + cls.parameter_overrides = {"ModeEnvVariable": cls.mode_env_variable} + super().setUpClass(cls) + def setUp(self): self.url = "http://127.0.0.1:{}".format(self.port) @@ -2147,8 +2154,6 @@ def count_running_containers(self): ) class TestWarmContainers(TestWarmContainersBaseClass): container_mode = ContainersInitializationMode.EAGER.value - mode_env_variable = str(uuid.uuid4()) - parameter_overrides = {"ModeEnvVariable": mode_env_variable} @pytest.mark.flaky(reruns=3) @pytest.mark.timeout(timeout=600, method="thread") @@ -2167,8 +2172,6 @@ def test_can_invoke_lambda_function_successfully(self): ) class TestWarmContainersInitialization(TestWarmContainersBaseClass): container_mode = ContainersInitializationMode.EAGER.value - mode_env_variable = str(uuid.uuid4()) - parameter_overrides = {"ModeEnvVariable": mode_env_variable} @pytest.mark.flaky(reruns=3) @pytest.mark.timeout(timeout=600, method="thread") @@ -2187,8 +2190,6 @@ def test_all_containers_are_initialized_before_any_invoke(self): ) class TestWarmContainersMultipleInvoke(TestWarmContainersBaseClass): container_mode = ContainersInitializationMode.EAGER.value - mode_env_variable = str(uuid.uuid4()) - parameter_overrides = {"ModeEnvVariable": mode_env_variable} @pytest.mark.flaky(reruns=3) @pytest.mark.timeout(timeout=600, method="thread") @@ -2210,8 +2211,6 @@ def test_no_new_created_containers_after_lambda_function_invoke(self): ) class TestLazyContainers(TestWarmContainersBaseClass): container_mode = ContainersInitializationMode.LAZY.value - mode_env_variable = str(uuid.uuid4()) - parameter_overrides = {"ModeEnvVariable": mode_env_variable} @pytest.mark.flaky(reruns=3) @pytest.mark.timeout(timeout=600, method="thread") @@ -2230,8 +2229,6 @@ def test_can_invoke_lambda_function_successfully(self): ) class TestLazyContainersInitialization(TestWarmContainersBaseClass): container_mode = ContainersInitializationMode.LAZY.value - mode_env_variable = str(uuid.uuid4()) - parameter_overrides = {"ModeEnvVariable": mode_env_variable} @pytest.mark.flaky(reruns=3) @pytest.mark.timeout(timeout=600, method="thread") @@ -2251,8 +2248,6 @@ def test_no_container_is_initialized_before_any_invoke(self): ) class TestLazyContainersMultipleInvoke(TestWarmContainersBaseClass): container_mode = ContainersInitializationMode.LAZY.value - mode_env_variable = str(uuid.uuid4()) - parameter_overrides = {"ModeEnvVariable": mode_env_variable} @pytest.mark.flaky(reruns=3) @pytest.mark.timeout(timeout=600, method="thread") @@ -3149,8 +3144,6 @@ def tearDownClass(self) -> None: class TestWarmContainersRemoteLayers(WarmContainersWithRemoteLayersBase): template_path = "/testdata/start_api/template-warm-containers-layers.yaml" container_mode = ContainersInitializationMode.EAGER.value - mode_env_variable = str(uuid.uuid4()) - parameter_overrides = {"ModeEnvVariable": mode_env_variable} @pytest.mark.flaky(reruns=3) @pytest.mark.timeout(timeout=600, method="thread") @@ -3170,8 +3163,6 @@ def test_can_invoke_lambda_layer_successfully(self): class TestWarmContainersRemoteLayersLazyInvoke(WarmContainersWithRemoteLayersBase): template_path = "/testdata/start_api/template-warm-containers-layers.yaml" container_mode = ContainersInitializationMode.LAZY.value - mode_env_variable = str(uuid.uuid4()) - parameter_overrides = {"ModeEnvVariable": mode_env_variable} @pytest.mark.flaky(reruns=3) @pytest.mark.timeout(timeout=600, method="thread") diff --git a/tests/integration/local/start_lambda/test_start_lambda.py b/tests/integration/local/start_lambda/test_start_lambda.py index 01a479fd3f..699704af87 100644 --- a/tests/integration/local/start_lambda/test_start_lambda.py +++ b/tests/integration/local/start_lambda/test_start_lambda.py @@ -299,6 +299,13 @@ def test_invoke_with_function_timeout(self, use_full_path): class TestWarmContainersBaseClass(StartLambdaIntegBaseClass): + + @classmethod + def setUpClass(cls): + cls.mode_env_variable = str(uuid.uuid4()) + cls.parameter_overrides = {"ModeEnvVariable": cls.mode_env_variable} + super().setUpClass(cls) + def setUp(self): self.url = "http://127.0.0.1:{}".format(self.port) self.lambda_client = boto3.client( @@ -328,8 +335,6 @@ def count_running_containers(self): ) class TestWarmContainers(TestWarmContainersBaseClass): container_mode = ContainersInitializationMode.EAGER.value - mode_env_variable = str(uuid.uuid4()) - parameter_overrides = {"ModeEnvVariable": mode_env_variable} @pytest.mark.flaky(reruns=3) @pytest.mark.timeout(timeout=600, method="thread") @@ -351,8 +356,6 @@ def test_can_invoke_lambda_function_successfully(self): ) class TestWarmContainersInitialization(TestWarmContainersBaseClass): container_mode = ContainersInitializationMode.EAGER.value - mode_env_variable = str(uuid.uuid4()) - parameter_overrides = {"ModeEnvVariable": mode_env_variable} @pytest.mark.flaky(reruns=3) @pytest.mark.timeout(timeout=600, method="thread") @@ -371,8 +374,6 @@ def test_all_containers_are_initialized_before_any_invoke(self): ) class TestWarmContainersMultipleInvoke(TestWarmContainersBaseClass): container_mode = ContainersInitializationMode.EAGER.value - mode_env_variable = str(uuid.uuid4()) - parameter_overrides = {"ModeEnvVariable": mode_env_variable} @pytest.mark.flaky(reruns=3) @pytest.mark.timeout(timeout=600, method="thread") @@ -394,8 +395,6 @@ def test_no_new_created_containers_after_lambda_function_invoke(self): ) class TestLazyContainers(TestWarmContainersBaseClass): container_mode = ContainersInitializationMode.LAZY.value - mode_env_variable = str(uuid.uuid4()) - parameter_overrides = {"ModeEnvVariable": mode_env_variable} @pytest.mark.flaky(reruns=3) @pytest.mark.timeout(timeout=600, method="thread") @@ -417,8 +416,6 @@ def test_can_invoke_lambda_function_successfully(self): ) class TestLazyContainersInitialization(TestWarmContainersBaseClass): container_mode = ContainersInitializationMode.LAZY.value - mode_env_variable = str(uuid.uuid4()) - parameter_overrides = {"ModeEnvVariable": mode_env_variable} @pytest.mark.flaky(reruns=3) @pytest.mark.timeout(timeout=600, method="thread") @@ -438,8 +435,6 @@ def test_no_container_is_initialized_before_any_invoke(self): ) class TestLazyContainersMultipleInvoke(TestWarmContainersBaseClass): container_mode = ContainersInitializationMode.LAZY.value - mode_env_variable = str(uuid.uuid4()) - parameter_overrides = {"ModeEnvVariable": mode_env_variable} @pytest.mark.flaky(reruns=3) @pytest.mark.timeout(timeout=600, method="thread") From 40d33da9b232771d6b9059a8ae68a363267e65e4 Mon Sep 17 00:00:00 2001 From: Mehmet Nuri Deveci <5735811+mndeveci@users.noreply.github.com> Date: Thu, 5 Oct 2023 00:19:35 -0700 Subject: [PATCH 13/22] fix func args --- tests/integration/local/start_api/test_start_api.py | 2 +- tests/integration/local/start_lambda/test_start_lambda.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/integration/local/start_api/test_start_api.py b/tests/integration/local/start_api/test_start_api.py index 3b07df75d3..9ec7934d2c 100644 --- a/tests/integration/local/start_api/test_start_api.py +++ b/tests/integration/local/start_api/test_start_api.py @@ -2131,7 +2131,7 @@ class TestWarmContainersBaseClass(StartApiIntegBaseClass): def setUpClass(cls): cls.mode_env_variable = str(uuid.uuid4()) cls.parameter_overrides = {"ModeEnvVariable": cls.mode_env_variable} - super().setUpClass(cls) + super().setUpClass() def setUp(self): self.url = "http://127.0.0.1:{}".format(self.port) diff --git a/tests/integration/local/start_lambda/test_start_lambda.py b/tests/integration/local/start_lambda/test_start_lambda.py index 699704af87..002221cfaa 100644 --- a/tests/integration/local/start_lambda/test_start_lambda.py +++ b/tests/integration/local/start_lambda/test_start_lambda.py @@ -304,7 +304,7 @@ class TestWarmContainersBaseClass(StartLambdaIntegBaseClass): def setUpClass(cls): cls.mode_env_variable = str(uuid.uuid4()) cls.parameter_overrides = {"ModeEnvVariable": cls.mode_env_variable} - super().setUpClass(cls) + super().setUpClass() def setUp(self): self.url = "http://127.0.0.1:{}".format(self.port) From 1a658c1d1edde8852f5fc3acfcdead7c015cfb0f Mon Sep 17 00:00:00 2001 From: Mehmet Nuri Deveci <5735811+mndeveci@users.noreply.github.com> Date: Thu, 5 Oct 2023 12:59:21 -0700 Subject: [PATCH 14/22] don't fail for docker errors --- .../local/start_lambda/test_start_lambda.py | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/tests/integration/local/start_lambda/test_start_lambda.py b/tests/integration/local/start_lambda/test_start_lambda.py index 002221cfaa..c3e69fdf8d 100644 --- a/tests/integration/local/start_lambda/test_start_lambda.py +++ b/tests/integration/local/start_lambda/test_start_lambda.py @@ -3,6 +3,8 @@ from concurrent.futures import ThreadPoolExecutor, as_completed from time import time, sleep import json + +import docker from parameterized import parameterized, parameterized_class import pytest @@ -320,9 +322,14 @@ def setUp(self): def count_running_containers(self): running_containers = 0 for container in self.docker_client.containers.list(): - _, output = container.exec_run(["bash", "-c", "'printenv'"]) - if f"MODE={self.mode_env_variable}" in str(output): - running_containers += 1 + try: + _, output = container.exec_run(["bash", "-c", "'printenv'"]) + if f"MODE={self.mode_env_variable}" in str(output): + running_containers += 1 + except docker.errors.NotFound: + # running tests in parallel might might cause this issue since this container in the loop + # might be created by other tests and might be at the removal step now + pass return running_containers From 243b5a90dcb520e311bf9414485c1e9ee58ddecc Mon Sep 17 00:00:00 2001 From: Mehmet Nuri Deveci <5735811+mndeveci@users.noreply.github.com> Date: Thu, 5 Oct 2023 16:44:16 -0700 Subject: [PATCH 15/22] catch multiple exceptions --- tests/integration/local/start_lambda/test_start_lambda.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/integration/local/start_lambda/test_start_lambda.py b/tests/integration/local/start_lambda/test_start_lambda.py index c3e69fdf8d..0a6cf2c190 100644 --- a/tests/integration/local/start_lambda/test_start_lambda.py +++ b/tests/integration/local/start_lambda/test_start_lambda.py @@ -326,7 +326,7 @@ def count_running_containers(self): _, output = container.exec_run(["bash", "-c", "'printenv'"]) if f"MODE={self.mode_env_variable}" in str(output): running_containers += 1 - except docker.errors.NotFound: + except (docker.errors.NotFound, docker.errors.APIError): # running tests in parallel might might cause this issue since this container in the loop # might be created by other tests and might be at the removal step now pass From 1611b3a4a601ad9b9ad1914151e9174726a02cc2 Mon Sep 17 00:00:00 2001 From: Mehmet Nuri Deveci <5735811+mndeveci@users.noreply.github.com> Date: Thu, 5 Oct 2023 16:51:00 -0700 Subject: [PATCH 16/22] check uuid --- tests/integration/local/start_lambda/test_start_lambda.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/integration/local/start_lambda/test_start_lambda.py b/tests/integration/local/start_lambda/test_start_lambda.py index 0a6cf2c190..3ba4504f70 100644 --- a/tests/integration/local/start_lambda/test_start_lambda.py +++ b/tests/integration/local/start_lambda/test_start_lambda.py @@ -390,6 +390,8 @@ def test_no_new_created_containers_after_lambda_function_invoke(self): initiated_containers = self.count_running_containers() # validate that no new containers got created + LOG.info(self.mode_env_variable) + self.assertEqual(1, 2) self.assertEqual(initiated_containers, initiated_containers_before_invoking_any_function) From 72e7f8418b3ec38fe5f009c69009ba8d72c46445 Mon Sep 17 00:00:00 2001 From: Mehmet Nuri Deveci <5735811+mndeveci@users.noreply.github.com> Date: Thu, 5 Oct 2023 17:00:07 -0700 Subject: [PATCH 17/22] remove auto fail --- tests/integration/local/start_lambda/test_start_lambda.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/tests/integration/local/start_lambda/test_start_lambda.py b/tests/integration/local/start_lambda/test_start_lambda.py index 3ba4504f70..0a6cf2c190 100644 --- a/tests/integration/local/start_lambda/test_start_lambda.py +++ b/tests/integration/local/start_lambda/test_start_lambda.py @@ -390,8 +390,6 @@ def test_no_new_created_containers_after_lambda_function_invoke(self): initiated_containers = self.count_running_containers() # validate that no new containers got created - LOG.info(self.mode_env_variable) - self.assertEqual(1, 2) self.assertEqual(initiated_containers, initiated_containers_before_invoking_any_function) From e2c3a9544a80d88548e2848ccfa44092069cf7f0 Mon Sep 17 00:00:00 2001 From: Mehmet Nuri Deveci <5735811+mndeveci@users.noreply.github.com> Date: Thu, 5 Oct 2023 17:07:01 -0700 Subject: [PATCH 18/22] wait for 5s before starting the tests --- .../local/start_lambda/start_lambda_api_integ_base.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tests/integration/local/start_lambda/start_lambda_api_integ_base.py b/tests/integration/local/start_lambda/start_lambda_api_integ_base.py index 4b5cd8e1de..d179458ba7 100644 --- a/tests/integration/local/start_lambda/start_lambda_api_integ_base.py +++ b/tests/integration/local/start_lambda/start_lambda_api_integ_base.py @@ -1,4 +1,5 @@ import shutil +import time import uuid from shutil import rmtree from typing import Optional, Dict, List @@ -99,6 +100,8 @@ def start_lambda_with_retry(cls, retries=3, input=None, env=None): if retry_count == retries: raise ValueError("Ran out of retries attempting to start lambda") + time.sleep(5) + @classmethod def get_start_lambda_command( cls, From 61b4a670ef6c687be03b054e0f78d076823936b9 Mon Sep 17 00:00:00 2001 From: Mehmet Nuri Deveci <5735811+mndeveci@users.noreply.github.com> Date: Thu, 5 Oct 2023 17:11:49 -0700 Subject: [PATCH 19/22] wait for 20s before starting the tests --- .../local/start_lambda/start_lambda_api_integ_base.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/integration/local/start_lambda/start_lambda_api_integ_base.py b/tests/integration/local/start_lambda/start_lambda_api_integ_base.py index d179458ba7..87f8b368c7 100644 --- a/tests/integration/local/start_lambda/start_lambda_api_integ_base.py +++ b/tests/integration/local/start_lambda/start_lambda_api_integ_base.py @@ -100,7 +100,7 @@ def start_lambda_with_retry(cls, retries=3, input=None, env=None): if retry_count == retries: raise ValueError("Ran out of retries attempting to start lambda") - time.sleep(5) + time.sleep(20) @classmethod def get_start_lambda_command( From cde0555a7c393ba23fc69a6858c0ea00da21750c Mon Sep 17 00:00:00 2001 From: Mehmet Nuri Deveci <5735811+mndeveci@users.noreply.github.com> Date: Thu, 5 Oct 2023 17:17:50 -0700 Subject: [PATCH 20/22] print any errors during container ping --- tests/integration/local/start_lambda/test_start_lambda.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/integration/local/start_lambda/test_start_lambda.py b/tests/integration/local/start_lambda/test_start_lambda.py index 0a6cf2c190..eef85c5461 100644 --- a/tests/integration/local/start_lambda/test_start_lambda.py +++ b/tests/integration/local/start_lambda/test_start_lambda.py @@ -326,9 +326,10 @@ def count_running_containers(self): _, output = container.exec_run(["bash", "-c", "'printenv'"]) if f"MODE={self.mode_env_variable}" in str(output): running_containers += 1 - except (docker.errors.NotFound, docker.errors.APIError): + except (docker.errors.NotFound, docker.errors.APIError) as ex: # running tests in parallel might might cause this issue since this container in the loop # might be created by other tests and might be at the removal step now + LOG.error("Failed to ping container %s for test %s", container.id, self.id(), exc_info=ex) pass return running_containers From 742f00757665c1c8ae97fadd12c5bc7a56c4eb4f Mon Sep 17 00:00:00 2001 From: Mehmet Nuri Deveci <5735811+mndeveci@users.noreply.github.com> Date: Thu, 5 Oct 2023 17:27:50 -0700 Subject: [PATCH 21/22] print moare --- tests/integration/local/start_lambda/test_start_lambda.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/integration/local/start_lambda/test_start_lambda.py b/tests/integration/local/start_lambda/test_start_lambda.py index eef85c5461..62b762f92c 100644 --- a/tests/integration/local/start_lambda/test_start_lambda.py +++ b/tests/integration/local/start_lambda/test_start_lambda.py @@ -323,6 +323,7 @@ def count_running_containers(self): running_containers = 0 for container in self.docker_client.containers.list(): try: + LOG.info(container.__dict__) _, output = container.exec_run(["bash", "-c", "'printenv'"]) if f"MODE={self.mode_env_variable}" in str(output): running_containers += 1 From a147620a7a129bc51ea0f11bac6c8ee84b69ae3d Mon Sep 17 00:00:00 2001 From: Mehmet Nuri Deveci <5735811+mndeveci@users.noreply.github.com> Date: Thu, 5 Oct 2023 17:39:45 -0700 Subject: [PATCH 22/22] check running containers in alt way --- .../local/start_lambda/test_start_lambda.py | 22 ++++++++++--------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/tests/integration/local/start_lambda/test_start_lambda.py b/tests/integration/local/start_lambda/test_start_lambda.py index 62b762f92c..c625b5f2f5 100644 --- a/tests/integration/local/start_lambda/test_start_lambda.py +++ b/tests/integration/local/start_lambda/test_start_lambda.py @@ -322,16 +322,18 @@ def setUp(self): def count_running_containers(self): running_containers = 0 for container in self.docker_client.containers.list(): - try: - LOG.info(container.__dict__) - _, output = container.exec_run(["bash", "-c", "'printenv'"]) - if f"MODE={self.mode_env_variable}" in str(output): - running_containers += 1 - except (docker.errors.NotFound, docker.errors.APIError) as ex: - # running tests in parallel might might cause this issue since this container in the loop - # might be created by other tests and might be at the removal step now - LOG.error("Failed to ping container %s for test %s", container.id, self.id(), exc_info=ex) - pass + if container.attrs.get("State", {}).get("Status", "") == "Running" and \ + container.attrs.get("Config", {}).get("Env", {}).get("MODE", "") == self.mode_env_variable: + running_containers += 1 + # try: + # _, output = container.exec_run(["bash", "-c", "'printenv'"]) + # if f"MODE={self.mode_env_variable}" in str(output): + # running_containers += 1 + # except (docker.errors.NotFound, docker.errors.APIError) as ex: + # # running tests in parallel might might cause this issue since this container in the loop + # # might be created by other tests and might be at the removal step now + # LOG.error("Failed to ping container %s for test %s", container.id, self.id(), exc_info=ex) + # pass return running_containers