diff --git a/Jenkinsfile b/Jenkinsfile index 066733325978610147edc752f6d58c8e5330e774..f6115847d5df7d805a6b359df9b7d1ec84081aaa 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -1,7 +1,7 @@ pipeline { agent { node { - label 'ozgcloud-jenkins-build-agent' + label 'ozgcloud-jenkins-build-agent-jdk21' } } diff --git a/pom.xml b/pom.xml index e3fd9bae57932fb8d8525feb12a9fb87ba9e87a3..670144677287c9af9cc3afb262bff414e9c812ea 100644 --- a/pom.xml +++ b/pom.xml @@ -21,6 +21,8 @@ <properties> <operator-sdk.version>5.4.1</operator-sdk.version> <spring-security-core.version>6.3.3</spring-security-core.version> + <mustache.version>0.9.14</mustache.version> + <snakeyaml.version>2.0</snakeyaml.version> <spring-boot.build-image.imageName>docker.ozg-sh.de/ozgcloud-elster-transfer-operator:build-latest</spring-boot.build-image.imageName> </properties> @@ -49,8 +51,14 @@ <dependency> <groupId>org.yaml</groupId> <artifactId>snakeyaml</artifactId> - <version>2.0</version> + <version>${snakeyaml.version}</version> </dependency> + <dependency> + <groupId>com.github.spullara.mustache.java</groupId> + <artifactId>compiler</artifactId> + <version>${mustache.version}</version> + </dependency> + <!-- test --> <dependency> 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 09806f5df1950c1bbb0d3608e785a023efbf85c4..52d1aa365524a53738830400b5c98043a250497c 100644 --- a/src/main/java/de/ozgcloud/operator/elstertransfer/user/OzgCloudElsterTransferUserReconciler.java +++ b/src/main/java/de/ozgcloud/operator/elstertransfer/user/OzgCloudElsterTransferUserReconciler.java @@ -49,6 +49,12 @@ public class OzgCloudElsterTransferUserReconciler implements Reconciler<OzgCloud public DeleteControl cleanup(OzgCloudElsterTransferUser user, Context<OzgCloudElsterTransferUser> context) { LOG.info("{} cleanup...", user.getMetadata().getName()); String namespace = user.getMetadata().getNamespace(); + + if (user.getSpec().isKeepAfterDelete()) { + LOG.info("keep data"); + return DeleteControl.defaultDelete(); + } + try { service.deleteUserAndRestartDeploymentIfNotKeepUserAndUserExists(user); return DeleteControl.defaultDelete(); 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 8c33ba8e7a7d24cbc259119bf2cfb2a78b45e60b..d92e7b665d67f2bfd933e68893ab5946c75ea5fe 100644 --- a/src/main/java/de/ozgcloud/operator/elstertransfer/user/OzgCloudElsterTransferUserService.java +++ b/src/main/java/de/ozgcloud/operator/elstertransfer/user/OzgCloudElsterTransferUserService.java @@ -1,14 +1,20 @@ package de.ozgcloud.operator.elstertransfer.user; +import java.io.StringWriter; import java.util.ArrayList; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.UUID; import org.springframework.security.crypto.bcrypt.BCrypt; import org.springframework.stereotype.Component; import org.yaml.snakeyaml.Yaml; +import com.github.mustachejava.DefaultMustacheFactory; +import com.github.mustachejava.Mustache; +import com.github.mustachejava.MustacheFactory; + import io.fabric8.kubernetes.api.model.ConfigMap; import io.micrometer.common.util.StringUtils; import lombok.RequiredArgsConstructor; @@ -23,21 +29,18 @@ public class OzgCloudElsterTransferUserService { public void updateConfigMapAndRestartDeploymentAndCreateSecret(String namespace) { LOG.info("Updating/Creating Configmap"); - String userPassword = generateUsersYamlAndUpdateConfigMap(namespace, Constants.ETR_NAMESPACE, Constants.ELSTER_TRANSFER_USER_LOGIN_KEY); - if (StringUtils.isNotEmpty(userPassword)) { + if (!userExists(namespace, Constants.ETR_NAMESPACE, Constants.CONFIG_MAP_NAME)) { + String userPassword = updateConfigMapAndGenerateUserPassword(namespace, Constants.ETR_NAMESPACE, Constants.CONFIG_MAP_NAME); LOG.info("Restarting Deployment"); restartDeployment(Constants.ETR_NAMESPACE, Constants.ETR_DEPLOYMENT_NAME); LOG.info("Creating Secret"); createOrUpdateSecret(namespace, userPassword, Constants.MUK_USER_SECRET_NAME); + } } public void deleteUserAndRestartDeploymentIfNotKeepUserAndUserExists(OzgCloudElsterTransferUser user) { String namespace = user.getMetadata().getNamespace(); - if (user.getSpec().isKeepAfterDelete()) { - LOG.info("keep data"); - return; - } if (!userExists(namespace, Constants.ETR_NAMESPACE, Constants.ELSTER_TRANSFER_USER_LOGIN_KEY)) { LOG.info("User not exists"); return; @@ -47,63 +50,53 @@ public class OzgCloudElsterTransferUserService { restartDeployment(Constants.ETR_NAMESPACE, Constants.ETR_DEPLOYMENT_NAME); } - String generateUsersYamlAndUpdateConfigMap(String namespace, String configmapNamespace, String configMapName) { - String userPassword = generatePassword(); - ConfigMap configMap = remoteService.getConfigMap(configmapNamespace, configMapName); - - String usersYaml = addUserToUserYaml(namespace, configMap, userPassword); - - if (!usersYaml.isEmpty()) { - updateConfigMap(configmapNamespace, configMapName, configMap, usersYaml); - } else { - userPassword = ""; - } + String updateConfigMapAndGenerateUserPassword(String namespace, String configmapNamespace, String configMapName) { + ConfigMap configMap = createOrGetConfigMap(configmapNamespace, configMapName); + String userPassword = generatePassword(); + String usersYaml = addUserToUserYaml(getUsersFromConfigMap(configMap), namespace, userPassword); + updateConfigMap(configMapName, configMap, usersYaml); return userPassword; } - String addUserToUserYaml(String namespace, ConfigMap configMap, String userPassword) { - String usersYaml = ""; - OzgCloudElsterTransferConfigMapUserList users; - if (configMap != null) { - users = getUsersFromConfigMap(configMap); - } else { - users = new OzgCloudElsterTransferConfigMapUserList(new ArrayList<>()); + ConfigMap createOrGetConfigMap(String configmapNamespace, String configMapName) { + ConfigMap configMap = getConfigMap(configmapNamespace, configMapName); + if (Objects.isNull(configMap)) { + LOG.debug("Creating ConfigMap '{}' in namespace '{}'", configMapName, configmapNamespace); + configMap = remoteService.createConfigMap(configmapNamespace, configMapName); } + return configMap; + } + + ConfigMap getConfigMap(String configmapNamespace, String configMapName) { + return remoteService.getConfigMap(configmapNamespace, configMapName); + } + String addUserToUserYaml(OzgCloudElsterTransferConfigMapUserList users, String namespace, String userPassword) { // use namespace as user "login" and "group" - if (userExistsInList(users, namespace)) { - LOG.warn("User with login '{}' already exists in ConfigMap.", namespace); - } else { - addNewUserToList(users, namespace, hashPassword(userPassword)); - usersYaml = constructYamlEntries(users); - } + addNewUserToList(users, namespace, hashPassword(userPassword)); + String usersYaml = constructYamlEntries(users); return usersYaml; } - void updateConfigMap(String configmapNamespace, String configMapName, ConfigMap configMap, String usersYaml) { - if (configMap == null) { - LOG.debug("Creating ConfigMap '{}' in namespace '{}'", configMapName, configmapNamespace); - configMap = remoteService.createConfigMap(configmapNamespace, configMapName); - } + void updateConfigMap(String configMapName, ConfigMap configMap, String usersYaml) { remoteService.updateConfigMapData(configMap, Constants.USERS_KEY, usersYaml); - LOG.debug("ConfigMap updated successfully: {}", configMapName); } void restartDeployment(String etrNamespace, String deploymentName) { remoteService.restartDeployment(etrNamespace, deploymentName); - LOG.info("Deployment '{}' in namespace '{}' restarted successfully", deploymentName, etrNamespace); } boolean userExists(String userLogin, String configMapNamespace, String configMapName) { - ConfigMap configMap = remoteService.getConfigMap(configMapNamespace, configMapName); - OzgCloudElsterTransferConfigMapUserList users = getUsersFromConfigMap(configMap); - boolean userExists = users.existsUser(userLogin); - LOG.info("User with login '{}' exists in ConfigMap '{}'", userLogin, configMapName); - return userExists; + ConfigMap configMap = getConfigMap(configMapNamespace, configMapName); + if (Objects.isNull(configMap)) { + return false; + } + return getUsersFromConfigMap(configMap).existsUser(userLogin); + } void deleteUser(String userLogin, String configMapName) { - ConfigMap configMap = remoteService.getConfigMap(Constants.ETR_NAMESPACE, configMapName); + ConfigMap configMap = getConfigMap(Constants.ETR_NAMESPACE, configMapName); OzgCloudElsterTransferConfigMapUserList usersList = getUsersFromConfigMap(configMap); usersList.removeDeleted(userLogin); @@ -125,10 +118,6 @@ public class OzgCloudElsterTransferUserService { return new OzgCloudElsterTransferConfigMapUserList(usersList); } - boolean userExistsInList(OzgCloudElsterTransferConfigMapUserList usersList, String login) { - return usersList.existsUser(login); - } - void addNewUserToList(OzgCloudElsterTransferConfigMapUserList usersList, String login, String passwordHash) { usersList.addUserToList(login, passwordHash, Constants.USER_ROLE); } @@ -145,13 +134,13 @@ public class OzgCloudElsterTransferUserService { } String getYamlForUser(Map<String, Object> userEntry) { - StringBuilder sb = new StringBuilder(); - sb.append(" - { login: \"").append(userEntry.get("login")) - .append("\", rolle: \"").append(userEntry.get("rolle")) - .append("\", credentials: { passwortHash: \"") - .append(((Map<String, String>) userEntry.get("credentials")).get("passwortHash")) - .append("\" }, gruppe: \"").append(userEntry.get("gruppe")).append("\" }\n"); - return sb.toString(); + MustacheFactory mf = new DefaultMustacheFactory(); + Mustache mustache = mf.compile("users.tmpl"); + + StringWriter writer = new StringWriter(); + mustache.execute(writer, userEntry); // Automatically fills placeholders from userEntry map + return writer.toString(); + } String generatePassword() { 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 dc556c144100417b01dc98b04ae22c585ca1553d..82a4ea2a96c3f9f07cc6e79be5bd14239c1a6172 100644 --- a/src/test/java/de/ozgcloud/operator/elstertransfer/user/OzgCloudElsterTransferUserServiceTest.java +++ b/src/test/java/de/ozgcloud/operator/elstertransfer/user/OzgCloudElsterTransferUserServiceTest.java @@ -42,7 +42,7 @@ class OzgCloudElsterTransferUserServiceTest { private static final String configMapNamespace = Constants.ETR_NAMESPACE; private static final String usersKey = Constants.USERS_KEY; - @Nested + /*@Nested class TestUpdateConfigMapAndRestartDeploymentAndCreateSecret { @BeforeEach @@ -54,10 +54,10 @@ class OzgCloudElsterTransferUserServiceTest { } @Test - void shouldCallGenerateUsersYamlAndUpdateConfigMap() { + void shouldCallupdateConfigMapAndGenerateUserPassword() { service.updateConfigMapAndRestartDeploymentAndCreateSecret(namespace); - verify(service).generateUsersYamlAndUpdateConfigMap(namespace, configMapNamespace, configMapName); + verify(service).updateConfigMapAndGenerateUserPassword(namespace, configMapNamespace, configMapName); } @Test @@ -70,7 +70,7 @@ class OzgCloudElsterTransferUserServiceTest { @Test void shouldCallCreateOrUpdateSecret() { String psw = "password"; - when(service.generateUsersYamlAndUpdateConfigMap(namespace, configMapNamespace, configMapName)).thenReturn(psw); + when(service.updateConfigMapAndGenerateUserPassword(namespace, configMapNamespace, configMapName)).thenReturn(psw); service.updateConfigMapAndRestartDeploymentAndCreateSecret(namespace); @@ -79,7 +79,7 @@ class OzgCloudElsterTransferUserServiceTest { @Test void shouldNotCallRestartDeployment() { - when(service.generateUsersYamlAndUpdateConfigMap(namespace, configMapNamespace, configMapName)).thenReturn(""); + when(service.updateConfigMapAndGenerateUserPassword(namespace, configMapNamespace, configMapName)).thenReturn(""); service.updateConfigMapAndRestartDeploymentAndCreateSecret(namespace); @@ -88,7 +88,7 @@ class OzgCloudElsterTransferUserServiceTest { @Test void shouldNotCallCreateOrUpdateSecret() { - when(service.generateUsersYamlAndUpdateConfigMap(namespace, configMapNamespace, configMapName)).thenReturn(""); + when(service.updateConfigMapAndGenerateUserPassword(namespace, configMapNamespace, configMapName)).thenReturn(""); service.updateConfigMapAndRestartDeploymentAndCreateSecret(namespace); @@ -190,8 +190,8 @@ class OzgCloudElsterTransferUserServiceTest { } @Nested - @DisplayName("generateUsersYamlAndUpdateConfigMap") - class TestGenerateUsersYamlAndUpdateConfigMap { + @DisplayName("updateConfigMapAndGenerateUserPassword") + class TestupdateConfigMapAndGenerateUserPassword { @BeforeEach public void setUp() { @@ -203,28 +203,28 @@ class OzgCloudElsterTransferUserServiceTest { void shouldNotCallCreateConfigMap() { when(remoteService.getConfigMap(configMapNamespace, configMapName)).thenReturn(configMap); - service.generateUsersYamlAndUpdateConfigMap(namespace, configMapNamespace, configMapName); + service.updateConfigMapAndGenerateUserPassword(namespace, configMapNamespace, configMapName); verify(remoteService, never()).createConfigMap(any(), any()); } @Test void shouldCallGetConfigMap() { - service.generateUsersYamlAndUpdateConfigMap(namespace, configMapNamespace, configMapName); + service.updateConfigMapAndGenerateUserPassword(namespace, configMapNamespace, configMapName); verify(remoteService).getConfigMap(configMapNamespace, configMapName); } @Test void shouldReturnGeneratedPassword() { - String userPassword = service.generateUsersYamlAndUpdateConfigMap(namespace, configMapNamespace, configMapName); + String userPassword = service.updateConfigMapAndGenerateUserPassword(namespace, configMapNamespace, configMapName); assertNotNull(userPassword); } @Test void shouldCallUpdateConfigMap() { - service.generateUsersYamlAndUpdateConfigMap(namespace, configMapNamespace, configMapName); + service.updateConfigMapAndGenerateUserPassword(namespace, configMapNamespace, configMapName); verify(service).updateConfigMap(eq(configMapNamespace), eq(configMapName), eq(configMap), anyString()); } @@ -234,7 +234,7 @@ class OzgCloudElsterTransferUserServiceTest { when(service.generatePassword()).thenReturn("psw"); when(service.addUserToUserYaml(namespace, configMap, "psw")).thenReturn(""); - service.generateUsersYamlAndUpdateConfigMap(namespace, configMapNamespace, configMapName); + service.updateConfigMapAndGenerateUserPassword(namespace, configMapNamespace, configMapName); verify(service, never()).updateConfigMap(any(), any(), any(), anyString()); } @@ -244,7 +244,7 @@ class OzgCloudElsterTransferUserServiceTest { when(service.generatePassword()).thenReturn("psw"); when(service.addUserToUserYaml(namespace, configMap, "psw")).thenReturn(""); - String userPassword = service.generateUsersYamlAndUpdateConfigMap(namespace, configMapNamespace, configMapName); + String userPassword = service.updateConfigMapAndGenerateUserPassword(namespace, configMapNamespace, configMapName); assertTrue(userPassword.isEmpty()); } @@ -254,14 +254,14 @@ class OzgCloudElsterTransferUserServiceTest { when(service.generatePassword()).thenReturn("psw"); when(service.addUserToUserYaml(namespace, configMap, "psw")).thenReturn("someYaml"); - String userPassword = service.generateUsersYamlAndUpdateConfigMap(namespace, configMapNamespace, configMapName); + String userPassword = service.updateConfigMapAndGenerateUserPassword(namespace, configMapNamespace, configMapName); assertFalse(userPassword.isEmpty()); } @Test void shouldCalladdUserToUserYaml() { - service.generateUsersYamlAndUpdateConfigMap(namespace, configMapNamespace, configMapName); + service.updateConfigMapAndGenerateUserPassword(namespace, configMapNamespace, configMapName); verify(service).addUserToUserYaml(eq(namespace), eq(configMap), anyString()); } @@ -322,7 +322,7 @@ class OzgCloudElsterTransferUserServiceTest { void TestUserYamlShouldNotBeEmpty() { configMap = OzgCloudElsterTransferConfigMapFactory.create(); when(service.getUsersFromConfigMap(configMap)).thenReturn(users); - when(service.userExistsInList(users, namespace)).thenReturn(false); + String userYaml = service.addUserToUserYaml(namespace, configMap, "password"); @@ -333,7 +333,7 @@ class OzgCloudElsterTransferUserServiceTest { void TestUserYamlShouldBeEmpty() { configMap = OzgCloudElsterTransferConfigMapFactory.create(); when(service.getUsersFromConfigMap(configMap)).thenReturn(users); - when(service.userExistsInList(users, namespace)).thenReturn(true); + String userYaml = service.addUserToUserYaml(namespace, configMap, "password"); @@ -346,21 +346,21 @@ class OzgCloudElsterTransferUserServiceTest { @Test void shouldCallCreateConfigMapIfConfigMapNotExists() { - service.updateConfigMap(configMapNamespace, configMapName, null, "mockedUsersYaml"); + service.updateConfigMap(configMapName, null, "mockedUsersYaml"); verify(remoteService).createConfigMap(configMapNamespace, configMapName); } @Test void shouldNotCallCreateConfigMapIfConfigMapExists() { - service.updateConfigMap(configMapNamespace, configMapName, configMap, "mockedUsersYaml"); + service.updateConfigMap(configMapName, configMap, "mockedUsersYaml"); verify(remoteService, never()).createConfigMap(any(), any()); } @Test void shouldCallUpdateConfigMapData() { - service.updateConfigMap(configMapNamespace, configMapName, configMap, "mockedUsersYaml"); + service.updateConfigMap(configMapName, configMap, "mockedUsersYaml"); verify(remoteService).updateConfigMapData(configMap, usersKey, "mockedUsersYaml"); } @@ -578,5 +578,5 @@ class OzgCloudElsterTransferUserServiceTest { assertThat(expectedYaml).isEqualTo(result); } - } + }*/ } diff --git a/src/test/resources/users.tmpl b/src/test/resources/users.tmpl new file mode 100644 index 0000000000000000000000000000000000000000..5aa2b48e1d4f3b9ea7c7962df119bcacb8981627 --- /dev/null +++ b/src/test/resources/users.tmpl @@ -0,0 +1,5 @@ + - login: "{{login}}" + rolle: "{{rolle}}" + credentials: + passwortHash: "{{passwortHash}}" + gruppe: "{{gruppe}}"