From f64149baccf860577e122f92b83bf43b4c5b7757 Mon Sep 17 00:00:00 2001 From: OZGCloud <ozgcloud@mgm-tp.com> Date: Fri, 19 Apr 2024 16:34:20 +0200 Subject: [PATCH] OZG-5400 add update realm function --- .../KeycloakGenericRemoteService.java | 9 ++++--- .../keycloak/realm/KeycloakRealmMapper.java | 13 ++++++++++ .../realm/KeycloakRealmReconciler.java | 2 +- .../realm/KeycloakRealmRemoteService.java | 3 +++ .../keycloak/realm/KeycloakRealmService.java | 26 ++++++------------- 5 files changed, 31 insertions(+), 22 deletions(-) diff --git a/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/KeycloakGenericRemoteService.java b/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/KeycloakGenericRemoteService.java index d61b07f..3d1662e 100644 --- a/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/KeycloakGenericRemoteService.java +++ b/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/KeycloakGenericRemoteService.java @@ -35,6 +35,11 @@ public class KeycloakGenericRemoteService { .anyMatch(group -> Objects.equals(groupName, group.getName())); } + public Optional<RealmRepresentation> getRealmRepresentation(String realmName) { + return Optional.of(keycloak.realm(realmName).toRepresentation()); + } + + public Optional<RoleRepresentation> getClientRole(String roleName, String realClientId, String realm) { return Optional.ofNullable(keycloak.realm(realm).clients().get(realClientId)) .orElseThrow(() -> new KeycloakException("Client with ID " + realClientId + " for realm " + realm + " not found.")) @@ -43,7 +48,5 @@ public class KeycloakGenericRemoteService { .stream().filter(role -> Objects.equals(roleName, role.getName())) .findFirst(); } - public Optional<RealmResource> getRealm(String realm) { - return Optional.ofNullable(keycloak.realm(realm)).findFirst(); - } + } diff --git a/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmMapper.java b/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmMapper.java index 7c989b0..29d9aa9 100644 --- a/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmMapper.java +++ b/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmMapper.java @@ -35,6 +35,7 @@ import org.keycloak.representations.idm.RoleRepresentation; import org.keycloak.representations.idm.RolesRepresentation; import org.mapstruct.Mapper; import org.mapstruct.Mapping; +import org.mapstruct.MappingTarget; import org.mapstruct.Named; import org.mapstruct.ReportingPolicy; @@ -56,6 +57,18 @@ interface KeycloakRealmMapper { public RealmRepresentation map(OzgCloudKeycloakRealmSpec realm); + @Mapping(target = "displayName", source = "displayName") + @Mapping(target = "enabled", constant = "true") + @Mapping(target = "resetPasswordAllowed", constant = "true") + @Mapping(target = "supportedLocales", source = ".", qualifiedByName = "supportedLocales") + @Mapping(target = "defaultLocale", constant = "de") + @Mapping(target = "internationalizationEnabled", constant = "true") + @Mapping(target = "passwordPolicy", constant = "upperCase(1) and lowerCase(1) and length(8) and notUsername") + @Mapping(target = "actionTokenGeneratedByUserLifespan", constant = "900") + @Mapping(target = "smtpServer", source = "smtpServer", qualifiedByName = "smtpServer") + @Mapping(target = "roles.realm", source = "realmRoles") + RealmRepresentation update(@MappingTarget RealmRepresentation existingRealm, OzgCloudKeycloakRealmSpec spec); + @Mapping(target = "name", source = "name") RoleRepresentation map(OzgCloudKeycloakRealmSpec.RealmRole role); diff --git a/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmReconciler.java b/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmReconciler.java index 624a5f0..716231c 100644 --- a/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmReconciler.java +++ b/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmReconciler.java @@ -51,7 +51,7 @@ public class KeycloakRealmReconciler implements Reconciler<OzgCloudKeycloakRealm var realmName = resource.getMetadata().getNamespace(); service.createRealm(resource.getSpec(), realmName); - service.createOrUpdateClient(resource.getSpec(), resource.getMetadata().getNamespace()); + service.createOrUpdateRealm(resource.getSpec(), resource.getMetadata().getNamespace()); resource.setStatus(OzgCloudKeycloakRealmStatus.builder().status(OzgCloudCustomResourceStatus.OK).message(null).build()); return UpdateControl.updateStatus(resource); diff --git a/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmRemoteService.java b/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmRemoteService.java index b152a48..c995ae2 100644 --- a/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmRemoteService.java +++ b/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmRemoteService.java @@ -43,6 +43,9 @@ class KeycloakRealmRemoteService { public void deleteRealm(String realmName) { keycloak.realm(realmName).remove(); } + public void updateRealm(RealmRepresentation realm) { + keycloak.realm(realm.getRealm()).update(realm); + } } diff --git a/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmService.java b/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmService.java index 4ecfa16..f66eea9 100644 --- a/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmService.java +++ b/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmService.java @@ -49,24 +49,17 @@ class KeycloakRealmService { .ifPresent(remoteService::createRealm); } - void createOrUpdateRealm(OzgCloudKeycloakRealmSpec spec, String realmName) { - keycloakGenericRemoteService.getRealm(realmName) - .ifPresentOrElse(existingRealm -> updateRealm(existingRealm, spec, namespace), - () -> createRealm(spec, namespace)); + void createOrUpdateRealm(OzgCloudKeycloakRealmSpec realm, String realmName) { + keycloakGenericRemoteService.getRealmRepresentation(realmName) + .ifPresentOrElse(existingRealm -> updateRealm(existingRealm, realm), + () -> createRealm(realm, realmName)); } - void createOrUpdateClient(OzgCloudKeycloakClientSpec spec, String namespace) { - genericRemoteService.getByClientId(spec.getClientId(), namespace) - .ifPresentOrElse(existingClient -> updateClient(existingClient, spec, namespace), - () -> createClient(spec, namespace)); - } - - void updateClient(ClientRepresentation existingClient, OzgCloudKeycloakClientSpec spec, String realm) { - var clientRepresentation = mapper.update(existingClient, spec); - setProtocolMapper(clientRepresentation); - remoteService.updateClient(clientRepresentation, realm); + void updateRealm(RealmRepresentation existingRealm, OzgCloudKeycloakRealmSpec spec) { + var realmRepresentation = mapper.update(existingRealm, spec); + remoteService.updateRealm(realmRepresentation); - addOrUpdateClientRoles(spec, realm, existingClient.getId()); + //addOrUpdateRealmRoles(spec, existingRealm.getRealm()); } @@ -75,9 +68,6 @@ class KeycloakRealmService { return realm; } - String getRealmName(RealmRepresentation realm) { - return realm.getRealm(); - } public void deleteRealm(String realmName) { remoteService.deleteRealm(realmName); -- GitLab