Skip to content

Commit a72a14d

Browse files
committed
feat: add rh-keycloak wrapper chart with short-lived ExternalSecret lifecycle
Add a wrapper chart (charts/rh-keycloak) that consumes the rhbk chart as a dependency and configures keycloakUsers ExternalSecret with a short-lived ArgoCD hook lifecycle: - ExternalSecret annotated as a Sync hook, deleted by HookSucceeded - creationPolicy: Orphan + deletionPolicy: Retain ensures the Secret survives ExternalSecret deletion - A simplified PostSync Job deletes the keycloak-users Secret by name after Keycloak realm import consumes it (security hygiene) - Conditional NetworkPolicy for the cleanup Job when default-deny is enabled Switch values-hub.yaml from the remote rhbk chart to the local rh-keycloak wrapper chart path. Requires rhbk-chart >= 0.0.12 (lifecycle management for ExternalSecrets). Signed-off-by: Min Zhang <minzhang@redhat.com>
1 parent e1d59c5 commit a72a14d

6 files changed

Lines changed: 295 additions & 154 deletions

File tree

charts/rh-keycloak/Chart.yaml

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
apiVersion: v2
2+
name: rh-keycloak
3+
description: ZTVP Keycloak deployment — wraps the rhbk chart with short-lived ExternalSecret lifecycle via ArgoCD hooks
4+
type: application
5+
version: 0.1.0
6+
dependencies:
7+
- name: rhbk
8+
version: ">=0.0.12"
9+
repository: "oci://quay.io/validatedpatterns"
10+
maintainers:
11+
- name: Zero Trust Validated Patterns Team
12+
email: ztvp-arch-group@redhat.com
13+
keywords:
14+
- keycloak
15+
- rhbk
16+
- zero-trust
17+
- pattern
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
{{- if .Values.cleanup.enabled }}
2+
---
3+
apiVersion: v1
4+
kind: ServiceAccount
5+
metadata:
6+
name: cleanup-keycloak-users
7+
namespace: {{ .Release.Namespace }}
8+
annotations:
9+
argocd.argoproj.io/hook: PostSync
10+
argocd.argoproj.io/hook-delete-policy: BeforeHookCreation
11+
---
12+
apiVersion: rbac.authorization.k8s.io/v1
13+
kind: Role
14+
metadata:
15+
name: cleanup-keycloak-users
16+
namespace: {{ .Release.Namespace }}
17+
annotations:
18+
argocd.argoproj.io/hook: PostSync
19+
argocd.argoproj.io/hook-delete-policy: BeforeHookCreation
20+
rules:
21+
- apiGroups: [""]
22+
resources: ["secrets"]
23+
resourceNames: ["keycloak-users"]
24+
verbs: ["get", "delete"]
25+
---
26+
apiVersion: rbac.authorization.k8s.io/v1
27+
kind: RoleBinding
28+
metadata:
29+
name: cleanup-keycloak-users
30+
namespace: {{ .Release.Namespace }}
31+
annotations:
32+
argocd.argoproj.io/hook: PostSync
33+
argocd.argoproj.io/hook-delete-policy: BeforeHookCreation
34+
roleRef:
35+
apiGroup: rbac.authorization.k8s.io
36+
kind: Role
37+
name: cleanup-keycloak-users
38+
subjects:
39+
- kind: ServiceAccount
40+
name: cleanup-keycloak-users
41+
namespace: {{ .Release.Namespace }}
42+
---
43+
apiVersion: batch/v1
44+
kind: Job
45+
metadata:
46+
name: cleanup-keycloak-users
47+
namespace: {{ .Release.Namespace }}
48+
annotations:
49+
argocd.argoproj.io/hook: PostSync
50+
argocd.argoproj.io/hook-delete-policy: BeforeHookCreation
51+
spec:
52+
backoffLimit: 2
53+
activeDeadlineSeconds: 120
54+
template:
55+
metadata:
56+
labels:
57+
app: cleanup-keycloak-users
58+
spec:
59+
serviceAccountName: cleanup-keycloak-users
60+
restartPolicy: Never
61+
containers:
62+
- name: cleanup
63+
image: {{ .Values.cleanup.image }}
64+
command:
65+
- /bin/bash
66+
- -ce
67+
- |
68+
oc delete secret keycloak-users -n "{{ .Release.Namespace }}" --ignore-not-found
69+
echo "Cleanup complete."
70+
{{- end }}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
{{- if and .Values.cleanup.enabled (eq (.Values.rhbk.defaultDenyNetworkPolicy.enabled | toString) "true") }}
2+
apiVersion: networking.k8s.io/v1
3+
kind: NetworkPolicy
4+
metadata:
5+
name: cleanup-keycloak-users-netpol
6+
namespace: {{ .Release.Namespace }}
7+
annotations:
8+
argocd.argoproj.io/hook: PostSync
9+
argocd.argoproj.io/hook-delete-policy: BeforeHookCreation
10+
spec:
11+
podSelector:
12+
matchLabels:
13+
app: cleanup-keycloak-users
14+
policyTypes:
15+
- Egress
16+
egress:
17+
- ports:
18+
- protocol: UDP
19+
port: 5353
20+
- protocol: TCP
21+
port: 5353
22+
to:
23+
- namespaceSelector:
24+
matchLabels:
25+
kubernetes.io/metadata.name: openshift-dns
26+
- ports:
27+
- protocol: TCP
28+
port: 6443
29+
{{- end }}

charts/rh-keycloak/values.yaml

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
# PostSync Job deletes the keycloak-users Secret after realm import consumes it.
2+
cleanup:
3+
enabled: true
4+
image: registry.redhat.io/openshift4/ose-cli-rhel9:latest
5+
6+
# Values passed through to the rhbk subchart.
7+
# The keycloakUsers ExternalSecret uses a short-lived ArgoCD hook lifecycle:
8+
# - Created during Sync, deleted by HookSucceeded
9+
# - Secret survives via creationPolicy: Orphan + deletionPolicy: Retain
10+
# - PostSync Job removes the Secret for security hygiene
11+
rhbk:
12+
externalSecrets:
13+
keycloakUsers:
14+
creationPolicy: "Orphan"
15+
deletionPolicy: "Retain"
16+
refreshPolicy: "OnChange"
17+
metadata:
18+
annotations:
19+
argocd.argoproj.io/hook: Sync
20+
argocd.argoproj.io/hook-delete-policy: HookSucceeded
21+
argocd.argoproj.io/sync-options: PrunePropagationPolicy=orphan
22+
targetMetadata:
23+
labels:
24+
validatedpatterns.io/cleanup: delete

0 commit comments

Comments
 (0)