Files
geointel/backend/tests/test_rc5_release_deployment.py
T
Codex f7078468db
GeoIntel CI / docs-smoke (push) Canceled after 0s
GeoIntel CI / contract-smoke (push) Canceled after 0s
Make release image tags truly immutable
2026-07-18 02:35:43 +02:00

84 lines
3.8 KiB
Python

from pathlib import Path
ROOT = Path(__file__).resolve().parents[2]
def test_build_identity_does_not_invalidate_dependency_layers() -> None:
dockerfile = (ROOT / "deploy" / "unraid" / "Dockerfile.all-in-one").read_text(encoding="utf-8")
dependency_install = dockerfile.index("/usr/bin/python3.11 -m venv /opt/geointel/venv")
source_copy = dockerfile.index("COPY backend/ /app/")
build_identity = dockerfile.index("ARG GEOINTEL_BUILD_SHA=unknown")
assert build_identity > dependency_install
assert build_identity > source_copy
assert 'org.opencontainers.image.revision="${GEOINTEL_BUILD_SHA}"' in dockerfile
assert 'org.opencontainers.image.created="${GEOINTEL_BUILD_TIME}"' in dockerfile
assert 'io.geointel.ai.enabled="${GEOINTEL_INSTALL_AI}"' in dockerfile
def test_release_deploy_preserves_immutable_and_previous_images() -> None:
script = (ROOT / "deploy" / "unraid" / "deploy-release.sh").read_text(encoding="utf-8")
assert 'GEOINTEL_RELEASE_VARIANT="ai"' in script
assert 'GEOINTEL_RELEASE_VARIANT="gis"' in script
assert 'GEOINTEL_RELEASE_IMAGE="${GEOINTEL_IMAGE_REPOSITORY}:${GEOINTEL_BUILD_SHA}-${GEOINTEL_RELEASE_VARIANT}"' in script
assert 'GEOINTEL_PREVIOUS_IMAGE="${GEOINTEL_IMAGE_REPOSITORY}:previous"' in script
assert 'docker tag "$current_image_id" "$GEOINTEL_PREVIOUS_IMAGE"' in script
assert 'if docker image inspect "$GEOINTEL_RELEASE_IMAGE"' in script
assert "Immutable release tag has conflicting metadata" in script
assert "Reusing existing immutable image" in script
assert "rollback_previous()" in script
assert "Deployed immutable image" in script
def test_runtime_configuration_is_validated_before_container_replacement() -> None:
run_script = (ROOT / "deploy" / "unraid" / "run-dockerman-container.sh").read_text(encoding="utf-8")
validation_index = run_script.index("validate_runtime_config")
replacement_index = run_script.index("docker compose down")
assert validation_index < replacement_index
assert "known-default PostGIS password" in run_script
assert "GEOINTEL_MAX_UPLOAD_MB must be between 1 and 2048" in run_script
assert 'docker image inspect "$GEOINTEL_IMAGE"' in run_script
def test_fresh_install_smoke_is_isolated_and_cleans_only_its_temp_path() -> None:
script = (ROOT / "scripts" / "verify_release_fresh_install.sh").read_text(encoding="utf-8")
assert "mktemp -d" in script
assert "geointel-fresh-smoke.*" in script
assert "-p 127.0.0.1::80" in script
assert "GEOINTEL_POSTGRES_PASSWORD=" in script
assert "/health/ready" in script
assert "/api/v1/system/capabilities" in script
assert "docker exec" in script
assert "python -m alembic heads" in script
def test_manual_rollback_reuses_persistent_paths_and_requires_existing_image() -> None:
rollback = (ROOT / "deploy" / "unraid" / "rollback-dockerman-container.sh").read_text(encoding="utf-8")
run_script = (ROOT / "deploy" / "unraid" / "run-dockerman-container.sh").read_text(encoding="utf-8")
assert "geointel-all-in-one:previous" in rollback
assert 'docker image inspect "$GEOINTEL_ROLLBACK_IMAGE"' in rollback
assert 'GEOINTEL_IMAGE="$GEOINTEL_ROLLBACK_IMAGE"' in rollback
assert '-v "${GEOINTEL_POSTGIS_DATA_PATH}:/var/lib/postgresql/data"' in run_script
assert '-v "${GEOINTEL_STORAGE_PATH}:/app/storage"' in run_script
def test_readiness_checks_all_release_shell_entrypoints() -> None:
readiness = (ROOT / "scripts" / "run_readiness_check.sh").read_text(encoding="utf-8")
for path in (
"scripts/deploy_tower.sh",
"scripts/verify_release_fresh_install.sh",
"deploy/unraid/all-in-one-start.sh",
"deploy/unraid/run-dockerman-container.sh",
"deploy/unraid/deploy-release.sh",
"deploy/unraid/rollback-dockerman-container.sh",
):
assert f"bash -n {path}" in readiness