Release v0.1.8

This commit is contained in:
2026-07-11 17:00:37 +02:00
parent a00ef54821
commit 9a0c467d55
102 changed files with 2150 additions and 9272 deletions

View File

@@ -2520,9 +2520,11 @@ finally:
"pathlib.Path(os.environ['GOVOPLAN_DATABASE_BACKUP_METADATA']).write_text(json.dumps({"
"'snapshot': 'external', "
"'pgtools_url': os.environ.get('GOVOPLAN_DATABASE_URL_PGTOOLS')"
"}), encoding='utf-8')"
"}), encoding='utf-8'); "
"print(os.environ.get('GOVOPLAN_DATABASE_URL'))"
)
backup_command = f"{sys.executable} -c {shlex.quote(backup_script)}"
database_url = "postgresql+psycopg://govoplan:db-secret@db.example.invalid/govoplan"
with database.session() as session:
save_maintenance_mode(session, MaintenanceMode(enabled=True))
@@ -2540,7 +2542,7 @@ finally:
available=available_module_manifests(),
current_enabled=("tenancy", "access"),
desired_enabled=("tenancy", "access"),
database_url="postgresql+psycopg://db.example.invalid/govoplan",
database_url=database_url,
runtime_dir=root / "installer",
migrate_database=True,
database_backup_command=backup_command,
@@ -2548,11 +2550,16 @@ finally:
dry_run=True,
)
record = json.loads(result.record_path.read_text(encoding="utf-8"))
record_text = result.record_path.read_text(encoding="utf-8")
self.assertNotIn("db-secret", record_text)
record = json.loads(record_text)
database_backup = record["snapshot"]["database_backup"]
self.assertEqual("external", database_backup["type"])
self.assertEqual("postgresql+psycopg://govoplan:***@db.example.invalid/govoplan", database_backup["database_url"])
self.assertEqual("external", database_backup["metadata"]["snapshot"])
self.assertEqual("postgresql://db.example.invalid/govoplan", database_backup["metadata"]["pgtools_url"])
self.assertEqual("postgresql://govoplan:***@db.example.invalid/govoplan", database_backup["metadata"]["pgtools_url"])
self.assertEqual("postgresql+psycopg://govoplan:***@db.example.invalid/govoplan", database_backup["stdout"].strip())
self.assertEqual(database_url, (result.record_path.parent / database_backup["database_url_secret"]).read_text(encoding="utf-8"))
self.assertEqual("backup", (result.record_path.parent / "database.external.backup").read_text(encoding="utf-8"))
def test_module_installer_external_database_restore_check_runs_before_migrations(self) -> None:
@@ -2613,14 +2620,17 @@ finally:
"os.environ.get('GOVOPLAN_DATABASE_URL', ''), encoding='utf-8')"
)
restore_command = f"{sys.executable} -c {shlex.quote(restore_script)}"
database_url = "postgresql://restore-user:restore-secret@db.example.invalid/govoplan"
(run_dir / "database.external.backup").write_text("backup", encoding="utf-8")
(run_dir / "database-url.secret").write_text(database_url, encoding="utf-8")
(run_dir / "record.json").write_text(json.dumps({
"run_id": run_id,
"plan": [],
"snapshot": {
"database_backup": {
"type": "external",
"database_url": "postgresql://db.example.invalid/govoplan",
"database_url": "postgresql://restore-user:***@db.example.invalid/govoplan",
"database_url_secret": "database-url.secret",
"backup_path": "database.external.backup",
"metadata_path": "database-backup-metadata.json",
"restore_command": restore_command,
@@ -2631,8 +2641,9 @@ finally:
result = rollback_module_install_run(run_id=run_id, runtime_dir=runtime_dir, npm_bin="npm")
self.assertEqual("rolled-back", result.status)
self.assertEqual("postgresql://db.example.invalid/govoplan", (run_dir / "restore.marker").read_text(encoding="utf-8"))
self.assertEqual(database_url, (run_dir / "restore.marker").read_text(encoding="utf-8"))
record = json.loads((run_dir / "record.json").read_text(encoding="utf-8"))
self.assertNotIn("restore-secret", json.dumps(record))
self.assertTrue(record["rollback_database_restore"]["restored"])
def test_module_installer_request_queue_round_trips(self) -> None:
@@ -2987,14 +2998,14 @@ finally:
result = subprocess.run(
[
sys.executable,
"scripts/generate-release-catalog.py",
str(Path(__file__).resolve().parents[2] / "govoplan" / "tools" / "generate-release-catalog.py"),
"--version",
"0.1.7",
"--catalog-output",
str(catalog_path),
],
cwd=str(Path(__file__).resolve().parents[1]),
env=os.environ.copy(),
env={**os.environ.copy(), "GOVOPLAN_CORE_ROOT": str(Path(__file__).resolve().parents[1])},
text=True,
capture_output=True,
check=False,