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 ca2988c4229c0565acaaa6024e0ccde4100863b3..7c989b0fc4f1a4f10d916adef6598ea494956327 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 @@ -25,14 +25,21 @@ package de.ozgcloud.operator.keycloak.realm; import java.util.HashMap; import java.util.Map; +import java.util.ArrayList; +import java.util.List; import java.util.Set; +import java.util.stream.Collectors; import org.keycloak.representations.idm.RealmRepresentation; +import org.keycloak.representations.idm.RoleRepresentation; +import org.keycloak.representations.idm.RolesRepresentation; import org.mapstruct.Mapper; import org.mapstruct.Mapping; import org.mapstruct.Named; import org.mapstruct.ReportingPolicy; +import de.ozgcloud.operator.keycloak.realm.OzgCloudKeycloakRealmSpec.RealmRole; + @Mapper(unmappedTargetPolicy = ReportingPolicy.IGNORE, unmappedSourcePolicy = ReportingPolicy.IGNORE) interface KeycloakRealmMapper { @@ -45,8 +52,13 @@ interface KeycloakRealmMapper { @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") public RealmRepresentation map(OzgCloudKeycloakRealmSpec realm); + + @Mapping(target = "name", source = "name") + RoleRepresentation map(OzgCloudKeycloakRealmSpec.RealmRole role); + @Named("supportedLocales") default Set<String> mapPassword(OzgCloudKeycloakRealmSpec spec) { return Set.of("de"); 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 4703f154ee68169988fceac1324a9374bfc5c539..7736f40a2f3376ad7fff141a1973e23a72b46360 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,9 @@ */ package de.ozgcloud.operator.keycloak.realm; +import java.util.ArrayList; +import java.util.List; + import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; @@ -48,9 +51,7 @@ class OzgCloudKeycloakRealmSpec { private KeycloakRealmSMTPServer smtpServer; @Getter - @Setter @Builder - @NoArgsConstructor @AllArgsConstructor static class KeycloakRealmSMTPServer { @@ -69,4 +70,16 @@ class OzgCloudKeycloakRealmSpec { private String fromDisplayName; } + + @Builder.Default + private List<RealmRole> realmRoles = new ArrayList<>(); + + @Getter + @Builder + @AllArgsConstructor + static class RealmRole { + + @JsonProperty("name") + private String name; + } } diff --git a/ozgcloud-keycloak-operator/src/test/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmMapperTest.java b/ozgcloud-keycloak-operator/src/test/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmMapperTest.java index 074f65dbb685587821e7363a11bcb752e9a4a00b..f36b39c8fc173d6391b7bd0b8107c428f6ff766f 100644 --- a/ozgcloud-keycloak-operator/src/test/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmMapperTest.java +++ b/ozgcloud-keycloak-operator/src/test/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmMapperTest.java @@ -118,4 +118,20 @@ class KeycloakRealmMapperTest { assertThat(mapped.getSmtpServer()).isEmpty(); } + + @Test + void shouldMapRealmRoles() { + var mapped = mapper.map(OzgCloudKeycloakRealmSpecTestFactory.create()); + + assertThat(mapped.getRoles().getRealm()).hasSize(2); + } + + @Test + void shouldContainRealmRolesValues() { + var mapped = mapper.map(OzgCloudKeycloakRealmSpecTestFactory.create()); + var mappedRealmRoles = mapped.getRoles(); + + assertThat(mappedRealmRoles.getRealm().get(0).getName()).isEqualTo(OzgCloudKeycloakRealmSpecTestFactory.ROLE_NAME_1); + assertThat(mappedRealmRoles.getRealm().get(1).getName()).isEqualTo(OzgCloudKeycloakRealmSpecTestFactory.ROLE_NAME_2); + } } diff --git a/ozgcloud-keycloak-operator/src/test/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmReconcilerTest.java b/ozgcloud-keycloak-operator/src/test/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmReconcilerTest.java index 510b314521a42509b33fcb971fa15e3a6e53963b..76e8fad81d7e513c4c24c68e8631c3d093b91cf1 100644 --- a/ozgcloud-keycloak-operator/src/test/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmReconcilerTest.java +++ b/ozgcloud-keycloak-operator/src/test/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmReconcilerTest.java @@ -72,6 +72,9 @@ class KeycloakRealmReconcilerTest { assertThat(response.getResource().getStatus().getStatus()).isEqualTo(OzgCloudCustomResourceStatus.OK); } + + + } @DisplayName("Reconciler Cleanup") @@ -154,6 +157,7 @@ class KeycloakRealmReconcilerTest { assertThat(control).usingRecursiveComparison() .isEqualTo(DeleteControl.noFinalizerRemoval().rescheduleAfter(Config.RECONCILER_RETRY_SECONDS_ON_ERROR)); } + } } } diff --git a/ozgcloud-keycloak-operator/src/test/java/de/ozgcloud/operator/keycloak/realm/OzgCloudKeycloakRealmSpecTestFactory.java b/ozgcloud-keycloak-operator/src/test/java/de/ozgcloud/operator/keycloak/realm/OzgCloudKeycloakRealmSpecTestFactory.java index 2b03fdab23db589c84807b0a07cd2c971b5cd369..5c27b298f4f21487701334bbd9f0be3c1ccfd7d1 100644 --- a/ozgcloud-keycloak-operator/src/test/java/de/ozgcloud/operator/keycloak/realm/OzgCloudKeycloakRealmSpecTestFactory.java +++ b/ozgcloud-keycloak-operator/src/test/java/de/ozgcloud/operator/keycloak/realm/OzgCloudKeycloakRealmSpecTestFactory.java @@ -23,11 +23,21 @@ */ package de.ozgcloud.operator.keycloak.realm; +import java.util.List; + +import de.ozgcloud.operator.keycloak.realm.OzgCloudKeycloakRealmSpec.RealmRole; + public class OzgCloudKeycloakRealmSpecTestFactory { public final static String DISPLAY_NAME = "TestDisplayName"; public final static boolean KEEP_AFTER_DELETE = false; + public static final String ROLE_NAME_1 = "RoleName1"; + public static final RealmRole ROLE1 = RealmRole.builder().name(ROLE_NAME_1).build(); + public static final String ROLE_NAME_2 = "RoleName2"; + public static final RealmRole ROLE2 = RealmRole.builder().name(ROLE_NAME_2).build(); + public static final List<RealmRole> ROLES = List.of(ROLE1, ROLE2); + public static OzgCloudKeycloakRealmSpec create() { return createBuilder().build(); } @@ -36,6 +46,7 @@ public class OzgCloudKeycloakRealmSpecTestFactory { return OzgCloudKeycloakRealmSpec.builder() .keepAfterDelete(KEEP_AFTER_DELETE) .displayName(DISPLAY_NAME) - .smtpServer(KeycloakRealmSmtpServerTestFactory.create()); + .smtpServer(KeycloakRealmSmtpServerTestFactory.create()) + .realmRoles(ROLES); } }