diff --git a/src/main/helm/templates/_helpers.tpl b/src/main/helm/templates/_helpers.tpl index 0b1337c8ab4554f6f66827c60f7113b8d6863d86..1317f415cf1502d9f897172dfcfcfdf2b1c3a2ef 100644 --- a/src/main/helm/templates/_helpers.tpl +++ b/src/main/helm/templates/_helpers.tpl @@ -70,7 +70,7 @@ app.kubernetes.io/namespace: {{ include "app.namespace" . }} {{- end -}} {{- define "app.ozgcloud_vorgangmanager_address" -}} -{{ printf "dns://%s.%s:9090" .Values.vorgangmanagerName .Release.Namespace }} +{{ printf "%s.%s:9090" .Values.vorgangmanagerName .Release.Namespace }} {{- end -}} {{- define "app.databaseSecretName" -}} @@ -124,3 +124,6 @@ app.kubernetes.io/namespace: {{ include "app.namespace" . }} {{- end -}} {{- end -}} +{{- define "app.elsterTransferOperatorNamespace" -}} +{{- required "elsterTransferOperator.namespace must be set" (.Values.elsterTransferOperator).namespace -}} +{{- end -}} \ No newline at end of file diff --git a/src/main/helm/templates/deployment.yaml b/src/main/helm/templates/deployment.yaml index cbb3ae56d5105372f34de651e87da7b08d689402..329fb56867a302145ce93e6d1d11e8384d795713 100644 --- a/src/main/helm/templates/deployment.yaml +++ b/src/main/helm/templates/deployment.yaml @@ -190,6 +190,18 @@ spec: value: {{ quote (required "ozgcloud.muk.sender must be set if ozgcloud.muk is enabled" ((.Values.ozgcloud).muk).sender) }} - name: ozgcloud_muk_server value: {{ quote (required "ozgcloud.muk.server must be set if ozgcloud.muk is enabled" ((.Values.ozgcloud).muk).server) }} + - name: ozgcloud_muk_password + valueFrom: + secretKeyRef: + name: muk-user-secret + key: password + optional: false + - name: ozgcloud_muk_userName + valueFrom: + secretKeyRef: + name: muk-user-secret + key: login + optional: false {{- end }} @@ -201,11 +213,13 @@ spec: - name: ozgcloud_antragraum_url value: {{ quote (required "ozgcloud.antragraum.url must be set if ozgcloud.antragraum is enabled" ((.Values.ozgcloud).antragraum).url) }} - name: ozgcloud_antragraum_metadataUri - value: {{ quote (required "ozgcloud.antragraum.metadataUri must be set if ozgcloud.antragraum is enabled" ((.Values.ozgcloud).antragraum).metadataUri) }} + value: "file:/keystore/bayernid/metadata.xml" - name: ozgcloud_antragraum_decryptionPrivateKey value: "file:/keystore/bayernid/bayern-id.key" - name: ozgcloud_antragraum_decryptionCertificate value: "file:/keystore/bayernid/bayern-id.crt" + - name: ozgcloud_antragraum_entityId + value: {{ quote (required "ozgcloud.antragraum.entityId must be set if ozgcloud.antragraum is enabled" ((.Values.ozgcloud).antragraum).entityId) }} {{- end }} {{- if (((.Values.ozgcloud).feature).bescheid).enableDummyDocumentProcessor }} - name: ozgcloud_feature_bescheid_enableDummyDocumentProcessor diff --git a/src/main/helm/templates/elstertransfer_user_cr.yaml b/src/main/helm/templates/elstertransfer_user_cr.yaml new file mode 100644 index 0000000000000000000000000000000000000000..622de75f0eb7c8ff34d7069732d7bd40da1bab8a --- /dev/null +++ b/src/main/helm/templates/elstertransfer_user_cr.yaml @@ -0,0 +1,34 @@ + +# +# 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 (((.Values.ozgcloud).muk).enabled) }} +--- +apiVersion: operator.ozgcloud.de/v1 +kind: OzgCloudElsterTransferUser +metadata: + name: {{ include "app.namespace" . }}-etr-user + namespace: {{ include "app.namespace" $ }} +spec: + keep_after_delete: {{ (.Values.elsterTransferOperator).keep_after_delete | default false }} +{{- end -}} \ No newline at end of file diff --git a/src/main/helm/templates/ozgcloud_elstertransfer_operator_secret_create_role.yaml b/src/main/helm/templates/ozgcloud_elstertransfer_operator_secret_create_role.yaml new file mode 100644 index 0000000000000000000000000000000000000000..14e66bc84f9808f7a1c044555305f4a4148e1bf2 --- /dev/null +++ b/src/main/helm/templates/ozgcloud_elstertransfer_operator_secret_create_role.yaml @@ -0,0 +1,50 @@ +# +# 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 ((.Values.ozgcloud).muk).enabled }} +--- +kind: RoleBinding +apiVersion: rbac.authorization.k8s.io/v1 +metadata: + name: ozgcloud-elster-transfer-operator-secret-create-role-binding + namespace: {{ include "app.namespace" . }} +subjects: + - kind: ServiceAccount + name: ozgcloud-elster-transfer-operator-service-account + namespace: {{ include "app.elsterTransferOperatorNamespace" . }} +roleRef: + kind: Role + name: ozgcloud-elster-transfer-operator-secret-create-role + apiGroup: rbac.authorization.k8s.io + +--- +kind: Role +apiVersion: rbac.authorization.k8s.io/v1 +metadata: + name: ozgcloud-elster-transfer-operator-secret-create-role + namespace: {{ include "app.namespace" . }} +rules: + - apiGroups: [""] + resources: ["secrets"] + verbs: ["create"] +{{- end }} diff --git a/src/main/helm/templates/ozgcloud_elstertransfer_operator_secret_read_role.yaml b/src/main/helm/templates/ozgcloud_elstertransfer_operator_secret_read_role.yaml new file mode 100644 index 0000000000000000000000000000000000000000..561b89abc4a96334c80a54382887e323dde6fd2f --- /dev/null +++ b/src/main/helm/templates/ozgcloud_elstertransfer_operator_secret_read_role.yaml @@ -0,0 +1,51 @@ +# +# 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 ((.Values.ozgcloud).muk).enabled }} +--- +kind: RoleBinding +apiVersion: rbac.authorization.k8s.io/v1 +metadata: + name: ozgcloud-elster-transfer-operator-secret-read-role-binding + namespace: {{ include "app.namespace" . }} +subjects: + - kind: ServiceAccount + name: ozgcloud-elster-transfer-operator-service-account + namespace: {{ include "app.elsterTransferOperatorNamespace" . }} +roleRef: + kind: Role + name: ozgcloud-elster-transfer-operator-secret-read-role + apiGroup: rbac.authorization.k8s.io + +--- +kind: Role +apiVersion: rbac.authorization.k8s.io/v1 +metadata: + name: ozgcloud-elster-transfer-operator-secret-read-role + namespace: {{ include "app.namespace" . }} +rules: + - apiGroups: [""] + resources: ["secrets"] + verbs: ["get", "list"] + resourceNames: ["muk-user-secret"] +{{- end -}} diff --git a/src/main/helm/templates/ozgcloud_elstertransfer_operator_secret_update_role.yaml b/src/main/helm/templates/ozgcloud_elstertransfer_operator_secret_update_role.yaml new file mode 100644 index 0000000000000000000000000000000000000000..584400851f0b3b110cb2d32e619a4b1816cb899d --- /dev/null +++ b/src/main/helm/templates/ozgcloud_elstertransfer_operator_secret_update_role.yaml @@ -0,0 +1,51 @@ +# +# 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 ((.Values.ozgcloud).muk).enabled }} +--- +kind: RoleBinding +apiVersion: rbac.authorization.k8s.io/v1 +metadata: + name: ozgcloud-elster-transfer-operator-secret-update-role-binding + namespace: {{ include "app.namespace" . }} +subjects: + - kind: ServiceAccount + name: ozgcloud-elster-transfer-operator-service-account + namespace: {{ include "app.elsterTransferOperatorNamespace" . }} +roleRef: + kind: Role + name: ozgcloud-elster-transfer-operator-secret-update-role + apiGroup: rbac.authorization.k8s.io + +--- +kind: Role +apiVersion: rbac.authorization.k8s.io/v1 +metadata: + name: ozgcloud-elster-transfer-operator-secret-update-role + namespace: {{ include "app.namespace" . }} +rules: + - apiGroups: [""] + resources: ["secrets"] + verbs: ["update"] + resourceNames: ["muk-user-secret"] +{{- end }} diff --git a/src/main/helm/values.yaml b/src/main/helm/values.yaml index 0a5fa16348e66ee56810b7a102f364d54ff81061..5182d0baab596a8abe3a67fcaa32c1f87e78b615 100644 --- a/src/main/helm/values.yaml +++ b/src/main/helm/values.yaml @@ -61,4 +61,4 @@ zufiManager: address: dns://zufi.zufi-manager:9090 elasticsearch: - certificateSecretName: elasticsearch-certificate \ No newline at end of file + certificateSecretName: elasticsearch-certificate diff --git a/src/test/helm-linter-values.yaml b/src/test/helm-linter-values.yaml index 047b472e2225090f010e1f297a03a7a660062eb1..4ee02232ecd2a9c111ed1a6f0eaf7295f075700c 100644 --- a/src/test/helm-linter-values.yaml +++ b/src/test/helm-linter-values.yaml @@ -27,7 +27,12 @@ ozgcloud: infoManager: address: https://info-manager.my-wonderful-domain.local:9000 + networkPolicy: dnsServerNamespace: test-dns-namespace -imagePullSecret: test-image-pull-secret \ No newline at end of file +imagePullSecret: test-image-pull-secret + +elsterTransferOperator: + namespace: elster-transfer + \ No newline at end of file diff --git a/src/test/helm/deployment_antragraum_test.yaml b/src/test/helm/deployment_antragraum_test.yaml index 7905ec79487182bc1e11c667a1a85528bad162af..0def5958d58429a5889774f8dc0c3cd49daff8cd 100644 --- a/src/test/helm/deployment_antragraum_test.yaml +++ b/src/test/helm/deployment_antragraum_test.yaml @@ -33,13 +33,13 @@ set: ozgcloud: environment: dev tests: - - it: should set antragraum values + - it: should set antragsraum values set: ozgcloud: antragraum: enabled: true url: https://antragraum.address - metadataUri: "classpath:/bayernid/metadata/bayernid-idp-infra.xml" + entityId: https://sso.dev.de/realms/by-antragsraum-idp asserts: - contains: path: spec.template.spec.containers[0].env @@ -55,7 +55,7 @@ tests: path: spec.template.spec.containers[0].env content: name: ozgcloud_antragraum_metadataUri - value: "classpath:/bayernid/metadata/bayernid-idp-infra.xml" + value: "file:/keystore/bayernid/metadata.xml" - contains: path: spec.template.spec.containers[0].env content: @@ -82,12 +82,12 @@ tests: ozgcloud: antragraum: enabled: true - metadataUri: "classpath:/bayernid/metadata/bayernid-idp-infra.xml" + entityId: https://sso.dev.de/realms/by-antragsraum-idp asserts: - failedTemplate: errorMessage: "ozgcloud.antragraum.url must be set if ozgcloud.antragraum is enabled" - - it: should fail if metadataUri is not set + - it: should fail if entityId is not set set: ozgcloud: antragraum: @@ -95,7 +95,7 @@ tests: url: https://antragraum.address asserts: - failedTemplate: - errorMessage: "ozgcloud.antragraum.metadataUri must be set if ozgcloud.antragraum is enabled" + errorMessage: "ozgcloud.antragraum.entityId must be set if ozgcloud.antragraum is enabled" - it: should set volumeMounts @@ -104,7 +104,7 @@ tests: antragraum: enabled: true url: https://antragraum.address - metadataUri: "classpath:/bayernid/metadata/bayernid-idp-infra.xml" + entityId: https://sso.dev.de/realms/by-antragsraum-idp asserts: - contains: path: spec.template.spec.containers[0].volumeMounts @@ -129,7 +129,7 @@ tests: antragraum: enabled: true url: https://antragraum.address - metadataUri: "classpath:/bayernid/metadata/bayernid-idp-infra.xml" + entityId: https://sso.dev.de/realms/by-antragsraum-idp asserts: - contains: path: spec.template.spec.volumes diff --git a/src/test/helm/deployment_muk_test.yaml b/src/test/helm/deployment_muk_test.yaml index 33c02db5fd14acf174884dc8f09517d0403bf1b1..aeb0cd59e88df0196712fb836088d1faa2b468ff 100644 --- a/src/test/helm/deployment_muk_test.yaml +++ b/src/test/helm/deployment_muk_test.yaml @@ -51,6 +51,25 @@ tests: content: name: ozgcloud_muk_server value: muk.test.ozg.de + - contains: + path: spec.template.spec.containers[0].env + content: + name: ozgcloud_muk_userName + valueFrom: + secretKeyRef: + name: muk-user-secret + key: login + optional: false + - contains: + path: spec.template.spec.containers[0].env + content: + name: ozgcloud_muk_password + valueFrom: + secretKeyRef: + name: muk-user-secret + key: password + optional: false + - it: should not by default set muk values asserts: - notContains: @@ -63,6 +82,16 @@ tests: content: name: ozgcloud_muk_server any: true + - notContains: + path: spec.template.spec.containers[0].env + content: + name: ozgcloud_muk_userName + any: true + - notContains: + path: spec.template.spec.containers[0].env + content: + name: ozgcloud_muk_password + any: true - it: should fail if sender name is not set set: @@ -87,3 +116,4 @@ tests: + diff --git a/src/test/helm/deployment_nachrichten_manager_address_test.yaml b/src/test/helm/deployment_nachrichten_manager_address_test.yaml index c473b5dd34e7e75f4132b0ae359f9eb47a042f44..b91b3cc5fe1d814a525fc99464add26e746aa617 100644 --- a/src/test/helm/deployment_nachrichten_manager_address_test.yaml +++ b/src/test/helm/deployment_nachrichten_manager_address_test.yaml @@ -39,4 +39,4 @@ tests: path: spec.template.spec.containers[0].env content: name: ozgcloud_nachrichten-manager_address - value: dns://vorgang-manager.sh-helm-test:9090 + value: vorgang-manager.sh-helm-test:9090 diff --git a/src/test/helm/elster_transfer_user_cr_test.yaml b/src/test/helm/elster_transfer_user_cr_test.yaml new file mode 100644 index 0000000000000000000000000000000000000000..0587c112a56c4097ccba6dc6c06cd60349fc66f5 --- /dev/null +++ b/src/test/helm/elster_transfer_user_cr_test.yaml @@ -0,0 +1,103 @@ +# +# 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: elster transfer user cr +release: + name: vorgang-manager + namespace: by-helm-test +templates: + - templates/elstertransfer_user_cr.yaml +tests: + - it: should contain apiVersion + set: + ozgcloud: + muk: + enabled: true + asserts: + - isAPIVersion: + of: operator.ozgcloud.de/v1 + - it: should contain basic info + set: + ozgcloud: + muk: + enabled: true + asserts: + - isKind: + of: OzgCloudElsterTransferUser + - isAPIVersion: + of: operator.ozgcloud.de/v1 + - it: should have metadata name + set: + ozgcloud: + muk: + enabled: true + asserts: + - equal: + path: metadata.name + value: by-helm-test-etr-user + - it: should have metadata namespace + set: + ozgcloud: + muk: + enabled: true + asserts: + - equal: + path: metadata.namespace + value: by-helm-test + - it: should have default spec + set: + ozgcloud: + muk: + enabled: true + asserts: + - equal: + path: spec.keep_after_delete + value: false + - it: should set spec correctly + set: + ozgcloud: + muk: + enabled: true + elsterTransferOperator: + keep_after_delete: true + asserts: + - equal: + path: spec.keep_after_delete + value: true + - it: should create cr if enabled + set: + ozgcloud: + muk: + enabled: true + asserts: + - hasDocuments: + count: 1 + + - it: should NOT create cr by default + asserts: + - hasDocuments: + count: 0 + + + \ No newline at end of file diff --git a/src/test/helm/ozgcloud_elstertransfer_operator_secret_create_role_test.yaml b/src/test/helm/ozgcloud_elstertransfer_operator_secret_create_role_test.yaml new file mode 100644 index 0000000000000000000000000000000000000000..34a6109f7119929c515b06f0e1de9c85e440de55 --- /dev/null +++ b/src/test/helm/ozgcloud_elstertransfer_operator_secret_create_role_test.yaml @@ -0,0 +1,133 @@ +# +# 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: ElsterTransfer user secret rbac test +release: + name: ozgcloud-elstertransfer-operator + namespace: test-namespace +templates: + - templates/ozgcloud_elstertransfer_operator_secret_create_role.yaml + + +tests: + - it: test RoleBinding metadata + set: + elsterTransferOperator: + namespace: etr-operator + ozgcloud: + muk: + enabled: true + asserts: + - isKind: + of: RoleBinding + documentIndex: 0 + - isAPIVersion: + of: rbac.authorization.k8s.io/v1 + documentIndex: 0 + - equal: + path: metadata.name + value: ozgcloud-elster-transfer-operator-secret-create-role-binding + documentIndex: 0 + + - it: test RoleBinding subject + set: + elsterTransferOperator: + namespace: etr-operator + ozgcloud: + muk: + enabled: true + asserts: + - contains: + path: subjects + content: + kind: ServiceAccount + name: ozgcloud-elster-transfer-operator-service-account + namespace: etr-operator + documentIndex: 0 + - it: test RoleBinding roleRef + set: + elsterTransferOperator: + namespace: etr-operator + ozgcloud: + muk: + enabled: true + asserts: + - equal: + path: roleRef + value: + kind: Role + name: ozgcloud-elster-transfer-operator-secret-create-role + apiGroup: rbac.authorization.k8s.io + documentIndex: 0 + + - it: test Role metadata + set: + elsterTransferOperator: + namespace: etr-operator + ozgcloud: + muk: + enabled: true + asserts: + - isKind: + of: Role + documentIndex: 1 + - isAPIVersion: + of: rbac.authorization.k8s.io/v1 + documentIndex: 1 + - equal: + path: metadata.name + value: ozgcloud-elster-transfer-operator-secret-create-role + documentIndex: 1 + + - it: test RoleBinding rules + set: + elsterTransferOperator: + namespace: etr-operator + ozgcloud: + muk: + enabled: true + asserts: + - contains: + path: rules + content: + apiGroups: + - "" + resources: + - secrets + verbs: + - create + documentIndex: 1 + - it: test eltertransferOperator namespace must be set msg + set: + ozgcloud: + muk: + enabled: true + asserts: + - failedTemplate: + errorMessage: elsterTransferOperator.namespace must be set + + - it: RBAC not created by default + asserts: + - hasDocuments: + count: 0 \ No newline at end of file diff --git a/src/test/helm/ozgcloud_elstertransfer_operator_secret_read_role_test.yaml b/src/test/helm/ozgcloud_elstertransfer_operator_secret_read_role_test.yaml new file mode 100644 index 0000000000000000000000000000000000000000..6d3bf2a10988847c5e425f13def889ea9ef8ea48 --- /dev/null +++ b/src/test/helm/ozgcloud_elstertransfer_operator_secret_read_role_test.yaml @@ -0,0 +1,138 @@ +# +# 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: ElsterTransfer user secret rbac test +release: + name: ozgcloud-elstertransfer-operator + namespace: test-namespace +templates: + - templates/ozgcloud_elstertransfer_operator_secret_read_role.yaml + + +tests: + - it: test RoleBinding metadata + set: + elsterTransferOperator: + namespace: etr-operator + ozgcloud: + muk: + enabled: true + asserts: + - isKind: + of: RoleBinding + documentIndex: 0 + - isAPIVersion: + of: rbac.authorization.k8s.io/v1 + documentIndex: 0 + - equal: + path: metadata.name + value: ozgcloud-elster-transfer-operator-secret-read-role-binding + documentIndex: 0 + + - it: test RoleBinding subject + set: + elsterTransferOperator: + namespace: etr-operator + ozgcloud: + muk: + enabled: true + asserts: + - contains: + path: subjects + content: + kind: ServiceAccount + name: ozgcloud-elster-transfer-operator-service-account + namespace: etr-operator + documentIndex: 0 + - it: test RoleBinding roleRef + set: + elsterTransferOperator: + namespace: etr-operator + ozgcloud: + muk: + enabled: true + asserts: + - equal: + path: roleRef + value: + kind: Role + name: ozgcloud-elster-transfer-operator-secret-read-role + apiGroup: rbac.authorization.k8s.io + documentIndex: 0 + + - it: test Role metadata + set: + elsterTransferOperator: + namespace: etr-operator + ozgcloud: + muk: + enabled: true + asserts: + - isKind: + of: Role + documentIndex: 1 + - isAPIVersion: + of: rbac.authorization.k8s.io/v1 + documentIndex: 1 + - equal: + path: metadata.name + value: ozgcloud-elster-transfer-operator-secret-read-role + documentIndex: 1 + + - it: test RoleBinding rules + set: + elsterTransferOperator: + namespace: etr-operator + ozgcloud: + muk: + enabled: true + asserts: + - contains: + path: rules + content: + apiGroups: + - "" + resourceNames: + - muk-user-secret + resources: + - secrets + verbs: + - get + - list + documentIndex: 1 + - it: test eltertransferOperator namespace must be set msg + set: + ozgcloud: + muk: + enabled: true + asserts: + - failedTemplate: + errorMessage: elsterTransferOperator.namespace must be set + documentIndex: 0 + + - it: RBAC not created by default + asserts: + - hasDocuments: + count: 0 + \ No newline at end of file diff --git a/src/test/helm/ozgcloud_elstertransfer_operator_secret_update_role_test.yaml b/src/test/helm/ozgcloud_elstertransfer_operator_secret_update_role_test.yaml new file mode 100644 index 0000000000000000000000000000000000000000..5f28b5cd2104687d7b40103ae741effa0418fda4 --- /dev/null +++ b/src/test/helm/ozgcloud_elstertransfer_operator_secret_update_role_test.yaml @@ -0,0 +1,136 @@ +# +# 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: ElsterTransfer user secret rbac test +release: + name: ozgcloud-elstertransfer-operator + namespace: test-namespace +templates: + - templates/ozgcloud_elstertransfer_operator_secret_update_role.yaml + + +tests: + - it: test RoleBinding metadata + set: + elsterTransferOperator: + namespace: etr-operator + ozgcloud: + muk: + enabled: true + asserts: + - isKind: + of: RoleBinding + documentIndex: 0 + - isAPIVersion: + of: rbac.authorization.k8s.io/v1 + documentIndex: 0 + - equal: + path: metadata.name + value: ozgcloud-elster-transfer-operator-secret-update-role-binding + documentIndex: 0 + + - it: test RoleBinding subject + set: + elsterTransferOperator: + namespace: etr-operator + ozgcloud: + muk: + enabled: true + asserts: + - contains: + path: subjects + content: + kind: ServiceAccount + name: ozgcloud-elster-transfer-operator-service-account + namespace: etr-operator + documentIndex: 0 + - it: test RoleBinding roleRef + set: + elsterTransferOperator: + namespace: etr-operator + ozgcloud: + muk: + enabled: true + asserts: + - equal: + path: roleRef + value: + kind: Role + name: ozgcloud-elster-transfer-operator-secret-update-role + apiGroup: rbac.authorization.k8s.io + documentIndex: 0 + + - it: test Role metadata + set: + elsterTransferOperator: + namespace: etr-operator + ozgcloud: + muk: + enabled: true + asserts: + - isKind: + of: Role + documentIndex: 1 + - isAPIVersion: + of: rbac.authorization.k8s.io/v1 + documentIndex: 1 + - equal: + path: metadata.name + value: ozgcloud-elster-transfer-operator-secret-update-role + documentIndex: 1 + + - it: test RoleBinding rules + set: + elsterTransferOperator: + namespace: etr-operator + ozgcloud: + muk: + enabled: true + asserts: + - contains: + path: rules + content: + apiGroups: + - "" + resources: + - secrets + verbs: + - update + resourceNames: + - muk-user-secret + documentIndex: 1 + - it: test eltertransferOperator namespace must be set msg + set: + ozgcloud: + muk: + enabled: true + asserts: + - failedTemplate: + errorMessage: elsterTransferOperator.namespace must be set + + - it: RBAC not created by default + asserts: + - hasDocuments: + count: 0 + \ No newline at end of file diff --git a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/servicekonto/ServiceKonto.java b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/servicekonto/ServiceKonto.java index dc55642a887b0d8a453a10ead82e0fb7de5970c8..c65e33018262555e9b38727cf434e221ec3ac4eb 100644 --- a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/servicekonto/ServiceKonto.java +++ b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/servicekonto/ServiceKonto.java @@ -24,7 +24,7 @@ public class ServiceKonto { @Singular private List<PostfachAddress> postfachAddresses; - static class ServiceKontoBuilder { + public static class ServiceKontoBuilder { public ServiceKontoBuilder trustLevel(String trustLevel) { validateTrustLevel(trustLevel); diff --git a/vorgang-manager-server/src/main/resources/application.yml b/vorgang-manager-server/src/main/resources/application.yml index 27c32295fea74eaca2e91f8ef769892658932e9b..6784f1d84c27c3a9745a4eb3f978d175cb440eeb 100644 --- a/vorgang-manager-server/src/main/resources/application.yml +++ b/vorgang-manager-server/src/main/resources/application.yml @@ -96,7 +96,4 @@ ozgcloud: user-manager: address: ${grpc.client.user-manager.address:false} negotiation-type: ${grpc.client.user-manager.negotiationType} - antragraum: - entityId: https://antragsraum.ozgcloud.de/ - metadataUri: "classpath:/bayernid/bayernid-idp-infra.xml" diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/nachrichten/antragraum/AntragraumITCase.java b/vorgang-manager-server/src/test/java/de/ozgcloud/nachrichten/antragraum/AntragraumITCase.java new file mode 100644 index 0000000000000000000000000000000000000000..81ff258399f0ffa813c0ac5837c83d4d5e8ec544 --- /dev/null +++ b/vorgang-manager-server/src/test/java/de/ozgcloud/nachrichten/antragraum/AntragraumITCase.java @@ -0,0 +1,226 @@ +package de.ozgcloud.nachrichten.antragraum; + +import static org.assertj.core.api.Assertions.*; +import static org.mockito.ArgumentMatchers.*; +import static org.mockito.Mockito.*; + +import java.util.Collections; +import java.util.List; +import java.util.Map; + +import org.apache.commons.lang3.StringUtils; +import org.apache.xml.security.stax.ext.XMLSecurityConstants.DIRECTION; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import org.mockito.ArgumentCaptor; +import org.mockito.Captor; +import org.mockito.Mock; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.data.mongodb.core.MongoOperations; +import org.springframework.security.test.context.support.WithMockUser; +import org.springframework.test.annotation.DirtiesContext; + +import de.ozgcloud.common.test.DataITCase; +import de.ozgcloud.common.test.TestUtils; +import de.ozgcloud.nachrichten.postfach.PostfachAddress; +import de.ozgcloud.nachrichten.postfach.PostfachNachricht; +import de.ozgcloud.nachrichten.postfach.PostfachNachrichtTestFactory; +import de.ozgcloud.nachrichten.postfach.osi.OsiPostfachProperties; +import de.ozgcloud.nachrichten.postfach.osi.ReplyOption; +import de.ozgcloud.vorgang.VorgangManagerServerApplication; +import de.ozgcloud.vorgang.attached_item.VorgangAttachedItem; +import de.ozgcloud.vorgang.attached_item.VorgangAttachedItemTestFactory; +import de.ozgcloud.vorgang.servicekonto.PostfachAddressTestFactory; +import de.ozgcloud.vorgang.servicekonto.ServiceKonto; +import de.ozgcloud.vorgang.servicekonto.ServiceKontoTestFactory; +import de.ozgcloud.vorgang.vorgang.Vorgang; +import de.ozgcloud.vorgang.vorgang.VorgangHeadTestFactory; +import de.ozgcloud.vorgang.vorgang.VorgangTestFactory; +import io.grpc.stub.StreamObserver; + +@SpringBootTest(classes = { VorgangManagerServerApplication.class, OsiPostfachProperties.class }, properties = { + "grpc.server.in-process-name=postfachitcase", + "ozgcloud.antragraum.url=https://localhost/dummy/antragraum", + "ozgcloud.antragraum.entityId=dummy-id", + "ozgcloud.antragraum.metadataUri=http://localhost/dummy/antragraum/uri", + "ozgcloud.antragraum.decryptionPrivateKey=dummyPrivateKey", + "ozgcloud.antragraum.decryptionCertificate=dummyCertificate", + "grpc.client.ozgcloud-command-manager.address=in-process:postfachitcase", + "grpc.client.command-manager.address=in-process:postfachitcase", + "grpc.client.info-manager.address=in-process:postfachitcase", + "grpc.client.vorgang-manager.address=in-process:postfachitcase", +}) +@WithMockUser +@DataITCase +@DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_CLASS) +class AntragraumITCase { + + @Autowired + private AntragraumGrpcService grpcService; + @Autowired + private MongoOperations mongoOperations; + + @MockBean + private Saml2Decrypter decrypter; + @MockBean + private Saml2Verifier verifier; + + @BeforeEach + void prepareDatabase() { + mongoOperations.dropCollection(Vorgang.COLLECTION_NAME); + mongoOperations.dropCollection(VorgangAttachedItem.COLLECTION_NAME); + } + + @DisplayName("Find rueckfragen") + @Nested + class TestFindRueckfragen { + + @Mock + private StreamObserver<GrpcFindRueckfragenResponse> responseObserver; + + @Captor + private ArgumentCaptor<GrpcFindRueckfragenResponse> captor; + + @BeforeEach + void mock() { + when(decrypter.decryptPostfachId(any())).thenReturn(PostfachAddressTestFactory.STRING_BASED_IDENTIFIER_POSTFACH_ID_VALUE); + when(verifier.verify(any())).thenReturn(Collections.emptyList()); + } + + @DisplayName("with nachrichten from different vorgaenge") + @Nested + class TestWithDifferentVorgangId { + + private Vorgang vorgangTrustLevel3; + private Vorgang vorgangTrustLevel2; + + @BeforeEach + void prepareDatabase() { + vorgangTrustLevel3 = mongoOperations.save(createVorgang(TrustLevel.LEVEL_3), Vorgang.COLLECTION_NAME); + mongoOperations.save(createPostfachNachrichtVorgangAttachedItem(vorgangTrustLevel3.getId()), VorgangAttachedItem.COLLECTION_NAME); + + vorgangTrustLevel2 = mongoOperations.save(createVorgang(TrustLevel.LEVEL_2), Vorgang.COLLECTION_NAME); + mongoOperations.save(createPostfachNachrichtVorgangAttachedItem(vorgangTrustLevel2.getId()), VorgangAttachedItem.COLLECTION_NAME); + } + + @Test + void shouldHaveTrustLevelForVorgang() { + when(decrypter.decryptTrustLevel(any())).thenReturn(TrustLevel.LEVEL_4.getValue()); + + var rueckfragen = findRueckfragen().stream() + .filter(rueckfrage -> StringUtils.equals(rueckfrage.getVorgangId(), vorgangTrustLevel3.getId())) + .toList(); + + assertThat(rueckfragen).isNotEmpty().hasSize(1); + assertThat(rueckfragen.get(0).getTrustLevel()).isEqualTo(TrustLevel.LEVEL_3.getValue()); + assertThat(rueckfragen.get(0).getAccessible()).isTrue(); + } + + @Test + void shouldHaveTrustLevelForOtherVorgang() { + when(decrypter.decryptTrustLevel(any())).thenReturn(TrustLevel.LEVEL_1.getValue()); + + var rueckfragen = findRueckfragen().stream() + .filter(rueckfrage -> StringUtils.equals(rueckfrage.getVorgangId(), vorgangTrustLevel2.getId())) + .toList(); + + assertThat(rueckfragen).isNotEmpty().hasSize(1); + assertThat(rueckfragen.get(0).getTrustLevel()).isEqualTo(TrustLevel.LEVEL_2.getValue()); + assertThat(rueckfragen.get(0).getAccessible()).isFalse(); + } + } + + @DisplayName("with nachrichten from one vorgang") + @Nested + class TestWithOneVorgangId { + + @BeforeEach + void prepareDatabase() { + var vorgang = mongoOperations.save(createVorgang(TrustLevel.LEVEL_3), Vorgang.COLLECTION_NAME); + mongoOperations.save(createPostfachNachrichtVorgangAttachedItem(vorgang.getId()), VorgangAttachedItem.COLLECTION_NAME); + } + + @Test + void shouldReturnOnMatchingTokenTrustLevel() { + when(decrypter.decryptTrustLevel(any())).thenReturn(TrustLevel.LEVEL_3.getValue()); + + var rueckfragen = findRueckfragen(); + + assertThat(rueckfragen).isNotEmpty().hasSize(1); + assertThat(rueckfragen.get(0).getTrustLevel()).isEqualTo(TrustLevel.LEVEL_3.getValue()); + assertThat(rueckfragen.get(0).getAccessible()).isTrue(); + } + + @Test + void shouldReturnOnLowerTokenTrustLevel() { + when(decrypter.decryptTrustLevel(any())).thenReturn(TrustLevel.LEVEL_1.getValue()); + + var rueckfragen = findRueckfragen(); + + assertThat(rueckfragen).isNotEmpty().hasSize(1); + assertThat(rueckfragen.get(0).getTrustLevel()).isEqualTo(TrustLevel.LEVEL_3.getValue()); + assertThat(rueckfragen.get(0).getAccessible()).isFalse(); + } + + @Test + void shouldReturnOnHigherTokenTrustLevel() { + when(decrypter.decryptTrustLevel(any())).thenReturn(TrustLevel.LEVEL_4.getValue()); + + var rueckfragen = findRueckfragen(); + + assertThat(rueckfragen).isNotEmpty().hasSize(1); + assertThat(rueckfragen.get(0).getTrustLevel()).isEqualTo(TrustLevel.LEVEL_3.getValue()); + assertThat(rueckfragen.get(0).getAccessible()).isTrue(); + } + } + + private List<GrpcRueckfrageHead> findRueckfragen() { + grpcService.findRueckfragen( + GrpcFindRueckfrageRequestTestFactory.createBuilder().setSamlToken(TestUtils.loadTextFile("SamlResponse.xml")).build(), + responseObserver); + verify(responseObserver).onNext(captor.capture()); + return captor.getValue().getRueckfrageHeadList(); + } + } + + private Vorgang createVorgang(TrustLevel trustLevel) { + return VorgangTestFactory.createBuilder() + .id(null) + .header(VorgangHeadTestFactory.createBuilder().serviceKonto(createBayernIdServiceKonto(trustLevel)).build()) + .build(); + } + + private ServiceKonto createBayernIdServiceKonto(TrustLevel trustLevel) { + return ServiceKontoTestFactory.createBuilder().type("BayernID").trustLevel(trustLevel.getValue()).build(); + } + + private VorgangAttachedItem createPostfachNachrichtVorgangAttachedItem(String vorgangId) { + return VorgangAttachedItemTestFactory.createBuilder() + .id(null) + .version(0) + .vorgangId(vorgangId) + .itemName("PostfachMail") + .client("OzgCloud_NachrichtenManager") + .item(createBayernIdPostfachNachrichtItem(vorgangId)) + .build(); + } + + private Map<String, Object> createBayernIdPostfachNachrichtItem(String vorgangId) { + var nachrichtItem = PostfachNachrichtTestFactory.asMap(); + nachrichtItem.put(PostfachNachricht.FIELD_DIRECTION, DIRECTION.OUT.name()); + nachrichtItem.put(PostfachNachricht.FIELD_REPLY_OPTION, ReplyOption.POSSIBLE); + nachrichtItem.put(PostfachNachricht.FIELD_VORGANG_ID, vorgangId); + nachrichtItem.put(PostfachNachricht.FIELD_POSTFACH_ID, PostfachAddressTestFactory.STRING_BASED_IDENTIFIER_POSTFACH_ID_VALUE); + nachrichtItem.put(PostfachNachricht.POSTFACH_ADDRESS_FIELD, Map.of( + PostfachAddress.TYPE_FIELD, 0, + PostfachAddress.VERSION_FIELD, 1, + PostfachAddress.IDENTIFIER_FIELD, + Map.of(PostfachNachricht.FIELD_POSTFACH_ID, PostfachAddressTestFactory.STRING_BASED_IDENTIFIER_POSTFACH_ID_VALUE), + PostfachAddress.SERVICEKONTO_TYPE_FIELD, "BayernID")); + return nachrichtItem; + } +} \ No newline at end of file