From 0077a2d0558a7d4cd99d28a83db9529b58eefebd Mon Sep 17 00:00:00 2001 From: Clint Branham Date: Wed, 25 Mar 2026 17:18:47 -0500 Subject: [PATCH 1/2] fix: mount answers/ and default.toml separately, not over /app MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Mounting the whole directory to /app overwrites server.py inside the container, causing "can't open file '/app/server.py'" errors. Mount the two paths individually instead: - answer_server_dir/answers → /app/answers - answer_server_dir/default.toml → /app/default.toml Co-Authored-By: Claude Opus 4.6 (1M context) --- tests/infrastructure/storage.tf | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/tests/infrastructure/storage.tf b/tests/infrastructure/storage.tf index 479f9a6..f217b0a 100644 --- a/tests/infrastructure/storage.tf +++ b/tests/infrastructure/storage.tf @@ -11,13 +11,14 @@ resource "docker_container" "answer_server" { network_mode = "host" - # Mount the answer server root directory which contains: - # default.toml — fallback answer file - # answers/ — per-MAC answer files - # The server expects both at ./default.toml and ./answers/ relative to /app volumes { - host_path = var.answer_server_dir - container_path = "/app" + host_path = "${var.answer_server_dir}/answers" + container_path = "/app/answers" + } + + volumes { + host_path = "${var.answer_server_dir}/default.toml" + container_path = "/app/default.toml" } } From 8f36593b35b4fe38576e62617582fe40f1e59254 Mon Sep 17 00:00:00 2001 From: Clint Branham Date: Wed, 25 Mar 2026 17:22:00 -0500 Subject: [PATCH 2/2] fix: always use shared mount for WORK_DIR, never RUNNER_TEMP RUNNER_TEMP (/__w/_temp in CI) is container-local and invisible to the Docker host. Files written there can't be bind-mounted into sibling containers (answer server, storage). This was the root cause of the "not a directory" mount failures in CI. Removed RUNNER_TEMP from the WORK_DIR fallback chain. WORK_DIR now always defaults to CACHE_DIR/work (/opt/pve-integration/work/) which is on the shared mount visible to both the CI container and Docker host. Co-Authored-By: Claude Opus 4.6 (1M context) --- tests/infrastructure/scripts/run-integration.sh | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/tests/infrastructure/scripts/run-integration.sh b/tests/infrastructure/scripts/run-integration.sh index 2e67e17..5a749c0 100755 --- a/tests/infrastructure/scripts/run-integration.sh +++ b/tests/infrastructure/scripts/run-integration.sh @@ -47,7 +47,10 @@ REPO_ROOT="$(cd "$INFRA_DIR/../.." && pwd)" # ── Defaults ──────────────────────────────────────────────────────── CACHE_DIR="${CACHE_DIR:-/opt/pve-integration}" -WORK_DIR="${WORK_DIR:-${RUNNER_TEMP:-$CACHE_DIR/work}}" +# Always use a path under CACHE_DIR (shared mount) so files are visible +# to sibling Docker containers. Do NOT use RUNNER_TEMP — it's container-local +# in CI and invisible to the Docker host. +WORK_DIR="${WORK_DIR:-$CACHE_DIR/work}" CONFIG_FILE="${CONFIG_FILE:-$WORK_DIR/config.json}" MODULE_ARTIFACT="${MODULE_ARTIFACT:-$REPO_ROOT/publish/netstandard2.0}" PVE_VERSIONS="${PVE_VERSIONS:-9 8}"