mirror of
https://github.com/NVIDIA/OpenShell.git
synced 2026-10-20 06:00:06 +08:00
* feat(helm): add generic gateway TOML serializer Signed-off-by: Gaizka Menendez Hernandez <gmenende@redhat.com> * docs(architecture): define Helm gateway configuration boundary Signed-off-by: Gaizka Menendez Hernandez <gmenende@redhat.com> * feat(helm): define default gateway configuration map Signed-off-by: Gaizka Menendez Hernandez <gmenende@redhat.com> * refactor(helm): render gateway config from values map Signed-off-by: Gaizka Menendez Hernandez <gmenende@redhat.com> * test(helm): cover generic gateway TOML rendering Signed-off-by: Gaizka Menendez Hernandez <gmenende@redhat.com> * feat(helm): protect gateway config secret boundary Signed-off-by: Gaizka Menendez Hernandez <gmenende@redhat.com> * docs(helm): classify legacy gateway configuration values Signed-off-by: Gaizka Menendez Hernandez <gmenende@redhat.com> * refactor(helm): derive dual-use resources from gateway config Signed-off-by: Gaizka Menendez Hernandez <gmenende@redhat.com> * test(helm): migrate gateway config scenarios Signed-off-by: Gaizka Menendez Hernandez <gmenende@redhat.com> * refactor(helm): derive credential resources from gateway config Signed-off-by: Gaizka Menendez Hernandez <gmenende@redhat.com> * refactor(helm): migrate gateway config overlays Signed-off-by: Gaizka Menendez Hernandez <gmenende@redhat.com> * refactor(helm): remove gateway configuration shadow values Signed-off-by: Gaizka Menendez Hernandez <gmenende@redhat.com> * refactor(helm): align runtime config with resources Signed-off-by: Gaizka Menendez Hernandez <gmenende@redhat.com> * docs(helm): add gateway config migration guide Signed-off-by: Gaizka Menendez Hernandez <gmenende@redhat.com> * test(helm): validate rendered gateway config Signed-off-by: Gaizka Menendez Hernandez <gmenende@redhat.com> * test(helm): cover config resource coherence Signed-off-by: Gaizka Menendez Hernandez <gmenende@redhat.com> * fix(helm): make Kubernetes E2E deployable Signed-off-by: Gaizka Menendez Hernandez <gmenende@redhat.com> * fix(e2e): pass host aliases through gateway config Signed-off-by: Gaizka Menendez Hernandez <gmenende@redhat.com> * docs(e2e): reference gateway config host alias Signed-off-by: Gaizka Menendez Hernandez <gmenende@redhat.com> * fix(helm): enforce gateway resource ownership Signed-off-by: Gaizka Menendez Hernandez <gmenende@redhat.com> * test(e2e): cover chart host gateway input Signed-off-by: Gaizka Menendez Hernandez <gmenende@redhat.com> * fix(helm): address gateway config review findings Signed-off-by: Gaizka Menendez Hernandez <gmenende@redhat.com> * fix(helm): repair RFC 0012 migration integration Signed-off-by: Gaizka Menendez Hernandez <gmenende@redhat.com> * fix(e2e): align Kubernetes parity with RFC 0012 Signed-off-by: Gaizka Menendez Hernandez <gmenende@redhat.com> * fix(helm): complete gateway config migration Signed-off-by: Gaizka Menendez Hernandez <gmenende@redhat.com> * chore(helm): add SPDX header to TOML template * fix(helm): preserve legacy gateway configuration aliases Signed-off-by: Gaizka Menendez Hernandez <gmenende@redhat.com> * fix(helm): complete legacy gateway config compatibility Signed-off-by: Gaizka Menendez Hernandez <gmenende@redhat.com> * feat(helm): support gateway config arrays of tables * fix(helm): preserve sandbox identity aliases * fix(helm): address gateway config review findings Signed-off-by: Gaizka Menendez Hernandez <gmenende@redhat.com> * fix(helm): preserve gateway config migration settings Signed-off-by: Taylor Mutch <taylormutch@gmail.com> * test(helm): validate extension arrays in CI values Signed-off-by: Taylor Mutch <taylormutch@gmail.com> * fix(helm): restore unconditional SPDX headers Signed-off-by: Taylor Mutch <taylormutch@gmail.com> * fix(helm): restore route SPDX header placement Signed-off-by: Taylor Mutch <taylormutch@gmail.com> * docs(helm): simplify configuration and migration examples Signed-off-by: Taylor Mutch <taylormutch@gmail.com> * docs(helm): remove redundant flag explanations Signed-off-by: Taylor Mutch <taylormutch@gmail.com> * docs(helm): move chart configuration guidance to Kubernetes setup Signed-off-by: Taylor Mutch <taylormutch@gmail.com> --------- Signed-off-by: Gaizka Menendez Hernandez <gmenende@redhat.com> Signed-off-by: Taylor Mutch <taylormutch@gmail.com> Co-authored-by: Taylor Mutch <taylormutch@gmail.com>
313 lines
12 KiB
YAML
313 lines
12 KiB
YAML
# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
|
# SPDX-License-Identifier: Apache-2.0
|
|
|
|
suite: credential drivers
|
|
templates:
|
|
- templates/gateway-config.yaml
|
|
- templates/credential-storage-key-encryption-key-secret.yaml
|
|
- templates/statefulset.yaml
|
|
- templates/deployment.yaml
|
|
- templates/credential-secrets-role.yaml
|
|
- templates/credential-secrets-rolebinding.yaml
|
|
release:
|
|
name: openshell
|
|
namespace: my-namespace
|
|
|
|
tests:
|
|
- it: renders default encrypted credential storage by default
|
|
template: templates/gateway-config.yaml
|
|
asserts:
|
|
- notMatchRegex:
|
|
path: data["gateway.toml"]
|
|
pattern: 'credential_drivers\s*='
|
|
- matchRegex:
|
|
path: data["gateway.toml"]
|
|
pattern: '(?ms)\[openshell\.gateway\.credential_storage\].*?key_encryption_key_env\s*=\s*"OPENSHELL_GATEWAY_CREDENTIAL_KEY_ENCRYPTION_KEY"'
|
|
- notMatchRegex:
|
|
path: data["gateway.toml"]
|
|
pattern: 'key_encryption_key_path\s*='
|
|
|
|
- it: creates a retained default credential storage key-encryption key Secret by default
|
|
template: templates/credential-storage-key-encryption-key-secret.yaml
|
|
asserts:
|
|
- equal:
|
|
path: kind
|
|
value: Secret
|
|
- matchRegex:
|
|
path: metadata.name
|
|
pattern: 'credential-storage-key-encryption-key$'
|
|
- equal:
|
|
path: metadata.annotations["helm.sh/resource-policy"]
|
|
value: keep
|
|
- matchRegex:
|
|
path: data["key-encryption-key"]
|
|
pattern: '.+'
|
|
|
|
- it: injects the default credential storage key-encryption key Secret into the gateway pod by default
|
|
template: templates/statefulset.yaml
|
|
asserts:
|
|
- contains:
|
|
path: spec.template.spec.containers[0].env
|
|
content:
|
|
name: OPENSHELL_GATEWAY_CREDENTIAL_KEY_ENCRYPTION_KEY
|
|
valueFrom:
|
|
secretKeyRef:
|
|
name: openshell-credential-storage-key-encryption-key
|
|
key: key-encryption-key
|
|
|
|
- it: renders Kubernetes Secrets credential driver config
|
|
template: templates/gateway-config.yaml
|
|
set:
|
|
server.credentialDrivers.kubernetesSecrets.enabled: true
|
|
server.credentialDrivers.kubernetesSecrets.namespace: provider-secrets
|
|
asserts:
|
|
- matchRegex:
|
|
path: data["gateway.toml"]
|
|
pattern: 'credential_drivers\s*=\s*\["kubernetes-secrets"\]'
|
|
- matchRegex:
|
|
path: data["gateway.toml"]
|
|
pattern: '(?ms)\[openshell\.credential_drivers\.kubernetes-secrets\]\s*namespace\s*=\s*"provider-secrets"'
|
|
- notMatchRegex:
|
|
path: data["gateway.toml"]
|
|
pattern: 'allow_reference_namespace'
|
|
- notMatchRegex:
|
|
path: data["gateway.toml"]
|
|
pattern: '\[openshell\.credential_drivers\.kubernetes-secrets\][^\[]*(workspace_mode|gateway_id)'
|
|
- notMatchRegex:
|
|
path: data["gateway.toml"]
|
|
pattern: 'transport\s*=\s*"in_tree"'
|
|
- notMatchRegex:
|
|
path: data["gateway.toml"]
|
|
pattern: '\[openshell\.gateway\.credential_storage\]'
|
|
|
|
- it: fills an absent schema-v2 Kubernetes Secrets namespace from the legacy alias
|
|
template: templates/gateway-config.yaml
|
|
set:
|
|
server.credentialDrivers.kubernetesSecrets.namespace: provider-secrets
|
|
gatewayConfig:
|
|
openshell.gateway:
|
|
credential_drivers:
|
|
- kubernetes-secrets
|
|
asserts:
|
|
- matchRegex:
|
|
path: data["gateway.toml"]
|
|
pattern: '(?ms)\[openshell\.credential_drivers\.kubernetes-secrets\].*?namespace\s*=\s*"provider-secrets"'
|
|
|
|
- it: preserves the canonical credential namespace when the legacy alias selects the driver
|
|
set:
|
|
server.credentialDrivers.kubernetesSecrets.enabled: true
|
|
server.credentialDrivers.kubernetesSecrets.namespace: legacy-secrets
|
|
gatewayConfig:
|
|
openshell.credential_drivers.kubernetes-secrets:
|
|
namespace: provider-secrets
|
|
asserts:
|
|
- template: templates/gateway-config.yaml
|
|
matchRegex:
|
|
path: data["gateway.toml"]
|
|
pattern: 'credential_drivers\s*=\s*\["kubernetes-secrets"\]'
|
|
- template: templates/gateway-config.yaml
|
|
matchRegex:
|
|
path: data["gateway.toml"]
|
|
pattern: '(?ms)\[openshell\.credential_drivers\.kubernetes-secrets\]\s*namespace\s*=\s*"provider-secrets"'
|
|
- template: templates/credential-secrets-role.yaml
|
|
equal:
|
|
path: metadata.namespace
|
|
value: provider-secrets
|
|
- template: templates/credential-secrets-rolebinding.yaml
|
|
equal:
|
|
path: metadata.namespace
|
|
value: provider-secrets
|
|
|
|
- it: renders Vault credential driver config
|
|
template: templates/gateway-config.yaml
|
|
set:
|
|
server.credentialDrivers.vault.enabled: true
|
|
server.credentialDrivers.vault.address: https://vault.vault.svc.cluster.local:8200
|
|
server.credentialDrivers.vault.caConfigMapName: vault-ca
|
|
server.credentialDrivers.vault.role: openshell-gateway
|
|
asserts:
|
|
- matchRegex:
|
|
path: data["gateway.toml"]
|
|
pattern: 'credential_drivers\s*=\s*\["vault"\]'
|
|
- matchRegex:
|
|
path: data["gateway.toml"]
|
|
pattern: '(?ms)\[openshell\.credential_drivers\.vault\].*?address\s*=\s*"https://vault\.vault\.svc\.cluster\.local:8200".*?auth_method\s*=\s*"kubernetes".*?ca_bundle\s*=\s*"/etc/openshell-tls/vault-ca/ca\.crt".*?role\s*=\s*"openshell-gateway"'
|
|
- notMatchRegex:
|
|
path: data["gateway.toml"]
|
|
pattern: 'transport\s*=\s*"in_tree"'
|
|
- notMatchRegex:
|
|
path: data["gateway.toml"]
|
|
pattern: '\[openshell\.gateway\.credential_storage\]'
|
|
|
|
- it: fills absent schema-v2 Vault settings from legacy values without overwriting schema-v2 fields
|
|
template: templates/gateway-config.yaml
|
|
set:
|
|
server.credentialDrivers.vault.enabled: true
|
|
server.credentialDrivers.vault.address: https://legacy-vault.example:8200
|
|
server.credentialDrivers.vault.authMethod: kubernetes
|
|
server.credentialDrivers.vault.role: legacy-role
|
|
gatewayConfig:
|
|
openshell.gateway:
|
|
credential_drivers:
|
|
- vault
|
|
openshell.credential_drivers.vault:
|
|
role: schema-v2-role
|
|
asserts:
|
|
- matchRegex:
|
|
path: data["gateway.toml"]
|
|
pattern: '(?ms)\[openshell\.credential_drivers\.vault\].*?address\s*=\s*"https://legacy-vault\.example:8200".*?auth_method\s*=\s*"kubernetes".*?role\s*=\s*"schema-v2-role"'
|
|
|
|
- it: rejects multiple enabled credential drivers
|
|
template: templates/statefulset.yaml
|
|
set:
|
|
server.credentialDrivers.kubernetesSecrets.enabled: true
|
|
server.credentialDrivers.vault.enabled: true
|
|
server.credentialDrivers.vault.address: https://vault.vault.svc.cluster.local:8200
|
|
server.credentialDrivers.vault.role: openshell-gateway
|
|
asserts:
|
|
- failedTemplate:
|
|
errorPattern: "only one external server.credentialDrivers backend can be enabled at a time"
|
|
|
|
- it: rejects multiple schema-v2 credential drivers
|
|
template: templates/statefulset.yaml
|
|
set:
|
|
gatewayConfig:
|
|
openshell.gateway:
|
|
credential_drivers:
|
|
- kubernetes-secrets
|
|
- vault
|
|
asserts:
|
|
- failedTemplate:
|
|
errorMessage: "gatewayConfig.openshell.gateway.credential_drivers may select only one backend"
|
|
|
|
- it: rejects an explicit empty schema-v2 driver list
|
|
template: templates/statefulset.yaml
|
|
set:
|
|
server.credentialDrivers.vault.enabled: true
|
|
gatewayConfig:
|
|
openshell.gateway:
|
|
credential_drivers: []
|
|
asserts:
|
|
- failedTemplate:
|
|
errorMessage: "gatewayConfig.openshell.gateway.credential_drivers must select exactly one backend or be omitted/null to use the chart default"
|
|
|
|
- it: mounts the Vault CA ConfigMap into the gateway
|
|
template: templates/statefulset.yaml
|
|
set:
|
|
server.credentialDrivers.vault.enabled: true
|
|
server.credentialDrivers.vault.address: https://vault.vault.svc.cluster.local:8200
|
|
server.credentialDrivers.vault.caConfigMapName: vault-ca
|
|
server.credentialDrivers.vault.role: openshell-gateway
|
|
asserts:
|
|
- contains:
|
|
path: spec.template.spec.containers[0].volumeMounts
|
|
content:
|
|
name: vault-ca
|
|
mountPath: /etc/openshell-tls/vault-ca
|
|
readOnly: true
|
|
- contains:
|
|
path: spec.template.spec.volumes
|
|
content:
|
|
name: vault-ca
|
|
configMap:
|
|
name: vault-ca
|
|
items:
|
|
- key: ca.crt
|
|
path: ca.crt
|
|
|
|
- it: creates namespaced Kubernetes Secret manager RBAC
|
|
template: templates/credential-secrets-role.yaml
|
|
set:
|
|
server.credentialDrivers.kubernetesSecrets.enabled: true
|
|
server.credentialDrivers.kubernetesSecrets.namespace: provider-secrets
|
|
asserts:
|
|
- equal:
|
|
path: metadata.namespace
|
|
value: provider-secrets
|
|
- equal:
|
|
path: rules[0].resources[0]
|
|
value: secrets
|
|
- equal:
|
|
path: rules[0].verbs[0]
|
|
value: get
|
|
- contains:
|
|
path: rules[0].verbs
|
|
content: create
|
|
- contains:
|
|
path: rules[0].verbs
|
|
content: patch
|
|
- contains:
|
|
path: rules[0].verbs
|
|
content: delete
|
|
|
|
- it: binds Kubernetes Secret manager RBAC to the gateway ServiceAccount
|
|
template: templates/credential-secrets-rolebinding.yaml
|
|
set:
|
|
server.credentialDrivers.kubernetesSecrets.enabled: true
|
|
server.credentialDrivers.kubernetesSecrets.namespace: provider-secrets
|
|
asserts:
|
|
- equal:
|
|
path: metadata.namespace
|
|
value: provider-secrets
|
|
- equal:
|
|
path: subjects[0].name
|
|
value: openshell
|
|
- equal:
|
|
path: subjects[0].namespace
|
|
value: my-namespace
|
|
|
|
- it: honors the legacy Kubernetes Secrets RBAC opt-out
|
|
template: templates/credential-secrets-role.yaml
|
|
set:
|
|
server.credentialDrivers.kubernetesSecrets.enabled: true
|
|
server.credentialDrivers.kubernetesSecrets.rbac.create: false
|
|
asserts:
|
|
- hasDocuments:
|
|
count: 0
|
|
|
|
- it: omits the Kubernetes Secrets RoleBinding when RBAC is opted out
|
|
template: templates/credential-secrets-rolebinding.yaml
|
|
set:
|
|
server.credentialDrivers.kubernetesSecrets.enabled: true
|
|
server.credentialDrivers.kubernetesSecrets.rbac.create: false
|
|
asserts:
|
|
- hasDocuments:
|
|
count: 0
|
|
|
|
- it: allows default credential storage on a Deployment with an external database
|
|
template: templates/deployment.yaml
|
|
set:
|
|
workload.kind: deployment
|
|
server.externalDbSecret: openshell-pg
|
|
asserts:
|
|
- equal:
|
|
path: kind
|
|
value: Deployment
|
|
- contains:
|
|
path: spec.template.spec.containers[0].env
|
|
content:
|
|
name: OPENSHELL_GATEWAY_CREDENTIAL_KEY_ENCRYPTION_KEY
|
|
valueFrom:
|
|
secretKeyRef:
|
|
name: openshell-credential-storage-key-encryption-key
|
|
key: key-encryption-key
|
|
|
|
- it: allows default credential storage with multiple replicas and an external database
|
|
template: templates/statefulset.yaml
|
|
set:
|
|
replicaCount: 2
|
|
server.externalDbSecret: openshell-pg
|
|
workload.allowMultiReplicaStatefulSet: true
|
|
asserts:
|
|
- equal:
|
|
path: spec.replicas
|
|
value: 2
|
|
- contains:
|
|
path: spec.template.spec.containers[0].env
|
|
content:
|
|
name: OPENSHELL_GATEWAY_CREDENTIAL_KEY_ENCRYPTION_KEY
|
|
valueFrom:
|
|
secretKeyRef:
|
|
name: openshell-credential-storage-key-encryption-key
|
|
key: key-encryption-key
|