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 2c3da928213a93fe77b9d5ea8e8bfb204b255cc2..81adfc5b5e70a7db9785d8480747e77cbfcf0f6a 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 @@ -23,14 +23,25 @@ */ package de.ozgcloud.operator.keycloak.realm; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.List; import java.util.Set; +import java.util.stream.Collectors; import org.keycloak.representations.idm.RealmRepresentation; import org.mapstruct.Mapper; import org.mapstruct.Mapping; + import org.mapstruct.Named; import org.mapstruct.ReportingPolicy; +import de.ozgcloud.operator.keycloak.realm.OzgCloudKeycloakRealmSpec.RealmRole; + +import org.keycloak.representations.idm.RoleRepresentation; +import org.keycloak.representations.idm.RolesRepresentation; + @Mapper(unmappedTargetPolicy = ReportingPolicy.IGNORE, unmappedSourcePolicy = ReportingPolicy.IGNORE) interface KeycloakRealmMapper { @@ -42,10 +53,33 @@ interface KeycloakRealmMapper { @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 = "roles", source = "realmRoles",qualifiedByName ="roles") public RealmRepresentation map(OzgCloudKeycloakRealmSpec realm); @Named("supportedLocales") default Set<String> mapPassword(OzgCloudKeycloakRealmSpec spec) { return Set.of("de"); } + + @Named("roles") + default RolesRepresentation maprealmRoles(List<OzgCloudKeycloakRealmSpec.RealmRole> realRoles) { + RolesRepresentation roles = new RolesRepresentation(); + + + List<String> roleNames = realRoles.stream() + .map(RealmRole::getName) + .collect(Collectors.toList()); + List<RoleRepresentation> rolerepresentationList = new ArrayList<>(roleNames.size()); + + + roleNames.forEach(roleName -> { + RoleRepresentation newRepresentation = new RoleRepresentation(); + newRepresentation.setName(roleName); + rolerepresentationList.add(newRepresentation); } ); + + roles.setRealm(rolerepresentationList); + return roles; + + } + } 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 7edc208537aec1d2afa2817c60ab98cb8eebb61f..a77787354e95b4e222af5ced2f2fc2bcfb868825 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 @@ -57,6 +57,8 @@ public class KeycloakRealmReconciler implements Reconciler<OzgCloudKeycloakRealm } catch (Exception e) { LOG.warn(resource.getMetadata().getName() + " could not reconcile in namespace " + resource.getMetadata().getNamespace(), e); + LOG.warn("STACKTRACE", e.getStackTrace()); + resource.setStatus(OzgCloudKeycloakRealmStatus.builder().status(OzgCloudCustomResourceStatus.ERROR).message(e.getMessage()).build()); return UpdateControl.updateStatus(resource).rescheduleAfter(Config.RECONCILER_RETRY_SECONDS); } 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 124f1d5dc65bcf9a39d05c279e8d8f4ac5b48150..2e291ab5f7c0d43ab85da9c911ef36a992165a85 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 @@ -23,10 +23,15 @@ */ package de.ozgcloud.operator.keycloak.realm; +import java.util.Objects; +import java.util.Optional; + import org.keycloak.admin.client.Keycloak; import org.keycloak.representations.idm.RealmRepresentation; +import org.keycloak.representations.idm.RoleRepresentation; import org.springframework.stereotype.Component; +import de.ozgcloud.operator.keycloak.KeycloakException; import lombok.RequiredArgsConstructor; @RequiredArgsConstructor diff --git a/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/realm/OzgCloudKeycloakRealmSpec.java b/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/realm/OzgCloudKeycloakRealmSpec.java index 0a23abfd2ed15f8744855b5e8d0bc406913b2fd5..4d18e8e2d8d0b1ce499c60b909e93681f17e3b5b 100644 --- a/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/realm/OzgCloudKeycloakRealmSpec.java +++ b/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/realm/OzgCloudKeycloakRealmSpec.java @@ -23,6 +23,11 @@ */ package de.ozgcloud.operator.keycloak.realm; +import java.util.List; +import java.util.ArrayList; +import org.keycloak.representations.idm.RoleRepresentation; +import org.keycloak.representations.idm.RolesRepresentation; + import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; @@ -44,4 +49,21 @@ class OzgCloudKeycloakRealmSpec { private boolean keepAfterDelete; private String displayName; + + + @Builder.Default + private List<RealmRole> realmRoles= new ArrayList<>(); + + @Getter + @Setter + @Builder + @NoArgsConstructor + @AllArgsConstructor + static class RealmRole { + + @JsonProperty("name") + private String name; + } } + +