From 293e19c319a44c283367bd78bfcdb79119e3c71b Mon Sep 17 00:00:00 2001 From: OZGCloud <ozgcloud@mgm-tp.com> Date: Mon, 15 Apr 2024 10:01:24 +0200 Subject: [PATCH] OZG-5400 --- .../KeycloakGenericRemoteService.java | 4 +++ .../realm/KeycloakRealmReconciler.java | 1 + .../realm/KeycloakRealmRemoteService.java | 3 +++ .../keycloak/realm/KeycloakRealmService.java | 25 +++++++++++++++++++ 4 files changed, 33 insertions(+) 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 53e57ffe..d61b07f4 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 @@ -4,6 +4,7 @@ import java.util.Objects; import java.util.Optional; import org.keycloak.admin.client.Keycloak; +import org.keycloak.admin.client.resource.RealmResource; import org.keycloak.representations.idm.ClientRepresentation; import org.keycloak.representations.idm.RealmRepresentation; import org.keycloak.representations.idm.RoleRepresentation; @@ -42,4 +43,7 @@ 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/KeycloakRealmReconciler.java b/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmReconciler.java index a7778735..c5615868 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,6 +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()); 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 2e291ab5..ddac507d 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 @@ -27,6 +27,7 @@ import java.util.Objects; import java.util.Optional; import org.keycloak.admin.client.Keycloak; +import org.keycloak.admin.client.resource.RealmResource; import org.keycloak.representations.idm.RealmRepresentation; import org.keycloak.representations.idm.RoleRepresentation; import org.springframework.stereotype.Component; @@ -47,4 +48,6 @@ class KeycloakRealmRemoteService { public void deleteRealm(String realmName) { keycloak.realm(realmName).remove(); } + + } 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 279a0557..4ecfa164 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,11 +49,36 @@ class KeycloakRealmService { .ifPresent(remoteService::createRealm); } + void createOrUpdateRealm(OzgCloudKeycloakRealmSpec spec, String realmName) { + keycloakGenericRemoteService.getRealm(realmName) + .ifPresentOrElse(existingRealm -> updateRealm(existingRealm, spec, namespace), + () -> createRealm(spec, namespace)); + } + + 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); + + addOrUpdateClientRoles(spec, realm, existingClient.getId()); + } + + RealmRepresentation addRealmName(RealmRepresentation realm, String realmName) { realm.setRealm(realmName); return realm; } + String getRealmName(RealmRepresentation realm) { + return realm.getRealm(); + } + public void deleteRealm(String realmName) { remoteService.deleteRealm(realmName); } -- GitLab