← Back to team overview

sts-sponsors team mailing list archive

[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