From bd0298993168eb3ea0d7c5b51f8ea37b64e0f019 Mon Sep 17 00:00:00 2001 From: OZGCloud <ozgcloud@mgm-tp.com> Date: Mon, 21 Oct 2024 17:02:40 +0200 Subject: [PATCH] 6711 resolve part of the comments --- Jenkinsfile | 60 ++++--- README.md | 1 + pom.xml | 154 +----------------- src/main/helm/templates/deployment.yaml | 25 +-- ...ransfer_operator_user_read_write_role.yaml | 40 ----- ...operator_user_read_write_role_binding.yaml | 12 ++ .../helm/templates/rbacs/service_account.yaml | 24 +-- src/main/helm/values.yaml | 26 --- ... ElsterTransferOperatorConfiguration.java} | 2 +- .../elstertransfer/user/Constants.java | 16 ++ ...gCloudElsterTransferConfigMapUserList.java | 10 +- .../OzgCloudElsterTransferUserReconciler.java | 31 ++-- ...gCloudElsterTransferUserRemoteService.java | 42 +++-- .../OzgCloudElsterTransferUserService.java | 32 ++-- .../user/UserUpdateControlBuilder.java | 62 +++++++ src/test/helm/deployment_env_test.yaml | 27 +-- .../helm/deployment_matchlabels_test.yaml | 35 +--- .../helm/deployment_metadata_labels_test.yaml | 41 +---- .../helm/deployment_pull_secret_test.yaml | 40 ++--- src/test/helm/deployment_resources_test.yaml | 27 +-- src/test/helm/deployment_test.yaml | 38 +---- src/test/helm/helm-linter-values.yaml | 4 - ...tor_user_read_write_role_binding_test.yaml | 35 ++++ ...er_operator_user_read_write_role_test.yaml | 60 +------ src/test/helm/rbacs/service_account_test.yaml | 24 +-- ...ElsterTransferOperatorApplicationTest.java | 35 ---- ...zgCloudElsterTransferConfigMapFactory.java | 15 +- ...lsterTransferConfigMapUserListFactory.java | 15 +- ...udElsterTransferConfigMapUserListTest.java | 38 +++-- ...CloudElsterTransferUserReconcilerTest.java | 43 +---- ...udElsterTransferUserRemoteServiceTest.java | 17 +- ...OzgCloudElsterTransferUserServiceTest.java | 18 +- ...OzgCloudElsterTransferUserTestFactory.java | 5 +- 33 files changed, 334 insertions(+), 720 deletions(-) create mode 100644 src/main/helm/templates/rbacs/ozgcloud_elstertransfer_operator_user_read_write_role_binding.yaml rename src/main/java/de/ozgcloud/operator/{Config.java => ElsterTransferOperatorConfiguration.java} (97%) create mode 100644 src/main/java/de/ozgcloud/operator/elstertransfer/user/Constants.java create mode 100644 src/main/java/de/ozgcloud/operator/elstertransfer/user/UserUpdateControlBuilder.java create mode 100644 src/test/helm/rbacs/ozgcloud_elstertransfer_operator_user_read_write_role_binding_test.yaml delete mode 100644 src/test/java/de/ozgcloud/operator/elstertransfer/ElsterTransferOperatorApplicationTest.java diff --git a/Jenkinsfile b/Jenkinsfile index 2889a53..0667333 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -81,11 +81,11 @@ pipeline { } } } - // post { - // always{ - // junit testResults: '**/target/surefire-reports/*.xml', skipPublishingChecks: true - // } - // } + post { + always{ + junit testResults: '**/target/surefire-reports/*.xml', skipPublishingChecks: true + } + } } stage('Deploy to Nexus'){ @@ -192,6 +192,18 @@ pipeline { } } } + post { + always{ + junit testResults: '**/target/surefire-reports/*.xml', skipPublishingChecks: true + } + failure { + script { + if (env.BRANCH_NAME == 'master' || env.BRANCH_NAME == 'release') { + sendFailureMessage() + } + } + } + } } @@ -214,12 +226,9 @@ String getHelmRepoUrl(){ } String generateHelmChartVersion() { - def chartVersion = getPomVersion('pom.xml') - - if (isMasterBranch()) { - chartVersion += "-${env.GIT_COMMIT.take(7)}" - } - else if (!isReleaseBranch()) { + def chartVersion = "${getPomVersion('pom.xml')}"+"-${env.GIT_COMMIT.take(7)}" + + if (!isReleaseBranch()) { chartVersion += "-${env.BRANCH_NAME}" } @@ -326,19 +335,9 @@ String getPomVersion(String pomFile){ } String generateImageTag() { - def imageTag = "${env.BRANCH_NAME}-${getPomVersion('pom.xml')}" - - if (env.BRANCH_NAME == 'master') { - imageTag += "-${env.GIT_COMMIT.take(7)}" - } - - return imageTag + return "${env.BRANCH_NAME}-${getPomVersion('pom.xml')}"+"-${env.GIT_COMMIT.take(7)}" } -String getParentPomVersion(String filePath) { - def pom = readMavenPom file: filePath - return pom.parent.version -} Boolean isReleaseVersion(List versions) { return matchRegexVersion(versions, RELEASE_REGEX) @@ -357,3 +356,20 @@ Boolean matchRegexVersion(List versions, String regex) { return true } + +Void sendFailureMessage() { + def room = '' + def data = """{"msgtype":"m.text", \ + "body":"FachstelleServer: Build Failed. Stage: ${FAILED_STAGE} Build-ID: ${env.BUILD_NUMBER} Link: ${BLUE_OCEAN_URL}", \ + "format": "org.matrix.custom.html", \ + "formatted_body":"FachstelleServer: Build Failed. Stage: ${FAILED_STAGE} Build-ID: <a href='${BLUE_OCEAN_URL}'>${env.BUILD_NUMBER}</a>"}""" + + if (env.BRANCH_NAME == 'master') { + room = "!iQPAvQIiRwRpNOszjw:matrix.ozg-sh.de" + } + else if (env.BRANCH_NAME == 'release') { + room = "!oWZpUGTFsxkJIYNfYg:matrix.ozg-sh.de" + } + + sh "curl -XPOST -H 'authorization: Bearer ${getElementAccessToken()}' -d '${data}' https://matrix.ozg-sh.de/_matrix/client/v3/rooms/$room/send/m.room.message" +} diff --git a/README.md b/README.md index ce74e20..c487311 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,3 @@ +# Ozgcloud-Elster-Transfer Operator Um die Mandantenfähigkeit des Elster-Transfer Service nutzen zu können, muss für jede Kommune ein Service User im Elster-Transfer angelegt werden. Hierfür soll ein neuer Operator für den Elster-Transfer entwickelt werden. Der Operator soll einen neuen Nutzer anlegen und die Logindaten in den Namespace der Kommune ablegen. \ No newline at end of file diff --git a/pom.xml b/pom.xml index 4b246e0..e3fd9ba 100644 --- a/pom.xml +++ b/pom.xml @@ -4,9 +4,9 @@ <modelVersion>4.0.0</modelVersion> <parent> - <groupId>org.springframework.boot</groupId> - <artifactId>spring-boot-starter-parent</artifactId> - <version>3.2.6</version> + <groupId>de.ozgcloud.common</groupId> + <artifactId>ozgcloud-common-parent</artifactId> + <version>4.3.2</version> <relativePath/> </parent> @@ -19,32 +19,13 @@ <properties> - <spring-boot.version>3.1.8</spring-boot.version> <operator-sdk.version>5.4.1</operator-sdk.version> - - <!-- tools --> - <commons-beanutils.version>1.9.4</commons-beanutils.version> - <lombok.version>1.18.28</lombok.version> - <mapstruct.version>1.5.5.Final</mapstruct.version> - <reflections.version>0.10.2</reflections.version> - <validation-api.version>2.0.1.Final</validation-api.version> - <lorem.version>2.2</lorem.version> - <elster-transfer.version>elster-transfer-24.04-rest-api-docs.yaml</elster-transfer.version> - - <!-- test --> - <junit-jupiter.version>5.10.1</junit-jupiter.version> - <kubernetes-server-mock.version>6.9.2</kubernetes-server-mock.version> - <io.javaoperatorsdk.version>0.9.5</io.javaoperatorsdk.version> - - <!-- plugin --> - <license-maven-plugin.version>4.1</license-maven-plugin.version> - <ozgcloud-license.version>1.6.0</ozgcloud-license.version> - <spring-boot.build-image.imageName>docker.ozg-sh.de/ozgcloud-elster-transfer-operator:build-latest - </spring-boot.build-image.imageName> - + <spring-security-core.version>6.3.3</spring-security-core.version> + <spring-boot.build-image.imageName>docker.ozg-sh.de/ozgcloud-elster-transfer-operator:build-latest</spring-boot.build-image.imageName> </properties> <dependencies> + <!-- spring --> <dependency> <groupId>org.springframework.boot</groupId> @@ -53,31 +34,18 @@ <dependency> <groupId>io.javaoperatorsdk</groupId> <artifactId>operator-framework-spring-boot-starter</artifactId> + <version>${operator-sdk.version}</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> - <dependency> + <dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-core</artifactId> - <version>5.7.2</version> <!-- Use the appropriate version for your project --> + <version>${spring-security-core.version}</version> </dependency> - <!-- tools --> - <dependency> - <groupId>org.projectlombok</groupId> - <artifactId>lombok</artifactId> - </dependency> - <dependency> - <groupId>commons-beanutils</groupId> - <artifactId>commons-beanutils</artifactId> - </dependency> - <dependency> - <groupId>com.thedeanda</groupId> - <artifactId>lorem</artifactId> - </dependency> - <dependency> <groupId>org.yaml</groupId> <artifactId>snakeyaml</artifactId> @@ -95,110 +63,8 @@ </exclusion> </exclusions> </dependency> - <dependency> - <groupId>org.junit.jupiter</groupId> - <artifactId>junit-jupiter-engine</artifactId> - <scope>test</scope> - </dependency> - <dependency> - <groupId>org.junit.jupiter</groupId> - <artifactId>junit-jupiter-params</artifactId> - <scope>test</scope> - </dependency> - <dependency> - <groupId>io.fabric8</groupId> - <artifactId>kubernetes-server-mock</artifactId> - <scope>test</scope> - </dependency> </dependencies> - <dependencyManagement> - <dependencies> - <!-- own projects --> - <dependency> - <groupId>de.ozgcloud.common</groupId> - <artifactId>ozgcloud-common-license</artifactId> - <version>${ozgcloud-license.version}</version> - </dependency> - - <!-- spring --> - <dependency> - <groupId>org.springframework.boot</groupId> - <artifactId>spring-boot-starter</artifactId> - <version>${spring-boot.version}</version> - </dependency> - <dependency> - <groupId>io.javaoperatorsdk</groupId> - <artifactId>operator-framework-spring-boot-starter</artifactId> - <version>${operator-sdk.version}</version> - </dependency> - - <!-- tools --> - <dependency> - <groupId>org.projectlombok</groupId> - <artifactId>lombok</artifactId> - <version>${lombok.version}</version> - </dependency> - <dependency> - <groupId>org.mapstruct</groupId> - <artifactId>mapstruct</artifactId> - <version>${mapstruct.version}</version> - </dependency> - <dependency> - <groupId>org.reflections</groupId> - <artifactId>reflections</artifactId> - <version>${reflections.version}</version> - </dependency> - <dependency> - <groupId>commons-beanutils</groupId> - <artifactId>commons-beanutils</artifactId> - <version>${commons-beanutils.version}</version> - </dependency> - <dependency> - <groupId>com.thedeanda</groupId> - <artifactId>lorem</artifactId> - <version>${lorem.version}</version> - </dependency> - - <!-- javax --> - <dependency> - <groupId>javax.validation</groupId> - <artifactId>validation-api</artifactId> - <version>${validation-api.version}</version> - </dependency> - - <!-- test --> - <dependency> - <groupId>org.junit.jupiter</groupId> - <artifactId>junit-jupiter-engine</artifactId> - <version>${junit-jupiter.version}</version> - <scope>test</scope> - </dependency> - <dependency> - <groupId>org.junit.jupiter</groupId> - <artifactId>junit-jupiter-params</artifactId> - <version>${junit-jupiter.version}</version> - <scope>test</scope> - </dependency> - <dependency> - <groupId>io.fabric8</groupId> - <artifactId>kubernetes-server-mock</artifactId> - <version>${kubernetes-server-mock.version}</version> - </dependency> - <dependency> - <groupId>io.javaoperatorsdk</groupId> - <artifactId>jenvtest-fabric8-client-support</artifactId> - <version>${io.javaoperatorsdk.version}</version> - <scope>test</scope> - </dependency> - <dependency> - <groupId>io.javaoperatorsdk</groupId> - <artifactId>jenvtest</artifactId> - <version>${io.javaoperatorsdk.version}</version> - <scope>test</scope> - </dependency> - </dependencies> - </dependencyManagement> <build> <pluginManagement> @@ -206,7 +72,6 @@ <plugin> <groupId>com.mycila</groupId> <artifactId>license-maven-plugin</artifactId> - <version>${license-maven-plugin.version}</version> <configuration> <mapping> <ts>SLASHSTAR_STYLE</ts> @@ -227,7 +92,6 @@ <dependency> <groupId>de.ozgcloud.common</groupId> <artifactId>ozgcloud-common-license</artifactId> - <version>${ozgcloud-license.version}</version> </dependency> </dependencies> </plugin> diff --git a/src/main/helm/templates/deployment.yaml b/src/main/helm/templates/deployment.yaml index b4f06b7..e550d45 100644 --- a/src/main/helm/templates/deployment.yaml +++ b/src/main/helm/templates/deployment.yaml @@ -1,27 +1,4 @@ -# 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. -# - apiVersion: apps/v1 kind: Deployment metadata: @@ -47,7 +24,7 @@ spec: serviceAccountName: ozgcloud-elster-transfer-operator-service-account containers: - name: ozgcloud-elster-transfer-operator - image: "{{ required "image.repo must be set" (.Values.image).repo }}/{{ required "image.name must be set" (.Values.image).name }}:{{ required "image.tag must be set" (.Values.image).tag }}" + image: "{{ (.Values.image).repo }}/{{ (.Values.image).name }}:{{ coalesce (.Values.image).tag "latest" }}" env: {{- with include "app.getCustomList" . }} {{ . | indent 8 }} diff --git a/src/main/helm/templates/rbacs/ozgcloud_elstertransfer_operator_user_read_write_role.yaml b/src/main/helm/templates/rbacs/ozgcloud_elstertransfer_operator_user_read_write_role.yaml index 753e24b..22f3bf5 100644 --- a/src/main/helm/templates/rbacs/ozgcloud_elstertransfer_operator_user_read_write_role.yaml +++ b/src/main/helm/templates/rbacs/ozgcloud_elstertransfer_operator_user_read_write_role.yaml @@ -1,43 +1,3 @@ -# -# 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. -# - - - -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: ozgcloud-elster-transfer-operator-user-read-write-role-binding -subjects: -- kind: ServiceAccount - name: ozgcloud-elster-transfer-operator-service-account - namespace: {{ include "app.namespace" . }} -roleRef: - kind: ClusterRole - name: ozgcloud-elster-transfer-operator-user-read-write-role - apiGroup: rbac.authorization.k8s.io - ---- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole diff --git a/src/main/helm/templates/rbacs/ozgcloud_elstertransfer_operator_user_read_write_role_binding.yaml b/src/main/helm/templates/rbacs/ozgcloud_elstertransfer_operator_user_read_write_role_binding.yaml new file mode 100644 index 0000000..208df7c --- /dev/null +++ b/src/main/helm/templates/rbacs/ozgcloud_elstertransfer_operator_user_read_write_role_binding.yaml @@ -0,0 +1,12 @@ +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + name: ozgcloud-elster-transfer-operator-user-read-write-role-binding +subjects: +- kind: ServiceAccount + name: ozgcloud-elster-transfer-operator-service-account + namespace: {{ include "app.namespace" . }} +roleRef: + kind: ClusterRole + name: ozgcloud-elster-transfer-operator-user-read-write-role + apiGroup: rbac.authorization.k8s.io diff --git a/src/main/helm/templates/rbacs/service_account.yaml b/src/main/helm/templates/rbacs/service_account.yaml index e4c3b8a..2085b96 100644 --- a/src/main/helm/templates/rbacs/service_account.yaml +++ b/src/main/helm/templates/rbacs/service_account.yaml @@ -1,26 +1,4 @@ -# -# 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. -# + apiVersion: v1 kind: ServiceAccount metadata: diff --git a/src/main/helm/values.yaml b/src/main/helm/values.yaml index d71f827..8b13789 100644 --- a/src/main/helm/values.yaml +++ b/src/main/helm/values.yaml @@ -1,27 +1 @@ -# -# 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. -# - -image: - repo: docker.ozg-sh.de diff --git a/src/main/java/de/ozgcloud/operator/Config.java b/src/main/java/de/ozgcloud/operator/ElsterTransferOperatorConfiguration.java similarity index 97% rename from src/main/java/de/ozgcloud/operator/Config.java rename to src/main/java/de/ozgcloud/operator/ElsterTransferOperatorConfiguration.java index 4a99874..131e324 100644 --- a/src/main/java/de/ozgcloud/operator/Config.java +++ b/src/main/java/de/ozgcloud/operator/ElsterTransferOperatorConfiguration.java @@ -33,7 +33,7 @@ import io.javaoperatorsdk.operator.Operator; import io.javaoperatorsdk.operator.api.reconciler.Reconciler; @Configuration -public class Config { +public class ElsterTransferOperatorConfiguration { public static final Duration RECONCILER_RETRY_SECONDS = Duration.ofSeconds(20); public static final Duration RECONCILER_RETRY_SECONDS_ON_ERROR = Duration.ofSeconds(60); diff --git a/src/main/java/de/ozgcloud/operator/elstertransfer/user/Constants.java b/src/main/java/de/ozgcloud/operator/elstertransfer/user/Constants.java new file mode 100644 index 0000000..49f4eec --- /dev/null +++ b/src/main/java/de/ozgcloud/operator/elstertransfer/user/Constants.java @@ -0,0 +1,16 @@ +package de.ozgcloud.operator.elstertransfer.user; + +public class Constants { + + public static final String CONFIG_MAP_NAME = "etr-user-config"; + public static final String USERS_KEY = "users.yaml"; + public static final String ELSTER_TRANSFER_USER_LOGIN_KEY = "login"; + public static final String ELSTER_TRANSFER_USER_PASSWORD_KEY = "password"; + // todo + public static final String ETR_NAMESPACE = "etr-user-creation"; + public static final String USER_ROLE = "USER"; + public static final String ETR_DEPLOYMENT_NAME = "elster-transfer"; + public static final String MUK_USER_SECRET_NAME = "muk-user-secret"; + + +} diff --git a/src/main/java/de/ozgcloud/operator/elstertransfer/user/OzgCloudElsterTransferConfigMapUserList.java b/src/main/java/de/ozgcloud/operator/elstertransfer/user/OzgCloudElsterTransferConfigMapUserList.java index 4c6b1a3..e6c665c 100644 --- a/src/main/java/de/ozgcloud/operator/elstertransfer/user/OzgCloudElsterTransferConfigMapUserList.java +++ b/src/main/java/de/ozgcloud/operator/elstertransfer/user/OzgCloudElsterTransferConfigMapUserList.java @@ -18,12 +18,8 @@ public class OzgCloudElsterTransferConfigMapUserList { } boolean existsUser(String login) { - for (Map<String, Object> existingUser : usersList) { - if (login.equals(existingUser.get("login"))) { - return true; - } - } - return false; + return usersList.stream() + .anyMatch(existingUser -> login.equals(existingUser.get("login"))); } void addUserToList(String login, String passwordHash, String role) { @@ -39,8 +35,6 @@ public class OzgCloudElsterTransferConfigMapUserList { usersList.removeIf(userMap -> userLogin.equals(userMap.get("login"))); } - // TODO Prüfen, ob diese Methode tatsächlich gebraucht wird! Sonst überall mit - // der Klasse arbeiten. public List<Map<String, Object>> getUsersList() { return usersList; } diff --git a/src/main/java/de/ozgcloud/operator/elstertransfer/user/OzgCloudElsterTransferUserReconciler.java b/src/main/java/de/ozgcloud/operator/elstertransfer/user/OzgCloudElsterTransferUserReconciler.java index 404c701..09806f5 100644 --- a/src/main/java/de/ozgcloud/operator/elstertransfer/user/OzgCloudElsterTransferUserReconciler.java +++ b/src/main/java/de/ozgcloud/operator/elstertransfer/user/OzgCloudElsterTransferUserReconciler.java @@ -2,7 +2,7 @@ package de.ozgcloud.operator.elstertransfer.user; import org.springframework.stereotype.Component; -import de.ozgcloud.operator.Config; +import de.ozgcloud.operator.ElsterTransferOperatorConfiguration; import de.ozgcloud.operator.elstertransfer.OzgCloudCustomResourceStatus; import io.javaoperatorsdk.operator.api.reconciler.Cleaner; import io.javaoperatorsdk.operator.api.reconciler.Context; @@ -19,7 +19,7 @@ import lombok.extern.log4j.Log4j2; @Component public class OzgCloudElsterTransferUserReconciler implements Reconciler<OzgCloudElsterTransferUser>, Cleaner<OzgCloudElsterTransferUser> { - private final OzgCloudElsterTransferUserService elsterTransferUserService; + private final OzgCloudElsterTransferUserService service; @Override public UpdateControl<OzgCloudElsterTransferUser> reconcile(OzgCloudElsterTransferUser elsterTransferUser, @@ -27,33 +27,34 @@ public class OzgCloudElsterTransferUserReconciler implements Reconciler<OzgCloud try { String namespace = elsterTransferUser.getMetadata().getNamespace(); - elsterTransferUserService.updateConfigMapAndRestartDeploymentAndCreateSecret(namespace); + service.updateConfigMapAndRestartDeploymentAndCreateSecret(namespace); - elsterTransferUser.setStatus(getElsterTransferUserStatus(OzgCloudCustomResourceStatus.OK, "Status: OK")); - return UpdateControl.updateStatus(elsterTransferUser); + return UserUpdateControlBuilder.fromResource(elsterTransferUser) + .withStatus(OzgCloudCustomResourceStatus.OK) + .withMessage("Status: OK") + .withReschedule(ElsterTransferOperatorConfiguration.RECONCILER_RETRY_SECONDS) + .build(); } catch (Exception e) { - LOG.warn(elsterTransferUser.getMetadata().getName() + " could not reconcile in namespace " - + elsterTransferUser.getMetadata().getNamespace(), e); - elsterTransferUser - .setStatus(getElsterTransferUserStatus(OzgCloudCustomResourceStatus.ERROR, e.getMessage())); - return UpdateControl.updateStatus(elsterTransferUser).rescheduleAfter(Config.RECONCILER_RETRY_SECONDS); + LOG.warn("{} could not reconcile in namespace {}: {}.", elsterTransferUser.getMetadata().getName(), elsterTransferUser.getMetadata().getNamespace(), e); + return UserUpdateControlBuilder.fromResource(elsterTransferUser) + .withStatus(OzgCloudCustomResourceStatus.ERROR) + .withMessage(e.getMessage()) + .withReschedule(ElsterTransferOperatorConfiguration.RECONCILER_RETRY_SECONDS_ON_ERROR) + .build(); } } - OzgCloudElsterTransferUserStatus getElsterTransferUserStatus(OzgCloudCustomResourceStatus status, String message) { - return OzgCloudElsterTransferUserStatus.builder().status(status).message(message).build(); - } @Override public DeleteControl cleanup(OzgCloudElsterTransferUser user, Context<OzgCloudElsterTransferUser> context) { LOG.info("{} cleanup...", user.getMetadata().getName()); String namespace = user.getMetadata().getNamespace(); try { - elsterTransferUserService.deleteUserAndRestartDeploymentIfNotKeepUserAndUserExists(user); + service.deleteUserAndRestartDeploymentIfNotKeepUserAndUserExists(user); return DeleteControl.defaultDelete(); } catch (Exception e) { LOG.warn(namespace + " could not delete.", e); - return DeleteControl.noFinalizerRemoval().rescheduleAfter(Config.RECONCILER_RETRY_SECONDS_ON_ERROR); + return DeleteControl.noFinalizerRemoval().rescheduleAfter(ElsterTransferOperatorConfiguration.RECONCILER_RETRY_SECONDS_ON_ERROR); } } diff --git a/src/main/java/de/ozgcloud/operator/elstertransfer/user/OzgCloudElsterTransferUserRemoteService.java b/src/main/java/de/ozgcloud/operator/elstertransfer/user/OzgCloudElsterTransferUserRemoteService.java index 23a43fa..2f0760d 100644 --- a/src/main/java/de/ozgcloud/operator/elstertransfer/user/OzgCloudElsterTransferUserRemoteService.java +++ b/src/main/java/de/ozgcloud/operator/elstertransfer/user/OzgCloudElsterTransferUserRemoteService.java @@ -1,6 +1,7 @@ package de.ozgcloud.operator.elstertransfer.user; import java.util.Base64; +import java.util.Objects; import org.springframework.stereotype.Component; import org.yaml.snakeyaml.Yaml; @@ -20,17 +21,21 @@ public class OzgCloudElsterTransferUserRemoteService { private final KubernetesClient client; + public ConfigMap getConfigMap(String configmapNamespace, String configMapName) { return client.configMaps().inNamespace(configmapNamespace).withName(configMapName).get(); } public ConfigMap createConfigMap(String configmapNamespace, String configMapName) { - ConfigMap configMap = new ConfigMapBuilder() - .withNewMetadata() - .withName(configMapName) - .endMetadata() - .build(); - return client.configMaps().inNamespace(configmapNamespace).resource(configMap).create(); + return client.configMaps().inNamespace(configmapNamespace).resource(buildConfigMap(configMapName)).create(); + } + + public ConfigMap buildConfigMap(String configMapName) { + return new ConfigMapBuilder() + .withNewMetadata() + .withName(configMapName) + .endMetadata() + .build(); } public void updateConfigMapData(ConfigMap configMap, String key, String data) { @@ -39,27 +44,36 @@ public class OzgCloudElsterTransferUserRemoteService { } public void restartDeployment(String namespace, String deploymentName) { - Resource<Deployment> deploymentResource = client.apps().deployments().inNamespace(namespace).withName(deploymentName); + Resource<Deployment> deploymentResource = getDeploymentResource(namespace, deploymentName); Deployment deployment = deploymentResource.get(); - if (deployment != null) { - setRestartFlag(deployment); + + if (Objects.nonNull(deployment)) { + setRestartAt(deployment); deploymentResource.replace(deployment); } } - void setRestartFlag(Deployment deployment) { + public Resource<Deployment> getDeploymentResource(String namespace, String deploymentName) { + return client.apps().deployments().inNamespace(namespace).withName(deploymentName); + } + + void setRestartAt(Deployment deployment) { deployment.getSpec().getTemplate().getMetadata().getAnnotations() .put("kubectl.kubernetes.io/restartedAt", String.valueOf(System.currentTimeMillis())); } public void createOrUpdateSecret(String namespace, String userPassword, String secretName) { - Secret secret = new SecretBuilder() + client.secrets().inNamespace(namespace).resource(buildUserSecret(namespace, userPassword, secretName )).createOrReplace(); + } + + public Secret buildUserSecret(String namespace, String userPassword, String secretName) { + return new SecretBuilder() .withNewMetadata() .withName(secretName) .endMetadata() - .addToData("login", Base64.getEncoder().encodeToString(namespace.getBytes())) - .addToData("password", Base64.getEncoder().encodeToString(userPassword.getBytes())) + .addToData(Constants.ELSTER_TRANSFER_USER_LOGIN_KEY, Base64.getEncoder().encodeToString(namespace.getBytes())) + .addToData(Constants.ELSTER_TRANSFER_USER_PASSWORD_KEY, Base64.getEncoder().encodeToString(userPassword.getBytes())) .build(); - client.secrets().inNamespace(namespace).resource(secret).createOrReplace(); } + } diff --git a/src/main/java/de/ozgcloud/operator/elstertransfer/user/OzgCloudElsterTransferUserService.java b/src/main/java/de/ozgcloud/operator/elstertransfer/user/OzgCloudElsterTransferUserService.java index 23c4ea0..8c33ba8 100644 --- a/src/main/java/de/ozgcloud/operator/elstertransfer/user/OzgCloudElsterTransferUserService.java +++ b/src/main/java/de/ozgcloud/operator/elstertransfer/user/OzgCloudElsterTransferUserService.java @@ -10,6 +10,7 @@ import org.springframework.stereotype.Component; import org.yaml.snakeyaml.Yaml; import io.fabric8.kubernetes.api.model.ConfigMap; +import io.micrometer.common.util.StringUtils; import lombok.RequiredArgsConstructor; import lombok.extern.log4j.Log4j2; @@ -19,22 +20,15 @@ import lombok.extern.log4j.Log4j2; public class OzgCloudElsterTransferUserService { private final OzgCloudElsterTransferUserRemoteService remoteService; - private static final String USERS_KEY = "users.yaml"; - // todo - private static final String ETR_NAMESPACE = "etr-user-creation"; - public static final String USER_ROLE = "USER"; - private static final String CONFIG_MAP_NAME = "etr-user-config"; - private static final String ETR_DEPLOYMENT_NAME = "elster-transfer"; - private static final String MUK_USER_SECRET_NAME = "muk-user-secret"; public void updateConfigMapAndRestartDeploymentAndCreateSecret(String namespace) { LOG.info("Updating/Creating Configmap"); - String userPassword = generateUsersYamlAndUpdateConfigMap(namespace, ETR_NAMESPACE, CONFIG_MAP_NAME); - if (!userPassword.isEmpty()) { + String userPassword = generateUsersYamlAndUpdateConfigMap(namespace, Constants.ETR_NAMESPACE, Constants.ELSTER_TRANSFER_USER_LOGIN_KEY); + if (StringUtils.isNotEmpty(userPassword)) { LOG.info("Restarting Deployment"); - restartDeployment(ETR_NAMESPACE, ETR_DEPLOYMENT_NAME); + restartDeployment(Constants.ETR_NAMESPACE, Constants.ETR_DEPLOYMENT_NAME); LOG.info("Creating Secret"); - createOrUpdateSecret(namespace, userPassword, MUK_USER_SECRET_NAME); + createOrUpdateSecret(namespace, userPassword, Constants.MUK_USER_SECRET_NAME); } } @@ -44,13 +38,13 @@ public class OzgCloudElsterTransferUserService { LOG.info("keep data"); return; } - if (!userExists(namespace, ETR_NAMESPACE, CONFIG_MAP_NAME)) { + if (!userExists(namespace, Constants.ETR_NAMESPACE, Constants.ELSTER_TRANSFER_USER_LOGIN_KEY)) { LOG.info("User not exists"); return; } LOG.info("{} do cleanup...", user.getMetadata()); - deleteUser(user.getMetadata().getNamespace(), CONFIG_MAP_NAME); - restartDeployment(ETR_NAMESPACE, ETR_DEPLOYMENT_NAME); + deleteUser(user.getMetadata().getNamespace(), Constants.ELSTER_TRANSFER_USER_LOGIN_KEY); + restartDeployment(Constants.ETR_NAMESPACE, Constants.ETR_DEPLOYMENT_NAME); } String generateUsersYamlAndUpdateConfigMap(String namespace, String configmapNamespace, String configMapName) { @@ -91,7 +85,7 @@ public class OzgCloudElsterTransferUserService { LOG.debug("Creating ConfigMap '{}' in namespace '{}'", configMapName, configmapNamespace); configMap = remoteService.createConfigMap(configmapNamespace, configMapName); } - remoteService.updateConfigMapData(configMap, USERS_KEY, usersYaml); + remoteService.updateConfigMapData(configMap, Constants.USERS_KEY, usersYaml); LOG.debug("ConfigMap updated successfully: {}", configMapName); } @@ -109,13 +103,13 @@ public class OzgCloudElsterTransferUserService { } void deleteUser(String userLogin, String configMapName) { - ConfigMap configMap = remoteService.getConfigMap(ETR_NAMESPACE, configMapName); + ConfigMap configMap = remoteService.getConfigMap(Constants.ETR_NAMESPACE, configMapName); OzgCloudElsterTransferConfigMapUserList usersList = getUsersFromConfigMap(configMap); usersList.removeDeleted(userLogin); String updatedUsersYaml = constructYamlEntries(usersList); - remoteService.updateConfigMapData(configMap, USERS_KEY, updatedUsersYaml); + remoteService.updateConfigMapData(configMap, Constants.USERS_KEY, updatedUsersYaml); LOG.info("User with login '{}' removed from configmap successfully", userLogin); } @@ -125,7 +119,7 @@ public class OzgCloudElsterTransferUserService { } OzgCloudElsterTransferConfigMapUserList getUsersFromConfigMap(ConfigMap configMap) { - String usersYaml = configMap.getData().get(USERS_KEY); + String usersYaml = configMap.getData().get(Constants.USERS_KEY); Map<String, Object> load = new Yaml().load(usersYaml); List<Map<String, Object>> usersList = (List<Map<String, Object>>) load.get("users"); return new OzgCloudElsterTransferConfigMapUserList(usersList); @@ -136,7 +130,7 @@ public class OzgCloudElsterTransferUserService { } void addNewUserToList(OzgCloudElsterTransferConfigMapUserList usersList, String login, String passwordHash) { - usersList.addUserToList(login, passwordHash, USER_ROLE); + usersList.addUserToList(login, passwordHash, Constants.USER_ROLE); } String constructYamlEntries(OzgCloudElsterTransferConfigMapUserList userList) { diff --git a/src/main/java/de/ozgcloud/operator/elstertransfer/user/UserUpdateControlBuilder.java b/src/main/java/de/ozgcloud/operator/elstertransfer/user/UserUpdateControlBuilder.java new file mode 100644 index 0000000..2d585ea --- /dev/null +++ b/src/main/java/de/ozgcloud/operator/elstertransfer/user/UserUpdateControlBuilder.java @@ -0,0 +1,62 @@ +package de.ozgcloud.operator.elstertransfer.user; + +import java.time.Duration; +import java.util.Optional; + +import de.ozgcloud.operator.elstertransfer.OzgCloudCustomResourceStatus; +import io.javaoperatorsdk.operator.api.reconciler.UpdateControl; + +class UserUpdateControlBuilder { + + private OzgCloudElsterTransferUser resource; + + private OzgCloudCustomResourceStatus status; + private Optional<String> message = Optional.empty(); + + private boolean reschedule = false; + private Duration scheduleDuration; + + public UserUpdateControlBuilder(OzgCloudElsterTransferUser resource) { + this.resource = resource; + } + + public static UserUpdateControlBuilder fromResource(OzgCloudElsterTransferUser resource) { + return new UserUpdateControlBuilder(resource); + } + + public UserUpdateControlBuilder withStatus(OzgCloudCustomResourceStatus status) { + this.status = status; + return this; + } + + public UserUpdateControlBuilder withMessage(String message) { + this.message = Optional.ofNullable(message); + return this; + } + + public UserUpdateControlBuilder withReschedule(Duration duration) { + this.reschedule = true; + this.scheduleDuration = duration; + return this; + } + + public UpdateControl<OzgCloudElsterTransferUser> build() { + resource.setStatus(buildOzgCloudElsterTransferUserStatus()); + + return buildUpdateControl(); + } + + private OzgCloudElsterTransferUserStatus buildOzgCloudElsterTransferUserStatus() { + var userStatus = OzgCloudElsterTransferUserStatus.builder().status(status); + message.ifPresent(userStatus::message); + + return userStatus.build(); + } + + private UpdateControl<OzgCloudElsterTransferUser> buildUpdateControl() { + if (reschedule) { + return UpdateControl.updateStatus(resource).rescheduleAfter(scheduleDuration); + } + return UpdateControl.updateStatus(resource); + } +} diff --git a/src/test/helm/deployment_env_test.yaml b/src/test/helm/deployment_env_test.yaml index 1e21ede..ebce42e 100644 --- a/src/test/helm/deployment_env_test.yaml +++ b/src/test/helm/deployment_env_test.yaml @@ -1,35 +1,10 @@ -# -# 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 environments templates: - templates/deployment.yaml set: imagePullSecret: "docker-secret" - image: - name: hase - tag: latest tests: - it: check customList as list set: diff --git a/src/test/helm/deployment_matchlabels_test.yaml b/src/test/helm/deployment_matchlabels_test.yaml index 00d21b3..3cc8ad2 100644 --- a/src/test/helm/deployment_matchlabels_test.yaml +++ b/src/test/helm/deployment_matchlabels_test.yaml @@ -1,44 +1,21 @@ -# -# 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: deployment matchlabels release: name: ozgcloud-elstertransfer-operator - namespace: sh-helm-test + namespace: by-helm-test templates: - templates/deployment.yaml set: imagePullSecret: "docker-secret" - image: - name: hase - tag: latest tests: - - it: check matchlabels + - it: should have set kubernetes name asserts: - equal: path: spec.selector.matchLabels["app.kubernetes.io/name"] value: ozgcloud-elstertransfer-operator + - it: should have set kubernetes namespace + asserts: - equal: path: spec.selector.matchLabels["app.kubernetes.io/namespace"] - value: sh-helm-test \ No newline at end of file + value: by-helm-test \ No newline at end of file diff --git a/src/test/helm/deployment_metadata_labels_test.yaml b/src/test/helm/deployment_metadata_labels_test.yaml index 1c01f24..0821ece 100644 --- a/src/test/helm/deployment_metadata_labels_test.yaml +++ b/src/test/helm/deployment_metadata_labels_test.yaml @@ -1,44 +1,21 @@ -# -# 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: deployment test metadata labels release: name: ozgcloud-elstertransfer-operator - namespace: sh-helm-test + namespace: by-helm-test templates: - templates/deployment.yaml set: imagePullSecret: "docker-secret" - image: - name: hase - tag: latest tests: - - it: check default labels + - it: check default labels namespace asserts: - - equal: - path: metadata.labels["app.kubernetes.io/name"] - value: ozgcloud-elstertransfer-operator - equal: path: metadata.labels["app.kubernetes.io/namespace"] - value: sh-helm-test \ No newline at end of file + value: by-helm-test + - it: check default labels name + asserts: + - equal: + path: metadata.labels["app.kubernetes.io/name"] + value: ozgcloud-elstertransfer-operator \ No newline at end of file diff --git a/src/test/helm/deployment_pull_secret_test.yaml b/src/test/helm/deployment_pull_secret_test.yaml index fb3d44e..b66ec8b 100644 --- a/src/test/helm/deployment_pull_secret_test.yaml +++ b/src/test/helm/deployment_pull_secret_test.yaml @@ -1,41 +1,21 @@ -# -# 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: deployment pull secret release: name: ozgcloud-elstertransfer-operator - namespace: sh-helm-test + namespace: by-helm-test templates: - deployment.yaml -set: - image: - name: hase - tag: latest - imagePullSecret: imagePullSecret + tests: - - it: validate image pull secret resource name + - it: should set imagePullSecret + set: + imagePullSecret: imagePullSecret asserts: - equal: path: spec.template.spec.imagePullSecrets[0].name value: imagePullSecret + - it: should fail tempalte with error message when not set + asserts: + - failedTemplate: + errorMessage: imagePullSecret must be set \ No newline at end of file diff --git a/src/test/helm/deployment_resources_test.yaml b/src/test/helm/deployment_resources_test.yaml index 8902036..c3957f4 100644 --- a/src/test/helm/deployment_resources_test.yaml +++ b/src/test/helm/deployment_resources_test.yaml @@ -1,26 +1,4 @@ -# -# 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: deployment resources test release: @@ -29,9 +7,6 @@ templates: - templates/deployment.yaml set: imagePullSecret: "docker-secret" - image: - name: hase - tag: latest tests: - it: test resources set: diff --git a/src/test/helm/deployment_test.yaml b/src/test/helm/deployment_test.yaml index 03891b4..99949ff 100644 --- a/src/test/helm/deployment_test.yaml +++ b/src/test/helm/deployment_test.yaml @@ -1,40 +1,20 @@ -# -# 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: deployment test release: name: intelliform-adapter - namespace: sh-helm-test + namespace: by-helm-test templates: - deployment.yaml -set: - imagePullSecret: "docker-secret" - image: - name: hase - tag: latest + tests: - it: validate image type and container image + set: + imagePullSecret: "docker-secret" + image: + name: hase + tag: latest + repo: docker.ozg-sh.de asserts: - isKind: of: Deployment diff --git a/src/test/helm/helm-linter-values.yaml b/src/test/helm/helm-linter-values.yaml index c63c797..db1bb62 100644 --- a/src/test/helm/helm-linter-values.yaml +++ b/src/test/helm/helm-linter-values.yaml @@ -1,8 +1,4 @@ elstertransfer: namespace: elster-transfer -image: - name: image - tag: tag - imagePullSecret: image-pull-secret \ No newline at end of file diff --git a/src/test/helm/rbacs/ozgcloud_elstertransfer_operator_user_read_write_role_binding_test.yaml b/src/test/helm/rbacs/ozgcloud_elstertransfer_operator_user_read_write_role_binding_test.yaml new file mode 100644 index 0000000..205ade6 --- /dev/null +++ b/src/test/helm/rbacs/ozgcloud_elstertransfer_operator_user_read_write_role_binding_test.yaml @@ -0,0 +1,35 @@ + +suite: ElsterTransfer user rbac test +release: + name: ozgcloud-elstertransfer-operator + namespace: test-namespace +templates: + - templates/rbacs/ozgcloud_elstertransfer_operator_user_read_write_role_binding.yaml +tests: + - it: test ClusterRoleBinding metadata + asserts: + - isKind: + of: ClusterRoleBinding + - isAPIVersion: + of: rbac.authorization.k8s.io/v1 + - equal: + path: metadata.name + value: ozgcloud-elster-transfer-operator-user-read-write-role-binding + + - it: test ClusterRoleBinding subject + asserts: + - contains: + path: subjects + content: + kind: ServiceAccount + name: ozgcloud-elster-transfer-operator-service-account + namespace: test-namespace + - it: test ClusterRoleBinding roleRef + asserts: + - equal: + path: roleRef + value: + kind: ClusterRole + name: ozgcloud-elster-transfer-operator-user-read-write-role + apiGroup: rbac.authorization.k8s.io + diff --git a/src/test/helm/rbacs/ozgcloud_elstertransfer_operator_user_read_write_role_test.yaml b/src/test/helm/rbacs/ozgcloud_elstertransfer_operator_user_read_write_role_test.yaml index 4ab755d..e3faded 100644 --- a/src/test/helm/rbacs/ozgcloud_elstertransfer_operator_user_read_write_role_test.yaml +++ b/src/test/helm/rbacs/ozgcloud_elstertransfer_operator_user_read_write_role_test.yaml @@ -1,26 +1,3 @@ -# -# 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 rbac test release: @@ -29,48 +6,16 @@ release: templates: - templates/rbacs/ozgcloud_elstertransfer_operator_user_read_write_role.yaml tests: - - it: test ClusterRoleBinding metadata - asserts: - - isKind: - of: ClusterRoleBinding - documentIndex: 0 - - isAPIVersion: - of: rbac.authorization.k8s.io/v1 - - equal: - path: metadata.name - value: ozgcloud-elster-transfer-operator-user-read-write-role-binding - documentIndex: 0 - - - it: test ClusterRoleBinding subject - asserts: - - contains: - path: subjects - content: - kind: ServiceAccount - name: ozgcloud-elster-transfer-operator-service-account - namespace: test-namespace - documentIndex: 0 - - it: test ClusterRoleBinding roleRef - asserts: - - equal: - path: roleRef - value: - kind: ClusterRole - name: ozgcloud-elster-transfer-operator-user-read-write-role - apiGroup: rbac.authorization.k8s.io - documentIndex: 0 - it: test ClusterRole metadata asserts: - isKind: of: ClusterRole - documentIndex: 1 - isAPIVersion: of: rbac.authorization.k8s.io/v1 - equal: path: metadata.name value: ozgcloud-elster-transfer-operator-user-read-write-role - documentIndex: 1 - it: test ClusterRoleBinding rules asserts: @@ -90,7 +35,4 @@ tests: - create - update - patch - - delete - - - documentIndex: 1 \ No newline at end of file + - delete \ No newline at end of file diff --git a/src/test/helm/rbacs/service_account_test.yaml b/src/test/helm/rbacs/service_account_test.yaml index ee4fc36..799580d 100644 --- a/src/test/helm/rbacs/service_account_test.yaml +++ b/src/test/helm/rbacs/service_account_test.yaml @@ -1,26 +1,4 @@ -# -# 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: ServiceAccount test release: diff --git a/src/test/java/de/ozgcloud/operator/elstertransfer/ElsterTransferOperatorApplicationTest.java b/src/test/java/de/ozgcloud/operator/elstertransfer/ElsterTransferOperatorApplicationTest.java deleted file mode 100644 index df437f6..0000000 --- a/src/test/java/de/ozgcloud/operator/elstertransfer/ElsterTransferOperatorApplicationTest.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - * 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. - */ -package de.ozgcloud.operator.elstertransfer; - -import org.junit.jupiter.api.Test; - -//@SpringBootTest -//@EnableMockOperator -class ElsterTransferOperatorApplicationTest { - - @Test - void contextLoads() { - } -} diff --git a/src/test/java/de/ozgcloud/operator/elstertransfer/user/OzgCloudElsterTransferConfigMapFactory.java b/src/test/java/de/ozgcloud/operator/elstertransfer/user/OzgCloudElsterTransferConfigMapFactory.java index 5b643cb..1a5d638 100644 --- a/src/test/java/de/ozgcloud/operator/elstertransfer/user/OzgCloudElsterTransferConfigMapFactory.java +++ b/src/test/java/de/ozgcloud/operator/elstertransfer/user/OzgCloudElsterTransferConfigMapFactory.java @@ -7,8 +7,6 @@ import io.fabric8.kubernetes.api.model.ConfigMap; import io.fabric8.kubernetes.api.model.ConfigMapBuilder; public class OzgCloudElsterTransferConfigMapFactory { - private static final String CONFIG_MAP_NAME = "etr-user-config"; - private static final String USERS_KEY = "users.yaml"; public static ConfigMap create() { String usersYaml = "fileFormat: 1\n" + @@ -18,16 +16,21 @@ public class OzgCloudElsterTransferConfigMapFactory { " credentials:\n" + " passwortHash: \"$2a$12$cqKZMcwTUe/tju7PIFGhperWdV2Xa9o4fVw5eClbzatRhvxZphE1a\"\n" + " gruppe: \"Administratoren\"\n"; + Map<String, String> data = new HashMap<>(); - data.put(USERS_KEY, usersYaml); - ConfigMap configMap = new ConfigMapBuilder() + data.put(Constants.USERS_KEY, usersYaml); + return createConfigMap(data); + + } + + static ConfigMap createConfigMap(Map<String, String> data) { + return new ConfigMapBuilder() .withNewMetadata() - .withName(CONFIG_MAP_NAME) + .withName(Constants.CONFIG_MAP_NAME) .endMetadata() .withData(data) .build(); - return configMap; } } diff --git a/src/test/java/de/ozgcloud/operator/elstertransfer/user/OzgCloudElsterTransferConfigMapUserListFactory.java b/src/test/java/de/ozgcloud/operator/elstertransfer/user/OzgCloudElsterTransferConfigMapUserListFactory.java index 42b6a4d..bb2ec02 100644 --- a/src/test/java/de/ozgcloud/operator/elstertransfer/user/OzgCloudElsterTransferConfigMapUserListFactory.java +++ b/src/test/java/de/ozgcloud/operator/elstertransfer/user/OzgCloudElsterTransferConfigMapUserListFactory.java @@ -8,13 +8,14 @@ import java.util.Map; public class OzgCloudElsterTransferConfigMapUserListFactory { public static List<Map<String, Object>> create() { - Map<String, Object> user1 = new HashMap<>(); - user1.put("login", "user1"); - user1.put("rolle", "USER"); - user1.put("gruppe", "user1"); - Map<String, String> credentials = new HashMap<>(); - credentials.put("passwortHash", "$2a$12$cqKZMcwTUe/tju7PIFGhperWdV2Xa9o4fVw5eClbzatRhvxZphE1a"); - user1.put("credentials", credentials); + Map<String, Object> user1 = Map.of( + "login", "user1", + "rolle", "USER", + "gruppe", "user1", + "credentials", Map.of( + "passwortHash", "$2a$12$cqKZMcwTUe/tju7PIFGhperWdV2Xa9o4fVw5eClbzatRhvxZphE1a" + ) + ); List<Map<String, Object>> usersList = Arrays.asList(user1); return usersList; } diff --git a/src/test/java/de/ozgcloud/operator/elstertransfer/user/OzgCloudElsterTransferConfigMapUserListTest.java b/src/test/java/de/ozgcloud/operator/elstertransfer/user/OzgCloudElsterTransferConfigMapUserListTest.java index 5ca2987..ff7413b 100644 --- a/src/test/java/de/ozgcloud/operator/elstertransfer/user/OzgCloudElsterTransferConfigMapUserListTest.java +++ b/src/test/java/de/ozgcloud/operator/elstertransfer/user/OzgCloudElsterTransferConfigMapUserListTest.java @@ -1,6 +1,7 @@ package de.ozgcloud.operator.elstertransfer.user; -import static org.junit.jupiter.api.Assertions.*; +import static org.assertj.core.api.Assertions.*; +import static org.mockito.ArgumentMatchers.*; import java.util.ArrayList; import java.util.List; @@ -20,25 +21,25 @@ class OzgCloudElsterTransferConfigMapUserListTest { } @Nested - class ExistsUserTests { + class TestExistsUser { @Test void shouldReturnTrueWhenUserExists() { - assertTrue(configMapUserList.existsUser("user1")); + assertThat(configMapUserList.existsUser("user1")).isTrue(); } @Test void shouldReturnFalseWhenUserDoesNotExist() { - assertFalse(configMapUserList.existsUser("nonExistentUser")); + assertThat(configMapUserList.existsUser("nonExistentUser")).isFalse(); } } @Nested - class AddUserTests { + class TestAddUser { @Test void shouldAddUser() { configMapUserList.addUserToList("newUser", "$2a$12$cqKZMcwTUe/tju7PIFGhperWdV2Xa9o4fVw5eClbzatRhvxZphE1a", "USER"); - assertTrue(configMapUserList.existsUser("newUser")); + assertThat(configMapUserList.existsUser("newUser")).isTrue(); } @Test @@ -50,42 +51,43 @@ class OzgCloudElsterTransferConfigMapUserListTest { .findFirst() .orElseThrow(); - assertEquals("USER", addedUser.get("rolle")); - assertEquals(Map.of("passwortHash", "$2a$12$cqKZMcwTUe/tju7PIFGhperWdV2Xa9o4fVw5eClbzatRhvxZphE1a"), addedUser.get("credentials")); - assertEquals("newUser", addedUser.get("gruppe")); + assertThat(addedUser.get("rolle")).isEqualTo("USER"); + assertThat(Map.of("passwortHash", "$2a$12$cqKZMcwTUe/tju7PIFGhperWdV2Xa9o4fVw5eClbzatRhvxZphE1a")).isEqualTo(addedUser.get("credentials")); + assertThat("newUser").isEqualTo(addedUser.get("gruppe")); } } @Nested - class RemoveUserTests { + class TestRemoveUser { @Test void shouldRemoveUserCorrectly() { configMapUserList.removeDeleted("user1"); - assertFalse(configMapUserList.existsUser("user1")); + assertThat(configMapUserList.existsUser("user1")).isFalse(); } } @Nested - class GetUsersListTests { + class TestGetUsersList { @Test void shouldReturnCurrentUsersList() { List<Map<String, Object>> userList = configMapUserList.getUsersList(); Map<String, Object> user = userList.get(0); - assertEquals(1, userList.size()); - assertEquals("user1", user.get("login")); - assertEquals("USER", user.get("rolle")); - assertEquals(Map.of("passwortHash", "$2a$12$cqKZMcwTUe/tju7PIFGhperWdV2Xa9o4fVw5eClbzatRhvxZphE1a"), user.get("credentials")); - assertEquals("user1", user.get("gruppe")); + assertThat(userList).hasSize(1); + assertThat(user.get("gruppe")).isEqualTo("user1"); + assertThat(user.get("login")).isEqualTo("user1"); + assertThat(user.get("rolle")).isEqualTo("USER"); + assertThat(user.get("credentials")).isEqualTo(Map.of("passwortHash", "$2a$12$cqKZMcwTUe/tju7PIFGhperWdV2Xa9o4fVw5eClbzatRhvxZphE1a")); + assertThat(user.get("gruppe")).isEqualTo("user1"); } @Test void shouldReturnEmptyListIfNoUsers() { OzgCloudElsterTransferConfigMapUserList emptyConfigMapUserList = new OzgCloudElsterTransferConfigMapUserList(new ArrayList<>()); - assertTrue(emptyConfigMapUserList.getUsersList().isEmpty()); + assertThat(emptyConfigMapUserList.getUsersList().isEmpty()).isTrue(); } } } diff --git a/src/test/java/de/ozgcloud/operator/elstertransfer/user/OzgCloudElsterTransferUserReconcilerTest.java b/src/test/java/de/ozgcloud/operator/elstertransfer/user/OzgCloudElsterTransferUserReconcilerTest.java index cbe37ab..f369911 100644 --- a/src/test/java/de/ozgcloud/operator/elstertransfer/user/OzgCloudElsterTransferUserReconcilerTest.java +++ b/src/test/java/de/ozgcloud/operator/elstertransfer/user/OzgCloudElsterTransferUserReconcilerTest.java @@ -1,7 +1,6 @@ package de.ozgcloud.operator.elstertransfer.user; import static org.assertj.core.api.Assertions.*; -import static org.junit.jupiter.api.Assertions.assertEquals; import static org.mockito.ArgumentMatchers.*; import static org.mockito.Mockito.*; @@ -12,7 +11,7 @@ import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.Spy; -import de.ozgcloud.operator.Config; +import de.ozgcloud.operator.ElsterTransferOperatorConfiguration; import de.ozgcloud.operator.elstertransfer.OzgCloudCustomResourceStatus; import io.fabric8.kubernetes.client.KubernetesClient; import io.javaoperatorsdk.operator.api.reconciler.DeleteControl; @@ -26,36 +25,25 @@ class OzgCloudElsterTransferUserReconcilerTest { @Mock private OzgCloudElsterTransferUserService service; - @Mock - private KubernetesClient client; - @DisplayName("Reconcile") @Nested class TestReconcile { - OzgCloudElsterTransferUser user = OzgCloudElsterTransferUserTestFactory.create(); + private final OzgCloudElsterTransferUser user = OzgCloudElsterTransferUserTestFactory.create(); @Test void shouldCallUpdateConfigMap() { - reconciler.reconcile(user, null); verify(service).updateConfigMapAndRestartDeploymentAndCreateSecret(OzgCloudElsterTransferUserTestFactory.METADATA_NAMESPACE); } @Test - void shouldReturnUpdateStatus() { + void shouldReturnUpdateControl() { var response = reconciler.reconcile(OzgCloudElsterTransferUserTestFactory.create(), null); assertThat(response.getResource()).isNotNull(); } - @Test - void shouldCallGetElsterTransferUserStatus() { - - reconciler.reconcile(user, null); - - verify(reconciler).getElsterTransferUserStatus(any(), any()); - } @Test void shouldSetStatusOk() { @@ -64,27 +52,7 @@ class OzgCloudElsterTransferUserReconcilerTest { assertThat(response.getResource().getStatus().getStatus()).isEqualTo(OzgCloudCustomResourceStatus.OK); } - @DisplayName("test getElsterTransferUserStatus") - @Nested - class TestGetElsterTransferUserStatus { - - void shouldRetrunOzgCloudElsterTransferUserStatus() { - - OzgCloudElsterTransferUserStatus result = reconciler.getElsterTransferUserStatus(OzgCloudCustomResourceStatus.OK, "Status: OK"); - - assertEquals(OzgCloudCustomResourceStatus.OK, result.getStatus()); - assertEquals("Status: OK", result.getMessage()); - } - } - - @Test - void shouldReturnErrorStatus() { - - OzgCloudElsterTransferUserStatus result = reconciler.getElsterTransferUserStatus(OzgCloudCustomResourceStatus.ERROR, "An error occurred"); - - assertEquals(OzgCloudCustomResourceStatus.ERROR, result.getStatus()); - assertEquals("An error occurred", result.getMessage()); - } + } @@ -96,7 +64,6 @@ class OzgCloudElsterTransferUserReconcilerTest { @Test void shouldCallServiceDelete() { - reconciler.cleanup(user, null); verify(service).deleteUserAndRestartDeploymentIfNotKeepUserAndUserExists(user); @@ -117,7 +84,7 @@ class OzgCloudElsterTransferUserReconcilerTest { var control = reconciler.cleanup(user, null); assertThat(control).usingRecursiveComparison() - .isEqualTo(DeleteControl.noFinalizerRemoval().rescheduleAfter(Config.RECONCILER_RETRY_SECONDS_ON_ERROR)); + .isEqualTo(DeleteControl.noFinalizerRemoval().rescheduleAfter(ElsterTransferOperatorConfiguration.RECONCILER_RETRY_SECONDS_ON_ERROR)); } } diff --git a/src/test/java/de/ozgcloud/operator/elstertransfer/user/OzgCloudElsterTransferUserRemoteServiceTest.java b/src/test/java/de/ozgcloud/operator/elstertransfer/user/OzgCloudElsterTransferUserRemoteServiceTest.java index 82051a2..79c93e1 100644 --- a/src/test/java/de/ozgcloud/operator/elstertransfer/user/OzgCloudElsterTransferUserRemoteServiceTest.java +++ b/src/test/java/de/ozgcloud/operator/elstertransfer/user/OzgCloudElsterTransferUserRemoteServiceTest.java @@ -68,11 +68,10 @@ class OzgCloudElsterTransferUserRemoteServiceTest { private Resource<Secret> secretResource; private static final String namespace = OzgCloudElsterTransferUserTestFactory.METADATA_NAMESPACE; - private static final String configMapName = OzgCloudElsterTransferUserTestFactory.CONFIG_MAP_NAME; - private static final String deploymentName = OzgCloudElsterTransferUserTestFactory.ETR_DEPLOYMENT_NAME; - private static final String secretName = OzgCloudElsterTransferUserTestFactory.MUK_USER_SECRET_NAME; - // todo - private static final String configmapNamespace = "etr-user-creation"; + private static final String configMapName = Constants.CONFIG_MAP_NAME; + private static final String deploymentName = Constants.ETR_DEPLOYMENT_NAME; + private static final String secretName = Constants.MUK_USER_SECRET_NAME; + private static final String configmapNamespace = Constants.ETR_NAMESPACE; @DisplayName("test ConfigMap") @Nested @@ -221,13 +220,13 @@ class OzgCloudElsterTransferUserRemoteServiceTest { } @Test - void shouldCallSetRestartFlag() { + void shouldCallsetRestartAt() { when(deploymentResource.get()).thenReturn(deployment); remoteService.restartDeployment(namespace, deploymentName); - verify(remoteService).setRestartFlag(deployment); + verify(remoteService).setRestartAt(deployment); } @Test @@ -241,13 +240,13 @@ class OzgCloudElsterTransferUserRemoteServiceTest { @DisplayName("set restart flag") @Nested - class TestSetRestartFlag { + class TestsetRestartAt { @Test void shouldSetRestartedAtAnnotation() { Map<String, String> annotations = new HashMap<>(); deployment.getSpec().getTemplate().getMetadata().setAnnotations(annotations); - remoteService.setRestartFlag(deployment); + remoteService.setRestartAt(deployment); assert annotations.containsKey("kubectl.kubernetes.io/restartedAt"); assert annotations.get("kubectl.kubernetes.io/restartedAt") != null; diff --git a/src/test/java/de/ozgcloud/operator/elstertransfer/user/OzgCloudElsterTransferUserServiceTest.java b/src/test/java/de/ozgcloud/operator/elstertransfer/user/OzgCloudElsterTransferUserServiceTest.java index 2fa1291..dc556c1 100644 --- a/src/test/java/de/ozgcloud/operator/elstertransfer/user/OzgCloudElsterTransferUserServiceTest.java +++ b/src/test/java/de/ozgcloud/operator/elstertransfer/user/OzgCloudElsterTransferUserServiceTest.java @@ -1,5 +1,6 @@ package de.ozgcloud.operator.elstertransfer.user; +import static org.assertj.core.api.Assertions.*; import static org.junit.jupiter.api.Assertions.*; import static org.mockito.ArgumentMatchers.*; import static org.mockito.Mockito.*; @@ -17,6 +18,7 @@ import org.mockito.Mock; import org.mockito.Spy; import io.fabric8.kubernetes.api.model.ConfigMap; +import io.javaoperatorsdk.operator.api.reconciler.DeleteControl; class OzgCloudElsterTransferUserServiceTest { @@ -34,11 +36,11 @@ class OzgCloudElsterTransferUserServiceTest { private OzgCloudElsterTransferConfigMapUserList users; private static final String namespace = OzgCloudElsterTransferUserTestFactory.METADATA_NAMESPACE; - private static final String configMapName = OzgCloudElsterTransferUserTestFactory.CONFIG_MAP_NAME; - private static final String deploymentName = OzgCloudElsterTransferUserTestFactory.ETR_DEPLOYMENT_NAME; - private static final String secretName = OzgCloudElsterTransferUserTestFactory.MUK_USER_SECRET_NAME; - private static final String configMapNamespace = "etr-user-creation"; - private static final String usersKey = "users.yaml"; + private static final String configMapName = Constants.CONFIG_MAP_NAME; + private static final String deploymentName = Constants.ETR_DEPLOYMENT_NAME; + private static final String secretName = Constants.MUK_USER_SECRET_NAME; + private static final String configMapNamespace = Constants.ETR_NAMESPACE; + private static final String usersKey = Constants.USERS_KEY; @Nested class TestUpdateConfigMapAndRestartDeploymentAndCreateSecret { @@ -509,7 +511,7 @@ class OzgCloudElsterTransferUserServiceTest { List<Map<String, Object>> usersList = result.getUsersList(); - assertEquals(1, usersList.size()); + assertThat(usersList).hasSize(1); } } @@ -554,7 +556,7 @@ class OzgCloudElsterTransferUserServiceTest { String result = service.constructYamlEntries(users); - assertEquals(expectedYaml, result); + assertThat(expectedYaml).isEqualTo(result); } } @@ -573,7 +575,7 @@ class OzgCloudElsterTransferUserServiceTest { String result = service.getYamlForUser(userEntry); - assertEquals(expectedYaml, result); + assertThat(expectedYaml).isEqualTo(result); } } diff --git a/src/test/java/de/ozgcloud/operator/elstertransfer/user/OzgCloudElsterTransferUserTestFactory.java b/src/test/java/de/ozgcloud/operator/elstertransfer/user/OzgCloudElsterTransferUserTestFactory.java index da99540..9b2bbc0 100644 --- a/src/test/java/de/ozgcloud/operator/elstertransfer/user/OzgCloudElsterTransferUserTestFactory.java +++ b/src/test/java/de/ozgcloud/operator/elstertransfer/user/OzgCloudElsterTransferUserTestFactory.java @@ -26,10 +26,7 @@ package de.ozgcloud.operator.elstertransfer.user; public class OzgCloudElsterTransferUserTestFactory { public static final String METADATA_NAMESPACE = "TestNamespace"; - public static final String ETR_NAMESPACE = "etr-user-creation"; - public static final String CONFIG_MAP_NAME = "etr-user-config"; - public static final String ETR_DEPLOYMENT_NAME = "elster-transfer"; - public static final String MUK_USER_SECRET_NAME = "muk-user-secret"; + public static OzgCloudElsterTransferUser create() { return createWithSpec(OzgCloudElsterTransferUserSpecTestFactory.create()); -- GitLab