From 734dfb21dda895313243206486066d5722192a74 Mon Sep 17 00:00:00 2001 From: Niek Otten Date: Wed, 22 Jul 2026 15:57:10 +0200 Subject: [PATCH] refactor(infra): drop zaaktype/informatieobjecttype URL injection; add ADR-0021 (refs #113) The ACL now discovers those URLs itself (S-27), so no stack captures/injects them: docker-compose.yml/.local.yml carry ZaaktypeIdentificatie/InformatieobjecttypeOmschrijving instead of placeholder URLs, run-domain-check.sh + local-seed stop emitting the URLs, and the local acl.env shrinks to the OpenZaak base URL. That base URL injection stays: OpenZaak rejects a single-label host on zaak-create (confirmed), so the ACL is still pointed at the container IP. ADR-0021 + demo-script note. Co-Authored-By: Claude Opus 4.8 (1M context) --- ...-acl-resolves-zaaktype-by-identificatie.md | 67 ++++++++++++++++++ docs/demo-script.md | 28 +++++++- infra/docker-compose.local.yml | 17 ++--- infra/docker-compose.yml | 23 +++--- infra/local/seed-zaaktype.sh | 14 ++-- .../seed_catalogus.cpython-314.pyc | Bin 0 -> 19398 bytes infra/run-domain-check.sh | 17 ++--- 7 files changed, 126 insertions(+), 40 deletions(-) create mode 100644 docs/architecture/adr-0021-acl-resolves-zaaktype-by-identificatie.md create mode 100644 infra/openzaak/__pycache__/seed_catalogus.cpython-314.pyc diff --git a/docs/architecture/adr-0021-acl-resolves-zaaktype-by-identificatie.md b/docs/architecture/adr-0021-acl-resolves-zaaktype-by-identificatie.md new file mode 100644 index 0000000..15a296f --- /dev/null +++ b/docs/architecture/adr-0021-acl-resolves-zaaktype-by-identificatie.md @@ -0,0 +1,67 @@ +# ADR-0021: The ACL resolves its zaaktype by identificatie, not a pinned URL + +- **Status:** Accepted +- **Date:** 2026-07-22 +- **Deciders:** Respellion engineering +- **Relates to:** S-27 (#113), proposed in #117. The cleaner design deliberately split out of S-B04 + (#110, ADR-0020), which fixed the local stack with an infra-only bootstrap. + +## Context + +The ACL was handed a **pinned zaaktype URL** (`Acl__Defaults__ZaaktypeUrl`) and diploma +informatieobjecttype URL. OpenZaak assigns those UUIDs at creation, so the URL is not knowable when +the compose file is written — every stack had to seed the catalogus and then capture + inject the +resulting URLs out of band: `run-domain-check.sh` for CI, and the `local-seed` → `acl.env` bootstrap +(ADR-0020) for `make local`. Brittle, and a stale/placeholder URL failed opaquely (OpenZaak 400). + +## Decision + +**The ACL resolves its zaaktype (by `identificatie`) and diploma informatieobjecttype (by +`omschrijving`) from OpenZaak's Catalogi API, instead of being handed the URLs.** + +- **Config:** `AclDefaults.ZaaktypeUrl`/`InformatieobjecttypeUrl` → `ZaaktypeIdentificatie` + (`BIG-REGISTRATIE`) / `InformatieobjecttypeOmschrijving` (`Diploma`). +- **Lookup (gateway, §8.1):** `GET /catalogi/api/v1/zaaktypen?status=definitief&identificatie=…` → + the published zaaktype URL; `GET /catalogi/api/v1/informatieobjecttypen?status=definitief` matched + on `omschrijving`. Reuses the gateway's existing catalogus-query machinery. +- **Timing = lazy + cached (`CachedZaaktypeCatalog`).** Resolve on first use (first zaak open / + document store) and cache for the process lifetime. Lazy avoids a startup ordering coupling — the + ACL never crash-loops when it boots before the catalogus is published. A **failed** resolution is + not cached, so it is retried on the next call (e.g. once the zaaktype is published); a restart + re-resolves. +- **Failure mode:** no published match → a clear "No published zaaktype with identificatie '…' found + in OpenZaak — is the BIG catalogus seeded and published?" error, replacing the opaque placeholder + 400. + +## Consequences + +**Positive** + +- No stack captures or injects a server-assigned URL any more: `run-domain-check.sh` drops the + `ACL_ZAAKTYPE_URL`/`ACL_INFORMATIEOBJECTTYPE_URL` capture+inject, `docker-compose.yml`/`.local.yml` + drop the placeholder URL env, and `local-seed`/`acl.env` shrink to a single line. The ACL + self-configures from the catalogus it already talks to. +- The failure mode is legible (a named error instead of a 400 on a zeros-UUID). + +**Negative / costs** + +- The ACL still needs its OpenZaak **BaseUrl** pointed at a **URL-valid host (a container IP)**, so + the base-URL injection from ADR-0020 stays (the local `acl.env` now carries only that; CI keeps + `ACL_OPENZAAK_BASEURL`). This is **not** something S-27 can remove: OpenZaak validates the + `zaaktype` field on zaak-create with Django's URLValidator and **rejects a single-label host** + (`http://openzaak:8000/…` → `zaaktype: bad-url, "Voer een geldige URL in."`, confirmed empirically). + So ADR-0020's `seed-env` volume + ACL entrypoint shim are **simplified, not deleted**. +- New branching in the gateway/resolver → unit + integration test surface; the mutation ratchet + covers it (§5). +- A seed step still **creates + publishes** the zaaktype (this ADR changes only discovery). Reaching + OpenZaak's Catalogi API to *seed* likewise needs the IP host (its query params hit the same + URLValidator) — unchanged from before. + +## Alternatives considered + +- **Resolve at startup** (eager). Simpler cache, but reintroduces the ordering coupling (crash-loop + if the catalogus isn't published yet). Rejected in favour of lazy. +- **Per-request resolution** (no cache). No stale-cache risk, but a Catalogi lookup on every ACL + operation. Rejected; a process-lifetime cache with restart-to-refresh is enough here. +- **Keep the pinned URL** (status quo / ADR-0020 only). Rejected — the brittleness this ADR removes is + exactly what S-27 was carved out to fix. diff --git a/docs/demo-script.md b/docs/demo-script.md index 9191f05..c94a4e0 100644 --- a/docs/demo-script.md +++ b/docs/demo-script.md @@ -26,9 +26,31 @@ make verify-local # → "OK — a fresh local stack completed the flow with # test123); it shows as INGESCHREVEN in the openbaar register at http://localhost:8141. ``` -> The zaaktype UUID is server-assigned, so `local-seed` writes the real URL into a shared volume as -> `acl.env` and the ACL sources it on startup (ADR-0020). The cleaner long-term fix — the ACL -> resolving its zaaktype by `identificatie` — is tracked separately as S-27 (#113). +> The zaaktype is discovered by the ACL itself since S-27 (below); `local-seed`'s `acl.env` now +> carries only OpenZaak's IP base URL, which the ACL still needs because OpenZaak rejects a +> single-label host on zaak-create (ADR-0020 + ADR-0021). + +--- + +## S-27 — ACL resolves its zaaktype by identificatie, not a pinned URL (#113, ADR-0021) + +**Outcome:** the ACL discovers its BIG zaaktype (by `identificatie`) and diploma informatieobjecttype +(by `omschrijving`) from OpenZaak's Catalogi API, instead of being handed the server-assigned URLs. +No user-visible behaviour change — the flow runs exactly as before — but no stack captures/injects a +zaaktype URL any more, and a missing catalogus now fails with a clear message instead of an opaque 400. + +```bash +# The live ACL↔OpenZaak integration test proves resolution against a real seeded OpenZaak: +make verify-acl # → "resolves the published BIG-REGISTRATIE zaaktype + Diploma informatieobjecttype by business key" + +# End-to-end unchanged (the ACL self-discovers the zaaktype during the flow): +make verify-local # local stack — still green, now with no zaaktype-URL injection +make verify-domain # CI stack — recreates the ACL pointed only at OpenZaak's IP (no URL to inject) +``` + +> The ACL still needs its OpenZaak base URL at a URL-valid host (a container IP): OpenZaak's +> URLValidator rejects a single-label host like `openzaak:8000` on zaak-create. So ADR-0020's base-URL +> injection stays; only the zaaktype/informatieobjecttype **URL** injection is gone (ADR-0021). --- diff --git a/infra/docker-compose.local.yml b/infra/docker-compose.local.yml index beafbb8..0bb7aad 100644 --- a/infra/docker-compose.local.yml +++ b/infra/docker-compose.local.yml @@ -315,21 +315,22 @@ services: context: ../services/acl dockerfile: Dockerfile image: register-referentie/acl:dev - # The base/zaaktype/informatieobjecttype below are PLACEHOLDERS. The real, server-assigned - # values are written by the local-seed one-shot into seed-env:/seed/acl.env, which the entrypoint - # sources (set -a) so they override these before the app starts (S-B04, #110, ADR-0020). Sourcing - # a runtime-generated env file is why we override the entrypoint here rather than use `env_file:` - # (which compose reads at parse time, before the seed has run). + # The ACL discovers its zaaktype + informatieobjecttype URLs from the Catalogi API by the business + # keys below (S-27, ADR-0021), so no URL is injected. It still needs its OpenZaak BaseUrl pointed at + # a URL-valid host (OpenZaak rejects a single-label host like `openzaak` on zaak-create), so the + # local-seed one-shot writes that IP base into seed-env:/seed/acl.env, which the entrypoint sources + # (set -a) before the app starts. A runtime-generated env file is why we override the entrypoint here + # rather than use `env_file:` (which compose reads at parse time, before the seed has run). entrypoint: ["/bin/sh", "-c", "set -a; . /seed/acl.env; set +a; exec dotnet Acl.Api.dll"] environment: - Acl__OpenZaak__BaseUrl: http://openzaak:8000/ + Acl__OpenZaak__BaseUrl: http://openzaak:8000/ # placeholder; seed-env/acl.env supplies the IP base Acl__OpenZaak__ClientId: big-reference-seed Acl__OpenZaak__Secret: insecure-dev-secret-change-me Acl__Defaults__Bronorganisatie: "517439943" Acl__Defaults__VerantwoordelijkeOrganisatie: "517439943" Acl__Defaults__Vertrouwelijkheidaanduiding: openbaar - Acl__Defaults__ZaaktypeUrl: http://openzaak:8000/catalogi/api/v1/zaaktypen/00000000-0000-0000-0000-000000000000 - Acl__Defaults__InformatieobjecttypeUrl: http://openzaak:8000/catalogi/api/v1/informatieobjecttypen/00000000-0000-0000-0000-000000000000 + Acl__Defaults__ZaaktypeIdentificatie: BIG-REGISTRATIE + Acl__Defaults__InformatieobjecttypeOmschrijving: Diploma ports: - "8100:8080" volumes: diff --git a/infra/docker-compose.yml b/infra/docker-compose.yml index ce76cdf..99f18fe 100644 --- a/infra/docker-compose.yml +++ b/infra/docker-compose.yml @@ -15,12 +15,12 @@ # # docker compose -f infra/docker-compose.yml up -d --build --wait # -# After first boot, seed the BIG catalogus and note the zaaktype URL: -# python infra/openzaak/seed_catalogus.py -# Then set ACL_ZAAKTYPE_URL in a .env file or your shell and re-up the acl -# service: -# export ACL_ZAAKTYPE_URL=http://openzaak:8000/catalogi/api/v1/zaaktypen/ -# docker compose -f infra/docker-compose.yml up -d acl +# After first boot, seed + publish the BIG catalogus: +# OZ_PUBLISH=1 python infra/openzaak/seed_catalogus.py +# The ACL discovers the zaaktype by identificatie (S-27, ADR-0021), so there is no URL to inject — +# just point its BaseUrl at an OpenZaak host OpenZaak accepts on zaak-create (a container IP; a +# single-label host is rejected): +# ACL_OPENZAAK_BASEURL=http://:8000/ docker compose -f infra/docker-compose.yml up -d acl services: @@ -304,11 +304,12 @@ services: Acl__Defaults__Bronorganisatie: "517439943" Acl__Defaults__VerantwoordelijkeOrganisatie: "517439943" Acl__Defaults__Vertrouwelijkheidaanduiding: openbaar - # Override with the real zaaktype URL after running seed_catalogus.py. - Acl__Defaults__ZaaktypeUrl: ${ACL_ZAAKTYPE_URL:-http://openzaak:8000/catalogi/api/v1/zaaktypen/00000000-0000-0000-0000-000000000000} - # The informatieobjecttype a diploma is filed under (S-10b). Placeholder until seed_catalogus.py - # (OZ_PUBLISH=1) reports the real URL, which verify-domain injects like the zaaktype URL. - Acl__Defaults__InformatieobjecttypeUrl: ${ACL_INFORMATIEOBJECTTYPE_URL:-http://openzaak:8000/catalogi/api/v1/informatieobjecttypen/00000000-0000-0000-0000-000000000000} + # The ACL resolves the (server-assigned) zaaktype + diploma informatieobjecttype URLs from the + # Catalogi API by these stable business keys (S-27, ADR-0021) — no URL to capture and inject. + # BaseUrl above stays overridable because OpenZaak rejects a single-label host on zaak creation, + # so verify-domain still points the ACL at OpenZaak's container IP. + Acl__Defaults__ZaaktypeIdentificatie: BIG-REGISTRATIE + Acl__Defaults__InformatieobjecttypeOmschrijving: Diploma ports: - "8100:8080" healthcheck: diff --git a/infra/local/seed-zaaktype.sh b/infra/local/seed-zaaktype.sh index 5773ad4..80906ed 100755 --- a/infra/local/seed-zaaktype.sh +++ b/infra/local/seed-zaaktype.sh @@ -21,15 +21,13 @@ echo ">> seeding + publishing the BIG zaaktype at ${OZ_BASE} (idempotent)" out="$(python3 /work/seed_catalogus.py)" echo "$out" -zt="$(printf '%s\n' "$out" | sed -n 's/^ZAAKTYPE_URL //p' | head -1)" -iot="$(printf '%s\n' "$out" | sed -n 's/^INFORMATIEOBJECTTYPE_URL //p' | head -1)" -[ -n "$zt" ] || { echo "ERROR: seed did not report a ZAAKTYPE_URL" >&2; exit 1; } -[ -n "$iot" ] || { echo "ERROR: seed did not report an INFORMATIEOBJECTTYPE_URL" >&2; exit 1; } +# Sanity-check that the zaaktype was actually published (the ACL discovers it by identificatie, S-27). +printf '%s\n' "$out" | grep -q '^ZAAKTYPE_URL ' || { echo "ERROR: seed did not publish the zaaktype" >&2; exit 1; } -# The ACL entrypoint sources this; these keys override the placeholder defaults in the compose file. +# The ACL resolves the zaaktype/informatieobjecttype URLs itself (S-27, ADR-0021); the only value it +# still needs injected is the OpenZaak base URL at a URL-valid host (the container IP), because OpenZaak +# rejects a single-label host on zaak-create. The ACL entrypoint sources this. cat > /out/acl.env <> wrote /out/acl.env (base=${OZ_BASE}/ zaaktype=${zt})" +echo ">> wrote /out/acl.env (base=${OZ_BASE}/)" diff --git a/infra/openzaak/__pycache__/seed_catalogus.cpython-314.pyc b/infra/openzaak/__pycache__/seed_catalogus.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8f2c9eabf78ff36e1f70f19bba5b2ac5184ce8b0 GIT binary patch literal 19398 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 literal 0 HcmV?d00001 diff --git a/infra/run-domain-check.sh b/infra/run-domain-check.sh index 3c360d6..833032a 100755 --- a/infra/run-domain-check.sh +++ b/infra/run-domain-check.sh @@ -30,21 +30,18 @@ oz_ip="$(ip "$oz")"; dom_ip="$(ip "$dom")" oz_base="http://$oz_ip:8000" echo ">> openzaak=$oz_ip domain=$dom_ip network=$net" -echo ">> seeding a published BIG zaaktype (idempotent) and capturing its URL" +echo ">> seeding + publishing a BIG zaaktype (idempotent)" sid="$(docker create --network "$net" -e "OZ_BASE=$oz_base" -e OZ_PUBLISH=1 python:3-slim python /seed.py)" docker cp "$here/openzaak/seed_catalogus.py" "$sid:/seed.py" >/dev/null seed_out="$(docker start -a "$sid")" -zt_url="$(printf '%s\n' "$seed_out" | sed -n 's/^ZAAKTYPE_URL //p' | head -1)" -iot_url="$(printf '%s\n' "$seed_out" | sed -n 's/^INFORMATIEOBJECTTYPE_URL //p' | head -1)" docker rm -f "$sid" >/dev/null -[ -n "$zt_url" ] || { echo "ERROR: seed did not report a ZAAKTYPE_URL" >&2; exit 1; } -[ -n "$iot_url" ] || { echo "ERROR: seed did not report an INFORMATIEOBJECTTYPE_URL" >&2; exit 1; } -echo ">> zaaktype: $zt_url" -echo ">> informatieobjecttype: $iot_url" +printf '%s\n' "$seed_out" | grep -q '^ZAAKTYPE_URL ' || { echo "ERROR: seed did not publish the zaaktype" >&2; exit 1; } -echo ">> recreating the acl service pointed at the seeded zaaktype + informatieobjecttype (host-consistent)" -ACL_ZAAKTYPE_URL="$zt_url" ACL_INFORMATIEOBJECTTYPE_URL="$iot_url" ACL_OPENZAAK_BASEURL="$oz_base/" \ - docker compose -f "$compose" up -d acl +# The ACL resolves the zaaktype + informatieobjecttype by identificatie/omschrijving (S-27, ADR-0021), +# so there is no URL to inject — only the OpenZaak base URL, pointed at the same host's container IP +# (OpenZaak rejects a single-label host on zaak-create). +echo ">> recreating the acl service pointed at OpenZaak's IP (it resolves the zaaktype itself, S-27)" +ACL_OPENZAAK_BASEURL="$oz_base/" docker compose -f "$compose" up -d acl WAIT_TIMEOUT="${WAIT_TIMEOUT:-120}" bash "$here/wait-healthy.sh" acl echo ">> submitting a registration to the domain"