diff options
Diffstat (limited to 'tests/integration_tests/conftest.py')
-rw-r--r-- | tests/integration_tests/conftest.py | 83 |
1 files changed, 70 insertions, 13 deletions
diff --git a/tests/integration_tests/conftest.py b/tests/integration_tests/conftest.py index a90a5d49..580fd6ad 100644 --- a/tests/integration_tests/conftest.py +++ b/tests/integration_tests/conftest.py @@ -7,7 +7,7 @@ import sys from contextlib import contextmanager from pathlib import Path from tarfile import TarFile -from typing import Dict, Type +from typing import Dict, Iterator, Type import pytest from pycloudlib.lxd.instance import LXDInstance @@ -92,8 +92,10 @@ def disable_subp_usage(request): pass -@pytest.fixture(scope="session") -def session_cloud(): +@contextmanager +def _session_cloud( + request: pytest.FixtureRequest, +) -> Iterator[IntegrationCloud]: if integration_settings.PLATFORM not in platforms.keys(): raise ValueError( "{} is an invalid PLATFORM specified in settings. " @@ -102,7 +104,17 @@ def session_cloud(): ) ) - cloud = platforms[integration_settings.PLATFORM]() + integration_cloud_marker = request.node.get_closest_marker( + "integration_cloud_args" + ) + cloud_args = [] + cloud_kwargs = {} + if integration_cloud_marker: + cloud_args = integration_cloud_marker.args + cloud_kwargs = integration_cloud_marker.kwargs + cloud = platforms[integration_settings.PLATFORM]( + *cloud_args, **cloud_kwargs + ) cloud.emit_settings_to_log() yield cloud @@ -110,6 +122,30 @@ def session_cloud(): cloud.destroy() +@pytest.fixture +def session_cloud( + request: pytest.FixtureRequest, +) -> Iterator[IntegrationCloud]: + with _session_cloud(request) as cloud: + yield cloud + + +@pytest.fixture(scope="module") +def module_session_cloud( + request: pytest.FixtureRequest, +) -> Iterator[IntegrationCloud]: + with _session_cloud(request) as cloud: + yield cloud + + +@pytest.fixture(scope="class") +def class_session_cloud( + request: pytest.FixtureRequest, +) -> Iterator[IntegrationCloud]: + with _session_cloud(request) as cloud: + yield cloud + + def get_validated_source( session_cloud: IntegrationCloud, source=integration_settings.CLOUD_INIT_SOURCE, @@ -135,13 +171,11 @@ def get_validated_source( ) -@pytest.fixture(scope="session") -def setup_image(session_cloud: IntegrationCloud, request): +def _setup_image(session_cloud: IntegrationCloud, request): """Setup the target environment with the correct version of cloud-init. So we can launch instances / run tests with the correct image """ - source = get_validated_source(session_cloud) if not source.installs_new_version(): return @@ -159,6 +193,21 @@ def setup_image(session_cloud: IntegrationCloud, request): request.addfinalizer(session_cloud.delete_snapshot) +@pytest.fixture +def setup_image(session_cloud: IntegrationCloud, request): + _setup_image(session_cloud, request) + + +@pytest.fixture(scope="module") +def module_setup_image(module_session_cloud: IntegrationCloud, request): + _setup_image(module_session_cloud, request) + + +@pytest.fixture(scope="class") +def class_setup_image(class_session_cloud: IntegrationCloud, request): + _setup_image(class_session_cloud, request) + + def _collect_logs( instance: IntegrationInstance, node_id: str, test_failed: bool ): @@ -218,7 +267,9 @@ def _collect_logs( @contextmanager -def _client(request, fixture_utils, session_cloud: IntegrationCloud): +def _client( + request, fixture_utils, session_cloud: IntegrationCloud +) -> Iterator[IntegrationInstance]: """Fixture implementation for the client fixtures. Launch the dynamic IntegrationClient instance using any provided @@ -268,23 +319,29 @@ def _client(request, fixture_utils, session_cloud: IntegrationCloud): @pytest.fixture -def client(request, fixture_utils, session_cloud, setup_image): +def client( + request, fixture_utils, session_cloud, setup_image +) -> Iterator[IntegrationInstance]: """Provide a client that runs for every test.""" with _client(request, fixture_utils, session_cloud) as client: yield client @pytest.fixture(scope="module") -def module_client(request, fixture_utils, session_cloud, setup_image): +def module_client( + request, fixture_utils, module_session_cloud, module_setup_image +) -> Iterator[IntegrationInstance]: """Provide a client that runs once per module.""" - with _client(request, fixture_utils, session_cloud) as client: + with _client(request, fixture_utils, module_session_cloud) as client: yield client @pytest.fixture(scope="class") -def class_client(request, fixture_utils, session_cloud, setup_image): +def class_client( + request, fixture_utils, class_session_cloud, class_setup_image +) -> Iterator[IntegrationInstance]: """Provide a client that runs once per class.""" - with _client(request, fixture_utils, session_cloud) as client: + with _client(request, fixture_utils, class_session_cloud) as client: yield client |