From 027bdc4770451020ed29285190cda3fe43de87a6 Mon Sep 17 00:00:00 2001 From: Lokesh Muvva Date: Tue, 14 Jul 2026 16:46:48 -0700 Subject: [PATCH 1/4] test: characterize single Grafana module rendering --- tests/test_template_rendering.py | 48 ++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 tests/test_template_rendering.py diff --git a/tests/test_template_rendering.py b/tests/test_template_rendering.py new file mode 100644 index 0000000..153f395 --- /dev/null +++ b/tests/test_template_rendering.py @@ -0,0 +1,48 @@ +"""Characterize GCP cloud_run template rendering. No GCP calls, no subprocess.""" +import hashlib + +import pytest +from jinja2 import Environment, FileSystemLoader + +from deployml.utils.constants import TEMPLATE_DIR + + +@pytest.fixture +def render_cloud_run(): + """Render templates/gcp/cloud_run/main.tf.j2 the same way cli.py's deploy + command does, with the minimal kwargs the template can reference.""" + + def _render(provider: str, stack: list[dict], stack_name: str = "test-stack") -> str: + env = Environment(loader=FileSystemLoader(TEMPLATE_DIR)) + template = env.get_template(f"{provider}/cloud_run/main.tf.j2") + name_hash = hashlib.sha1(f"{stack_name}:test-project".encode("utf-8")).hexdigest()[:6] + return template.render( + cloud=provider, + stack=stack, + deployment_type="cloud_run", + create_artifact_bucket=False, + bucket_configs={}, + project_id="test-project", + stack_name=stack_name, + name_hash=name_hash, + teardown_config=None, + teardown_cron_schedule="", + teardown_scheduled_timestamp=0, + ) + + return _render + + +def test_cloud_run_grafana_is_rendered_once(render_cloud_run): + rendered = render_cloud_run( + provider="gcp", + stack=[ + { + "model_monitoring": { + "name": "grafana", + "params": {"service_name": "grafana-server"}, + } + } + ], + ) + assert rendered.count('module "model_monitoring_grafana"') == 1 From efd35edb0c69227d98eb0a55d54badb207d15e49 Mon Sep 17 00:00:00 2001 From: Lokesh Muvva Date: Tue, 28 Jul 2026 16:42:44 -0700 Subject: [PATCH 2/4] test: characterize Grafana rendering in the mlflow template --- tests/test_template_rendering.py | 40 +++++++++++++++++++++----------- 1 file changed, 26 insertions(+), 14 deletions(-) diff --git a/tests/test_template_rendering.py b/tests/test_template_rendering.py index 153f395..34000ad 100644 --- a/tests/test_template_rendering.py +++ b/tests/test_template_rendering.py @@ -1,4 +1,5 @@ """Characterize GCP cloud_run template rendering. No GCP calls, no subprocess.""" + import hashlib import pytest @@ -12,10 +13,17 @@ def render_cloud_run(): """Render templates/gcp/cloud_run/main.tf.j2 the same way cli.py's deploy command does, with the minimal kwargs the template can reference.""" - def _render(provider: str, stack: list[dict], stack_name: str = "test-stack") -> str: + def _render( + provider: str, + stack: list[dict], + stack_name: str = "test-stack", + template_name: str = "main.tf.j2", + ) -> str: env = Environment(loader=FileSystemLoader(TEMPLATE_DIR)) - template = env.get_template(f"{provider}/cloud_run/main.tf.j2") - name_hash = hashlib.sha1(f"{stack_name}:test-project".encode("utf-8")).hexdigest()[:6] + template = env.get_template(f"{provider}/cloud_run/{template_name}") + name_hash = hashlib.sha1( + f"{stack_name}:test-project".encode("utf-8") + ).hexdigest()[:6] return template.render( cloud=provider, stack=stack, @@ -34,15 +42,19 @@ def _render(provider: str, stack: list[dict], stack_name: str = "test-stack") -> def test_cloud_run_grafana_is_rendered_once(render_cloud_run): - rendered = render_cloud_run( - provider="gcp", - stack=[ - { - "model_monitoring": { - "name": "grafana", - "params": {"service_name": "grafana-server"}, - } + stack = [ + { + "model_monitoring": { + "name": "grafana", + "params": {"service_name": "grafana-server"}, } - ], - ) - assert rendered.count('module "model_monitoring_grafana"') == 1 + } + ] + + for template_name in ("main.tf.j2", "mlflow_main.tf.j2"): + rendered = render_cloud_run( + provider="gcp", + stack=stack, + template_name=template_name, + ) + assert rendered.count('module "model_monitoring_grafana"') == 1 From 633141cc03ae3c873704462f08eaed31acf6dc10 Mon Sep 17 00:00:00 2001 From: Lokesh Muvva Date: Tue, 28 Jul 2026 16:54:29 -0700 Subject: [PATCH 3/4] test: characterize build_images service discovery --- tests/test_docker_discovery.py | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 tests/test_docker_discovery.py diff --git a/tests/test_docker_discovery.py b/tests/test_docker_discovery.py new file mode 100644 index 0000000..02a28b8 --- /dev/null +++ b/tests/test_docker_discovery.py @@ -0,0 +1,17 @@ +"""Characterize the service discovery used by ``build_images``.""" + +from pathlib import Path + + +def test_build_images_discovers_exactly_the_current_gcp_services(): + docker_root = Path(__file__).parents[1] / "src" / "deployml" / "docker" + services = { + directory.name + for directory in docker_root.iterdir() + if directory.is_dir() and (directory / "Dockerfile").exists() + } + + assert services == {"fastapi", "grafana-container", "mlflow"}, ( + "A new service directory requires per-provider filtering in build_images " + "(correction C5) before it can land." + ) From 331d32370e15bd02f755d4bb8be6dbb02040f162 Mon Sep 17 00:00:00 2001 From: Lokesh Muvva Date: Tue, 28 Jul 2026 16:54:55 -0700 Subject: [PATCH 4/4] test: parametrize the Grafana rendering characterization --- tests/test_template_rendering.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/tests/test_template_rendering.py b/tests/test_template_rendering.py index 34000ad..16bef1e 100644 --- a/tests/test_template_rendering.py +++ b/tests/test_template_rendering.py @@ -41,7 +41,8 @@ def _render( return _render -def test_cloud_run_grafana_is_rendered_once(render_cloud_run): +@pytest.mark.parametrize("template_name", ["main.tf.j2", "mlflow_main.tf.j2"]) +def test_cloud_run_grafana_is_rendered_once(render_cloud_run, template_name): stack = [ { "model_monitoring": { @@ -51,10 +52,9 @@ def test_cloud_run_grafana_is_rendered_once(render_cloud_run): } ] - for template_name in ("main.tf.j2", "mlflow_main.tf.j2"): - rendered = render_cloud_run( - provider="gcp", - stack=stack, - template_name=template_name, - ) - assert rendered.count('module "model_monitoring_grafana"') == 1 + rendered = render_cloud_run( + provider="gcp", + stack=stack, + template_name=template_name, + ) + assert rendered.count('module "model_monitoring_grafana"') == 1