sts-sponsors team mailing list archive
-
sts-sponsors team
-
Mailing list archive
-
Message #04880
[Merge] ~adam-collard/maas-ci/+git/system-tests:version_info_in_header into ~maas-committers/maas-ci/+git/system-tests:master
Adam Collard has proposed merging ~adam-collard/maas-ci/+git/system-tests:version_info_in_header into ~maas-committers/maas-ci/+git/system-tests:master.
Commit message:
Rework pytest_report_header to add meta information
* Systemtests branch and SHA-1
* MAAS Version (snap channel, or git repo/branch)
* Unify reporting from optional components (tls, o11y, vault...)
* Add BEGIN/END markers to allow extraction from Jenkins
Requested reviews:
MAAS Committers (maas-committers)
For more details, see:
https://code.launchpad.net/~adam-collard/maas-ci/+git/system-tests/+merge/436429
--
Your team MAAS Committers is requested to review the proposed merge of ~adam-collard/maas-ci/+git/system-tests:version_info_in_header into ~maas-committers/maas-ci/+git/system-tests:master.
diff --git a/systemtests/conftest.py b/systemtests/conftest.py
index d9e8576..5fd6f9c 100644
--- a/systemtests/conftest.py
+++ b/systemtests/conftest.py
@@ -1,5 +1,6 @@
from __future__ import annotations
+import subprocess
from logging import getLogger
from typing import TYPE_CHECKING, Any, Iterator
@@ -49,6 +50,7 @@ from .fixtures import (
)
from .lxd import Instance, get_lxd
from .machine_config import MachineConfig
+from .o11y import add_o11y_header
from .state import (
authenticated_admin,
configured_maas,
@@ -57,7 +59,9 @@ from .state import (
ready_maas,
ready_remote_maas,
)
+from .tls import add_tls_header
from .utils import wait_for_machine
+from .vault import add_vault_header
if TYPE_CHECKING:
from _pytest.config.argparsing import Parser
@@ -114,21 +118,63 @@ def config(request: pytest.FixtureRequest) -> dict[str, Any]:
return config
+def add_maas_version_header(headers: list[str], config: dict[str, Any]) -> None:
+ """Add package type and source."""
+ if "snap" in config:
+ headers.append("packagetype: snap")
+ channel = config["snap"]["maas_channel"]
+ headers.append(f"maas: {channel}")
+ else:
+ headers.append("packagetype: deb")
+ deb_config = config.get("deb", {})
+ git_repo = deb_config.get("git_repo", "https://git.launchpad.net/maas")
+ git_branch = deb_config.get("git_branch", "master")
+ headers.append(f"maas: {git_repo}:{git_branch}")
+
+
+def add_systemtests_info(headers: list[str], config: dict[str, Any]) -> None:
+ """Add systemtests source info."""
+ try:
+ branch_process = subprocess.run(
+ ["git", "name-rev", "--name-only", "HEAD"],
+ capture_output=True,
+ text=True,
+ check=True,
+ timeout=10,
+ )
+ except subprocess.CalledProcessError:
+ branch_name = "unknown"
+ else:
+ branch_name = branch_process.stdout.strip()
+ try:
+ sha1_process = subprocess.run(
+ ["git", "rev-parse", "HEAD"],
+ capture_output=True,
+ text=True,
+ check=True,
+ timeout=10,
+ )
+ except subprocess.CalledProcessError:
+ sha1 = "unknown"
+ else:
+ sha1 = sha1_process.stdout.strip()
+ headers.append(f"systemtests: {branch_name} {sha1}")
+
+
def pytest_report_header(config: pytest.Config) -> list[str]:
- headers = []
+ headers = ["BEGIN_SYSTEMTESTS_META"]
systemtests_config = config.getoption("--ss-config")
- package_type = "snap" if "snap" in systemtests_config else "deb"
- headers.append(f"packagetype: {package_type}")
+ add_systemtests_info(headers, systemtests_config)
+ add_maas_version_header(headers, systemtests_config)
machines = ", ".join(
machine_config.name
for machine_config in generate_machines_config(systemtests_config)
)
headers.append(f"machines: {machines}")
- if "tls" in systemtests_config:
- headers.append("tlsenabled: true")
- if "vault" in systemtests_config:
- headers.append("vaultenabled: true")
- return headers
+ add_tls_header(headers, systemtests_config)
+ add_vault_header(headers, systemtests_config)
+ add_o11y_header(headers, systemtests_config)
+ return headers + ["END_SYSTEMTESTS_META"]
@pytest.hookimpl(tryfirst=True, hookwrapper=True) # type: ignore
diff --git a/systemtests/fixtures.py b/systemtests/fixtures.py
index bcd1c0a..d4aac35 100644
--- a/systemtests/fixtures.py
+++ b/systemtests/fixtures.py
@@ -14,10 +14,10 @@ from pytest_steps import one_fixture_per_step
from .api import AuthenticatedAPIClient, UnauthenticatedMAASAPIClient
from .config import ADMIN_EMAIL, ADMIN_PASSWORD, ADMIN_USER
from .lxd import Instance, get_lxd
-from .o11y import setup_o11y
+from .o11y import is_o11y_enabled, setup_o11y
from .region import MAASRegion
-from .tls import MAAS_CONTAINER_CERTS_PATH, setup_tls
-from .vault import Vault, VaultNotReadyError, setup_vault
+from .tls import MAAS_CONTAINER_CERTS_PATH, is_tls_enabled, setup_tls
+from .vault import Vault, VaultNotReadyError, is_vault_enabled, setup_vault
LOG_NAME = "systemtests.fixtures"
@@ -284,7 +284,9 @@ def maas_container(
@pytest.fixture(scope="session")
def vault(maas_container: Instance, config: dict[str, Any]) -> Optional[Vault]:
- snap_channel = config.get("vault", {}).get("snap-channel")
+ if not is_vault_enabled(config):
+ return None
+ snap_channel = config["vault"]["snap-channel"]
if not snap_channel:
return None
@@ -450,7 +452,7 @@ def maas_region(
if vault:
setup_vault(vault, maas_container)
- if "tls" in config:
+ if is_tls_enabled(config):
region_host, url = setup_tls(maas_container)
region = MAASRegion(
url=url,
@@ -459,7 +461,7 @@ def maas_region(
maas_container=maas_container,
installed_from_snap=installed_from_snap,
)
- if "tls" in config:
+ if is_tls_enabled(config):
region.restart()
if not region.user_exists(ADMIN_USER):
@@ -477,8 +479,8 @@ def maas_region(
credentials["snap_channel"] = config["snap"]["maas_channel"]
yaml.dump(credentials, fh)
- if o11y := config.get("o11y"):
- setup_o11y(o11y, maas_container, installed_from_snap)
+ if is_o11y_enabled(config):
+ setup_o11y(config["o11y"], maas_container, installed_from_snap)
yield region
@@ -614,7 +616,7 @@ def maas_client_container(
ensure_host_ip_mapping(
instance, maas_credentials["region_host"], maas_credentials["region_ip"]
)
- if "tls" in config:
+ if is_tls_enabled(config):
instance.execute(["mkdir", "-p", MAAS_CONTAINER_CERTS_PATH])
instance.files[f"{MAAS_CONTAINER_CERTS_PATH}cacerts.pem"].push(
config["tls"]["cacerts"]
diff --git a/systemtests/o11y.py b/systemtests/o11y.py
index e95ba6e..702a7ce 100644
--- a/systemtests/o11y.py
+++ b/systemtests/o11y.py
@@ -10,6 +10,16 @@ if TYPE_CHECKING:
AGENT_PATH = "/opt/agent/agent-linux-amd64"
+def is_o11y_enabled(config: dict[str, Any]) -> bool:
+ return "o11y" in config
+
+
+def add_o11y_header(headers: list[str], config: dict[str, Any]) -> None:
+ """Report on o11y status for pytest header."""
+ if is_o11y_enabled(config):
+ headers.append("o11yenabled: true")
+
+
def setup_o11y(
o11y: dict[str, Any], maas_container: Instance, installed_from_snap: bool
) -> None:
diff --git a/systemtests/tls.py b/systemtests/tls.py
index 53a739c..f26fd9a 100644
--- a/systemtests/tls.py
+++ b/systemtests/tls.py
@@ -1,6 +1,6 @@
from __future__ import annotations
-from typing import TYPE_CHECKING
+from typing import TYPE_CHECKING, Any
if TYPE_CHECKING:
from .lxd import Instance
@@ -10,6 +10,16 @@ if TYPE_CHECKING:
MAAS_CONTAINER_CERTS_PATH = "/var/snap/maas/common/certs/"
+def is_tls_enabled(config: dict[str, Any]) -> bool:
+ return "tls" in config
+
+
+def add_tls_header(headers: list[str], config: dict[str, Any]) -> None:
+ """Report on tls status for pytest header."""
+ if is_tls_enabled(config):
+ headers.append("tlsenabled: true")
+
+
def setup_tls(maas_container: Instance) -> tuple[str, str]:
maas_container.execute(["mkdir", "-p", MAAS_CONTAINER_CERTS_PATH])
maas_container.execute(
diff --git a/systemtests/vault.py b/systemtests/vault.py
index 01e3e77..baa4dce 100644
--- a/systemtests/vault.py
+++ b/systemtests/vault.py
@@ -15,6 +15,16 @@ from retry.api import retry_call
from .lxd import Instance
+def is_vault_enabled(config: dict[str, Any]) -> bool:
+ return bool(config.get("vault", {}).get("snap-channel"))
+
+
+def add_vault_header(headers: list[str], config: dict[str, Any]) -> None:
+ """Report on vault status for pytest header."""
+ if is_vault_enabled(config):
+ headers.append("vaultenabled: true")
+
+
class VaultNotReadyError(Exception):
pass
Follow ups