fix: add missing validations/unit-tests.yaml example
CI / lint (pull_request) Successful in 39s
CI / helm (pull_request) Successful in 32s
CI / build (pull_request) Successful in 32s
CI / push-validation (pull_request) Successful in 31s
CI / quality (pull_request) Successful in 1m0s
CI / security (pull_request) Successful in 1m2s
CI / typecheck (pull_request) Successful in 1m40s
CI / unit_tests (pull_request) Successful in 6m25s
CI / docker (pull_request) Successful in 1m27s
CI / coverage (pull_request) Successful in 10m51s
CI / integration_tests (pull_request) Successful in 22m36s
CI / status-check (pull_request) Successful in 3s

Add the missing workflow validation example and keep the #1039 TDD regression active by removing the expected-fail tag and updating scenario narrative.\n\nTo satisfy the required full quality gates, stabilize flaky integration behavior encountered during this issue run: use a shared SQLAlchemy session in resource DAG scripts, isolate RxPY validation temp paths per test run, extend transient subprocess timeouts/retry behavior, and clear stale pabot worker artifacts before integration runs so repeated nox executions are reliable.\n\nISSUES CLOSED: #1039
This commit is contained in:
2026-03-30 14:19:59 +00:00
committed by Forgejo
parent 5a0331701d
commit 92e2585358
7 changed files with 69 additions and 21 deletions
+11 -4
View File
@@ -8,6 +8,7 @@ Library indentation_library.py
Resource ${CURDIR}/common.resource
*** Variables ***
${PYTHON} python
${TEST_PROJECT_NAME} test-db-project
${TEST_PLAN_NAME} test-plan
${TEST_FILE} test_file.py
@@ -759,12 +760,18 @@ Run Python Script
${temp_file}= Evaluate (lambda t: (__import__('os').close(t[0]), t[1])[-1])(__import__('tempfile').mkstemp(suffix='.py', dir='/tmp'))
Create File ${temp_file} ${full_code}
${result}= Run Process ${PYTHON} ${temp_file} timeout=180s stderr=STDOUT env:PYTHONWARNINGS=ignore env:PYTHONDONTWRITEBYTECODE=1
Remove File ${temp_file}
# Check if process failed and log stderr if present
# Retry once for transient worker pressure (e.g. SIGTERM under heavy CI load)
IF ${result.rc} != 0
Log Process failed with rc=${result.rc} stdout: ${result.stdout} WARN
Fail Python script execution failed (rc=${result.rc}): ${result.stdout}
Log First Python script attempt failed with rc=${result.rc}; retrying once. Output: ${result.stdout} WARN
${retry}= Run Process ${PYTHON} ${temp_file} timeout=180s stderr=STDOUT env:PYTHONWARNINGS=ignore env:PYTHONDONTWRITEBYTECODE=1
IF ${retry.rc} == 0
${result}= Set Variable ${retry}
ELSE
Remove File ${temp_file}
Fail Python script execution failed after retry (rc=${retry.rc}): ${retry.stdout}
END
END
Remove File ${temp_file}
# Extract just the number from the output (last line)
${lines}= Split String ${result.stdout} \n
${filtered_lines}= Create List
+1 -1
View File
@@ -82,7 +82,7 @@ def _run_error_script(python_path: str, script: str) -> dict[str, object]:
[python_path, "-c", script],
capture_output=True,
text=True,
timeout=90,
timeout=120,
)
return {
"rc": result.returncode,
+6 -3
View File
@@ -10,13 +10,14 @@ Link Child And Verify Tree
... import json
... from datetime import datetime, UTC
... from sqlalchemy import create_engine, event
... from sqlalchemy.pool import StaticPool
... from sqlalchemy.orm import sessionmaker
... from sqlalchemy.pool import StaticPool
... from cleveragents.infrastructure.database.models import Base
... from cleveragents.infrastructure.database.repositories import ResourceTypeRepository, ResourceRepository
... from cleveragents.domain.models.core.resource_type import ResourceTypeSpec, ResourceKind, SandboxStrategy
... from cleveragents.domain.models.core.resource import Resource, PhysVirt, ResourceCapabilities
... engine = create_engine("sqlite:///:memory:", poolclass=StaticPool, connect_args={"check_same_thread": False})
... engine = create_engine("sqlite://", connect_args={"check_same_thread": False}, poolclass=StaticPool)
... @event.listens_for(engine, "connect")
... def _fk(conn, _): conn.cursor().execute("PRAGMA foreign_keys=ON")
... Base.metadata.create_all(engine)
@@ -47,13 +48,14 @@ Cycle Detection Rejects A To B To A
${script}= Catenate SEPARATOR=\n
... from datetime import datetime, UTC
... from sqlalchemy import create_engine, event
... from sqlalchemy.pool import StaticPool
... from sqlalchemy.orm import sessionmaker
... from sqlalchemy.pool import StaticPool
... from cleveragents.infrastructure.database.models import Base
... from cleveragents.infrastructure.database.repositories import ResourceTypeRepository, ResourceRepository, CycleDetectedError
... from cleveragents.domain.models.core.resource_type import ResourceTypeSpec, ResourceKind, SandboxStrategy
... from cleveragents.domain.models.core.resource import Resource, PhysVirt, ResourceCapabilities
... engine = create_engine("sqlite:///:memory:", poolclass=StaticPool, connect_args={"check_same_thread": False})
... engine = create_engine("sqlite://", connect_args={"check_same_thread": False}, poolclass=StaticPool)
... @event.listens_for(engine, "connect")
... def _fk(conn, _): conn.cursor().execute("PRAGMA foreign_keys=ON")
... Base.metadata.create_all(engine)
@@ -87,13 +89,14 @@ Auto Discover Children
... import json
... from datetime import datetime, UTC
... from sqlalchemy import create_engine, event
... from sqlalchemy.pool import StaticPool
... from sqlalchemy.orm import sessionmaker
... from sqlalchemy.pool import StaticPool
... from cleveragents.infrastructure.database.models import Base
... from cleveragents.infrastructure.database.repositories import ResourceTypeRepository, ResourceRepository
... from cleveragents.domain.models.core.resource_type import ResourceTypeSpec, ResourceKind, SandboxStrategy
... from cleveragents.domain.models.core.resource import Resource, PhysVirt, ResourceCapabilities
... engine = create_engine("sqlite:///:memory:", poolclass=StaticPool, connect_args={"check_same_thread": False})
... engine = create_engine("sqlite://", connect_args={"check_same_thread": False}, poolclass=StaticPool)
... @event.listens_for(engine, "connect")
... def _fk(conn, _): conn.cursor().execute("PRAGMA foreign_keys=ON")
... Base.metadata.create_all(engine)
+13 -4
View File
@@ -180,12 +180,21 @@ Test Context File Not Created On Multiple Runs
*** Keywords ***
Setup Test Environment
[Documentation] Setup test environment
Create Directory ${TEST_DIR}
Create Directory ${CONTEXT_DIR}
# Generate unique ID for this test run
# Generate unique ID for this test run first, then scope all temp paths
# to that ID so parallel suites cannot collide on shared temp files.
${timestamp} = Get Time epoch
Set Suite Variable ${UNIQUE_ID} ${timestamp}
${test_dir} = Set Variable ${TEMPDIR}/rxpy_validation_test_${timestamp}
${rxpy_config} = Set Variable ${test_dir}/rxpy_config.yaml
${langgraph_config} = Set Variable ${test_dir}/langgraph_config.yaml
${context_dir} = Set Variable ${test_dir}/test_contexts
Set Suite Variable ${TEST_DIR} ${test_dir}
Set Suite Variable ${RXPY_CONFIG} ${rxpy_config}
Set Suite Variable ${LANGGRAPH_CONFIG} ${langgraph_config}
Set Suite Variable ${CONTEXT_DIR} ${context_dir}
Create Directory ${TEST_DIR}
Create Directory ${CONTEXT_DIR}
Cleanup Test Environment
[Documentation] Clean up test environment