test-python
failed- Job ID
019c8256-d561-09bf-322a-bf36842ed5e0- Created
- 2026-02-21 22:34:14 UTC
- Updated
- 2026-02-21 22:34:14 UTC
- Duration
- 1m 12s
- Source Ref
- 9804f3c6f946eb3b9949ef1cad0047fc4cfe84ab
- Source URL
- https://github.com/catalystcommunity/reactorcide.git
- Runner Image
10.16.0.1:5000/public/reactorcide/runnerbase:dev- Priority
- 10
- Queue
- reactorcide-jobs
Logs
Cloning into '/workspace'...
=== Running Python Tests ===
Using CPython 3.13.12 interpreter at: /usr/local/bin/python3.13
Creating virtual environment at: .venv
Building runnerlib @ file:///workspace/runnerlib
Downloading cryptography (4.3MiB)
Downloading pygments (1.2MiB)
Downloaded cryptography
Downloaded pygments
Built runnerlib @ file:///workspace/runnerlib
warning: Failed to hardlink files; falling back to full copy. This may lead to degraded performance.
If the cache and target directories are on different filesystems, hardlinking may not be supported.
If this is intentional, set `export UV_LINK_MODE=copy` or use `--link-mode=copy` to suppress this warning.
Installed 22 packages in 127ms
============================= test session starts ==============================
platform linux -- Python 3.13.12, pytest-8.3.5, pluggy-1.6.0
rootdir: /workspace/runnerlib
configfile: pyproject.toml
plugins: cov-7.0.0
collected 381 items
tests/test_config.py .................... [ 5%]
tests/test_container_advanced.py ......... [ 7%]
tests/test_container_isolation.py .... [ 8%]
tests/test_container_validation.py ................... [ 13%]
tests/test_directory_operations.py ............ [ 16%]
tests/test_eval.py ..................................................... [ 30%]
............. [ 34%]
tests/test_eval_cli.py ..................... [ 39%]
tests/test_git_operations.py .......... [ 42%]
tests/test_git_ops.py ....... [ 44%]
tests/test_integration.py ........... [ 46%]
tests/test_job_isolation.py ...F [ 48%]
tests/test_plugins.py ....................... [ 54%]
tests/test_register_secret.py ............ [ 57%]
tests/test_secrets.py ................... [ 62%]
tests/test_secrets_local.py ............................ [ 69%]
tests/test_secrets_resolver.py ............................. [ 77%]
tests/test_secrets_server.py ........ [ 79%]
tests/test_source_preparation.py ............... [ 83%]
tests/test_validation.py ........................... [ 90%]
tests/test_workflow.py ..................................... [100%]
=================================== FAILURES ===================================
_______________ TestJobIsolation.test_container_mount_isolation ________________
self = <runnerlib.tests.test_job_isolation.TestJobIsolation object at 0x7f76edb836f0>
mock_popen = <MagicMock name='Popen' id='140148770388160'>
@patch('subprocess.Popen')
def test_container_mount_isolation(self, mock_popen):
"""Test that containers mount only their job's directory."""
# Mock the Popen object with proper behavior
mock_process = MagicMock()
mock_process.poll.side_effect = [None, None, 0] # Running, running, then finished
mock_process.returncode = 0
mock_process.stdout.readline.return_value = '' # No output (text mode)
mock_process.stderr.readline.return_value = '' # No errors
mock_process.communicate.return_value = ('', '') # Empty re[REDACTED]ing output
mock_popen.return_value = mock_process
with tempfile.TemporaryDirectory() as temp_dir:
# Save original cwd if possible
try:
original_cwd = os.getcwd()
except FileNotFoundError:
# If current dir doesn't exist, use temp dir as fallback
original_cwd = temp_dir
try:
os.chdir(temp_dir)
config = RunnerConfig(
code_dir="/job/src",
job_dir="/job/src",
job_command="echo test",
runner_image="alpine:latest"
)
# Prepare job directory
job_path = prepare_job_directory(config)
# Create a test file
test_file = job_path / "test.txt"
test_file.write_text("test data")
# Run container
> run_container(config)
/workspace/runnerlib/tests/test_job_isolation.py:257:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
config = RunnerConfig(code_dir='/job/src', job_dir='/job/src', job_command='echo test', runner_image='alpine:latest', job_env=N...=None, source_type=None, source_url=None, source_ref=None, ci_source_type=None, ci_source_url=None, ci_source_ref=None)
additional_args = None
def run_container(
config: RunnerConfig,
additional_args: Optional[List[str]] = None
) -> int:
"""Run the job container using docker with full configuration support.
Args:
config: Runner configuration
additional_args: Additional arguments to pass to the job command
Returns:
Exit code of the container process
Raises:
ValueError: If configuration is invalid
FileNotFoundError: If docker is not available
"""
# Create plugin context for the execution
plugin_context = PluginContext(
config=config,
phase=PluginPhase.PRE_SOURCE_PREP,
metadata={}
)
try:
# Execute pre-source-prep plugins
plugin_manager.execute_phase(PluginPhase.PRE_SOURCE_PREP, plugin_context)
# Basic validation is handled by CLI layer
# Check if docker is available
if not shutil.which("docker"):
logger.error("Docker is not available in PATH")
> raise FileNotFoundError("docker is not available in PATH")
E FileNotFoundError: docker is not available in PATH
/workspace/runnerlib/src/container.py:114: FileNotFoundError
----------------------------- Captured stderr call -----------------------------
2026-02-21T22:35:19.803263+00:00 [ERROR] [runnerlib] Docker is not available in PATH
=========================== short test summary info ============================
FAILED tests/test_job_isolation.py::TestJobIsolation::test_container_mount_isolation
======================== 1 failed, 380 passed in 19.56s ========================