Skip to content
Snippets Groups Projects
Commit cd254ea0 authored by OZGCloud's avatar OZGCloud
Browse files

OZG-6177 Add quick refactoring approach

parent c45f5adc
No related branches found
No related tags found
No related merge requests found
<?xml version="1.0"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
......@@ -38,7 +39,8 @@
<!-- 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-boot.build-image.imageName>docker.ozg-sh.de/ozgcloud-elster-transfer-operator:build-latest
</spring-boot.build-image.imageName>
</properties>
......
package de.ozgcloud.operator.elstertransfer.user;
import org.springframework.stereotype.Component;
import de.ozgcloud.operator.Config;
import de.ozgcloud.operator.elstertransfer.OzgCloudCustomResourceStatus;
import io.javaoperatorsdk.operator.api.reconciler.Cleaner;
import io.javaoperatorsdk.operator.api.reconciler.Context;
import io.javaoperatorsdk.operator.api.reconciler.ControllerConfiguration;
import io.javaoperatorsdk.operator.api.reconciler.DeleteControl;
import io.javaoperatorsdk.operator.api.reconciler.Reconciler;
import io.javaoperatorsdk.operator.api.reconciler.UpdateControl;
import io.javaoperatorsdk.operator.api.reconciler.Context;
import lombok.RequiredArgsConstructor;
import lombok.extern.log4j.Log4j2;
......@@ -30,26 +29,18 @@ public class OzgCloudElsterTransferUserReconciler implements Reconciler<OzgCloud
public UpdateControl<OzgCloudElsterTransferUser> reconcile(OzgCloudElsterTransferUser elsterTransferUser,
Context<OzgCloudElsterTransferUser> context) {
try {
String namespace = elsterTransferUser.getMetadata().getNamespace();
String psw = elsterTransferUserService.updateConfigMap(namespace, ETR_NAMESPACE, CONFIG_MAP_NAME);
// psw will not be generated if the user "login" already exist in configmap
if (!psw.isEmpty()) {
// Restart the deployment
elsterTransferUserService.restartDeployment(ETR_NAMESPACE, DEPLOYMENT_NAME);
// create or update secret
elsterTransferUserService.createSecret(namespace, psw);
}
elsterTransferUserService.updateConfigurationAndRestartDeployment(namespace);
//TODO refactor message builder
elsterTransferUser.setStatus(OzgCloudElsterTransferUserStatus.builder().status(OzgCloudCustomResourceStatus.OK).message(null).build());
return UpdateControl.updateStatus(elsterTransferUser);
} catch (Exception e) {
LOG.warn(elsterTransferUser.getMetadata().getName() + " could not reconcile in namespace "
+ elsterTransferUser.getMetadata().getNamespace(), e);
elsterTransferUser
//TODO refactor message builder
.setStatus(OzgCloudElsterTransferUserStatus.builder().status(OzgCloudCustomResourceStatus.ERROR).message(e.getMessage()).build());
return UpdateControl.updateStatus(elsterTransferUser).rescheduleAfter(Config.RECONCILER_RETRY_SECONDS);
}
......
......@@ -3,6 +3,7 @@ package de.ozgcloud.operator.elstertransfer.user;
import java.util.Base64;
import org.springframework.stereotype.Component;
import org.yaml.snakeyaml.Yaml;
import io.fabric8.kubernetes.api.model.ConfigMap;
import io.fabric8.kubernetes.api.model.ConfigMapBuilder;
......@@ -24,16 +25,22 @@ public class OzgCloudElsterTransferUserRemoteService {
return client.configMaps().inNamespace(configmapNamespace).withName(configMapName).get();
}
public ConfigMap createConfigMap(String configmapNamespace, String configMapName) {
ConfigMap configMap = new ConfigMapBuilder()
.withNewMetadata()
.withName(configMapName)
.endMetadata()
.addToData("users.yaml", "")
.addToData("users.yaml", createEmptyUserYaml())
.build();
return client.configMaps().inNamespace(configmapNamespace).resource(configMap).create();
}
private static String createEmptyUserYaml() {
return new Yaml().toString();
}
public void updateConfigMapData(ConfigMap configMap, String key, String data) {
configMap.getData().put(key, data);
client.configMaps().inNamespace(configMap.getMetadata().getNamespace()).resource(configMap).update();
......@@ -43,12 +50,16 @@ public class OzgCloudElsterTransferUserRemoteService {
Resource<Deployment> deploymentResource = client.apps().deployments().inNamespace(namespace).withName(deploymentName);
Deployment deployment = deploymentResource.get();
if (deployment != null) {
deployment.getSpec().getTemplate().getMetadata().getAnnotations()
.put("kubectl.kubernetes.io/restartedAt", String.valueOf(System.currentTimeMillis()));
setRestartFlag(deployment);
deploymentResource.replace(deployment);
}
}
void setRestartFlag(Deployment deployment){
deployment.getSpec().getTemplate().getMetadata().getAnnotations()
.put("kubectl.kubernetes.io/restartedAt", String.valueOf(System.currentTimeMillis()));
}
public void createSecret(String namespace, String psw) {
Secret secret = new SecretBuilder()
......
package de.ozgcloud.operator.elstertransfer.user;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
......@@ -11,8 +8,6 @@ import org.springframework.security.crypto.bcrypt.BCrypt;
import org.springframework.stereotype.Component;
import org.yaml.snakeyaml.Yaml;
import com.fasterxml.jackson.databind.ObjectMapper;
import io.fabric8.kubernetes.api.model.ConfigMap;
import lombok.RequiredArgsConstructor;
import lombok.extern.log4j.Log4j2;
......@@ -25,44 +20,63 @@ public class OzgCloudElsterTransferUserService {
private final OzgCloudElsterTransferUserRemoteService remoteService;
private static final String USERS_KEY = "users.yaml";
private static final String ETR_NAMESPACE = "etr-user-creation";
private static final String USER_ROLE = "USER";
public static final String USER_ROLE = "USER";
private static final String CONFIG_MAP_NAME = "etr-user-config";
private static final String DEPLOYMENT_NAME = "elster-transfer";
public void updateConfigurationAndRestartDeployment(String namespace) {
String psw = updateConfigMap(namespace, ETR_NAMESPACE, CONFIG_MAP_NAME);
public String updateConfigMap(String namespace, String configmapNamespace, String configMapName) {
// psw will not be generated if the user "login" already exist in configmap
if (!psw.isEmpty()) {
// Restart the deployment
LOG.info("Restart Deployment");
restartDeployment(ETR_NAMESPACE, DEPLOYMENT_NAME);
// create or update secret
LOG.info("Create Secret");
createSecret(namespace, psw);
}
}
String updateConfigMap(String namespace, String configmapNamespace, String configMapName) {
//TODO rename psw
String psw = "";
ConfigMap configMap = remoteService.getConfigMap(configmapNamespace, configMapName);
if (configMap == null) {
LOG.info("Creating ConfigMap '{}' in namespace '{}'", configMapName, namespace);
LOG.debug("Creating ConfigMap '{}' in namespace '{}'", configMapName, namespace);
configMap = remoteService.createConfigMap(configmapNamespace, configMapName);
}
Map<String, Object> usersMap = getUsersMapFromConfigMap(configMap);
List<Map<String, Object>> usersList = getUsersListFromMap(usersMap);
// Map<String, Object> usersMap = getUsersMapFromConfigMap(configMap);
// List<Map<String, Object>> usersList = getUsersListFromMap(usersMap);
UserList users = getUsersFromYaml(configMap);
// use namespace as user "login" and "group"
if (userExistsInList(usersList, namespace)) {
if (userExistsInList(users, namespace)) {
LOG.error("User with login '{}' already exists in ConfigMap '{}'.", namespace, configMapName);
} else {
psw = generatePassword();
String passwordHash = hashPassword(psw);
addUserToList(usersList, namespace, passwordHash);
addUserToList(users, namespace, passwordHash);
// Manually construct the YAML string
String usersYaml = constructYamlEntries(usersList);
String usersYaml = constructYamlEntries(users);
remoteService.updateConfigMapData(configMap, USERS_KEY, usersYaml);
LOG.info("ConfigMap updated successfully: {}", configMapName);
LOG.debug("ConfigMap updated successfully: {}", configMapName);
}
return psw;
}
public void restartDeployment(String etrNamespace, String deploymentName) {
void restartDeployment(String etrNamespace, String deploymentName) {
remoteService.restartDeployment(etrNamespace, deploymentName);
LOG.info("Deployment '{}' in namespace '{}' restarted successfully", deploymentName, etrNamespace);
}
public boolean userExists(String userLogin, String configMapNamespace, String configMapName) {
boolean userExists(String userLogin, String configMapNamespace, String configMapName) {
ConfigMap configMap = remoteService.getConfigMap(configMapNamespace, configMapName);
if (configMap == null) {
......@@ -75,28 +89,38 @@ public class OzgCloudElsterTransferUserService {
return false;
}
Map<String, Object> yamlMap = getUsersMapFromConfigMap(configMap);
if (!yamlMap.isEmpty()) {
List<Map<String, Object>> users = getUsersListFromMap(yamlMap);
for (Map<String, Object> user : users) {
if (userLogin.equals(user.get("login"))) {
UserList users1 = getUsersFromYaml(configMap);
boolean userExists = users1.existsUser(userLogin);
LOG.info("User with login '{}' exists in ConfigMap '{}'", userLogin, configMapName);
return true;
}
}
}
LOG.info("User with login '{}' does not exist in ConfigMap '{}'", userLogin, configMapName);
return false;
}
public void deleteUser(String userLogin, String configMapName) {
return userExists;
//TODO: Löschen, wenn der ober Code diese Funktion erfüllt
// Map<String, Object> yamlMap = getUsersMapFromConfigMap(configMap);
//
// if (!yamlMap.isEmpty()) {
// //code refactoren mit UserList Objekt (???)
//
// getUsersFromYaml(yamlMap);
//
// List<Map<String, Object>> users = getUsersListFromMap(yamlMap);
// for (Map<String, Object> user : users) {
// if (userLogin.equals(user.get("login"))) {
// LOG.info("User with login '{}' exists in ConfigMap '{}'", userLogin, configMapName);
// return true;
// }
// }
// }
// LOG.debug("User with login '{}' does not exist in ConfigMap '{}'", userLogin, configMapName);
// return false;
}
void deleteUser(String userLogin, String configMapName) {
try {
ConfigMap configMap = remoteService.getConfigMap(ETR_NAMESPACE, configMapName);
if (configMap == null) {
LOG.warn("ConfigMap '{}' not found in namespace '{}'", configMapName, ETR_NAMESPACE);
LOG.debug("ConfigMap '{}' not found in namespace '{}'", configMapName, ETR_NAMESPACE);
return;
}
......@@ -105,9 +129,8 @@ public class OzgCloudElsterTransferUserService {
return;
}
Map<String, Object> usersMap = getUsersMapFromConfigMap(configMap);
List<Map<String, Object>> usersList = getUsersListFromMap(usersMap);
usersList.removeIf(userMap -> userLogin.equals(userMap.get("login")));
UserList usersList = getUsersFromYaml(configMap);
usersList.removeDeleted(userLogin);
String updatedUsersYaml = constructYamlEntries(usersList);
//usersMap.put("users", usersList);
......@@ -120,63 +143,90 @@ public class OzgCloudElsterTransferUserService {
}
}
public void createSecret(String namespace, String psw) {
void createSecret(String namespace, String psw) {
remoteService.createSecret(namespace, psw);
LOG.info("Secret for user in namespace '{}' created successfully", namespace);
}
Map<String, Object> getUsersMapFromConfigMap(ConfigMap configMap) {
//TODO: Löschen wenn Code woanders korrekt
// Map<String, Object> getUsersMapFromConfigMap(ConfigMap configMap) {
// String usersYaml = configMap.getData().get(USERS_KEY);
//
// Map<String, Object> usersMap = new HashMap<>();
// if (usersYaml != null && !usersYaml.isEmpty()) {
// usersMap = new Yaml().load(usersYaml);
// }
// return usersMap;
// }
//TODO: Löschen wenn Code woanders korrekt
// List<Map<String, Object>> getUsersListFromMap(Map<String, Object> usersMap) {
// List<Map<String, Object>> usersList = (List<Map<String, Object>>) usersMap.get("users");
// return usersList != null ? usersList : new ArrayList<>();
// }
UserList getUsersFromYaml(ConfigMap configMap) {
String usersYaml = configMap.getData().get(USERS_KEY);
Map<String, Object> usersMap = new HashMap<>();
if (usersYaml != null && !usersYaml.isEmpty()) {
usersMap = new Yaml().load(usersYaml);
}
return usersMap != null ? usersMap : new HashMap<>();
Map<String, Object> load = new Yaml().load(usersYaml);
List<Map<String, Object>> usersList = (List<Map<String, Object>>) load.get("users");
return new UserList(usersList);
}
List<Map<String, Object>> getUsersListFromMap(Map<String, Object> usersMap) {
List<Map<String, Object>> usersList = (List<Map<String, Object>>) usersMap.get("users");
return usersList != null ? usersList : new ArrayList<>();
}
//TODO: Löschen
// boolean userExistsInList2(List<Map<String, Object>> usersList, String login) {
// for (Map<String, Object> existingUser : usersList) {
// if (login.equals(existingUser.get("login"))) {
// return true;
// }
// }
// return false;
// }
boolean userExistsInList(List<Map<String, Object>> usersList, String login) {
for (Map<String, Object> existingUser : usersList) {
if (login.equals(existingUser.get("login"))) {
return true;
}
}
return false;
boolean userExistsInList(UserList usersList, String login) {
return usersList.existsUser(login);
}
void addUserToList(List<Map<String, Object>> usersList, String login, String passwordHash) {
Map<String, Object> formattedUser = Map.of(
"login", login,
"rolle", USER_ROLE,
"credentials", Map.of("passwortHash", passwordHash),
"gruppe", login);
usersList.add(formattedUser);
void addUserToList(UserList usersList, String login, String passwordHash) {
usersList.addUserToList(login, passwordHash, USER_ROLE);
}
String generatePassword() {
//TODO: Löschen
// void addUserToList(List<Map<String, Object>> usersList, String login, String passwordHash) {
// Map<String, Object> formattedUser = Map.of(
// "login", login,
// "rolle", USER_ROLE,
// "credentials", Map.of("passwortHash", passwordHash),
// "gruppe", login);
// usersList.add(formattedUser);
// }
private String generatePassword() {
return UUID.randomUUID().toString();
}
String hashPassword(String password) {
private String hashPassword(String password) {
return BCrypt.hashpw(password, BCrypt.gensalt());
}
String constructYamlEntries(List<Map<String, Object>> usersList){
String constructYamlEntries(UserList userList) {
List<Map<String, Object>> usersList = userList.getUsersList();
StringBuilder usersYaml = new StringBuilder();
usersYaml.append("fileFormat: 1\nusers:\n");
for (Map<String, Object> userEntry : usersList) {
usersYaml.append(" - { login: \"").append(userEntry.get("login"))
usersYaml.append(getYamlForUser(userEntry));
}
return usersYaml.toString();
}
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 usersYaml.toString();
return sb.toString();
}
}
package de.ozgcloud.operator.elstertransfer.user;
import java.util.List;
import java.util.Map;
/**
* TODO Gib mir einen schöneren Namen
*/
public class UserList {
private List<Map<String, Object>> usersList;
public UserList(List<Map<String, Object>> usersList) {
this.usersList = usersList;
}
boolean existsUser(String login){
for (Map<String, Object> existingUser : usersList) {
if (login.equals(existingUser.get("login"))) {
return true;
}
}
return false;
}
//TODO Lösche diese Stelle, wenn sie im Service nicht mehr gebraucht wird
// boolean existsUSer2(String login){
// List<Map<String, Object>> users = getUsersListFromMap(yamlMap);
// for (Map<String, Object> user : users) {
// if (userLogin.equals(user.get("login"))) {
// LOG.info("User with login '{}' exists in ConfigMap '{}'", userLogin, configMapName);
// return true;
// }
// }
// }
void addUserToList(String login, String passwordHash, String role) {
Map<String, Object> formattedUser = Map.of(
"login", login,
"rolle", role,
"credentials", Map.of("passwortHash", passwordHash),
"gruppe", login);
usersList.add(formattedUser);
}
void removeDeleted(String userLogin){
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;
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment