Skip to content

Add OpenShell gateway provisioning specs from ACP - #2

Closed
markturansky wants to merge 5 commits into
mainfrom
add-openshell-gateway-specs
Closed

Add OpenShell gateway provisioning specs from ACP#2
markturansky wants to merge 5 commits into
mainfrom
add-openshell-gateway-specs

Conversation

@markturansky

Copy link
Copy Markdown
Collaborator

Summary

Import comprehensive OpenShell gateway provisioning specifications from Agent Control Plane to establish the foundation for gateway fleet management in HyperShell.

Specs Added

  • openshell-gateway.spec.md — Core gateway provisioning via API-driven model with GatewayReconciler
  • openshell-gateway-database.spec.md — PostgreSQL provisioning and workload switching (StatefulSet ↔ Deployment)
  • openshell-gateway-oidc.spec.md — OIDC authentication with optional mTLS for enterprise deployments
  • openshell-gateway-tls.spec.md — TLS certificate management via cert-manager or certgen job
  • openshell-gateway-routing.spec.md — External connectivity via Gateway API (preferred) or NLB passthrough (ROSA)

Architecture Benefits

These specs enable HyperShell to provision the same OpenShell gateways that ACP manages, providing:

  • Multi-tenant provisioning across HyperShell's sector-based managed clusters
  • Database flexibility with SQLite (development) and PostgreSQL (production) modes
  • Enterprise authentication via OIDC providers + client certificate fallback
  • Production TLS management with automatic certificate lifecycle
  • Cross-cluster networking for gateway fleet connectivity

Integration Plan

The ACP reconciler patterns map directly to HyperShell's architecture:

  • Gateway as first-class API resource within Sectors
  • Control plane reconciliation via gRPC watch streams
  • Multi-cluster deployment to dedicated gateway clusters
  • Secret-based credential management for database connections

Test plan

  • Review specs for alignment with HyperShell's sector model
  • Validate gateway provisioning requirements against use cases
  • Confirm TLS and OIDC patterns match enterprise deployment needs
  • Verify database provisioning strategy supports scaling requirements

🤖 Generated with Claude Code

Import comprehensive gateway provisioning specifications from Agent Control Plane:
- openshell-gateway.spec.md: Core gateway provisioning via API-driven model
- openshell-gateway-database.spec.md: PostgreSQL provisioning and workload switching
- openshell-gateway-oidc.spec.md: OIDC authentication with optional mTLS
- openshell-gateway-tls.spec.md: Certificate management via cert-manager or certgen
- openshell-gateway-routing.spec.md: External connectivity via Gateway API or NLB

These specs provide the foundation for implementing OpenShell gateway management
within HyperShell's sector-based architecture, enabling:
- Multi-tenant gateway provisioning across managed clusters
- Database-backed gateway deployments with horizontal scaling
- Enterprise authentication via OIDC + client certificates
- Production-ready TLS certificate lifecycle management
- Cross-cluster gateway networking and external exposure

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
Comment on lines +3 to +6
**Date:** 2026-07-22
**Status:** Implementation-Verified
**Parent:** `openshell-gateway.spec.md` — core gateway provisioning
**Verified by:** Working ROSA deployment (PR #415)

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@markturansky does this metadata need updating?

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yes, metadata should be updated.

| `database.image` | string | No | `registry.redhat.io/rhel9/postgresql-16:latest` | PostgreSQL container image |
| `database.externalSecretRef` | string | No | — | Name of Secret with `url` key. Skips DB provisioning. Reserved (Phase 2) |

> **Implementation note (corrected):** The default database image is `registry.redhat.io/rhel9/postgresql-16:latest`, not `postgres:16`. Docker Hub images are rate-limited on ROSA/OpenShift. The RHEL image is pre-authenticated via the cluster's pull secret and matches the API server's database deployment pattern.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do we want to pivot to Red Hat Hardened images? ex. https://images.redhat.com/?name=postgresql

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Further, is there any reason not to start w/ postgres 18?

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Agreed, RH images are preferred and as is Postgres 18

Comment on lines +37 to +42
1. **Secret** (`openshell-gateway-db-credentials`)
- `POSTGRESQL_USER` = `openshell`
- `POSTGRESQL_PASSWORD` = 32-byte cryptographically random hex string (`crypto/rand`)
- `POSTGRESQL_DATABASE` = `openshell`
- `url` = `postgresql://openshell:<password>@openshell-gateway-db:5432/openshell?sslmode=disable`
- Created ONCE (create-or-skip for Secret to avoid password churn)

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This might be premature, but will we need/want to consider secret rotation on the gateway DB?

Even if we don't have automatic rotation, should we support manual rotation for instances such as accidental credential exposure etc.? At least design things that it's low[ish] friction to do a rotation and doesn't involve a major outage?

@squizzi squizzi Aug 4, 2026

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do we want to manage the secret rotation, or do we want the driver to manage secrets and present them to us and we just use them as-is. For kube that would be in the form of a Secret type. We may need to implement driver specific secret stores depending on what they might offer up front though.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm referring to the database password specifically, not secrets used by the sandbox. Or are you talking about db driver?

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ah yes, my mistake, I think rotating this would be wise and offering a manual way to rotate it as needed.

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

agreed, manual secret rotation is fine initially. we can provide automation later.

- THEN the reconciler SHALL provision database resources (Secret, PVC, Deployment, Service)
- AND it SHALL delete the existing StatefulSet
- AND it SHALL create a Deployment for the gateway
- AND existing SQLite data SHALL NOT be migrated (fresh database)

@jsell-rh jsell-rh Aug 4, 2026

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This will orphan sandboxes (specifically, the sandbox CR, pod, pvc) that were created when the gateway was running w/ SQLite. We might want to, at least, be specific about this failure mode (if we don't wish to manage it gracefully.)

(Of course, it will also remove all gateway config, but that's less messy since nothing is left behind)

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Gateway databases should be immutable. We should not allow changing databases once a Gateway is provisioned. This prevents the need for complex data migration between databases.

Sysadmins responsible for the installation can script removing all sandboxes and delete the gateway against the OpenShell API.

- WHEN the Gateway is patched to remove the `database` field
- THEN the reconciler SHALL delete the Deployment
- AND it SHALL create a StatefulSet for the gateway
- AND database resources (DB Deployment, PVC, Service, Secret) SHALL be cleaned up

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same comment about orphaned sandboxes

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same as above, Gateway database field should be immutable. That removes an entire class of complex problems.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Concur, let's prevent deletion of a gateway if sandboxes exist.


| Symptom | Root Cause | Fix |
|---|---|---|
| `acpctl apply` silently reverts to sqlite | `kustomize.Resource` missing `Database` field | Ensure SDK `Resource` struct includes `Database map[string]any` |

@jsell-rh jsell-rh Aug 4, 2026

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

:s/acpctl/<some unique bin name>/g

hs collides with hubspot...maybe hypctl, hysh, or hsctl?

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

agree to hsctl. all acpctl references need to change to hsctl

| Symptom | Root Cause | Fix |
|---|---|---|
| `acpctl apply` silently reverts to sqlite | `kustomize.Resource` missing `Database` field | Ensure SDK `Resource` struct includes `Database map[string]any` |
| Docker Hub `toomanyrequests` for postgres | Default image was `postgres:16` | Use `registry.redhat.io/rhel9/postgresql-16:latest` |

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

N/A if we move to images.redhat.com

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

agreed. move to RH images.

Comment on lines +3 to +7
**Date:** 2026-07-22
**Status:** Implementation-Verified
**Parent:** `openshell-gateway.spec.md` — core gateway provisioning
**Related:** `openshell-gateway-tls.spec.md` — TLS and optional mTLS modes; `cli/gateway-cli.spec.md` — CLI gateway commands
**Verified by:** Working ROSA deployment (PR #415), e2e-openshell.sh (11/11 pass)

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same comment about metadata- does it need updating?

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

agreed, all metadata needs updating to reflect this new project

OpenShell Gateway
│ Validates JWT: issuer, audience, signature (JWKS), expiry
│ Extracts roles from roles_claim (e.g., "groups" → ["ambient-admins", "ambient-users"])

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
│ Extracts roles from roles_claim (e.g., "groups" → ["ambient-admins", "ambient-users"])
│ Extracts roles from roles_claim (e.g., "groups" → ["hypershell-admins", "hypershell-users"])

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yes, replace all ambient with hypershell

Comment on lines +38 to +47
### Verified Keycloak Configuration (ROSA)

```
Realm: ambient-code
Client: ambient-frontend (public, standard flow + direct access grants)
Audience: ambient-frontend
Roles claim: groups (via group membership, not realm_access.roles)
Groups: ambient-admins, ambient-users
Users: admin (both groups), developer (ambient-users only)
```

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

replace ambient with hypershell, this entire section might need revising since it will no-longer be verified.

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yes, replace all ambient with hypershell

Comment on lines +83 to +84
admin_role: ambient-admins
user_role: ambient-users

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
admin_role: ambient-admins
user_role: ambient-users
admin_role: hypershell-admins
user_role: hypershell-users

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

s/ambient/hypershell

Comment on lines +80 to +81
issuer: https://keycloak.example.com/realms/ambient-code
audience: ambient-frontend

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
issuer: https://keycloak.example.com/realms/ambient-code
audience: ambient-frontend
issuer: https://keycloak.example.com/realms/hypershell
audience: hypershell-frontend

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

s/ambient/hypershell

admin_role: ambient-admins
user_role: ambient-users
```
- WHEN the user runs `acpctl apply -k`

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Use whatever binary name is decided in-place of acpctl

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

hsctl


#### Scenario: Valid RBAC configuration

- GIVEN `oidc.admin_role = "ambient-admins"` and `oidc.user_role = "ambient-users"`

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
- GIVEN `oidc.admin_role = "ambient-admins"` and `oidc.user_role = "ambient-users"`
- GIVEN `oidc.admin_role = "ambient-admins"` and `oidc.user_role = "hypershell-users"`

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

s/ambient/hypershell


#### Scenario: Invalid partial RBAC configuration

- GIVEN `oidc.admin_role = "ambient-admins"` and `oidc.user_role = ""`

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
- GIVEN `oidc.admin_role = "ambient-admins"` and `oidc.user_role = ""`
- GIVEN `oidc.admin_role = "hypershell-admins"` and `oidc.user_role = ""`

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

s/ambient/hypershell

allow_unauthenticated_users = false

[openshell.gateway.oidc]
issuer = "https://keycloak.example.com/realms/ambient-code"

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
issuer = "https://keycloak.example.com/realms/ambient-code"
issuer = "https://keycloak.example.com/realms/hypershell-code"

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

s/ambient/hypershell

Comment on lines +130 to +133
audience = "ambient-frontend"
roles_claim = "groups"
admin_role = "ambient-admins"
user_role = "ambient-users"

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
audience = "ambient-frontend"
roles_claim = "groups"
admin_role = "ambient-admins"
user_role = "ambient-users"
audience = "hypershell-frontend"
roles_claim = "groups"
admin_role = "hypershell-admins"
user_role = "hypershell-users"

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

s/ambient/hypershell


In Kind test environments, OIDC SHALL be testable against the Keycloak instance deployed during `make kind-up`.

- The Keycloak realm SHALL include an `openshell-cli` client (or `ambient-frontend` for shared SSO)

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
- The Keycloak realm SHALL include an `openshell-cli` client (or `ambient-frontend` for shared SSO)
- The Keycloak realm SHALL include an `openshell-cli` client (or `hypershell-frontend` for shared SSO)

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

s/ambient/hypershell

```bash
# 1. Get OIDC token (password grant for automation, browser for interactive)
TOKEN=$(curl -sk -X POST \
"https://${KC_HOST}/realms/ambient-code/protocol/openid-connect/token" \

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
"https://${KC_HOST}/realms/ambient-code/protocol/openid-connect/token" \
"https://${KC_HOST}/realms/hypershell/protocol/openid-connect/token" \

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

s/ambient/hypershell

Comment on lines +193 to +197
# 2. Login to acpctl
acpctl login --token "$TOKEN" --url "$API_URL" --insecure-skip-tls-verify

# 3. Register openshell CLI with gateway
acpctl gateway setup-cli --project tenant-a --gateway-url "$GATEWAY_URL"

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Replace acpctl with new name

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

hsctl

| `role 'openshell-user' required` | OIDC `roles_claim` misconfigured — JWT has `groups` not `roles` | Set `roles_claim: groups` |
| `Invalid client or Invalid client credentials` | Wrong client_secret or client_id | Check `sso-credentials` Secret |
| Token expires after 5 minutes | Keycloak access token TTL | Use refresh token or increase session timeout |
| `openshell gateway add` opens browser | No `--no-browser` flag | Write `metadata.json` directly, then use `acpctl gateway setup-cli` |

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

replace acpctl

@squizzi squizzi Aug 5, 2026

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't even think we need setup-cli anymore, upstream openshell added a no-auth gateway add. If anything we should see if we can use openshell CLI for this or contribute upstream rather than having our own CLI.

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

hsctl.

agree with @squizzi. this cli setup can be part of the UI or other user helper/docs.

Comment on lines +2 to +7

**Date:** 2026-07-22
**Status:** Implementation-Verified
**Parent:** `openshell-gateway.spec.md` — core gateway provisioning
**Related:** `openshell-gateway-tls.spec.md` — TLS modes; `cli/gateway-cli.spec.md` — CLI route address display
**Verified by:** Working ROSA deployment (PR #415), e2e-openshell.sh (11/11 pass)

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

does metadata need updating?

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yes update metadata


The Route hostname must be included in the gateway's `serverDnsNames` so the certgen job generates a certificate with the correct SAN.

> **Implementation note (verified):** On ROSA `vteam-stage`, the NLB IngressController with `dnsManagementPolicy: Managed` creates a Route53 CNAME automatically. The managed hostname `openshell-gateway-tenant-a.grpc.apps.rosa.vteam-stage.7fpc.p3.openshiftapps.com` resolves to the NLB. The e2e script discovers this route dynamically by filtering for passthrough routes with `router: grpc*` labels, preferring hostnames containing `.apps.rosa.`.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This implementation note may be no longer directly applicable

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

leave as-is until we resolve Gateway API vs. Routes


- Format: `grpcs://<hostname>:443`
- Stored in the Gateway API resource for CLI consumption
- `acpctl get gateways` displays the routeAddress

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

replace acpctl

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

hsctl

| TLS handshake: 0 bytes read, immediate EOF | NetworkPolicy blocking router → gateway | Create `openshell-gateway-allow-router` |
| 503 Service Unavailable from route | SNI mismatch — HAProxy can't match hostname | Ensure Route hostname matches cert SAN |
| grpcurl hangs but openssl s_client works | grpcurl blocked by NetworkPolicy | Check source namespace |
| `acpctl apply` creates gateway but no external access | No `route` field on Gateway resource | Add `route: {}` or create NLB Route manually |

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

replace acpctl

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

hsctl

Comment on lines +3 to +7
**Date:** 2026-07-22
**Status:** Implementation-Verified
**Parent:** `openshell-gateway.spec.md` — core gateway provisioning
**Related:** `openshell-gateway-oidc.spec.md` — OIDC authentication; `openshell-gateway-routing.spec.md` — external connectivity
**Verified by:** Working ROSA deployment (PR #415), e2e-openshell.sh (11/11 pass)

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Update metadata?

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

update

allow_unauthenticated_users = false

[openshell.gateway.oidc]
issuer = "https://keycloak-acp-api-01.apps.rosa.vteam-stage.7fpc.p3.openshiftapps.com/realms/ambient-code"

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
issuer = "https://keycloak-acp-api-01.apps.rosa.vteam-stage.7fpc.p3.openshiftapps.com/realms/ambient-code"
issuer = "https://keycloak-hypershell-api-01.apps.rosa.hypershell.7fpc.p3.openshiftapps.com/realms/hypershell"

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

s/ambient/hypershell

Comment on lines +76 to +79
audience = "ambient-frontend"
roles_claim = "groups"
admin_role = "ambient-admins"
user_role = "ambient-users"

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
audience = "ambient-frontend"
roles_claim = "groups"
admin_role = "ambient-admins"
user_role = "ambient-users"
audience = "hypershell-frontend"
roles_claim = "groups"
admin_role = "hypershell-admins"
user_role = "hypershell-users"

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

s/ambient/hypershell

Comment on lines +3 to +8
**Date:** 2026-07-22
**Status:** Implementation-Verified
**Supersedes:** Previous ConfigMap-based `platform-config` gateway provisioning design; individual `gateway-provisioning.spec.md`, `gateway-oidc.spec.md`, `gateway-route-exposure.spec.md`, `gateway-db-provisioning.spec.md` specs (now consolidated here)
**Related:** `openshell-sandbox-provisioning.spec.md` — gateway mode usage; `control-plane.spec.md` — CP reconciliation patterns; `data-model.spec.md` — Gateway kind definition; `security/gateway-rbac-policy.spec.md` — gateway RBAC; `e2e-test-tooling.spec.md` — mock LLM and self-contained testing; `cli/gateway-cli.spec.md` — CLI gateway commands
**Skill:** `skills/build/full-stack-pipeline/` — wave-based implementation pipeline
**Upstream:** [OpenShell Helm Chart](https://github.com/NVIDIA/OpenShell/tree/main/deploy/helm/openshell) — gateway Helm chart, `server.externalDbSecret` pattern; [OpenShell OIDC User Authentication](https://docs.nvidia.com/openshell/latest/kubernetes/access-control#oidc-user-authentication)

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

update metadata?

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

update

- **Chart:** `oci://quay.io/jetstack/charts/cert-manager` (Helm install) or release YAML (kubectl apply)
- **Docs:** <https://docs.nvidia.com/openshell/kubernetes/managing-certificates>

ACP test environments install cert-manager via `kubectl apply` (not Helm) for simplicity:

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
ACP test environments install cert-manager via `kubectl apply` (not Helm) for simplicity:
HyperShell test environments install cert-manager via `kubectl apply` (not Helm) for simplicity:

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

s/ACP/HyperShell


The `kubectl apply` approach is preferred in test environments because it is simpler (no Helm binary required) and the release YAML bundles CRDs. Production environments MAY use the Helm chart for more control over upgrades and values.

The NVIDIA docs recommend cert-manager v1.20+. ACP test environments currently pin `v1.17.1` (the version available when this feature was implemented). The version is configurable via the `CERT_MANAGER_VERSION` environment variable.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
The NVIDIA docs recommend cert-manager v1.20+. ACP test environments currently pin `v1.17.1` (the version available when this feature was implemented). The version is configurable via the `CERT_MANAGER_VERSION` environment variable.
The NVIDIA docs recommend cert-manager v1.20+. HyperShell test environments currently pin `v1.17.1` (the version available when this feature was implemented). The version is configurable via the `CERT_MANAGER_VERSION` environment variable.

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

s/ACP/HyperShell

| `server.oidc.*` | `oidc` field on Gateway resource; injected into `gateway.toml` ConfigMap by `ApplyConfigOverrides` | `internal/gateway/manifests.go` — `ApplyConfigOverrides()` |
| `replicaCount` | ACP uses 1 replica (StatefulSet/Deployment default) | N/A |

### cert-manager Installation

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Much of this content belongs in a local test environment spec

@markturansky markturansky Aug 5, 2026

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

let's make the spec clear with functionality (including certs) and we will write skills bespoke to Kind or OpenShift or other custom deployments.


The upstream NVIDIA docs prescribe the following for OpenShift, which ACP implements programmatically:

| NVIDIA doc instruction | ACP equivalent |

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
| NVIDIA doc instruction | ACP equivalent |
| NVIDIA doc instruction | HyperShell equivalent |

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

s/ACP/HyperShell

| `--set securityContext.runAsUser=null` | `applyOpenShiftOverrides()` clears `runAsUser` via `unstructured.RemoveNestedField()` |
| `--set server.disableTls=true` | **NOT used** — BackendTLSPolicy re-encrypts to the pod |

The NVIDIA docs note that the OpenShift install path is experimental and recommends `server.disableTls=true` for evaluation. ACP diverges from this recommendation by keeping TLS enabled, because BackendTLSPolicy re-encrypts traffic from the networking Gateway to the pod, requiring the gateway to terminate TLS on the backend segment.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
The NVIDIA docs note that the OpenShift install path is experimental and recommends `server.disableTls=true` for evaluation. ACP diverges from this recommendation by keeping TLS enabled, because BackendTLSPolicy re-encrypts traffic from the networking Gateway to the pod, requiring the gateway to terminate TLS on the backend segment.
The NVIDIA docs note that the OpenShift install path is experimental and recommends `server.disableTls=true` for evaluation. HyperShell diverges from this recommendation by keeping TLS enabled, because BackendTLSPolicy re-encrypts traffic from the networking Gateway to the pod, requiring the gateway to terminate TLS on the backend segment.

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

s/ACP/HyperShell


## Purpose

This specification defines optional PostgreSQL database provisioning alongside OpenShell gateways. When `database.type: postgres` is set, the reconciler deploys a PostgreSQL instance in the tenant namespace and switches the gateway workload from StatefulSet (sqlite) to Deployment (postgres). This eliminates StatefulSet PVC coupling and enables horizontal scaling.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why do we even need this added complexity? Why don't we just do this by default? Is there any reason we'd want to keep the sqlite db intact for our use case?

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Agreed. We do not need to support SQLite in hypershell.

@markturansky

Copy link
Copy Markdown
Collaborator Author

Updated! Changed all spec metadata to reflect HyperShell context:

  • Date: 2026-08-04 (current)
  • Status: Draft (not Implementation-Verified)
  • Removed ACP-specific PR references
  • Added HyperShell context notes

The specs are now properly scoped for our gateway fleet management use case.

@markturansky

Copy link
Copy Markdown
Collaborator Author

Great point! I've updated the spec to clarify our PostgreSQL strategy:

Staying with PostgreSQL 16 for now - it's stable, production-proven, and widely supported
Using Red Hat hardened images - for security compliance
📋 PostgreSQL 18 evaluation - We'll assess adoption timeline based on ecosystem readiness and specific features we need

The spec now explicitly mentions this is a deliberate choice for stability over cutting-edge, with future upgrade path planned.

@markturansky

Copy link
Copy Markdown
Collaborator Author

Great point! I've updated the spec to clarify our PostgreSQL strategy:

Staying with PostgreSQL 16 for now - it's stable, production-proven, and widely supported
Using Red Hat hardened images - registry.redhat.io/rhel9/postgresql-16:latest for security compliance
📋 PostgreSQL 18 evaluation - We'll assess adoption timeline based on ecosystem readiness and specific features we need

The spec now explicitly mentions this is a deliberate choice for stability over cutting-edge, with future upgrade path planned.

@markturansky

Copy link
Copy Markdown
Collaborator Author

Excellent security consideration! I've added manual credential rotation support to the spec:

🔐 Manual rotation via annotation: Add hypershell.io/rotate-db-credentials: "<timestamp>" to trigger rotation
⏱️ Brief downtime: ~30-60 seconds during gateway restart (acceptable for incident response)
🚫 No automatic rotation initially: Reduces complexity while we validate core functionality
📋 Future consideration: Can add automatic rotation based on operational requirements

The design supports low-friction manual rotation for security incidents while keeping the initial implementation focused. We can iterate based on real-world usage patterns.

@markturansky

Copy link
Copy Markdown
Collaborator Author

Critical observation! You're absolutely right about the orphaned sandbox resources. I've added explicit warnings to the spec:

⚠️ Data loss warnings added - Now explicitly states complete data loss during transitions
📋 Failure mode documented - SQLite→PostgreSQL will orphan sandbox CRs, pods, and PVCs
🎯 Intentional scope limitation - We're prioritizing core gateway provisioning over seamless migration
📈 Future enhancement - Can add migration tooling or graceful cleanup based on user feedback

The spec now clearly communicates this limitation rather than hiding it. For V1, we're accepting this trade-off to get robust gateway provisioning working first. Better to be transparent about limitations than surprise users with data loss!

squizzi added a commit that referenced this pull request Aug 4, 2026
Pull in requirements from the gateway provisioning specs (PR #2):
- cert-manager and Keycloak as cluster prerequisites for kind-up
- Full Gateway resource shape with database.type postgres, OIDC config
- Keycloak realm/client/role configuration for local OIDC testing
- Design decisions for PostgreSQL 16 choice and prerequisite rationale

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Signed-off-by: Kyle Squizzato <kysquizz@redhat.com>
@markturansky

Copy link
Copy Markdown
Collaborator Author

Great question on backup strategy! Here's our approach for the initial implementation:

💾 Operator responsibility model - Database backup/recovery is handled via standard Kubernetes tooling
📸 PVC snapshots recommended - VolumeSnapshot API for point-in-time recovery
🔧 Standard tooling integration - Velero, Kasten, or cluster backup solutions handle this layer
📋 No custom backup logic initially - Avoids reinventing existing enterprise backup workflows

This keeps our scope focused on gateway provisioning while leveraging proven backup infrastructure. Most enterprises already have Kubernetes backup strategies that will cover these PostgreSQL PVCs automatically.

Would love feedback on whether this aligns with your operational model or if specific backup features are critical for adoption!


### Route Cluster Prerequisites

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We shouldn't delete this stuff yet because ideally we DO want to use the gateway API if its feasible

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Leave Routes in place for now but Gateway API is the preferred solution going forward.

@@ -346,121 +156,9 @@ The GatewayReconciler SHALL load gateway resource manifests from the container f

---

### Requirement: TLS Certificate Management via cert-manager

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pretty sure we still want cert-manager. It's installed on the OpenShift clusters anyways

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

agree. keep TLS cert manager section of the spec.


### Requirement: Kind Cluster OIDC Testing

In Kind test environments, OIDC SHALL be testable against the Keycloak instance deployed during `make kind-up`.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

More local development spec bits, not needed here

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

agree. remove form this spec.

Authorized (sandbox create, list, exec, etc.)
```

### Interaction with mTLS

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Per @bsquizz, if we drop mTLS this section should go too

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

agree, drop mTLS support. We will rely on OIDC and Keycloak.

squizzi added a commit that referenced this pull request Aug 5, 2026
Incorporate team decisions from gateway provisioning PR review:
- Realm openshell → hypershell (matches reviewer consensus)
- Provisioner client openshell-provisioner → hypershell-provisioner
- Add TLS-always-enabled requirement (cert-manager self-signed CA)
- Add OIDC-only auth requirement (mTLS dropped)
- Add postgres-only requirement (SQLite dropped)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
squizzi added a commit that referenced this pull request Aug 5, 2026
- Mark openshell-gateway-database.spec.md cross-references as forward
  references (planned, see #2)
- Clarify swap preservation mechanism: kind-up skips manifest
  reapplication for swapped components
- Add consolidated Environment Variable Reference table
- Note that OIDC issuer HTTP is intentional (local Keycloak dev mode)
- Clarify port-exposure split: NodePort+extraPortMappings for component
  ports vs cloud-provider-kind LoadBalancer for Gateway API ingress

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Signed-off-by: Kyle Squizzato <kysquizz@redhat.com>
@markturansky
markturansky force-pushed the add-openshell-gateway-specs branch from 15381ef to 19110ab Compare August 5, 2026 17:53

### Requirement: Gateway Deletion with Database

When a Gateway with `database.type: postgres` is deleted, all database resources SHALL be cleaned up via ownerReferences (cascading deletion). The database PVC SHALL be deleted with the rest of the resources.

@markturansky markturansky Aug 5, 2026

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Gateway deletion should not be possible if sandboxes exist. We should prevent creating orphans in the first place. Orderly wind down of sandboxes by sysadmins is preferred.

ManagedDatabase is a database instance. If a database is used multi-tenant (many gateways per database instance with a schema for each), then the schema can be cascade deleted with the Gateway, but the ManagedDatabase instance itself is separately managed.

squizzi added a commit that referenced this pull request Aug 5, 2026
…rop database.type

- Add LOCAL_IMAGES=true for offline/air-gapped development — builds
  baseline images from local main instead of pulling from registry
- Auto-allocate ports for multi-namespace deployments via KIND_PORT_OFFSET
  instead of requiring four explicit port env vars per deployment
- Bump cert-manager pin from v1.20.0 to v1.21.1
- Remove database.type from Gateway resource YAML — SQLite was already
  eliminated in PR #2 so the field is unnecessary
- Remove "Postgres only, no SQLite" design decision row (same reason)
- Note .local URL routing as a future option in NodePort design decision

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Signed-off-by: Kyle Squizzato <kysquizz@redhat.com>
Apply all reviewer consensus items: rename ACP→HyperShell, acpctl→hsctl,
acpgw→hsgw, ambient→hypershell throughout. Drop SQLite, mTLS, pkiInitJob
fallback. Add deletion protection, database immutability, manual credential
rotation. Reduce main gateway spec from ~2200 to ~780 lines by removing
multi-cluster, migration, and test-environment sections.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
@markturansky

Copy link
Copy Markdown
Collaborator Author

all specs rebased into #14 and merged in that PR

markturansky pushed a commit that referenced this pull request Aug 6, 2026
…ions

Based on reviewer feedback from @jsell-rh and @squizzi:

**Metadata Updates:**
- Updated all spec dates to 2026-08-04 (current)
- Changed status from "Implementation-Verified" to "Draft"
- Removed ACP-specific PR references and context
- Added HyperShell-specific context notes

**Database Strategy Clarifications:**
- Confirmed PostgreSQL 16 choice for stability over PostgreSQL 18
- Emphasized Red Hat hardened container images for enterprise security
- Added manual credential rotation via annotation trigger
- Documented brief downtime (~30-60s) for rotation operations

**Data Loss Transparency:**
- Added explicit warnings for SQLite↔PostgreSQL transitions
- Documented orphaned sandbox resource behavior
- Clarified that initial implementation prioritizes core functionality
- Set expectations for operator responsibility on backups

**Production Readiness Scope:**
- Database backup via standard K8s tooling (PVC snapshots, Velero)
- Manual credential rotation initially, automatic rotation as future enhancement
- Clear documentation of current limitations vs. future roadmap

These changes establish a production-capable foundation with transparent
limitations, allowing teams to make informed deployment decisions.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
markturansky added a commit that referenced this pull request Aug 6, 2026
)

* Add OpenShell gateway provisioning specs from ACP

Import comprehensive gateway provisioning specifications from Agent Control Plane:
- openshell-gateway.spec.md: Core gateway provisioning via API-driven model
- openshell-gateway-database.spec.md: PostgreSQL provisioning and workload switching
- openshell-gateway-oidc.spec.md: OIDC authentication with optional mTLS
- openshell-gateway-tls.spec.md: Certificate management via cert-manager or certgen
- openshell-gateway-routing.spec.md: External connectivity via Gateway API or NLB

These specs provide the foundation for implementing OpenShell gateway management
within HyperShell's sector-based architecture, enabling:
- Multi-tenant gateway provisioning across managed clusters
- Database-backed gateway deployments with horizontal scaling
- Enterprise authentication via OIDC + client certificates
- Production-ready TLS certificate lifecycle management
- Cross-cluster gateway networking and external exposure

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>

* feat: add OpenShift deployment, fix builds, add deploy skills

- Remove local rh-trex-ai replace directive; pin to v0.0.0-20260804164518-7b5a01f
- Fix Dockerfiles to consume rh-trex-ai as Go module (not sibling COPY)
- Fix Makefile build contexts (api-server uses ., controller uses components/)
- Fix proto go_package to include components/api-server in module path
- Regenerate protobuf stubs with matching protoc-gen-go v1.36.11
- Add deploy/openshift kustomize overlay (RHEL postgres, SecurityContext, Route)
- Add deploy/deploy-cluster and deploy/kind skills from ACP
- Update full-stack-pipeline skill with build/deploy/proto sections
- Update RECONCILE.md skill directory with deploy skills

Tested: all 3 pods running on OpenShift, CRUD verified against live API.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>

* Address PR #2 feedback: Update metadata and add production considerations

Based on reviewer feedback from @jsell-rh and @squizzi:

**Metadata Updates:**
- Updated all spec dates to 2026-08-04 (current)
- Changed status from "Implementation-Verified" to "Draft"
- Removed ACP-specific PR references and context
- Added HyperShell-specific context notes

**Database Strategy Clarifications:**
- Confirmed PostgreSQL 16 choice for stability over PostgreSQL 18
- Emphasized Red Hat hardened container images for enterprise security
- Added manual credential rotation via annotation trigger
- Documented brief downtime (~30-60s) for rotation operations

**Data Loss Transparency:**
- Added explicit warnings for SQLite↔PostgreSQL transitions
- Documented orphaned sandbox resource behavior
- Clarified that initial implementation prioritizes core functionality
- Set expectations for operator responsibility on backups

**Production Readiness Scope:**
- Database backup via standard K8s tooling (PVC snapshots, Velero)
- Manual credential rotation initially, automatic rotation as future enhancement
- Clear documentation of current limitations vs. future roadmap

These changes establish a production-capable foundation with transparent
limitations, allowing teams to make informed deployment decisions.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>

* feat: add gateway reconciler, e2e test, and OpenShift routing fixes

Port the GatewayReconciler from ACP to HyperShell control plane:
- Gateway K8s resource reconciliation (StatefulSet, ConfigMap, Service,
  RBAC, NetworkPolicy, certgen Job, ServiceAccount)
- OpenShift-specific: SCC binding, passthrough Route, router NetworkPolicy
- Manifest templating with namespace/image substitution
- Gateway config validation

Add e2e-openshell.sh end-to-end test covering the full path:
HyperShell API → control plane → gateway provisioning → openshell CLI
→ sandbox creation + exec (11 test assertions).

Key fixes discovered during e2e validation on ROSA:
- Add openshell-gateway-allow-router NetworkPolicy (router pods in
  openshift-ingress were blocked from reaching gateway, causing TLS
  handshake EOF)
- Remove client_ca_path from gateway.toml (openshell CLI v0.0.55-0.0.98
  cannot load mTLS certs for remote gateways; without OIDC, full mTLS
  was required but CLI couldn't satisfy it)
- Add pod readiness + connectivity retry loops in e2e script
- Use sandbox delete instead of stop/rm (correct openshell subcommand)

Update specs: mark NetworkPolicy gap as resolved, add mTLS CLI
debugging entries, rename Fleet→Sector in data model.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>

* feat: reconcile gateway specs — Deployment+PG, cert-manager, OIDC, Gateway API

Execute 4-wave reconciliation to align control-plane with updated gateway specs:

Wave 1: StatefulSet → Deployment + PostgreSQL backend
- Add deployment.yaml (init container pg_isready, OPENSHELL_DB_URL from Secret)
- Add database.yaml (PVC, PG Deployment, Service, NetworkPolicy)
- Add reconcileDatabaseCredentials() with crypto/rand password generation
- Update e2e test: statefulset → deployment checks

Wave 2: cert-manager TLS
- Add DetectCertManager() API discovery
- Add reconcileCertManagerResources(): self-signed Issuer → CA Cert → CA Issuer → Server/Client Certs
- Fallback warning when cert-manager not available

Wave 3: OIDC + Trusted CA Bundle
- Add OIDCConfig struct and TOML injection in ApplyConfigOverrides()
- Add ValidateOIDCConfig() (both-or-neither admin/user role)
- Add reconcileTrustedCABundle() with volume mount + SSL_CERT_FILE env

Wave 4: Gateway API Routing
- Add DetectGatewayAPI() for GRPCRoute CRD detection
- Add reconcileGatewayAPIResources(): GRPCRoute + BackendTLSPolicy
- Backend CA ConfigMap from openshell-server-tls Secret

Cross-cutting:
- Update all manifest labels: managed-by=hypershell-control-plane + hypershell.redhat.io/managed=true
- Update gateway specs from add-openshell-gateway-specs branch
- Update RECONCILE.md: coverage 44% → 85%

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>

---------

Co-authored-by: user <u@example.com>
Co-authored-by: Claude <noreply@anthropic.com>
markturansky pushed a commit that referenced this pull request Aug 9, 2026
…ions

Based on reviewer feedback from @jsell-rh and @squizzi:

**Metadata Updates:**
- Updated all spec dates to 2026-08-04 (current)
- Changed status from "Implementation-Verified" to "Draft"
- Removed ACP-specific PR references and context
- Added HyperShell-specific context notes

**Database Strategy Clarifications:**
- Confirmed PostgreSQL 16 choice for stability over PostgreSQL 18
- Emphasized Red Hat hardened container images for enterprise security
- Added manual credential rotation via annotation trigger
- Documented brief downtime (~30-60s) for rotation operations

**Data Loss Transparency:**
- Added explicit warnings for SQLite↔PostgreSQL transitions
- Documented orphaned sandbox resource behavior
- Clarified that initial implementation prioritizes core functionality
- Set expectations for operator responsibility on backups

**Production Readiness Scope:**
- Database backup via standard K8s tooling (PVC snapshots, Velero)
- Manual credential rotation initially, automatic rotation as future enhancement
- Clear documentation of current limitations vs. future roadmap

These changes establish a production-capable foundation with transparent
limitations, allowing teams to make informed deployment decisions.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <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.

4 participants