8000 Remove operator version-tolerant workaround by Copilot · Pull Request #53065 · keycloak/keycloak · GitHub
[go: up one dir, main page]

Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -13,14 +13,12 @@
import io.fabric8.kubernetes.client.utils.KubernetesResourceUtil;
import io.javaoperatorsdk.operator.api.config.informer.Informer;
import io.javaoperatorsdk.operator.api.reconciler.Context;
import io.javaoperatorsdk.operator.api.reconciler.EventSourceContext;
import io.javaoperatorsdk.operator.api.reconciler.dependent.DependentResource;
import io.javaoperatorsdk.operator.api.reconciler.dependent.GarbageCollected;
import io.javaoperatorsdk.operator.processing.dependent.Creator;
import io.javaoperatorsdk.operator.processing.dependent.kubernetes.KubernetesDependent;
import io.javaoperatorsdk.operator.processing.dependent.kubernetes.KubernetesDependentResource;
import io.javaoperatorsdk.operator.processing.dependent.workflow.Condition;
import io.javaoperatorsdk.operator.processing.event.source.SecondaryToPrimaryMapper;

@KubernetesDependent(
informer = @Informer(labelSelector = Constants.DEFAULT_LABELS_AS_STRING)
Expand Down Expand Up @@ -61,11 +59,4 @@ public static boolean hasCustomAdminSecret(Keycloak keycloak) {
return Optional.ofNullable(keycloak.getSpec().getBootstrapAdminSpec()).map(BootstrapAdminSpec::getUser)
.map(BootstrapAdminSpec.User::getSecret).filter(s -> !s.equals(KeycloakAdminSecretDependentResource.getName(keycloak))).isPresent();
}

@Override
protected Optional<SecondaryToPrimaryMapper<Secret>> getSecondaryToPrimaryMapper(
EventSourceContext<Keycloak> context) {
return VersionTolerantCRUDKubernetesDependentResource.primaryMapper(context);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,7 @@
import io.javaoperatorsdk.operator.api.config.informer.Informer;
import io.javaoperatorsdk.operator.api.reconciler.Context;
import io.javaoperatorsdk.operator.api.reconciler.dependent.DependentResource;
import io.javaoperatorsdk.operator.processing.dependent.kubernetes.CRUDKubernetesDependentResource;
import io.javaoperatorsdk.operator.processing.dependent.kubernetes.KubernetesDependent;
import io.javaoperatorsdk.operator.processing.dependent.workflow.Condition;
import io.quarkus.logging.Log;
Expand All @@ -81,7 +82,7 @@
@KubernetesDependent(
informer = @Informer(labelSelector = Constants.DEFAULT_LABELS_AS_STRING)
)
public class KeycloakDeploymentDependentResource extends VersionTolerantCRUDKubernetesDependentResource<StatefulSet, Keycloak> {
public class KeycloakDeploymentDependentResource extends CRUDKubernetesDependentResource<StatefulSet, Keycloak> {

public static final String HTTP_MANAGEMENT_SCHEME = "http-management-scheme";

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,12 +26,13 @@
import io.fabric8.kubernetes.api.model.ServiceSpecBuilder;
import io.javaoperatorsdk.operator.api.config.informer.Informer;
import io.javaoperatorsdk.operator.api.reconciler.Context;
import io.javaoperatorsdk.operator.processing.dependent.kubernetes.CRUDKubernetesDependentResource;
import io.javaoperatorsdk.operator.processing.dependent.kubernetes.KubernetesDependent;

@KubernetesDependent(
informer = @Informer(labelSelector = Constants.DEFAULT_LABELS_AS_STRING)
)
public class KeycloakDiscoveryServiceDependentResource extends VersionTolerantCRUDKubernetesDependentResource<Service, Keycloak> {
public class KeycloakDiscoveryServiceDependentResource extends CRUDKubernetesDependentResource<Service, Keycloak> {

public KeycloakDiscoveryServiceDependentResource() {
super(Service.class);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@
import io.javaoperatorsdk.operator.api.config.informer.Informer;
import io.javaoperatorsdk.operator.api.reconciler.Context;
import io.javaoperatorsdk.operator.api.reconciler.dependent.DependentResource;
import io.javaoperatorsdk.operator.processing.dependent.kubernetes.CRUDKubernetesDependentResource;
import io.javaoperatorsdk.operator.processing.dependent.kubernetes.KubernetesDependent;
import io.javaoperatorsdk.operator.processing.dependent.workflow.Condition;
import io.quarkus.logging.Log;
Expand All @@ -43,7 +44,7 @@
@KubernetesDependent(
informer = @Informer(labelSelector = Constants.DEFAULT_LABELS_AS_STRING)
)
public class KeycloakIngressDependentResource extends VersionTolerantCRUDKubernetesDependentResource<Ingress, Keycloak> {
public class KeycloakIngressDependentResource extends CRUDKubernetesDependentResource<Ingress, Keycloak> {

private static final Logger LOG = Logger.getLogger(KeycloakIngressDependentResource.class.getName());

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@
import io.javaoperatorsdk.operator.api.config.informer.Informer;
import io.javaoperatorsdk.operator.api.reconciler.Context;
import io.javaoperatorsdk.operator.api.reconciler.dependent.DependentResource;
import io.javaoperatorsdk.operator.processing.dependent.kubernetes.CRUDKubernetesDependentResource;
import io.javaoperatorsdk.operator.processing.dependent.kubernetes.KubernetesDependent;
import io.javaoperatorsdk.operator.processing.dependent.workflow.Condition;
import org.jboss.logging.Logger;
Expand All @@ -50,7 +51,7 @@
@KubernetesDependent(
informer = @Informer(labelSelector = Constants.DEFAULT_LABELS_AS_STRING)
)
public class KeycloakNetworkPolicyDependentResource extends VersionTolerantCRUDKubernetesDependentResource<NetworkPolicy, Keycloak> {
public class KeycloakNetworkPolicyDependentResource extends CRUDKubernetesDependentResource<NetworkPolicy, Keycloak> {

private static final Logger LOG = Logger.getLogger(KeycloakNetworkPolicyDependentResource.class.getName());

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,12 +45,10 @@
import io.fabric8.kubernetes.api.model.batch.v1.JobBuilder;
import io.fabric8.kubernetes.client.utils.KubernetesResourceUtil;
import io.javaoperatorsdk.operator.api.reconciler.Context;
import io.javaoperatorsdk.operator.api.reconciler.EventSourceContext;
import io.javaoperatorsdk.operator.api.reconciler.dependent.GarbageCollected;
import io.javaoperatorsdk.operator.processing.dependent.Creator;
import io.javaoperatorsdk.operator.processing.dependent.kubernetes.KubernetesDependent;
import io.javaoperatorsdk.operator.processing.dependent.kubernetes.KubernetesDependentResource;
import io.javaoperatorsdk.operator.processing.event.source.SecondaryToPrimaryMapper;

import static org.keycloak.operator.Utils.addResources;
import static org.keycloak.operator.controllers.KeycloakDistConfigurator.getKeycloakOptionEnvVarName;
Expand Down Expand Up @@ -184,10 +182,4 @@ static void handleJobScheduling(Keycloak keycloak, Optional<SchedulingSpec> sche
}
// else use the parent values
}

@Override
protected Optional<SecondaryToPrimaryMapper<Job>> getSecondaryToPrimaryMapper(
EventSourceContext<KeycloakRealmImport> context) {
return VersionTolerantCRUDKubernetesDependentResource.primaryMapper(context);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,12 +9,13 @@
import io.fabric8.kubernetes.client.utils.KubernetesResourceUtil;
import io.javaoperatorsdk.operator.api.config.informer.Informer;
import io.javaoperatorsdk.operator.api.reconciler.Context;
import io.javaoperatorsdk.operator.processing.dependent.kubernetes.CRUDKubernetesDependentResource;
import io.javaoperatorsdk.operator.processing.dependent.kubernetes.KubernetesDependent;

@KubernetesDependent(
informer = @Informer(labelSelector = Constants.DEFAULT_LABELS_AS_STRING)
)
public class KeycloakRealmImportSecretDependentResource extends VersionTolerantCRUDKubernetesDependentResource<Secret, KeycloakRealmImport> {
public class KeycloakRealmImportSecretDependentResource extends CRUDKubernetesDependentResource<Secret, KeycloakRealmImport> {

public static final String DEPENDENT_NAME = "realm-import-secret";

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,14 +33,15 @@
import io.fabric8.kubernetes.api.model.ServiceSpecBuilder;
import io.javaoperatorsdk.operator.api.config.informer.Informer;
import io.javaoperatorsdk.operator.api.reconciler.Context;
import io.javaoperatorsdk.operator.processing.dependent.kubernetes.CRUDKubernetesDependentResource;
import io.javaoperatorsdk.operator.processing.dependent.kubernetes.KubernetesDependent;

import static org.keycloak.operator.crds.v2beta1.CRDUtils.isTlsConfigured;

@KubernetesDependent(
informer = @Informer(labelSelector = Constants.DEFAULT_LABELS_AS_STRING)
)
public class KeycloakServiceDependentResource extends VersionTolerantCRUDKubernetesDependentResource<Service, Keycloak> {
public class KeycloakServiceDependentResource extends CRUDKubernetesDependentResource<Service, Keycloak> {

public KeycloakServiceDependentResource() {
super(Service.class);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
import io.javaoperatorsdk.operator.api.config.informer.Informer;
import io.javaoperatorsdk.operator.api.reconciler.Context;
import io.javaoperatorsdk.operator.api.reconciler.dependent.DependentResource;
import io.javaoperatorsdk.operator.processing.dependent.kubernetes.CRUDKubernetesDependentResource;
import io.javaoperatorsdk.operator.processing.dependent.kubernetes.KubernetesDependent;
import io.javaoperatorsdk.operator.processing.dependent.workflow.Condition;
import io.quarkiverse.operatorsdk.annotations.CSVMetadata;
Expand All @@ -31,7 +32,7 @@
informer = @Informer(labelSelector = Constants.DEFAULT_LABELS_AS_STRING)
)
@CSVMetadata.Optional
public class KeycloakServiceMonitorDependentResource extends VersionTolerantCRUDKubernetesDependentResource<ServiceMonitor, Keycloak> {
public class KeycloakServiceMonitorDependentResource extends CRUDKubernetesDependentResource<ServiceMonitor, Keycloak> {

public static final String OPEN_METRICS_PROTOCOL = "OpenMetricsText1.0.0";
public static final String WARN_METRICS_NOT_ENABLED = "A ServiceMonitor will not be created because `metrics-enabled` is not true.";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,10 +49,11 @@
import io.fabric8.kubernetes.api.model.batch.v1.JobSpecFluent;
import io.javaoperatorsdk.operator.api.config.informer.InformerConfiguration;
import io.javaoperatorsdk.operator.api.reconciler.Context;
import io.javaoperatorsdk.operator.processing.dependent.kubernetes.CRUDKubernetesDependentResource;
import io.javaoperatorsdk.operator.processing.dependent.kubernetes.KubernetesDependentResourceConfigBuilder;

@ApplicationScoped
public class KeycloakUpdateJobDependentResource extends VersionTolerantCRUDKubernetesDependentResource<Job, Keycloak> {
public class KeycloakUpdateJobDependentResource extends CRUDKubernetesDependentResource<Job, Keycloak> {

// shared volume configuration
private static final String WORK_DIR_VOLUME_NAME = "keycloak-update-job-temporary-workdir"; // unlikely to conflict
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,103 @@
package org.keycloak.operator.controllers;

import java.util.Optional;
import java.util.Set;

import org.keycloak.operator.crds.v2beta1.deployment.Keycloak;
import org.keycloak.operator.crds.v2beta1.realmimport.KeycloakRealmImport;

import io.fabric8.kubernetes.api.model.HasMetadata;
import io.fabric8.kubernetes.api.model.OwnerReferenceBuilder;
import io.fabric8.kubernetes.api.model.Secret;
import io.fabric8.kubernetes.api.model.SecretBuilder;
import io.fabric8.kubernetes.api.model.batch.v1.Job;
import io.fabric8.kubernetes.api.model.batch.v1.JobBuilder;
import io.javaoperatorsdk.operator.api.reconciler.EventSourceContext;
import io.javaoperatorsdk.operator.processing.event.ResourceID;
import io.javaoperatorsdk.operator.processing.event.source.SecondaryToPrimaryMapper;
import org.junit.jupiter.api.Test;
import org.mockito.Mockito;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertTrue;

public class OwnerReferenceMappingTest {

private static final String LEGACY_API_VERSION = "k8s.keycloak.org/v2alpha1";

@Test
void shouldMapLegacyOwnerReferenceForAdminSecret() {
var mapper = new TestKeycloakAdminSecretDependentResource()
.secondaryToPrimaryMapper(contextFor(Keycloak.class));

assertPrimaryResourceId(mapper, secretOwnedBy(Keycloak.class, "example"));
}

@Test
void shouldMapLegacyOwnerReferenceForRealmImportJob() {
var mapper = new TestKeycloakRealmImportJobDependentResource()
.secondaryToPrimaryMapper(contextFor(KeycloakRealmImport.class));

assertPrimaryResourceId(mapper, jobOwnedBy(KeycloakRealmImport.class, "example-realm-import"));
}

private static <R extends HasMetadata> void assertPrimaryResourceId(Optional<SecondaryToPrimaryMapper<R>> mapper, R secondary) {
assertTrue(mapper.isPresent());

Set<ResourceID> resourceIds = mapper.orElseThrow().toPrimaryResourceIDs(secondary);
assertEquals(1, resourceIds.size());

ResourceID resourceId = resourceIds.iterator().next();
assertEquals(secondary.getMetadata().getOwnerReferences().get(0).getName(), resourceId.getName());
assertEquals(Optional.of(secondary.getMetadata().getNamespace()), resourceId.getNamespace());
}

@SuppressWarnings("unchecked")
private static <P extends HasMetadata> EventSourceContext<P> contextFor(Class<P> primaryClass) {
EventSourceContext<P> context = Mockito.mock(EventSourceContext.class);
Mockito.when(context.getPrimaryResourceClass()).thenReturn(primaryClass);
return context;
}

private static Secret secretOwnedBy(Class<? extends HasMetadata> primaryClass, String primaryName) {
return new SecretBuilder()
.withNewMetadata()
.withName("secret")
.withNamespace("test")
.addToOwnerReferences(new OwnerReferenceBuilder()
.withApiVersion(LEGACY_API_VERSION)
.withKind(HasMetadata.getKind(primaryClass))
.withName(primaryName)
.build())
.endMetadata()
.build();
}

private static Job jobOwnedBy(Class<? extends HasMetadata> primaryClass, String primaryName) {
return new JobBuilder()
.withNewMetadata()
.withName("job")
.withNamespace("test")
.addToOwnerReferences(new OwnerReferenceBuilder()
.withApiVersion(LEGACY_API_VERSION)
.withKind(HasMetadata.getKind(primaryClass))
.withName(primaryName)
.build())
.endMetadata()
.build();
}

private static final class TestKeycloakAdminSecretDependentResource extends KeycloakAdminSecretDependentResource {

private Optional<SecondaryToPrimaryMapper<Secret>> secondaryToPrimaryMapper(EventSourceContext<Keycloak> context) {
return getSecondaryToPrimaryMapper(context);
}
}

private static final class TestKeycloakRealmImportJobDependentResource extends KeycloakRealmImportJobDependentResource {

private Optional<SecondaryToPrimaryMapper<Job>> secondaryToPrimaryMapper(EventSourceContext<KeycloakRealmImport> context) {
return getSecondaryToPrimaryMapper(context);
}
}
}
Loading
0