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 53e57ffed8c03c1406bc0ecdd4c877b35873aed9..d61b07f4764ea4d83949d2101a2e5ca817731c0b 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 a77787354e95b4e222af5ced2f2fc2bcfb868825..c5615868a13b372a9d1cb5de5adbb821b876c892 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 2e291ab5f7c0d43ab85da9c911ef36a992165a85..ddac507d2642bf17021686e2a775c5cdab69f312 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 279a05573ba927a7b84b4f76166785b1fb2641e1..4ecfa1642b38d60621a103cb837090395abdd7dd 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); }