Skip to content

Commit 345c168

Browse files
committed
tests: Dump CMS logs on failure
Add a helper decorator to dump CMS and MLflow logs when an exception is raised and use it for catching unexpected errors while waiting for task completion. Signed-off-by: Phoevos Kalemkeris <[email protected]>
1 parent 1605db2 commit 345c168

File tree

1 file changed

+31
-9
lines changed

1 file changed

+31
-9
lines changed

tests/integration/utils.py

Lines changed: 31 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import functools
12
import json
23
import logging
34
import os
@@ -56,6 +57,26 @@
5657

5758
log = logging.getLogger("cmg.tests.integration")
5859

60+
cms_compose: DockerCompose = None
61+
cms_mlflow_compose: DockerCompose = None
62+
63+
64+
def dump_cms_logs_on_failure(func):
65+
@functools.wraps(func)
66+
def wrapper(*args, **kwargs):
67+
try:
68+
return func(*args, **kwargs)
69+
except Exception as e:
70+
logs = cms_compose.get_logs()
71+
log.error("CogStack Model Serve Logs:\nstdout: %s\nstderr: %s", logs[0], logs[1])
72+
73+
mlflow_logs = cms_mlflow_compose.get_logs()
74+
log.error("MLflow Logs:\nstdout: %s\nstderr: %s", mlflow_logs[0], mlflow_logs[1])
75+
76+
raise e
77+
78+
return wrapper
79+
5980

6081
def setup_testcontainers(request: pytest.FixtureRequest):
6182
postgres = PostgresContainer(POSTGRES_IMAGE)
@@ -211,29 +232,29 @@ def start_cogstack_model_serve(model_services: list[str]) -> list[DockerCompose]
211232

212233
log.debug(f"CogStack Model Serve environment file: {env_file_path}")
213234

214-
compose: DockerCompose = None
215-
compose_mlflow: DockerCompose = None
235+
global cms_compose, cms_mlflow_compose
216236

217237
try:
218-
compose = DockerCompose(
238+
cms_compose = DockerCompose(
219239
context=COGSTACK_MODEL_SERVE_LOCAL_PATH,
220240
compose_file_name=COGSTACK_MODEL_SERVE_COMPOSE,
221241
env_file=".env",
222242
services=model_services,
223243
)
224-
compose.start()
244+
cms_compose.start()
225245

226-
compose_mlflow = DockerCompose(
246+
cms_mlflow_compose = DockerCompose(
227247
context=COGSTACK_MODEL_SERVE_LOCAL_PATH,
228248
compose_file_name=COGSTACK_MODEL_SERVE_COMPOSE_MLFLOW,
229249
env_file=".env",
230250
services=["mlflow-ui", "mlflow-db", "minio", "model-bucket-init"],
231251
)
232-
compose_mlflow.start()
233-
return [compose, compose_mlflow]
252+
cms_mlflow_compose.start()
253+
254+
return [cms_compose, cms_mlflow_compose]
234255
except subprocess.CalledProcessError as e:
235256
log.info(e.stderr)
236-
stop_cogstack_model_serve([env for env in (compose, compose_mlflow) if env])
257+
stop_cogstack_model_serve([env for env in (cms_compose, cms_mlflow_compose) if env])
237258
raise
238259

239260

@@ -281,11 +302,12 @@ def verify_task_submitted_successfully(task_uuid: str, tm: TaskManager):
281302
assert tm.get_task(task_uuid), "Failed to submit task: not found in the database"
282303

283304

305+
@dump_cms_logs_on_failure
284306
def wait_for_task_completion(task_uuid: str, tm: TaskManager, expected_status: Status) -> Task:
285307
"""Wait for a task to complete and verify its results."""
286308
while (task := tm.get_task(task_uuid)).status != expected_status:
287309
if task.status in [Status.FAILED, Status.SUCCEEDED, Status.REQUEUED]:
288-
pytest.fail(f"Task '{task_uuid}' completed with unexpected status '{task.status}'")
310+
raise ValueError(f"Task '{task_uuid}' completed with unexpected status '{task.status}'")
289311

290312
# Verify task results
291313
if expected_status == Status.SUCCEEDED:

0 commit comments

Comments
 (0)