Skip to content

feat(controlplane): wire Lakekeeper provisioner into control plane (PR5)#583

Merged
fuziontech merged 1 commit into
lakekeeper-pr3-provisioning-triggerfrom
lakekeeper-pr5-cp-wiring
May 20, 2026
Merged

feat(controlplane): wire Lakekeeper provisioner into control plane (PR5)#583
fuziontech merged 1 commit into
lakekeeper-pr3-provisioning-triggerfrom
lakekeeper-pr5-cp-wiring

Conversation

@fuziontech
Copy link
Copy Markdown
Member

What & why

The provisioning controller gained WithLakekeeperProvisioner in PR3, but nothing ever called it — so reconcileLakekeeper was inert in every deployment. This PR wires it into the multitenant control plane, making per-org Lakekeeper provisioning actually run.

Lands the allowall + NetworkPolicy deployment shape (empty KubernetesAuthAudiences). OIDC SA-token auth (PR4's broker) remains a separate flag-day change.

Stacked on PR4 (#580, merged into lakekeeper-pr3-provisioning-trigger). Base will retarget to main once PR3 (#579) merges.

Changes

  • controlplane/lakekeeper_inputs.gonewLakekeeperInputsResolver, resolving per-org ProvisioningInputs from two sources:
    1. Crossplane Duckling CR status (prod) — the same source shared_worker_activator.go already reads. Metadata-store master creds → admin DSN (CREATE DATABASE/ROLE); data-store bucket → S3 warehouse. Admin DDL and the Lakekeeper pod target the direct Aurora endpoint, never PgBouncer (transaction pooling breaks CREATE DATABASE and Lakekeeper's own migrations). S3 uses the pod's IRSA identity (no static creds).
    2. Env fallback (dev/orbstack + MinIO) when no usable Duckling CR is present.
  • controlplane/multitenant.go — wires WithLakekeeperProvisioner after NewController, gated behind DUCKGRES_LAKEKEEPER_PROVISIONER_ENABLED (off by default; best-effort if the K8s client can't be built). S3-Tables warehouses are unaffected.

Testing

  • go build -tags kubernetes ./controlplane/... clean; default build clean.
  • New resolver unit tests: CR path, env fallback, CR-error→env fallback, incomplete-CR error, no-source error, enable toggle. All green with -tags kubernetes.
  • Lint clean.

Deploy notes

  • Off by default. To enable on dev: set DUCKGRES_LAKEKEEPER_PROVISIONER_ENABLED=true plus the DUCKGRES_LAKEKEEPER_* env fallbacks (admin DSN, S3 bucket/region/endpoint, MinIO creds).
  • Still pending before a first prod org: prod operator AppSet/values (charts) and confirming the operator sets an IRSA-annotated ServiceAccount on the Lakekeeper pod.

🤖 Generated with Claude Code

…rol plane (PR5)

Enables the per-org Lakekeeper provisioning branch end-to-end. The
provisioning controller already had WithLakekeeperProvisioner (PR3) but
nothing called it, so reconcileLakekeeper was inert in every deployment.

- newLakekeeperInputsResolver resolves per-org ProvisioningInputs:
    1. Crossplane Duckling CR status (prod) — the metadata-store master
       creds double as the admin connection that CREATEs the
       lakekeeper_<orgid> db/role; data-store bucket is the S3 warehouse.
       Admin DDL + the Lakekeeper pod target the DIRECT Aurora endpoint,
       never the PgBouncer pooler (transaction pooling breaks CREATE
       DATABASE and Lakekeeper's own migrations). S3 uses pod IRSA.
    2. Env fallback (dev/orbstack + MinIO) when no usable Duckling CR.
- multitenant.go wires it after NewController, gated behind
  DUCKGRES_LAKEKEEPER_PROVISIONER_ENABLED (off by default; best-effort if
  the K8s client can't be built). S3-Tables warehouses are unaffected.
- KubernetesAuthAudiences left empty: this is the allowall + NetworkPolicy
  deployment shape. OIDC SA-token auth remains a separate flag-day change.

Builds clean with -tags kubernetes; resolver unit tests cover the CR path,
env fallback, CR-error fallback, and the no-source error.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
@fuziontech fuziontech merged commit 8a76b67 into lakekeeper-pr3-provisioning-trigger May 20, 2026
5 checks passed
@fuziontech fuziontech deleted the lakekeeper-pr5-cp-wiring branch May 20, 2026 16:47
fuziontech added a commit that referenced this pull request May 20, 2026
…R5) (#583)

Enables the per-org Lakekeeper provisioning branch end-to-end. The
provisioning controller already had WithLakekeeperProvisioner (PR3) but
nothing called it, so reconcileLakekeeper was inert in every deployment.

- newLakekeeperInputsResolver resolves per-org ProvisioningInputs:
    1. Crossplane Duckling CR status (prod) — the metadata-store master
       creds double as the admin connection that CREATEs the
       lakekeeper_<orgid> db/role; data-store bucket is the S3 warehouse.
       Admin DDL + the Lakekeeper pod target the DIRECT Aurora endpoint,
       never the PgBouncer pooler (transaction pooling breaks CREATE
       DATABASE and Lakekeeper's own migrations). S3 uses pod IRSA.
    2. Env fallback (dev/orbstack + MinIO) when no usable Duckling CR.
- multitenant.go wires it after NewController, gated behind
  DUCKGRES_LAKEKEEPER_PROVISIONER_ENABLED (off by default; best-effort if
  the K8s client can't be built). S3-Tables warehouses are unaffected.
- KubernetesAuthAudiences left empty: this is the allowall + NetworkPolicy
  deployment shape. OIDC SA-token auth remains a separate flag-day change.

Builds clean with -tags kubernetes; resolver unit tests cover the CR path,
env fallback, CR-error fallback, and the no-source error.

Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant