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 d61b07f4764ea4d83949d2101a2e5ca817731c0b..3d1662e83c21e9ed161b219e519a5cffe9798905 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 7c989b0fc4f1a4f10d916adef6598ea494956327..29d9aa92df7c25db5aaeaafb6db7b42196609628 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 624a5f05dd898183375d60aa4e5ba0507f5c0da0..716231c5a93dca4ca83a8df79a71b16414fb2d17 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 b152a4833aab084b559f190f2aa4634c94dcdcb4..c995ae2e90cdf454787811e9bb38e7a11db0b752 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 4ecfa1642b38d60621a103cb837090395abdd7dd..f66eea94d55acaf604c8ce56706ad29d2d42ec6c 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);