diff --git a/src/main/helm/templates/_helpers.tpl b/src/main/helm/templates/_helpers.tpl index f0aa61ba4d6e43509d987ef47370df9f2c59a9a6..010d749611edd3797a12660a34ee2010018af555 100644 --- a/src/main/helm/templates/_helpers.tpl +++ b/src/main/helm/templates/_helpers.tpl @@ -139,6 +139,14 @@ app.kubernetes.io/namespace: {{ include "app.namespace" . }} {{ printf "%s" ( (.Values.serviceAccount).name | default "user-manager-service-account" ) }} {{- end -}} +{{- define "app.truststoreSecretName" -}} +{{- if .Values.optionalTrustStoreSecretName -}} +{{ .Values.optionalTrustStoreSecretName }} +{{- else -}} +{{ printf "user-manager-truststore" }} +{{- end -}} +{{- end -}} + {{- define "app.getCustomList" -}} {{- with (.Values.env).customList -}} {{- if kindIs "map" . -}} diff --git a/src/main/helm/templates/certificate.yaml b/src/main/helm/templates/certificate.yaml index 2e711fd20a731f19e17fac1fa1cbb11257d041e7..350e7cc5469f8e2fc84e787edf7c6e2101cb2755 100644 --- a/src/main/helm/templates/certificate.yaml +++ b/src/main/helm/templates/certificate.yaml @@ -33,8 +33,8 @@ spec: issuerRef: name: user-manager-issuer kind: Issuer - duration: 8760h0m0s - renewBefore: 720h0m0s + duration: 8760h0m0s # 1 Jahr + renewBefore: 5840h0m0s # 8 Monate commonName: {{ .Release.Name }} dnsNames: - "*.{{ .Release.Name }}.{{ include "app.namespace" . }}.svc.cluster.local" diff --git a/src/main/helm/templates/deployment.yaml b/src/main/helm/templates/deployment.yaml index 8eb7dae2026666151832f4b3f27ea993d258da0a..2bebcaeb28b0b22578d5b4b70bb9f74fc27e8e2b 100644 --- a/src/main/helm/templates/deployment.yaml +++ b/src/main/helm/templates/deployment.yaml @@ -116,16 +116,16 @@ spec: {{- with include "app.getCustomList" . }} {{ . | indent 8 }} {{- end }} - {{- if .Values.optionalTrustStoreSecretName }} - - name: TRUST_STORE_PASSWORD + {{- if not .Values.disableNamespaceTruststore }} + - name: TRUSTSTORE_PASSWORD valueFrom: secretKeyRef: - name: {{ .Values.optionalTrustStoreSecretName }} + name: {{ include "app.truststoreSecretName" . }} key: password optional: false args: - - '-Djavax.net.ssl.trustStore=/optional-trust-store/truststore.jks' - - '-Djavax.net.ssl.trustStorePassword=$(TRUST_STORE_PASSWORD)' + - '-Djavax.net.ssl.trustStore=/namespace-truststore/truststore.jks' + - '-Djavax.net.ssl.trustStorePassword=$(TRUSTSTORE_PASSWORD)' {{- end }} image: "{{ .Values.image.repo }}/{{ .Values.image.name }}:{{ coalesce (.Values.image).tag "latest" }}" imagePullPolicy: Always @@ -191,37 +191,27 @@ spec: terminationMessagePath: /dev/termination-log terminationMessagePolicy: File tty: true - {{- if or (not .Values.disableGrpcServerTls) .Values.optionalTrustStoreSecretName }} volumeMounts: {{- if not .Values.disableGrpcServerTls }} - name: user-manager-tls-certificate - mountPath: "/user-manager-tls-certificate/tls.crt" - subPath: tls.crt - readOnly: true - - name: user-manager-tls-certificate - mountPath: "/user-manager-tls-certificate/tls.key" - subPath: tls.key + mountPath: "/user-manager-tls-certificate" readOnly: true {{- end }} - {{- if .Values.optionalTrustStoreSecretName }} - - name: optional-trust-store - mountPath: "/optional-trust-store/truststore.jks" - subPath: truststore.jks + {{- if not .Values.disableNamespaceTruststore }} + - name: namespace-truststore + mountPath: "/namespace-truststore" readOnly: true {{- end }} - {{- end }} - {{- if or (not .Values.disableGrpcServerTls) .Values.optionalTrustStoreSecretName }} volumes: {{- if not .Values.disableGrpcServerTls }} - name: user-manager-tls-certificate secret: secretName: user-manager-tls-cert {{- end }} - {{- if .Values.optionalTrustStoreSecretName }} - - name: optional-trust-store + {{- if not .Values.disableNamespaceTruststore }} + - name: namespace-truststore secret: - secretName: {{ .Values.optionalTrustStoreSecretName }} - {{- end }} + secretName: {{ include "app.truststoreSecretName" . }} {{- end }} dnsConfig: {} dnsPolicy: ClusterFirst diff --git a/src/main/helm/templates/truststore/init_truststore_job.yaml b/src/main/helm/templates/truststore/init_truststore_job.yaml new file mode 100644 index 0000000000000000000000000000000000000000..6285cf7bbe674a5e93b23100e36bdda1fd3f7930 --- /dev/null +++ b/src/main/helm/templates/truststore/init_truststore_job.yaml @@ -0,0 +1,55 @@ +# +# Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den +# Ministerpräsidenten des Landes Schleswig-Holstein +# Staatskanzlei +# Abteilung Digitalisierung und zentrales IT-Management der Landesregierung +# +# Lizenziert unter der EUPL, Version 1.2 oder - sobald +# diese von der Europäischen Kommission genehmigt wurden - +# Folgeversionen der EUPL ("Lizenz"); +# Sie dürfen dieses Werk ausschließlich gemäß +# dieser Lizenz nutzen. +# Eine Kopie der Lizenz finden Sie hier: +# +# https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 +# +# Sofern nicht durch anwendbare Rechtsvorschriften +# gefordert oder in schriftlicher Form vereinbart, wird +# die unter der Lizenz verbreitete Software "so wie sie +# ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - +# ausdrücklich oder stillschweigend - verbreitet. +# Die sprachspezifischen Genehmigungen und Beschränkungen +# unter der Lizenz sind dem Lizenztext zu entnehmen. +# + +{{- if and (not .Values.disableNamespaceTruststore) (not .Values.disableCreateTruststore) }} +apiVersion: batch/v1 +kind: Job +metadata: + name: init-user-manager-truststore-job + namespace: {{ include "app.namespace" . }} + labels: + {{- include "app.defaultLabels" . | indent 4 }} + annotations: + argocd.argoproj.io/hook: Sync + argocd.argoproj.io/hook-delete-policy: HookSucceeded +spec: + template: + metadata: + name: init-user-manager-truststore-job + labels: + {{- include "app.defaultLabels" . | indent 8 }} + spec: + serviceAccountName: truststore-init-service-account + initContainers: + - name: wait-for-cronjob + image: dockerproxy.ozg-sh.de/bitnami/kubectl:latest + command: ["/bin/sh", "-c"] + args: ["kubectl wait --for=jsonpath='{.metadata.name}'=renew-user-manager-truststore-cronjob cronjob/renew-user-manager-truststore-cronjob -n {{ include "app.namespace" . }}"] + containers: + - name: run-renew-user-manager-truststore-cronjob + image: dockerproxy.ozg-sh.de/bitnami/kubectl:latest + command: ["/bin/sh", "-c"] + args: ["kubectl create job create-user-manager-truststore --from=cronjob/renew-user-manager-truststore-cronjob -n {{ include "app.namespace" . }} --dry-run=client -o yaml | kubectl patch --dry-run=client -o yaml --type json --patch '[{ \"op\": \"replace\", \"path\": \"/metadata/ownerReferences/0/blockOwnerDeletion\", \"value\": false }]' -f - | kubectl apply -f -"] + restartPolicy: OnFailure +{{- end }} \ No newline at end of file diff --git a/src/main/helm/templates/truststore/init_truststore_rbac.yaml b/src/main/helm/templates/truststore/init_truststore_rbac.yaml new file mode 100644 index 0000000000000000000000000000000000000000..5d0de6ab93608620ac3e4d9eda457475ab528de4 --- /dev/null +++ b/src/main/helm/templates/truststore/init_truststore_rbac.yaml @@ -0,0 +1,79 @@ +# +# Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den +# Ministerpräsidenten des Landes Schleswig-Holstein +# Staatskanzlei +# Abteilung Digitalisierung und zentrales IT-Management der Landesregierung +# +# Lizenziert unter der EUPL, Version 1.2 oder - sobald +# diese von der Europäischen Kommission genehmigt wurden - +# Folgeversionen der EUPL ("Lizenz"); +# Sie dürfen dieses Werk ausschließlich gemäß +# dieser Lizenz nutzen. +# Eine Kopie der Lizenz finden Sie hier: +# +# https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 +# +# Sofern nicht durch anwendbare Rechtsvorschriften +# gefordert oder in schriftlicher Form vereinbart, wird +# die unter der Lizenz verbreitete Software "so wie sie +# ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - +# ausdrücklich oder stillschweigend - verbreitet. +# Die sprachspezifischen Genehmigungen und Beschränkungen +# unter der Lizenz sind dem Lizenztext zu entnehmen. +# + +{{- if and (not .Values.disableNamespaceTruststore) (not .Values.disableCreateTruststore) }} +--- +apiVersion: v1 +kind: ServiceAccount +metadata: + name: truststore-init-service-account + namespace: {{ include "app.namespace" . }} + +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: Role +metadata: + name: truststore-init-role + namespace: {{ include "app.namespace" . }} +rules: + - apiGroups: + - "batch" + resources: + - cronjobs + resourceNames: + - renew-user-manager-truststore-cronjob + verbs: + - get + - list + - apiGroups: + - "batch" + resources: + - jobs + verbs: + - create + - apiGroups: + - "batch" + resources: + - jobs + resourceNames: + - create-user-manager-truststore + verbs: + - patch + - get + +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: RoleBinding +metadata: + name: truststore-init-role-binding + namespace: {{ include "app.namespace" . }} +subjects: + - kind: ServiceAccount + name: truststore-init-service-account + namespace: {{ include "app.namespace" . }} +roleRef: + kind: Role + name: truststore-init-role + apiGroup: rbac.authorization.k8s.io +{{- end }} \ No newline at end of file diff --git a/src/main/helm/templates/truststore/truststore_cronjob.yaml b/src/main/helm/templates/truststore/truststore_cronjob.yaml new file mode 100644 index 0000000000000000000000000000000000000000..34e2f1fe80f187c830c8b0076e7396ce7de03b5d --- /dev/null +++ b/src/main/helm/templates/truststore/truststore_cronjob.yaml @@ -0,0 +1,85 @@ +# +# Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den +# Ministerpräsidenten des Landes Schleswig-Holstein +# Staatskanzlei +# Abteilung Digitalisierung und zentrales IT-Management der Landesregierung +# +# Lizenziert unter der EUPL, Version 1.2 oder - sobald +# diese von der Europäischen Kommission genehmigt wurden - +# Folgeversionen der EUPL ("Lizenz"); +# Sie dürfen dieses Werk ausschließlich gemäß +# dieser Lizenz nutzen. +# Eine Kopie der Lizenz finden Sie hier: +# +# https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 +# +# Sofern nicht durch anwendbare Rechtsvorschriften +# gefordert oder in schriftlicher Form vereinbart, wird +# die unter der Lizenz verbreitete Software "so wie sie +# ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - +# ausdrücklich oder stillschweigend - verbreitet. +# Die sprachspezifischen Genehmigungen und Beschränkungen +# unter der Lizenz sind dem Lizenztext zu entnehmen. +# + +{{- if and (not .Values.disableNamespaceTruststore) (not .Values.disableCreateTruststore) }} +apiVersion: batch/v1 +kind: CronJob +metadata: + name: renew-user-manager-truststore-cronjob + namespace: {{ include "app.namespace" . }} + labels: + {{- include "app.defaultLabels" . | indent 4 }} +spec: + schedule: "1 1 * * 1" + jobTemplate: + spec: + template: + metadata: + name: renew-user-manager-truststore-cronjob + labels: + {{- include "app.defaultLabels" . | indent 12 }} + spec: + serviceAccountName: truststore-secret-service-account + initContainers: + - name: create-truststore + image: dockerproxy.ozg-sh.de/openjdk:latest + command: ["/bin/sh", "-c"] + args: + - | + [[ -z "${TRUSTSTORE_PASSWORD}" ]] && TRUSTSTORE_PASSWORD=$(tr -dc '[:alnum:]' < /dev/urandom | head -c 12; echo) + + echo $TRUSTSTORE_PASSWORD >> /tmp/password.txt + + keytool -importkeystore -srckeystore /usr/java/latest/lib/security/cacerts -destkeystore /tmp/truststore.jks -srcstoretype PKCS12 -deststoretype PKCS12 -deststorepass $TRUSTSTORE_PASSWORD -srcstorepass changeit -noprompt + + keytool -importcert -alias {{ include "app.namespace" . }}-ca -file /namespace-ca-cert/ca.crt -keystore /tmp/truststore.jks -storepass $TRUSTSTORE_PASSWORD -noprompt + env: + - name: TRUSTSTORE_PASSWORD + valueFrom: + secretKeyRef: + name: {{ include "app.truststoreSecretName" . }} + key: password + optional: true + volumeMounts: + - name: namespace-ca-cert + mountPath: /namespace-ca-cert + readOnly: true + - name: temp-dir + mountPath: "/tmp" + containers: + - name: create-truststore-secret + image: dockerproxy.ozg-sh.de/bitnami/kubectl:latest + command: ["/bin/sh", "-c"] + args: ["kubectl create secret generic {{ include "app.truststoreSecretName" . }} --from-file=/tmp/truststore.jks --from-literal=password=$(cat /tmp/password.txt) --save-config --dry-run=client -o yaml | kubectl apply -n {{ include "app.namespace" . }} -f -"] + volumeMounts: + - name: temp-dir + mountPath: "/tmp" + volumes: + - name: namespace-ca-cert + secret: + secretName: {{ include "app.namespace" . }}-ca-cert + - name: temp-dir + emptyDir: {} + restartPolicy: Never +{{- end }} \ No newline at end of file diff --git a/src/main/helm/templates/truststore/truststore_rbac.yaml b/src/main/helm/templates/truststore/truststore_rbac.yaml new file mode 100644 index 0000000000000000000000000000000000000000..d68c45f18e95a8da051ffd94f72ea16e1119b53c --- /dev/null +++ b/src/main/helm/templates/truststore/truststore_rbac.yaml @@ -0,0 +1,71 @@ +# +# Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den +# Ministerpräsidenten des Landes Schleswig-Holstein +# Staatskanzlei +# Abteilung Digitalisierung und zentrales IT-Management der Landesregierung +# +# Lizenziert unter der EUPL, Version 1.2 oder - sobald +# diese von der Europäischen Kommission genehmigt wurden - +# Folgeversionen der EUPL ("Lizenz"); +# Sie dürfen dieses Werk ausschließlich gemäß +# dieser Lizenz nutzen. +# Eine Kopie der Lizenz finden Sie hier: +# +# https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 +# +# Sofern nicht durch anwendbare Rechtsvorschriften +# gefordert oder in schriftlicher Form vereinbart, wird +# die unter der Lizenz verbreitete Software "so wie sie +# ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - +# ausdrücklich oder stillschweigend - verbreitet. +# Die sprachspezifischen Genehmigungen und Beschränkungen +# unter der Lizenz sind dem Lizenztext zu entnehmen. +# + +{{- if and (not .Values.disableNamespaceTruststore) (not .Values.disableCreateTruststore) }} +--- +apiVersion: v1 +kind: ServiceAccount +metadata: + name: truststore-secret-service-account + namespace: {{ include "app.namespace" . }} + +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: Role +metadata: + name: truststore-secret-role + namespace: {{ include "app.namespace" . }} +rules: + - apiGroups: + - "" + resources: + - secrets + resourceNames: + - {{ include "app.truststoreSecretName" . }} + verbs: + - patch + - update + - get + - apiGroups: + - "" + resources: + - secrets + verbs: + - create + +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: RoleBinding +metadata: + name: truststore-secret-role-binding + namespace: {{ include "app.namespace" . }} +subjects: + - kind: ServiceAccount + name: truststore-secret-service-account + namespace: {{ include "app.namespace" . }} +roleRef: + kind: Role + name: truststore-secret-role + apiGroup: rbac.authorization.k8s.io +{{- end }} \ No newline at end of file diff --git a/src/test/helm/certificate_test.yaml b/src/test/helm/certificate_test.yaml index 0fe136c561849439f67b32d1f51bd92eda6de2bd..594ec04ccdf1e359e77a54e3c39de44b65e1af83 100644 --- a/src/test/helm/certificate_test.yaml +++ b/src/test/helm/certificate_test.yaml @@ -65,7 +65,7 @@ tests: asserts: - equal: path: spec.renewBefore - value: 720h0m0s + value: 5840h0m0s - it: should have commonName asserts: - equal: diff --git a/src/test/helm/deployment_optional_trust_store_test.yaml b/src/test/helm/deployment_namespace_truststore_test.yaml similarity index 54% rename from src/test/helm/deployment_optional_trust_store_test.yaml rename to src/test/helm/deployment_namespace_truststore_test.yaml index 056003a511e08cf064e696fccde61fabc81dd3d0..876a951ccfe08cbf1a4ebb58794948e0e0501315 100644 --- a/src/test/helm/deployment_optional_trust_store_test.yaml +++ b/src/test/helm/deployment_namespace_truststore_test.yaml @@ -22,67 +22,99 @@ # unter der Lizenz sind dem Lizenztext zu entnehmen. # -suite: test environments trust store +suite: test namespace truststore templates: - templates/deployment.yaml +release: + name: user-manager + namespace: by-helm-test set: ozgcloud: bundesland: by bezeichner: helm - environment: dev + environment: test sso: serverUrl: sso.test.sh.ozg-cloud.de baseUrl: test.sh.ozg-cloud.de imagePullSecret: image-pull-secret tests: - it: check without truststore + set: + disableNamespaceTruststore: true asserts: - notExists: path: spec.template.spec.containers[0].args - notContains: path: spec.template.spec.containers[0].env content: - name: TRUST_STORE_PASSWORD + name: TRUSTSTORE_PASSWORD - notContains: path: spec.template.spec.containers[0].volumeMounts content: - name: optional-trust-store - mountPath: "/optional-trust-store/truststore.jks" - subPath: truststore.jks - readOnly: true + name: namespace-truststore + any: true - notContains: path: spec.template.spec.volumes content: - name: optional-trust-store + name: namespace-truststore + any: true + + - it: check with default namespace truststore + asserts: + - equal: + path: spec.template.spec.containers[0].args + value: + - '-Djavax.net.ssl.trustStore=/namespace-truststore/truststore.jks' + - '-Djavax.net.ssl.trustStorePassword=$(TRUSTSTORE_PASSWORD)' + - contains: + path: spec.template.spec.containers[0].env + content: + name: TRUSTSTORE_PASSWORD + valueFrom: + secretKeyRef: + name: user-manager-truststore + key: password + optional: false + - contains: + path: spec.template.spec.containers[0].volumeMounts + content: + name: namespace-truststore + mountPath: "/namespace-truststore" + readOnly: true + - contains: + path: spec.template.spec.volumes + content: + name: namespace-truststore + secret: + secretName: user-manager-truststore - - it: check with truststore + - it: check with optional truststore set: - optionalTrustStoreSecretName: optional-trust-store-secret + optionalTrustStoreSecretName: optional-truststore-secret asserts: - equal: path: spec.template.spec.containers[0].args value: - - '-Djavax.net.ssl.trustStore=/optional-trust-store/truststore.jks' - - '-Djavax.net.ssl.trustStorePassword=$(TRUST_STORE_PASSWORD)' + - '-Djavax.net.ssl.trustStore=/namespace-truststore/truststore.jks' + - '-Djavax.net.ssl.trustStorePassword=$(TRUSTSTORE_PASSWORD)' - contains: path: spec.template.spec.containers[0].env content: - name: TRUST_STORE_PASSWORD + name: TRUSTSTORE_PASSWORD valueFrom: secretKeyRef: - name: optional-trust-store-secret + name: optional-truststore-secret key: password optional: false - contains: path: spec.template.spec.containers[0].volumeMounts content: - name: optional-trust-store - mountPath: "/optional-trust-store/truststore.jks" - subPath: truststore.jks + name: namespace-truststore + mountPath: "/namespace-truststore" readOnly: true - contains: path: spec.template.spec.volumes content: - name: optional-trust-store + name: namespace-truststore secret: - secretName: optional-trust-store-secret \ No newline at end of file + secretName: optional-truststore-secret \ No newline at end of file diff --git a/src/test/helm/deplyoment_cert_bindings_test.yaml b/src/test/helm/deplyoment_cert_bindings_test.yaml index 4ac96535cd8c1817d7f1d165d2a5d5c33d661bc8..521161e89a666653099a07f8c28f897c053e5db0 100644 --- a/src/test/helm/deplyoment_cert_bindings_test.yaml +++ b/src/test/helm/deplyoment_cert_bindings_test.yaml @@ -44,15 +44,7 @@ tests: path: spec.template.spec.containers[0].volumeMounts content: name: user-manager-tls-certificate - mountPath: "/user-manager-tls-certificate/tls.crt" - subPath: tls.crt - readOnly: true - - contains: - path: spec.template.spec.containers[0].volumeMounts - content: - name: user-manager-tls-certificate - mountPath: "/user-manager-tls-certificate/tls.key" - subPath: tls.key + mountPath: "/user-manager-tls-certificate" readOnly: true - it: should have volumes for user-manager root certificate @@ -82,13 +74,6 @@ tests: name: user-manager-tls-certificate any: true - - it: should not have volume mounts - set: - disableGrpcServerTls: true - asserts: - - notExists: - path: spec.template.spec.containers[0].volumeMounts - - it: should not have volume for user-manager root certificate set: disableGrpcServerTls: true @@ -97,10 +82,3 @@ tests: - notContains: path: spec.template.spec.volumes any: true - - - it: should not have volume - set: - disableGrpcServerTls: true - asserts: - - notExists: - path: spec.template.spec.volumes diff --git a/src/test/helm/truststore/init_truststore_job_test.yaml b/src/test/helm/truststore/init_truststore_job_test.yaml new file mode 100644 index 0000000000000000000000000000000000000000..1a764f60fec178139d7168f6d7142736f8dcb3c6 --- /dev/null +++ b/src/test/helm/truststore/init_truststore_job_test.yaml @@ -0,0 +1,159 @@ +# +# Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den +# Ministerpräsidenten des Landes Schleswig-Holstein +# Staatskanzlei +# Abteilung Digitalisierung und zentrales IT-Management der Landesregierung +# +# Lizenziert unter der EUPL, Version 1.2 oder - sobald +# diese von der Europäischen Kommission genehmigt wurden - +# Folgeversionen der EUPL ("Lizenz"); +# Sie dürfen dieses Werk ausschließlich gemäß +# dieser Lizenz nutzen. +# Eine Kopie der Lizenz finden Sie hier: +# +# https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 +# +# Sofern nicht durch anwendbare Rechtsvorschriften +# gefordert oder in schriftlicher Form vereinbart, wird +# die unter der Lizenz verbreitete Software "so wie sie +# ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - +# ausdrücklich oder stillschweigend - verbreitet. +# Die sprachspezifischen Genehmigungen und Beschränkungen +# unter der Lizenz sind dem Lizenztext zu entnehmen. +# + +suite: test init truststore job +release: + name: user-manager + namespace: by-helm-test +templates: + - templates/truststore/init_truststore_job.yaml +tests: + - it: Job should not exist if disableCreateTruststore is true + set: + disableCreateTruststore: true + asserts: + - hasDocuments: + count: 0 + - it: Job should not exist if disableNamespaceTruststore is true + set: + disableNamespaceTruststore: true + asserts: + - hasDocuments: + count: 0 + - it: check header data + asserts: + - isAPIVersion: + of: batch/v1 + - isKind: + of: Job + - it: check default metadata + asserts: + - equal: + path: metadata.name + value: init-user-manager-truststore-job + - equal: + path: metadata.namespace + value: by-helm-test + - equal: + path: metadata.labels["app.kubernetes.io/instance"] + value: user-manager + - equal: + path: metadata.labels["app.kubernetes.io/managed-by"] + value: Helm + - equal: + path: metadata.labels["app.kubernetes.io/name"] + value: user-manager + - equal: + path: metadata.labels["app.kubernetes.io/namespace"] + value: by-helm-test + - equal: + path: metadata.labels["app.kubernetes.io/part-of"] + value: ozgcloud + - equal: + path: metadata.labels["app.kubernetes.io/version"] + value: 0.0.0-MANAGED-BY-JENKINS + - equal: + path: metadata.labels["helm.sh/chart"] + value: user-manager-0.0.0-MANAGED-BY-JENKINS + - equal: + path: metadata.labels["ozgcloud-mongodb-client"] + value: "true" + - equal: + path: metadata.annotations["argocd.argoproj.io/hook"] + value: Sync + - equal: + path: metadata.annotations["argocd.argoproj.io/hook-delete-policy"] + value: HookSucceeded + + - it: check default template metadata + asserts: + - equal: + path: spec.template.metadata.name + value: init-user-manager-truststore-job + - equal: + path: spec.template.metadata.labels["app.kubernetes.io/instance"] + value: user-manager + - equal: + path: spec.template.metadata.labels["app.kubernetes.io/managed-by"] + value: Helm + - equal: + path: spec.template.metadata.labels["app.kubernetes.io/name"] + value: user-manager + - equal: + path: spec.template.metadata.labels["app.kubernetes.io/namespace"] + value: by-helm-test + - equal: + path: spec.template.metadata.labels["app.kubernetes.io/part-of"] + value: ozgcloud + - equal: + path: spec.template.metadata.labels["app.kubernetes.io/version"] + value: 0.0.0-MANAGED-BY-JENKINS + - equal: + path: spec.template.metadata.labels["helm.sh/chart"] + value: user-manager-0.0.0-MANAGED-BY-JENKINS + - equal: + path: spec.template.metadata.labels["ozgcloud-mongodb-client"] + value: "true" + + - it: check job serviceaccountname + asserts: + - equal: + path: spec.template.spec.serviceAccountName + value: truststore-init-service-account + + - it: check initContainer + asserts: + - equal: + path: spec.template.spec.initContainers[0].name + value: wait-for-cronjob + - equal: + path: spec.template.spec.initContainers[0].image + value: dockerproxy.ozg-sh.de/bitnami/kubectl:latest + - equal: + path: spec.template.spec.initContainers[0].command + value: ["/bin/sh", "-c"] + - equal: + path: spec.template.spec.initContainers[0].args + value: ["kubectl wait --for=jsonpath='{.metadata.name}'=renew-user-manager-truststore-cronjob cronjob/renew-user-manager-truststore-cronjob -n by-helm-test"] + + - it: check container + asserts: + - equal: + path: spec.template.spec.containers[0].name + value: run-renew-user-manager-truststore-cronjob + - equal: + path: spec.template.spec.containers[0].image + value: dockerproxy.ozg-sh.de/bitnami/kubectl:latest + - equal: + path: spec.template.spec.containers[0].command + value: ["/bin/sh", "-c"] + - equal: + path: spec.template.spec.containers[0].args + value: ["kubectl create job create-user-manager-truststore --from=cronjob/renew-user-manager-truststore-cronjob -n by-helm-test --dry-run=client -o yaml | kubectl patch --dry-run=client -o yaml --type json --patch '[{ \"op\": \"replace\", \"path\": \"/metadata/ownerReferences/0/blockOwnerDeletion\", \"value\": false }]' -f - | kubectl apply -f -"] + + - it: check restartPolicy + asserts: + - equal: + path: spec.template.spec.restartPolicy + value: OnFailure \ No newline at end of file diff --git a/src/test/helm/truststore/init_truststore_rbac_test.yaml b/src/test/helm/truststore/init_truststore_rbac_test.yaml new file mode 100644 index 0000000000000000000000000000000000000000..a81aa9eb1ed3f9f0ea76cdcca8034d3b21eeeac7 --- /dev/null +++ b/src/test/helm/truststore/init_truststore_rbac_test.yaml @@ -0,0 +1,151 @@ +# +# Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den +# Ministerpräsidenten des Landes Schleswig-Holstein +# Staatskanzlei +# Abteilung Digitalisierung und zentrales IT-Management der Landesregierung +# +# Lizenziert unter der EUPL, Version 1.2 oder - sobald +# diese von der Europäischen Kommission genehmigt wurden - +# Folgeversionen der EUPL ("Lizenz"); +# Sie dürfen dieses Werk ausschließlich gemäß +# dieser Lizenz nutzen. +# Eine Kopie der Lizenz finden Sie hier: +# +# https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 +# +# Sofern nicht durch anwendbare Rechtsvorschriften +# gefordert oder in schriftlicher Form vereinbart, wird +# die unter der Lizenz verbreitete Software "so wie sie +# ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - +# ausdrücklich oder stillschweigend - verbreitet. +# Die sprachspezifischen Genehmigungen und Beschränkungen +# unter der Lizenz sind dem Lizenztext zu entnehmen. +# + +suite: test init truststore rbac +release: + name: user-manager + namespace: by-helm-test +templates: + - templates/truststore/init_truststore_rbac.yaml +tests: + - it: RBAC should not exist if disableCreateTruststore is true + set: + disableCreateTruststore: true + asserts: + - hasDocuments: + count: 0 + - it: RBAC should not exist if disableNamespaceTruststore is true + set: + disableNamespaceTruststore: true + asserts: + - hasDocuments: + count: 0 + +# ServiceAccount + - it: check ServiceAccount header data + documentIndex: 0 + asserts: + - isAPIVersion: + of: v1 + - isKind: + of: ServiceAccount + - it: check ServiceAccount default metadata + documentIndex: 0 + asserts: + - equal: + path: metadata.name + value: truststore-init-service-account + - equal: + path: metadata.namespace + value: by-helm-test + +# Role + - it: check Role header data + documentIndex: 1 + asserts: + - isAPIVersion: + of: rbac.authorization.k8s.io/v1 + - isKind: + of: Role + - it: check Role default metadata + documentIndex: 1 + asserts: + - equal: + path: metadata.name + value: truststore-init-role + - equal: + path: metadata.namespace + value: by-helm-test + - it: check Role rules + documentIndex: 1 + asserts: + - contains: + path: rules + content: + apiGroups: + - "batch" + resources: + - cronjobs + resourceNames: + - renew-user-manager-truststore-cronjob + verbs: + - get + - list + - contains: + path: rules + content: + apiGroups: + - "batch" + resources: + - jobs + verbs: + - create + - contains: + path: rules + content: + apiGroups: + - "batch" + resources: + - jobs + resourceNames: + - create-user-manager-truststore + verbs: + - patch + - get + +# RoleBinding + - it: check RoleBinding header data + documentIndex: 2 + asserts: + - isAPIVersion: + of: rbac.authorization.k8s.io/v1 + - isKind: + of: RoleBinding + - it: check RoleBinding default metadata + documentIndex: 2 + asserts: + - equal: + path: metadata.name + value: truststore-init-role-binding + - equal: + path: metadata.namespace + value: by-helm-test + - it: check RoleBinding subjects + documentIndex: 2 + asserts: + - contains: + path: subjects + content: + kind: ServiceAccount + name: truststore-init-service-account + namespace: by-helm-test + - it: check RoleBinding roleRef + documentIndex: 2 + asserts: + - equal: + path: roleRef + value: + kind: Role + name: truststore-init-role + apiGroup: rbac.authorization.k8s.io \ No newline at end of file diff --git a/src/test/helm/truststore/truststore_cronjob_test.yaml b/src/test/helm/truststore/truststore_cronjob_test.yaml new file mode 100644 index 0000000000000000000000000000000000000000..1329ae06687db7fec0ad1273cb9b16e9595b212c --- /dev/null +++ b/src/test/helm/truststore/truststore_cronjob_test.yaml @@ -0,0 +1,206 @@ +# +# Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den +# Ministerpräsidenten des Landes Schleswig-Holstein +# Staatskanzlei +# Abteilung Digitalisierung und zentrales IT-Management der Landesregierung +# +# Lizenziert unter der EUPL, Version 1.2 oder - sobald +# diese von der Europäischen Kommission genehmigt wurden - +# Folgeversionen der EUPL ("Lizenz"); +# Sie dürfen dieses Werk ausschließlich gemäß +# dieser Lizenz nutzen. +# Eine Kopie der Lizenz finden Sie hier: +# +# https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 +# +# Sofern nicht durch anwendbare Rechtsvorschriften +# gefordert oder in schriftlicher Form vereinbart, wird +# die unter der Lizenz verbreitete Software "so wie sie +# ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - +# ausdrücklich oder stillschweigend - verbreitet. +# Die sprachspezifischen Genehmigungen und Beschränkungen +# unter der Lizenz sind dem Lizenztext zu entnehmen. +# + +suite: test truststore cronjob +release: + name: user-manager + namespace: by-helm-test +templates: + - templates/truststore/truststore_cronjob.yaml +tests: + - it: CronJob should not exist if disableCreateTruststore is true + set: + disableCreateTruststore: true + asserts: + - hasDocuments: + count: 0 + - it: CronJob should not exist if disableNamespaceTruststore is true + set: + disableNamespaceTruststore: true + asserts: + - hasDocuments: + count: 0 + - it: check header data + asserts: + - isAPIVersion: + of: batch/v1 + - isKind: + of: CronJob + - it: check default metadata + asserts: + - equal: + path: metadata.name + value: renew-user-manager-truststore-cronjob + - equal: + path: metadata.namespace + value: by-helm-test + - equal: + path: metadata.labels["app.kubernetes.io/instance"] + value: user-manager + - equal: + path: metadata.labels["app.kubernetes.io/managed-by"] + value: Helm + - equal: + path: metadata.labels["app.kubernetes.io/name"] + value: user-manager + - equal: + path: metadata.labels["app.kubernetes.io/namespace"] + value: by-helm-test + - equal: + path: metadata.labels["app.kubernetes.io/part-of"] + value: ozgcloud + - equal: + path: metadata.labels["app.kubernetes.io/version"] + value: 0.0.0-MANAGED-BY-JENKINS + - equal: + path: metadata.labels["helm.sh/chart"] + value: user-manager-0.0.0-MANAGED-BY-JENKINS + - equal: + path: metadata.labels["ozgcloud-mongodb-client"] + value: "true" + + - it: check default schedule + asserts: + - equal: + path: spec.schedule + value: "1 1 * * 1" + + - it: check default jobTemplate template metadata + asserts: + - equal: + path: spec.jobTemplate.spec.template.metadata.name + value: renew-user-manager-truststore-cronjob + - equal: + path: spec.jobTemplate.spec.template.metadata.labels["app.kubernetes.io/instance"] + value: user-manager + - equal: + path: spec.jobTemplate.spec.template.metadata.labels["app.kubernetes.io/managed-by"] + value: Helm + - equal: + path: spec.jobTemplate.spec.template.metadata.labels["app.kubernetes.io/name"] + value: user-manager + - equal: + path: spec.jobTemplate.spec.template.metadata.labels["app.kubernetes.io/namespace"] + value: by-helm-test + - equal: + path: spec.jobTemplate.spec.template.metadata.labels["app.kubernetes.io/part-of"] + value: ozgcloud + - equal: + path: spec.jobTemplate.spec.template.metadata.labels["app.kubernetes.io/version"] + value: 0.0.0-MANAGED-BY-JENKINS + - equal: + path: spec.jobTemplate.spec.template.metadata.labels["helm.sh/chart"] + value: user-manager-0.0.0-MANAGED-BY-JENKINS + - equal: + path: spec.jobTemplate.spec.template.metadata.labels["ozgcloud-mongodb-client"] + value: "true" + + - it: check cronJob serviceaccountname + asserts: + - equal: + path: spec.jobTemplate.spec.template.spec.serviceAccountName + value: truststore-secret-service-account + + - it: check initContainer + asserts: + - equal: + path: spec.jobTemplate.spec.template.spec.initContainers[0].name + value: create-truststore + - equal: + path: spec.jobTemplate.spec.template.spec.initContainers[0].image + value: dockerproxy.ozg-sh.de/openjdk:latest + - equal: + path: spec.jobTemplate.spec.template.spec.initContainers[0].command + value: ["/bin/sh", "-c"] + - equal: + path: spec.jobTemplate.spec.template.spec.initContainers[0].args + value: + - | + [[ -z "${TRUSTSTORE_PASSWORD}" ]] && TRUSTSTORE_PASSWORD=$(tr -dc '[:alnum:]' < /dev/urandom | head -c 12; echo) + + echo $TRUSTSTORE_PASSWORD >> /tmp/password.txt + + keytool -importkeystore -srckeystore /usr/java/latest/lib/security/cacerts -destkeystore /tmp/truststore.jks -srcstoretype PKCS12 -deststoretype PKCS12 -deststorepass $TRUSTSTORE_PASSWORD -srcstorepass changeit -noprompt + + keytool -importcert -alias by-helm-test-ca -file /namespace-ca-cert/ca.crt -keystore /tmp/truststore.jks -storepass $TRUSTSTORE_PASSWORD -noprompt + - contains: + path: spec.jobTemplate.spec.template.spec.initContainers[0].env + content: + name: TRUSTSTORE_PASSWORD + valueFrom: + secretKeyRef: + name: user-manager-truststore + key: password + optional: true + - contains: + path: spec.jobTemplate.spec.template.spec.initContainers[0].volumeMounts + content: + name: namespace-ca-cert + mountPath: /namespace-ca-cert + readOnly: true + - contains: + path: spec.jobTemplate.spec.template.spec.initContainers[0].volumeMounts + content: + name: temp-dir + mountPath: "/tmp" + + - it: check container + asserts: + - equal: + path: spec.jobTemplate.spec.template.spec.containers[0].name + value: create-truststore-secret + - equal: + path: spec.jobTemplate.spec.template.spec.containers[0].image + value: dockerproxy.ozg-sh.de/bitnami/kubectl:latest + - equal: + path: spec.jobTemplate.spec.template.spec.containers[0].command + value: ["/bin/sh", "-c"] + - equal: + path: spec.jobTemplate.spec.template.spec.containers[0].args + value: ["kubectl create secret generic user-manager-truststore --from-file=/tmp/truststore.jks --from-literal=password=$(cat /tmp/password.txt) --save-config --dry-run=client -o yaml | kubectl apply -n by-helm-test -f -"] + - contains: + path: spec.jobTemplate.spec.template.spec.initContainers[0].volumeMounts + content: + name: temp-dir + mountPath: "/tmp" + + - it: check volumes + asserts: + - contains: + path: spec.jobTemplate.spec.template.spec.volumes + content: + name: namespace-ca-cert + secret: + secretName: by-helm-test-ca-cert + - contains: + path: spec.jobTemplate.spec.template.spec.volumes + content: + name: temp-dir + emptyDir: {} + + - it: check restartPolicy + asserts: + - equal: + path: spec.jobTemplate.spec.template.spec.restartPolicy + value: Never \ No newline at end of file diff --git a/src/test/helm/truststore/truststore_rbac_test.yaml b/src/test/helm/truststore/truststore_rbac_test.yaml new file mode 100644 index 0000000000000000000000000000000000000000..f40118b06769e0a8b624f9d4693e9ce17e914c09 --- /dev/null +++ b/src/test/helm/truststore/truststore_rbac_test.yaml @@ -0,0 +1,140 @@ +# +# Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den +# Ministerpräsidenten des Landes Schleswig-Holstein +# Staatskanzlei +# Abteilung Digitalisierung und zentrales IT-Management der Landesregierung +# +# Lizenziert unter der EUPL, Version 1.2 oder - sobald +# diese von der Europäischen Kommission genehmigt wurden - +# Folgeversionen der EUPL ("Lizenz"); +# Sie dürfen dieses Werk ausschließlich gemäß +# dieser Lizenz nutzen. +# Eine Kopie der Lizenz finden Sie hier: +# +# https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 +# +# Sofern nicht durch anwendbare Rechtsvorschriften +# gefordert oder in schriftlicher Form vereinbart, wird +# die unter der Lizenz verbreitete Software "so wie sie +# ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - +# ausdrücklich oder stillschweigend - verbreitet. +# Die sprachspezifischen Genehmigungen und Beschränkungen +# unter der Lizenz sind dem Lizenztext zu entnehmen. +# + +suite: test truststore rbac +release: + name: user-manager + namespace: by-helm-test +templates: + - templates/truststore/truststore_rbac.yaml +tests: + - it: RBAC should not exist if disableCreateTruststore is true + set: + disableCreateTruststore: true + asserts: + - hasDocuments: + count: 0 + - it: RBAC should not exist if disableNamespaceTruststore is true + set: + disableNamespaceTruststore: true + asserts: + - hasDocuments: + count: 0 + +# ServiceAccount + - it: check ServiceAccount header data + documentIndex: 0 + asserts: + - isAPIVersion: + of: v1 + - isKind: + of: ServiceAccount + - it: check ServiceAccount default metadata + documentIndex: 0 + asserts: + - equal: + path: metadata.name + value: truststore-secret-service-account + - equal: + path: metadata.namespace + value: by-helm-test + +# Role + - it: check Role header data + documentIndex: 1 + asserts: + - isAPIVersion: + of: rbac.authorization.k8s.io/v1 + - isKind: + of: Role + - it: check Role default metadata + documentIndex: 1 + asserts: + - equal: + path: metadata.name + value: truststore-secret-role + - equal: + path: metadata.namespace + value: by-helm-test + - it: check Role rules + documentIndex: 1 + asserts: + - contains: + path: rules + content: + apiGroups: + - "" + resources: + - secrets + resourceNames: + - user-manager-truststore + verbs: + - patch + - update + - get + - contains: + path: rules + content: + apiGroups: + - "" + resources: + - secrets + verbs: + - create + +# RoleBinding + - it: check RoleBinding header data + documentIndex: 2 + asserts: + - isAPIVersion: + of: rbac.authorization.k8s.io/v1 + - isKind: + of: RoleBinding + - it: check RoleBinding default metadata + documentIndex: 2 + asserts: + - equal: + path: metadata.name + value: truststore-secret-role-binding + - equal: + path: metadata.namespace + value: by-helm-test + - it: check RoleBinding subjects + documentIndex: 2 + asserts: + - contains: + path: subjects + content: + kind: ServiceAccount + name: truststore-secret-service-account + namespace: by-helm-test + - it: check RoleBinding roleRef + documentIndex: 2 + asserts: + - equal: + path: roleRef + value: + kind: Role + name: truststore-secret-role + apiGroup: rbac.authorization.k8s.io \ No newline at end of file