summaryrefslogtreecommitdiff
path: root/tests/integration_tests/conftest.py
diff options
context:
space:
mode:
Diffstat (limited to 'tests/integration_tests/conftest.py')
-rw-r--r--tests/integration_tests/conftest.py83
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