Skip to content

Commit af62d3e

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 af62d3e

6 files changed

Lines changed: 294 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: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
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+
verbs: ["list", "delete"]
24+
---
25+
apiVersion: rbac.authorization.k8s.io/v1
26+
kind: RoleBinding
27+
metadata:
28+
name: cleanup-keycloak-users
29+
namespace: {{ .Release.Namespace }}
30+
annotations:
31+
argocd.argoproj.io/hook: PostSync
32+
argocd.argoproj.io/hook-delete-policy: BeforeHookCreation
33+
roleRef:
34+
apiGroup: rbac.authorization.k8s.io
35+
kind: Role
36+
name: cleanup-keycloak-users
37+
subjects:
38+
- kind: ServiceAccount
39+
name: cleanup-keycloak-users
40+
namespace: {{ .Release.Namespace }}
41+
---
42+
apiVersion: batch/v1
43+
kind: Job
44+
metadata:
45+
name: cleanup-keycloak-users
46+
namespace: {{ .Release.Namespace }}
47+
annotations:
48+
argocd.argoproj.io/hook: PostSync
49+
argocd.argoproj.io/hook-delete-policy: BeforeHookCreation
50+
spec:
51+
backoffLimit: 2
52+
activeDeadlineSeconds: 120
53+
template:
54+
metadata:
55+
labels:
56+
app: cleanup-keycloak-users
57+
spec:
58+
serviceAccountName: cleanup-keycloak-users
59+
restartPolicy: Never
60+
containers:
61+
- name: cleanup
62+
image: {{ .Values.cleanup.image }}
63+
command:
64+
- /bin/bash
65+
- -ce
66+
- |
67+
oc delete secret -l "validatedpatterns.io/cleanup=delete" -n "{{ .Release.Namespace }}" --ignore-not-found
68+
echo "Cleanup complete."
69+
{{- 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)