From d9529268e096a221060a1874c24cac1a5bb0e779 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Attila=20M=C3=A9sz=C3=A1ros?= Date: Sun, 15 Dec 2024 22:37:27 +0100 Subject: [PATCH 01/21] chore: quarkus operator sdk and related version updates MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Attila Mészáros --- pom.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pom.xml b/pom.xml index e521084..4ee3dc3 100644 --- a/pom.xml +++ b/pom.xml @@ -17,11 +17,11 @@ 3.5.2 java-operator-sdk https://sonarcloud.io - 6.13.1 - 3.8.3 + 7.1.0 + 3.17.4 24.1.2 5.11.0 - 6.6.8 + 7.0.1 3.27.3 2.43.0 From 89cc67cf8bc9af4db9962e7f7cc2d1e854c30e32 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Attila=20M=C3=A9sz=C3=A1ros?= Date: Sun, 23 Feb 2025 19:10:10 +0100 Subject: [PATCH 02/21] fix build MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Attila Mészáros --- pom.xml | 4 +- .../javaoperatorsdk/operator/glue/Utils.java | 2 +- .../glue/customresource/AbstractStatus.java | 11 ++++- .../dependent/GCGenericDependentResource.java | 9 ++-- .../GenericBulkDependentResource.java | 2 +- .../dependent/GenericDependentResource.java | 37 +++++++++++++- .../GenericResourceDiscriminator.java | 48 ------------------- .../reconciler/ValidationAndErrorHandler.java | 4 +- .../glue/reconciler/glue/GlueReconciler.java | 44 ++++++++--------- .../reconciler/glue/InformerProducer.java | 4 +- .../reconciler/glue/InformerRegister.java | 10 ++-- ...OwnedResourceSecondaryToPrimaryMapper.java | 5 +- .../operator/GlueOperatorReconciler.java | 23 +++++---- src/main/resources/application.properties | 1 + .../reconciler/glue/InformerRegisterTest.java | 2 +- 15 files changed, 99 insertions(+), 107 deletions(-) delete mode 100644 src/main/java/io/javaoperatorsdk/operator/glue/dependent/GenericResourceDiscriminator.java diff --git a/pom.xml b/pom.xml index 4ee3dc3..8de238e 100644 --- a/pom.xml +++ b/pom.xml @@ -18,10 +18,10 @@ java-operator-sdk https://sonarcloud.io 7.1.0 - 3.17.4 + 3.19.0 24.1.2 5.11.0 - 7.0.1 + 7.1.0 3.27.3 2.43.0 diff --git a/src/main/java/io/javaoperatorsdk/operator/glue/Utils.java b/src/main/java/io/javaoperatorsdk/operator/glue/Utils.java index 5311c49..560777f 100644 --- a/src/main/java/io/javaoperatorsdk/operator/glue/Utils.java +++ b/src/main/java/io/javaoperatorsdk/operator/glue/Utils.java @@ -66,7 +66,7 @@ public static Map getRelatedResources(Glue gl var es = (InformerEventSource) context .eventSourceRetriever() - .getResourceEventSourceFor(GenericKubernetesResource.class, gvk.toString()); + .getEventSourceFor(GenericKubernetesResource.class, gvk.toString()); var namespace = relatedResourceSpec.isClusterScoped() ? null : relatedResourceSpec.getNamespace() == null ? glue.getMetadata().getNamespace() diff --git a/src/main/java/io/javaoperatorsdk/operator/glue/customresource/AbstractStatus.java b/src/main/java/io/javaoperatorsdk/operator/glue/customresource/AbstractStatus.java index 5744ef4..22f9824 100644 --- a/src/main/java/io/javaoperatorsdk/operator/glue/customresource/AbstractStatus.java +++ b/src/main/java/io/javaoperatorsdk/operator/glue/customresource/AbstractStatus.java @@ -1,8 +1,8 @@ package io.javaoperatorsdk.operator.glue.customresource; -import io.javaoperatorsdk.operator.api.ObservedGenerationAwareStatus; +public class AbstractStatus { -public class AbstractStatus extends ObservedGenerationAwareStatus { + private Long observedGeneration = null; private String errorMessage; @@ -14,4 +14,11 @@ public void setErrorMessage(String errorMessage) { this.errorMessage = errorMessage; } + public Long getObservedGeneration() { + return observedGeneration; + } + + public void setObservedGeneration(Long observedGeneration) { + this.observedGeneration = observedGeneration; + } } diff --git a/src/main/java/io/javaoperatorsdk/operator/glue/dependent/GCGenericDependentResource.java b/src/main/java/io/javaoperatorsdk/operator/glue/dependent/GCGenericDependentResource.java index 9dbf369..7a22bf7 100644 --- a/src/main/java/io/javaoperatorsdk/operator/glue/dependent/GCGenericDependentResource.java +++ b/src/main/java/io/javaoperatorsdk/operator/glue/dependent/GCGenericDependentResource.java @@ -10,13 +10,14 @@ public class GCGenericDependentResource extends GenericDependentResource implements GarbageCollected { public GCGenericDependentResource(GenericTemplateHandler genericTemplateHandler, - GenericKubernetesResource desired, String name, + GenericKubernetesResource desired, String name, String namespace, boolean clusterScoped, Matcher matcher) { - super(genericTemplateHandler, desired, name, clusterScoped, matcher); + super(genericTemplateHandler, desired, name, namespace, clusterScoped, matcher); } public GCGenericDependentResource(GenericTemplateHandler genericTemplateHandler, - String desiredTemplate, String name, boolean clusterScoped, Matcher matcher) { - super(genericTemplateHandler, desiredTemplate, name, clusterScoped, matcher); + String desiredTemplate, String name, String namespace, boolean clusterScoped, + Matcher matcher) { + super(genericTemplateHandler, desiredTemplate, name, namespace, clusterScoped, matcher); } } diff --git a/src/main/java/io/javaoperatorsdk/operator/glue/dependent/GenericBulkDependentResource.java b/src/main/java/io/javaoperatorsdk/operator/glue/dependent/GenericBulkDependentResource.java index a98dbd9..2ea06f6 100644 --- a/src/main/java/io/javaoperatorsdk/operator/glue/dependent/GenericBulkDependentResource.java +++ b/src/main/java/io/javaoperatorsdk/operator/glue/dependent/GenericBulkDependentResource.java @@ -22,7 +22,7 @@ public GenericBulkDependentResource(GenericTemplateHandler genericTemplateHandle String desiredTemplate, String name, boolean clusterScoped, Matcher matcher) { - super(genericTemplateHandler, desiredTemplate, name, clusterScoped, matcher); + super(genericTemplateHandler, desiredTemplate, name, null, clusterScoped, matcher); } @Override diff --git a/src/main/java/io/javaoperatorsdk/operator/glue/dependent/GenericDependentResource.java b/src/main/java/io/javaoperatorsdk/operator/glue/dependent/GenericDependentResource.java index a111aac..01fcdfc 100644 --- a/src/main/java/io/javaoperatorsdk/operator/glue/dependent/GenericDependentResource.java +++ b/src/main/java/io/javaoperatorsdk/operator/glue/dependent/GenericDependentResource.java @@ -1,5 +1,9 @@ package io.javaoperatorsdk.operator.glue.dependent; +import java.util.Objects; +import java.util.Optional; +import java.util.Set; + import io.fabric8.kubernetes.api.model.GenericKubernetesResource; import io.fabric8.kubernetes.client.utils.Serialization; import io.javaoperatorsdk.operator.api.reconciler.Context; @@ -23,16 +27,18 @@ public class GenericDependentResource protected final GenericKubernetesResource desired; protected final String desiredTemplate; protected final String name; + protected final String namespace; protected final boolean clusterScoped; protected final Matcher matcher; protected final GenericTemplateHandler genericTemplateHandler; public GenericDependentResource(GenericTemplateHandler genericTemplateHandler, - GenericKubernetesResource desired, String name, + GenericKubernetesResource desired, String name, String namespace, boolean clusterScoped, Matcher matcher) { super(new GroupVersionKind(desired.getApiVersion(), desired.getKind())); this.desired = desired; + this.namespace = namespace; this.matcher = matcher; this.desiredTemplate = null; this.name = name; @@ -41,12 +47,14 @@ public GenericDependentResource(GenericTemplateHandler genericTemplateHandler, } public GenericDependentResource(GenericTemplateHandler genericTemplateHandler, - String desiredTemplate, String name, boolean clusterScoped, Matcher matcher) { + String desiredTemplate, String name, String namespace, boolean clusterScoped, + Matcher matcher) { super(new GroupVersionKind(Utils.getApiVersionFromTemplate(desiredTemplate), Utils.getKindFromTemplate(desiredTemplate))); this.genericTemplateHandler = genericTemplateHandler; this.name = name; this.desiredTemplate = desiredTemplate; + this.namespace = namespace; this.matcher = matcher; this.desired = null; this.clusterScoped = clusterScoped; @@ -84,4 +92,29 @@ public Result match(GenericKubernetesResource actualR return Result.nonComputed(false); } } + + @Override + protected Optional selectTargetSecondaryResource( + Set secondaryResources, + Glue primary, + Context context) { + + var res = context.getSecondaryResources(GenericKubernetesResource.class) + .stream() + .filter(r -> r.getKind().equals(getGroupVersionKind().getKind()) && + r.getApiVersion().equals(getGroupVersionKind().apiVersion()) && + r.getMetadata().getName().equals(name) && + (namespace == null || Objects.equals(namespace, r.getMetadata().getNamespace()))) + .toList(); + + if (res.size() > 1) { + throw new IllegalStateException("Multiple resources found for gvk: " + getGroupVersionKind() + + " name:" + name + + " namespace:" + namespace); + } else if (res.size() == 1) { + return Optional.of(res.get(0)); + } else { + return Optional.empty(); + } + } } diff --git a/src/main/java/io/javaoperatorsdk/operator/glue/dependent/GenericResourceDiscriminator.java b/src/main/java/io/javaoperatorsdk/operator/glue/dependent/GenericResourceDiscriminator.java deleted file mode 100644 index e351183..0000000 --- a/src/main/java/io/javaoperatorsdk/operator/glue/dependent/GenericResourceDiscriminator.java +++ /dev/null @@ -1,48 +0,0 @@ -package io.javaoperatorsdk.operator.glue.dependent; - -import java.util.Objects; -import java.util.Optional; - -import io.fabric8.kubernetes.api.model.GenericKubernetesResource; -import io.javaoperatorsdk.operator.api.reconciler.Context; -import io.javaoperatorsdk.operator.api.reconciler.ResourceDiscriminator; -import io.javaoperatorsdk.operator.glue.customresource.glue.Glue; -import io.javaoperatorsdk.operator.processing.GroupVersionKind; - -public class GenericResourceDiscriminator - implements ResourceDiscriminator { - - private final GroupVersionKind groupVersionKind; - private final String name; - private final String namespace; - - public GenericResourceDiscriminator(GroupVersionKind groupVersionKind, String name, - String namespace) { - this.groupVersionKind = groupVersionKind; - this.name = name; - this.namespace = namespace; - } - - @Override - public Optional distinguish(Class resource, - Glue primary, - Context context) { - var res = context.getSecondaryResources(GenericKubernetesResource.class) - .stream() - .filter(r -> r.getKind().equals(groupVersionKind.getKind()) && - r.getApiVersion().equals(groupVersionKind.apiVersion()) && - r.getMetadata().getName().equals(name) && - (namespace == null || Objects.equals(namespace, r.getMetadata().getNamespace()))) - .toList(); - - if (res.size() > 1) { - throw new IllegalStateException("Multiple resources found for gvk: " + groupVersionKind - + " name:" + name - + " namespace:" + namespace); - } else if (res.size() == 1) { - return Optional.of(res.get(0)); - } else { - return Optional.empty(); - } - } -} diff --git a/src/main/java/io/javaoperatorsdk/operator/glue/reconciler/ValidationAndErrorHandler.java b/src/main/java/io/javaoperatorsdk/operator/glue/reconciler/ValidationAndErrorHandler.java index 43cf57d..351dc07 100644 --- a/src/main/java/io/javaoperatorsdk/operator/glue/reconciler/ValidationAndErrorHandler.java +++ b/src/main/java/io/javaoperatorsdk/operator/glue/reconciler/ValidationAndErrorHandler.java @@ -37,14 +37,14 @@ public class ValidationAndErrorHandler { if (e instanceof ValidationAndErrorHandler.NonUniqueNameException ex) { resource.getStatus() .setErrorMessage(NON_UNIQUE_NAMES_FOUND_PREFIX + String.join(",", ex.getDuplicates())); - return ErrorStatusUpdateControl.updateStatus(resource).withNoRetry(); + return ErrorStatusUpdateControl.patchStatus(resource).withNoRetry(); } else { var message = e.getMessage(); if (message.length() > MAX_MESSAGE_SIZE) { message = message.substring(0, MAX_MESSAGE_SIZE) + "..."; } resource.getStatus().setErrorMessage("Error: " + message); - return ErrorStatusUpdateControl.updateStatus(resource); + return ErrorStatusUpdateControl.patchStatus(resource); } } diff --git a/src/main/java/io/javaoperatorsdk/operator/glue/reconciler/glue/GlueReconciler.java b/src/main/java/io/javaoperatorsdk/operator/glue/reconciler/glue/GlueReconciler.java index d3cb5c9..ad5a856 100644 --- a/src/main/java/io/javaoperatorsdk/operator/glue/reconciler/glue/GlueReconciler.java +++ b/src/main/java/io/javaoperatorsdk/operator/glue/reconciler/glue/GlueReconciler.java @@ -24,11 +24,9 @@ import io.javaoperatorsdk.operator.glue.dependent.GCGenericBulkDependentResource; import io.javaoperatorsdk.operator.glue.dependent.GCGenericDependentResource; import io.javaoperatorsdk.operator.glue.dependent.GenericDependentResource; -import io.javaoperatorsdk.operator.glue.dependent.GenericResourceDiscriminator; import io.javaoperatorsdk.operator.glue.reconciler.ValidationAndErrorHandler; import io.javaoperatorsdk.operator.glue.reconciler.operator.GlueOperatorReconciler; import io.javaoperatorsdk.operator.glue.templating.GenericTemplateHandler; -import io.javaoperatorsdk.operator.processing.dependent.BulkDependentResource; import io.javaoperatorsdk.operator.processing.dependent.workflow.Condition; import io.javaoperatorsdk.operator.processing.dependent.workflow.KubernetesResourceDeletedCondition; import io.javaoperatorsdk.operator.processing.dependent.workflow.WorkflowBuilder; @@ -38,7 +36,7 @@ import static io.javaoperatorsdk.operator.glue.reconciler.operator.GlueOperatorReconciler.PARENT_RELATED_RESOURCE_NAME; @ControllerConfiguration(name = GlueReconciler.GLUE_RECONCILER_NAME) -public class GlueReconciler implements Reconciler, Cleaner, ErrorStatusHandler { +public class GlueReconciler implements Reconciler, Cleaner { private static final Logger log = LoggerFactory.getLogger(GlueReconciler.class); public static final String DEPENDENT_NAME_ANNOTATION_KEY = @@ -107,7 +105,7 @@ public DeleteControl cleanup(Glue primary, Context context) { return DeleteControl.noFinalizerRemoval(); } else { removeFinalizerForParent(primary, context); - actualWorkflow.getDependentResourcesByNameWithoutActivationCondition().forEach((n, dr) -> { + actualWorkflow.getDependentResourcesWithoutActivationCondition().forEach(dr -> { var genericDependentResource = (GenericDependentResource) dr; informerRegister.deRegisterInformer(genericDependentResource.getGroupVersionKind(), primary, context); @@ -201,55 +199,51 @@ private void createAndAddDependentToWorkflow(Glue primary, Context context targetNamespace.map(n -> n.trim().equals(primary.getMetadata().getNamespace().trim())) .orElse(true); - var dr = createDependentResource(spec, leafDependent, resourceInSameNamespaceAsPrimary); + var name = genericTemplateHandler.processTemplate(Utils.getName(spec), primary, false, context); + var dr = createDependentResource(name, spec, leafDependent, resourceInSameNamespaceAsPrimary, + targetNamespace.orElse(null)); var gvk = dr.getGroupVersionKind(); - if (!(dr instanceof BulkDependentResource)) { - dr.setResourceDiscriminator(new GenericResourceDiscriminator(dr.getGroupVersionKind(), - genericTemplateHandler.processTemplate(Utils.getName(spec), primary, false, context), - targetNamespace.orElse(null))); - } - var es = informerRegister.registerInformer(context, gvk, primary); - dr.configureWith(es); + dr.setEventSource(es); - builder.addDependentResource(dr); - spec.getDependsOn().forEach(s -> builder.dependsOn(genericDependentResourceMap.get(s))); - // if a resources does not depend on another there is no reason to add cleanup condition + var nodeBuilder = builder.addDependentResourceAndConfigure(dr); + spec.getDependsOn().forEach(s -> nodeBuilder.dependsOn(genericDependentResourceMap.get(s))); + // if resources do not depend on another, there is no reason to add cleanup condition if (!spec.getDependsOn().isEmpty()) { - builder.withDeletePostcondition(deletePostCondition); + nodeBuilder.withDeletePostcondition(deletePostCondition); } genericDependentResourceMap.put(spec.getName(), dr); Optional.ofNullable(spec.getReadyPostCondition()) - .ifPresent(c -> builder.withReadyPostcondition(toCondition(c))); + .ifPresent(c -> nodeBuilder.withReadyPostcondition(toCondition(c))); Optional.ofNullable(spec.getCondition()) - .ifPresent(c -> builder.withReconcilePrecondition(toCondition(c))); + .ifPresent(c -> nodeBuilder.withReconcilePrecondition(toCondition(c))); } - private GenericDependentResource createDependentResource(DependentResourceSpec spec, - boolean leafDependent, Boolean resourceInSameNamespaceAsPrimary) { + private GenericDependentResource createDependentResource(String name, DependentResourceSpec spec, + boolean leafDependent, Boolean resourceInSameNamespaceAsPrimary, String namespace) { if (leafDependent && resourceInSameNamespaceAsPrimary && !spec.isClusterScoped()) { return spec.getResourceTemplate() != null ? spec.getBulk() ? new GCGenericBulkDependentResource(genericTemplateHandler, spec.getResourceTemplate(), - spec.getName(), + name, spec.isClusterScoped(), spec.getMatcher()) : new GCGenericDependentResource(genericTemplateHandler, spec.getResourceTemplate(), - spec.getName(), + name, namespace, spec.isClusterScoped(), spec.getMatcher()) : new GCGenericDependentResource(genericTemplateHandler, spec.getResource(), - spec.getName(), + name, namespace, spec.isClusterScoped(), spec.getMatcher()); } else { return spec.getResourceTemplate() != null ? new GenericDependentResource(genericTemplateHandler, - spec.getResourceTemplate(), spec.getName(), spec.isClusterScoped(), + spec.getResourceTemplate(), name, namespace, spec.isClusterScoped(), spec.getMatcher()) : new GenericDependentResource(genericTemplateHandler, - spec.getResource(), spec.getName(), spec.isClusterScoped(), spec.getMatcher()); + spec.getResource(), name, namespace, spec.isClusterScoped(), spec.getMatcher()); } } diff --git a/src/main/java/io/javaoperatorsdk/operator/glue/reconciler/glue/InformerProducer.java b/src/main/java/io/javaoperatorsdk/operator/glue/reconciler/glue/InformerProducer.java index 405db6e..4b7a957 100644 --- a/src/main/java/io/javaoperatorsdk/operator/glue/reconciler/glue/InformerProducer.java +++ b/src/main/java/io/javaoperatorsdk/operator/glue/reconciler/glue/InformerProducer.java @@ -2,7 +2,7 @@ import io.fabric8.kubernetes.api.model.GenericKubernetesResource; -import io.javaoperatorsdk.operator.api.config.informer.InformerConfiguration; +import io.javaoperatorsdk.operator.api.config.informer.InformerEventSourceConfiguration; import io.javaoperatorsdk.operator.api.reconciler.Context; import io.javaoperatorsdk.operator.glue.customresource.glue.Glue; import io.javaoperatorsdk.operator.processing.event.source.informer.InformerEventSource; @@ -15,7 +15,7 @@ public class InformerProducer { public InformerEventSource createInformer( - InformerConfiguration configuration, + InformerEventSourceConfiguration configuration, Context context) { return new InformerEventSource<>(configuration, context.eventSourceRetriever().eventSourceContextForDynamicRegistration()); diff --git a/src/main/java/io/javaoperatorsdk/operator/glue/reconciler/glue/InformerRegister.java b/src/main/java/io/javaoperatorsdk/operator/glue/reconciler/glue/InformerRegister.java index 02a6fdf..b57e71d 100644 --- a/src/main/java/io/javaoperatorsdk/operator/glue/reconciler/glue/InformerRegister.java +++ b/src/main/java/io/javaoperatorsdk/operator/glue/reconciler/glue/InformerRegister.java @@ -8,7 +8,7 @@ import org.slf4j.LoggerFactory; import io.fabric8.kubernetes.api.model.GenericKubernetesResource; -import io.javaoperatorsdk.operator.api.config.informer.InformerConfiguration; +import io.javaoperatorsdk.operator.api.config.informer.InformerEventSourceConfiguration; import io.javaoperatorsdk.operator.api.reconciler.Context; import io.javaoperatorsdk.operator.glue.ControllerConfig; import io.javaoperatorsdk.operator.glue.Utils; @@ -94,8 +94,9 @@ public InformerEventSource registerInformer( markEventSource(gvk, glue); } - var configBuilder = InformerConfiguration.from(gvk) - .withSecondaryToPrimaryMapper(mapper); + var configBuilder = InformerEventSourceConfiguration.from(gvk, Glue.class) + .withSecondaryToPrimaryMapper(mapper) + .withName(gvk.toString()); labelSelectorForGVK(gvk).ifPresent(ls -> { log.debug("Registering label selector: {} for informer for gvk: {}", ls, gvk); configBuilder.withLabelSelector(ls); @@ -105,8 +106,7 @@ public InformerEventSource registerInformer( return (InformerEventSource) context .eventSourceRetriever() - .dynamicallyRegisterEventSource(gvk.toString(), newInformer); - + .dynamicallyRegisterEventSource(newInformer); } public synchronized void deRegisterInformer(GroupVersionKind groupVersionKind, diff --git a/src/main/java/io/javaoperatorsdk/operator/glue/reconciler/glue/RelatedAndOwnedResourceSecondaryToPrimaryMapper.java b/src/main/java/io/javaoperatorsdk/operator/glue/reconciler/glue/RelatedAndOwnedResourceSecondaryToPrimaryMapper.java index 5f722b5..ffcf713 100644 --- a/src/main/java/io/javaoperatorsdk/operator/glue/reconciler/glue/RelatedAndOwnedResourceSecondaryToPrimaryMapper.java +++ b/src/main/java/io/javaoperatorsdk/operator/glue/reconciler/glue/RelatedAndOwnedResourceSecondaryToPrimaryMapper.java @@ -7,6 +7,7 @@ import java.util.concurrent.ConcurrentHashMap; import io.fabric8.kubernetes.api.model.GenericKubernetesResource; +import io.javaoperatorsdk.operator.glue.customresource.operator.GlueOperator; import io.javaoperatorsdk.operator.processing.event.ResourceID; import io.javaoperatorsdk.operator.processing.event.source.SecondaryToPrimaryMapper; import io.javaoperatorsdk.operator.processing.event.source.informer.Mappers; @@ -19,8 +20,8 @@ public class RelatedAndOwnedResourceSecondaryToPrimaryMapper @Override public Set toPrimaryResourceIDs(GenericKubernetesResource resource) { // based on if GC or non GC dependent it can have different mapping - var res = Mappers.fromOwnerReferences(false).toPrimaryResourceIDs(resource); - res.addAll(Mappers.fromDefaultAnnotations().toPrimaryResourceIDs(resource)); + var res = Mappers.fromOwnerReferences(GlueOperator.class, false).toPrimaryResourceIDs(resource); + res.addAll(Mappers.fromDefaultAnnotations(GlueOperator.class).toPrimaryResourceIDs(resource)); // related resource mapping var idMapped = secondaryToPrimaryMap.get( diff --git a/src/main/java/io/javaoperatorsdk/operator/glue/reconciler/operator/GlueOperatorReconciler.java b/src/main/java/io/javaoperatorsdk/operator/glue/reconciler/operator/GlueOperatorReconciler.java index d1943a0..fb8712d 100644 --- a/src/main/java/io/javaoperatorsdk/operator/glue/reconciler/operator/GlueOperatorReconciler.java +++ b/src/main/java/io/javaoperatorsdk/operator/glue/reconciler/operator/GlueOperatorReconciler.java @@ -10,7 +10,7 @@ import io.fabric8.kubernetes.api.model.ObjectMeta; import io.fabric8.kubernetes.api.model.ObjectMetaBuilder; import io.fabric8.kubernetes.client.utils.KubernetesResourceUtil; -import io.javaoperatorsdk.operator.api.config.informer.InformerConfiguration; +import io.javaoperatorsdk.operator.api.config.informer.InformerEventSourceConfiguration; import io.javaoperatorsdk.operator.api.reconciler.*; import io.javaoperatorsdk.operator.glue.ControllerConfig; import io.javaoperatorsdk.operator.glue.GlueException; @@ -33,8 +33,8 @@ @ControllerConfiguration(name = GlueOperatorReconciler.GLUE_OPERATOR_RECONCILER_NAME) public class GlueOperatorReconciler - implements Reconciler, EventSourceInitializer, - Cleaner, ErrorStatusHandler { + implements Reconciler, + Cleaner { private static final Logger log = LoggerFactory.getLogger(GlueOperatorReconciler.class); @@ -177,34 +177,37 @@ private InformerEventSource getOrRegist try { es = (InformerEventSource) context .eventSourceRetriever() - .getResourceEventSourceFor(GenericKubernetesResource.class, gvk.toString()); + .getEventSourceFor(GenericKubernetesResource.class, gvk.toString()); es.start(); } catch (IllegalArgumentException e) { - var configBuilder = InformerConfiguration.from(gvk, - context.eventSourceRetriever().eventSourceContextForDynamicRegistration()) + var configBuilder = InformerEventSourceConfiguration.from(gvk, GlueOperator.class) + .withName(gvk.toString()) .withSecondaryToPrimaryMapper( resource -> Set.of(ResourceID.fromResource(glueOperator))); + + if (spec.getParent().getLabelSelector() != null) { configBuilder.withLabelSelector(spec.getParent().getLabelSelector()); } es = new InformerEventSource<>(configBuilder.build(), context.eventSourceRetriever().eventSourceContextForDynamicRegistration()); - context.eventSourceRetriever().dynamicallyRegisterEventSource(gvk.toString(), es); + context.eventSourceRetriever().dynamicallyRegisterEventSource(es); } return es; } @Override - public Map prepareEventSources( + public List> prepareEventSources( EventSourceContext eventSourceContext) { glueEventSource = new InformerEventSource<>( - InformerConfiguration.from(Glue.class, eventSourceContext) + InformerEventSourceConfiguration.from(Glue.class, GlueOperator.class) + .withName("GlueEventSource") .withLabelSelector(FOR_GLUE_OPERATOR_LABEL_KEY + "=" + FOR_GLUE_OPERATOR_LABEL_VALUE) .build(), eventSourceContext); - return EventSourceInitializer.nameEventSources(glueEventSource); + return List.of(glueEventSource); } @Override diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index a501d72..c9ca4d7 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -11,3 +11,4 @@ quarkus.container-image.labels."org.opencontainers.image.source"=https://github. quarkus.container-image.labels."org.opencontainers.image.documentation"=https://github.com/java-operator-sdk/kubernetes-glue-operator?tab=readme-ov-file#documentation # Generate apply-able cluster role bindings quarkus.kubernetes.namespace=default +quarkus.operator-sdk.enable-ssa=false \ No newline at end of file diff --git a/src/test/java/io/javaoperatorsdk/operator/glue/reconciler/glue/InformerRegisterTest.java b/src/test/java/io/javaoperatorsdk/operator/glue/reconciler/glue/InformerRegisterTest.java index 009bd6d..a9fca1f 100644 --- a/src/test/java/io/javaoperatorsdk/operator/glue/reconciler/glue/InformerRegisterTest.java +++ b/src/test/java/io/javaoperatorsdk/operator/glue/reconciler/glue/InformerRegisterTest.java @@ -38,7 +38,7 @@ void registersInformerWithLabelSelectorIfConfigured() { register.registerInformer(mockContext, gvk, testGlue()); verify(informerProducer).createInformer(argThat(c -> { - assertThat(c.getLabelSelector()).isEqualTo(LABEL_SELECTOR); + assertThat(c.getInformerConfig().getLabelSelector()).isEqualTo(LABEL_SELECTOR); return true; }), any()); } From dc703a4816aeefe4bc351176a25a56b2880c2317 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Attila=20M=C3=A9sz=C3=A1ros?= Date: Mon, 24 Feb 2025 10:53:01 +0100 Subject: [PATCH 03/21] fixes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Attila Mészáros --- .../dependent/GCGenericDependentResource.java | 10 ++++++---- .../dependent/GenericBulkDependentResource.java | 2 +- .../glue/dependent/GenericDependentResource.java | 11 ++++++++--- .../glue/reconciler/glue/GlueReconciler.java | 15 +++++++++------ ...dAndOwnedResourceSecondaryToPrimaryMapper.java | 15 ++++++++++++--- .../javaoperatorsdk/operator/glue/GlueTest.java | 2 +- 6 files changed, 37 insertions(+), 18 deletions(-) diff --git a/src/main/java/io/javaoperatorsdk/operator/glue/dependent/GCGenericDependentResource.java b/src/main/java/io/javaoperatorsdk/operator/glue/dependent/GCGenericDependentResource.java index 7a22bf7..4d5e0ec 100644 --- a/src/main/java/io/javaoperatorsdk/operator/glue/dependent/GCGenericDependentResource.java +++ b/src/main/java/io/javaoperatorsdk/operator/glue/dependent/GCGenericDependentResource.java @@ -10,14 +10,16 @@ public class GCGenericDependentResource extends GenericDependentResource implements GarbageCollected { public GCGenericDependentResource(GenericTemplateHandler genericTemplateHandler, - GenericKubernetesResource desired, String name, String namespace, + GenericKubernetesResource desired, String name, String resourceName, String namespace, boolean clusterScoped, Matcher matcher) { - super(genericTemplateHandler, desired, name, namespace, clusterScoped, matcher); + super(genericTemplateHandler, desired, name, resourceName, namespace, clusterScoped, matcher); } public GCGenericDependentResource(GenericTemplateHandler genericTemplateHandler, - String desiredTemplate, String name, String namespace, boolean clusterScoped, + String desiredTemplate, String name, String resourceName, String namespace, + boolean clusterScoped, Matcher matcher) { - super(genericTemplateHandler, desiredTemplate, name, namespace, clusterScoped, matcher); + super(genericTemplateHandler, desiredTemplate, name, resourceName, namespace, clusterScoped, + matcher); } } diff --git a/src/main/java/io/javaoperatorsdk/operator/glue/dependent/GenericBulkDependentResource.java b/src/main/java/io/javaoperatorsdk/operator/glue/dependent/GenericBulkDependentResource.java index 2ea06f6..bbea509 100644 --- a/src/main/java/io/javaoperatorsdk/operator/glue/dependent/GenericBulkDependentResource.java +++ b/src/main/java/io/javaoperatorsdk/operator/glue/dependent/GenericBulkDependentResource.java @@ -22,7 +22,7 @@ public GenericBulkDependentResource(GenericTemplateHandler genericTemplateHandle String desiredTemplate, String name, boolean clusterScoped, Matcher matcher) { - super(genericTemplateHandler, desiredTemplate, name, null, clusterScoped, matcher); + super(genericTemplateHandler, desiredTemplate, name, null, null, clusterScoped, matcher); } @Override diff --git a/src/main/java/io/javaoperatorsdk/operator/glue/dependent/GenericDependentResource.java b/src/main/java/io/javaoperatorsdk/operator/glue/dependent/GenericDependentResource.java index 01fcdfc..957a9c0 100644 --- a/src/main/java/io/javaoperatorsdk/operator/glue/dependent/GenericDependentResource.java +++ b/src/main/java/io/javaoperatorsdk/operator/glue/dependent/GenericDependentResource.java @@ -27,6 +27,8 @@ public class GenericDependentResource protected final GenericKubernetesResource desired; protected final String desiredTemplate; protected final String name; + // resource name might be templated + protected final String resourceName; protected final String namespace; protected final boolean clusterScoped; protected final Matcher matcher; @@ -34,7 +36,7 @@ public class GenericDependentResource protected final GenericTemplateHandler genericTemplateHandler; public GenericDependentResource(GenericTemplateHandler genericTemplateHandler, - GenericKubernetesResource desired, String name, String namespace, + GenericKubernetesResource desired, String name, String resourceName, String namespace, boolean clusterScoped, Matcher matcher) { super(new GroupVersionKind(desired.getApiVersion(), desired.getKind())); this.desired = desired; @@ -42,17 +44,20 @@ public GenericDependentResource(GenericTemplateHandler genericTemplateHandler, this.matcher = matcher; this.desiredTemplate = null; this.name = name; + this.resourceName = resourceName; this.clusterScoped = clusterScoped; this.genericTemplateHandler = genericTemplateHandler; } public GenericDependentResource(GenericTemplateHandler genericTemplateHandler, - String desiredTemplate, String name, String namespace, boolean clusterScoped, + String desiredTemplate, String name, String resourceName, String namespace, + boolean clusterScoped, Matcher matcher) { super(new GroupVersionKind(Utils.getApiVersionFromTemplate(desiredTemplate), Utils.getKindFromTemplate(desiredTemplate))); this.genericTemplateHandler = genericTemplateHandler; this.name = name; + this.resourceName = resourceName; this.desiredTemplate = desiredTemplate; this.namespace = namespace; this.matcher = matcher; @@ -103,7 +108,7 @@ protected Optional selectTargetSecondaryResource( .stream() .filter(r -> r.getKind().equals(getGroupVersionKind().getKind()) && r.getApiVersion().equals(getGroupVersionKind().apiVersion()) && - r.getMetadata().getName().equals(name) && + r.getMetadata().getName().equals(resourceName) && (namespace == null || Objects.equals(namespace, r.getMetadata().getNamespace()))) .toList(); diff --git a/src/main/java/io/javaoperatorsdk/operator/glue/reconciler/glue/GlueReconciler.java b/src/main/java/io/javaoperatorsdk/operator/glue/reconciler/glue/GlueReconciler.java index ad5a856..4c813f3 100644 --- a/src/main/java/io/javaoperatorsdk/operator/glue/reconciler/glue/GlueReconciler.java +++ b/src/main/java/io/javaoperatorsdk/operator/glue/reconciler/glue/GlueReconciler.java @@ -221,7 +221,8 @@ private void createAndAddDependentToWorkflow(Glue primary, Context context .ifPresent(c -> nodeBuilder.withReconcilePrecondition(toCondition(c))); } - private GenericDependentResource createDependentResource(String name, DependentResourceSpec spec, + private GenericDependentResource createDependentResource(String resourceName, + DependentResourceSpec spec, boolean leafDependent, Boolean resourceInSameNamespaceAsPrimary, String namespace) { if (leafDependent && resourceInSameNamespaceAsPrimary && !spec.isClusterScoped()) { @@ -229,21 +230,23 @@ private GenericDependentResource createDependentResource(String name, DependentR ? spec.getBulk() ? new GCGenericBulkDependentResource(genericTemplateHandler, spec.getResourceTemplate(), - name, + spec.getName(), spec.isClusterScoped(), spec.getMatcher()) : new GCGenericDependentResource(genericTemplateHandler, spec.getResourceTemplate(), - name, namespace, + spec.getName(), resourceName, namespace, spec.isClusterScoped(), spec.getMatcher()) : new GCGenericDependentResource(genericTemplateHandler, spec.getResource(), - name, namespace, + spec.getName(), resourceName, namespace, spec.isClusterScoped(), spec.getMatcher()); } else { return spec.getResourceTemplate() != null ? new GenericDependentResource(genericTemplateHandler, - spec.getResourceTemplate(), name, namespace, spec.isClusterScoped(), + spec.getResourceTemplate(), spec.getName(), resourceName, namespace, + spec.isClusterScoped(), spec.getMatcher()) : new GenericDependentResource(genericTemplateHandler, - spec.getResource(), name, namespace, spec.isClusterScoped(), spec.getMatcher()); + spec.getResource(), spec.getName(), resourceName, namespace, spec.isClusterScoped(), + spec.getMatcher()); } } diff --git a/src/main/java/io/javaoperatorsdk/operator/glue/reconciler/glue/RelatedAndOwnedResourceSecondaryToPrimaryMapper.java b/src/main/java/io/javaoperatorsdk/operator/glue/reconciler/glue/RelatedAndOwnedResourceSecondaryToPrimaryMapper.java index ffcf713..4a9d299 100644 --- a/src/main/java/io/javaoperatorsdk/operator/glue/reconciler/glue/RelatedAndOwnedResourceSecondaryToPrimaryMapper.java +++ b/src/main/java/io/javaoperatorsdk/operator/glue/reconciler/glue/RelatedAndOwnedResourceSecondaryToPrimaryMapper.java @@ -6,8 +6,11 @@ import java.util.Set; import java.util.concurrent.ConcurrentHashMap; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import io.fabric8.kubernetes.api.model.GenericKubernetesResource; -import io.javaoperatorsdk.operator.glue.customresource.operator.GlueOperator; +import io.javaoperatorsdk.operator.glue.customresource.glue.Glue; import io.javaoperatorsdk.operator.processing.event.ResourceID; import io.javaoperatorsdk.operator.processing.event.source.SecondaryToPrimaryMapper; import io.javaoperatorsdk.operator.processing.event.source.informer.Mappers; @@ -15,13 +18,16 @@ public class RelatedAndOwnedResourceSecondaryToPrimaryMapper implements SecondaryToPrimaryMapper { + private static final Logger log = + LoggerFactory.getLogger(RelatedAndOwnedResourceSecondaryToPrimaryMapper.class); + private final Map> secondaryToPrimaryMap = new ConcurrentHashMap<>(); @Override public Set toPrimaryResourceIDs(GenericKubernetesResource resource) { // based on if GC or non GC dependent it can have different mapping - var res = Mappers.fromOwnerReferences(GlueOperator.class, false).toPrimaryResourceIDs(resource); - res.addAll(Mappers.fromDefaultAnnotations(GlueOperator.class).toPrimaryResourceIDs(resource)); + var res = Mappers.fromOwnerReferences(Glue.class, false).toPrimaryResourceIDs(resource); + res.addAll(Mappers.fromDefaultAnnotations(Glue.class).toPrimaryResourceIDs(resource)); // related resource mapping var idMapped = secondaryToPrimaryMap.get( @@ -29,6 +35,9 @@ public Set toPrimaryResourceIDs(GenericKubernetesResource resource) if (idMapped != null) { res.addAll(idMapped); } + log.debug("Resource name: {}, namespace: {}, kind: {}, resourceIds: {}", + resource.getMetadata().getName(), + resource.getMetadata().getNamespace(), resource.getKind(), res); return res; } diff --git a/src/test/java/io/javaoperatorsdk/operator/glue/GlueTest.java b/src/test/java/io/javaoperatorsdk/operator/glue/GlueTest.java index cdd3515..df949a4 100644 --- a/src/test/java/io/javaoperatorsdk/operator/glue/GlueTest.java +++ b/src/test/java/io/javaoperatorsdk/operator/glue/GlueTest.java @@ -38,7 +38,7 @@ void simpleTemplating() { TestUtils.loadGlue("/glue/Templating.yaml"); glue = create(glue); - await().untilAsserted(() -> { + await().timeout(Duration.ofHours(1)).untilAsserted(() -> { var cm1 = get(ConfigMap.class, "templconfigmap1"); var cm2 = get(ConfigMap.class, "templconfigmap2"); assertThat(cm1).isNotNull(); From 8a263314405967fe2d5f67cfe68d3ce47c3e846d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Attila=20M=C3=A9sz=C3=A1ros?= Date: Tue, 25 Feb 2025 09:45:45 +0100 Subject: [PATCH 04/21] fix MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Attila Mészáros --- .../operator/glue/reconciler/ValidationAndErrorHandler.java | 3 +++ .../glue/reconciler/operator/GlueOperatorReconciler.java | 5 ++--- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/main/java/io/javaoperatorsdk/operator/glue/reconciler/ValidationAndErrorHandler.java b/src/main/java/io/javaoperatorsdk/operator/glue/reconciler/ValidationAndErrorHandler.java index 351dc07..4e955e5 100644 --- a/src/main/java/io/javaoperatorsdk/operator/glue/reconciler/ValidationAndErrorHandler.java +++ b/src/main/java/io/javaoperatorsdk/operator/glue/reconciler/ValidationAndErrorHandler.java @@ -40,6 +40,9 @@ public class ValidationAndErrorHandler { return ErrorStatusUpdateControl.patchStatus(resource).withNoRetry(); } else { var message = e.getMessage(); + if (message == null) { + message = e.getClass().getName(); + } if (message.length() > MAX_MESSAGE_SIZE) { message = message.substring(0, MAX_MESSAGE_SIZE) + "..."; } diff --git a/src/main/java/io/javaoperatorsdk/operator/glue/reconciler/operator/GlueOperatorReconciler.java b/src/main/java/io/javaoperatorsdk/operator/glue/reconciler/operator/GlueOperatorReconciler.java index fb8712d..7fa0e7b 100644 --- a/src/main/java/io/javaoperatorsdk/operator/glue/reconciler/operator/GlueOperatorReconciler.java +++ b/src/main/java/io/javaoperatorsdk/operator/glue/reconciler/operator/GlueOperatorReconciler.java @@ -25,6 +25,7 @@ import io.javaoperatorsdk.operator.glue.reconciler.glue.GlueReconciler; import io.javaoperatorsdk.operator.glue.templating.GenericTemplateHandler; import io.javaoperatorsdk.operator.processing.GroupVersionKind; +import io.javaoperatorsdk.operator.processing.event.NoEventSourceForClassException; import io.javaoperatorsdk.operator.processing.event.ResourceID; import io.javaoperatorsdk.operator.processing.event.source.EventSource; import io.javaoperatorsdk.operator.processing.event.source.informer.InformerEventSource; @@ -179,14 +180,12 @@ private InformerEventSource getOrRegist .eventSourceRetriever() .getEventSourceFor(GenericKubernetesResource.class, gvk.toString()); es.start(); - } catch (IllegalArgumentException e) { + } catch (NoEventSourceForClassException e) { var configBuilder = InformerEventSourceConfiguration.from(gvk, GlueOperator.class) .withName(gvk.toString()) .withSecondaryToPrimaryMapper( resource -> Set.of(ResourceID.fromResource(glueOperator))); - - if (spec.getParent().getLabelSelector() != null) { configBuilder.withLabelSelector(spec.getParent().getLabelSelector()); } From 91079f030271f168a8fae257c495246dd8c91fb2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Attila=20M=C3=A9sz=C3=A1ros?= Date: Tue, 25 Feb 2025 10:32:40 +0100 Subject: [PATCH 05/21] fixes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Attila Mészáros --- .../operator/glue/reconciler/glue/GlueReconciler.java | 10 +++++----- .../glue/reconciler/glue/InformerRegister.java | 3 ++- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/main/java/io/javaoperatorsdk/operator/glue/reconciler/glue/GlueReconciler.java b/src/main/java/io/javaoperatorsdk/operator/glue/reconciler/glue/GlueReconciler.java index 4c813f3..164ace1 100644 --- a/src/main/java/io/javaoperatorsdk/operator/glue/reconciler/glue/GlueReconciler.java +++ b/src/main/java/io/javaoperatorsdk/operator/glue/reconciler/glue/GlueReconciler.java @@ -40,9 +40,9 @@ public class GlueReconciler implements Reconciler, Cleaner { private static final Logger log = LoggerFactory.getLogger(GlueReconciler.class); public static final String DEPENDENT_NAME_ANNOTATION_KEY = - "io.javaoperatorsdk.operator.resourceflow/name"; + "io.javaoperatorsdk.operator.glue/resource-name"; public static final String PARENT_GLUE_FINALIZER_PREFIX = - "io.javaoperatorsdk.operator.resourceflow.glue/"; + "io.javaoperatorsdk.operator.glue/"; public static final String GLUE_RECONCILER_NAME = "glue"; @@ -97,6 +97,7 @@ public UpdateControl reconcile(Glue primary, @Override public DeleteControl cleanup(Glue primary, Context context) { + registerRelatedResourceInformers(context, primary); var actualWorkflow = buildWorkflowAndRegisterInformers(primary, context); var result = actualWorkflow.cleanup(primary, context); result.throwAggregateExceptionIfErrorsPresent(); @@ -147,9 +148,8 @@ private UpdateControl removeErrorMessageFromGlueStatusIfPresent(Glue prima private void registerRelatedResourceInformers(Context context, Glue glue) { - glue.getSpec().getRelatedResources().forEach(r -> { - informerRegister.registerInformerForRelatedResource(context, glue, r); - }); + glue.getSpec().getRelatedResources() + .forEach(r -> informerRegister.registerInformerForRelatedResource(context, glue, r)); } // todo test diff --git a/src/main/java/io/javaoperatorsdk/operator/glue/reconciler/glue/InformerRegister.java b/src/main/java/io/javaoperatorsdk/operator/glue/reconciler/glue/InformerRegister.java index b57e71d..766a951 100644 --- a/src/main/java/io/javaoperatorsdk/operator/glue/reconciler/glue/InformerRegister.java +++ b/src/main/java/io/javaoperatorsdk/operator/glue/reconciler/glue/InformerRegister.java @@ -97,13 +97,14 @@ public InformerEventSource registerInformer( var configBuilder = InformerEventSourceConfiguration.from(gvk, Glue.class) .withSecondaryToPrimaryMapper(mapper) .withName(gvk.toString()); + configBuilder.withName(gvk.toString()); labelSelectorForGVK(gvk).ifPresent(ls -> { log.debug("Registering label selector: {} for informer for gvk: {}", ls, gvk); configBuilder.withLabelSelector(ls); }); var newInformer = informerProducer.createInformer(configBuilder.build(), context); - + log.debug("Registering informer for gvk: {}", gvk); return (InformerEventSource) context .eventSourceRetriever() .dynamicallyRegisterEventSource(newInformer); From d3212deaf8436cd0b3bd4d187b815a6e68528f44 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Attila=20M=C3=A9sz=C3=A1ros?= Date: Tue, 25 Feb 2025 10:57:30 +0100 Subject: [PATCH 06/21] fixes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Attila Mészáros --- .../customresource/operator/GlueOperator.java | 2 +- ...torStatus.java => GlueOperatorStatus.java} | 2 +- ...r.java => ValidationAndStatusHandler.java} | 48 +++++++++++++++++-- .../glue/reconciler/glue/GlueReconciler.java | 24 +++------- .../operator/GlueOperatorReconciler.java | 14 +++--- .../operator/glue/GlueOperatorTest.java | 4 +- .../operator/glue/GlueTest.java | 4 +- 7 files changed, 65 insertions(+), 33 deletions(-) rename src/main/java/io/javaoperatorsdk/operator/glue/customresource/operator/{ResourceFlowOperatorStatus.java => GlueOperatorStatus.java} (68%) rename src/main/java/io/javaoperatorsdk/operator/glue/reconciler/{ValidationAndErrorHandler.java => ValidationAndStatusHandler.java} (66%) diff --git a/src/main/java/io/javaoperatorsdk/operator/glue/customresource/operator/GlueOperator.java b/src/main/java/io/javaoperatorsdk/operator/glue/customresource/operator/GlueOperator.java index c8dd269..f938802 100644 --- a/src/main/java/io/javaoperatorsdk/operator/glue/customresource/operator/GlueOperator.java +++ b/src/main/java/io/javaoperatorsdk/operator/glue/customresource/operator/GlueOperator.java @@ -10,6 +10,6 @@ @Version("v1beta1") @ShortNames("go") public class GlueOperator - extends CustomResource + extends CustomResource implements Namespaced { } diff --git a/src/main/java/io/javaoperatorsdk/operator/glue/customresource/operator/ResourceFlowOperatorStatus.java b/src/main/java/io/javaoperatorsdk/operator/glue/customresource/operator/GlueOperatorStatus.java similarity index 68% rename from src/main/java/io/javaoperatorsdk/operator/glue/customresource/operator/ResourceFlowOperatorStatus.java rename to src/main/java/io/javaoperatorsdk/operator/glue/customresource/operator/GlueOperatorStatus.java index 5ad0174..b15e535 100644 --- a/src/main/java/io/javaoperatorsdk/operator/glue/customresource/operator/ResourceFlowOperatorStatus.java +++ b/src/main/java/io/javaoperatorsdk/operator/glue/customresource/operator/GlueOperatorStatus.java @@ -2,7 +2,7 @@ import io.javaoperatorsdk.operator.glue.customresource.AbstractStatus; -public class ResourceFlowOperatorStatus extends AbstractStatus { +public class GlueOperatorStatus extends AbstractStatus { } diff --git a/src/main/java/io/javaoperatorsdk/operator/glue/reconciler/ValidationAndErrorHandler.java b/src/main/java/io/javaoperatorsdk/operator/glue/reconciler/ValidationAndStatusHandler.java similarity index 66% rename from src/main/java/io/javaoperatorsdk/operator/glue/reconciler/ValidationAndErrorHandler.java rename to src/main/java/io/javaoperatorsdk/operator/glue/reconciler/ValidationAndStatusHandler.java index 4e955e5..fc611f9 100644 --- a/src/main/java/io/javaoperatorsdk/operator/glue/reconciler/ValidationAndErrorHandler.java +++ b/src/main/java/io/javaoperatorsdk/operator/glue/reconciler/ValidationAndStatusHandler.java @@ -11,20 +11,25 @@ import io.fabric8.kubernetes.client.CustomResource; import io.javaoperatorsdk.operator.api.reconciler.ErrorStatusUpdateControl; +import io.javaoperatorsdk.operator.api.reconciler.UpdateControl; import io.javaoperatorsdk.operator.glue.GlueException; import io.javaoperatorsdk.operator.glue.customresource.AbstractStatus; import io.javaoperatorsdk.operator.glue.customresource.glue.DependentResourceSpec; +import io.javaoperatorsdk.operator.glue.customresource.glue.Glue; import io.javaoperatorsdk.operator.glue.customresource.glue.GlueSpec; +import io.javaoperatorsdk.operator.glue.customresource.glue.GlueStatus; import io.javaoperatorsdk.operator.glue.customresource.glue.RelatedResourceSpec; +import io.javaoperatorsdk.operator.glue.customresource.operator.GlueOperator; +import io.javaoperatorsdk.operator.glue.customresource.operator.GlueOperatorStatus; import jakarta.inject.Singleton; @Singleton -public class ValidationAndErrorHandler { +public class ValidationAndStatusHandler { public static final int MAX_MESSAGE_SIZE = 150; - private static final Logger log = LoggerFactory.getLogger(ValidationAndErrorHandler.class); + private static final Logger log = LoggerFactory.getLogger(ValidationAndStatusHandler.class); public static final String NON_UNIQUE_NAMES_FOUND_PREFIX = "Non unique names found: "; @@ -34,7 +39,7 @@ public class ValidationAndErrorHandler { log.error("Error during reconciliation of resource. Name: {} namespace: {}, Kind: {}", resource.getMetadata().getName(), resource.getMetadata().getNamespace(), resource.getKind(), e); - if (e instanceof ValidationAndErrorHandler.NonUniqueNameException ex) { + if (e instanceof ValidationAndStatusHandler.NonUniqueNameException ex) { resource.getStatus() .setErrorMessage(NON_UNIQUE_NAMES_FOUND_PREFIX + String.join(",", ex.getDuplicates())); return ErrorStatusUpdateControl.patchStatus(resource).withNoRetry(); @@ -51,6 +56,43 @@ public class ValidationAndErrorHandler { } } + public UpdateControl handleStatusUpdate(GlueOperator primary) { + if (primary.getStatus() == null) { + primary.setStatus(new GlueOperatorStatus()); + } + return handleGenericStatusUpdate(primary); + } + + public UpdateControl handleStatusUpdate(Glue primary) { + if (primary.getStatus() == null) { + primary.setStatus(new GlueStatus()); + } + return handleGenericStatusUpdate(primary); + } + + private > UpdateControl handleGenericStatusUpdate( + T primary) { + boolean patch = false; + + if (primary.getStatus().getErrorMessage() != null) { + patch = true; + primary.getStatus().setErrorMessage(null); + } + if (!primary.getMetadata().getGeneration() + .equals(primary.getStatus().getObservedGeneration())) { + patch = true; + primary.getStatus().setObservedGeneration(primary.getMetadata().getGeneration()); + } + + if (patch) { + primary.getMetadata().setResourceVersion(null); + return UpdateControl.patchStatus(primary); + } else { + return UpdateControl.noUpdate(); + } + + } + public void checkIfValidGlueSpec(GlueSpec glueSpec) { checkIfBulkProvidesResourceTemplate(glueSpec); checkIfNamesAreUnique(glueSpec); diff --git a/src/main/java/io/javaoperatorsdk/operator/glue/reconciler/glue/GlueReconciler.java b/src/main/java/io/javaoperatorsdk/operator/glue/reconciler/glue/GlueReconciler.java index 164ace1..07a24d8 100644 --- a/src/main/java/io/javaoperatorsdk/operator/glue/reconciler/glue/GlueReconciler.java +++ b/src/main/java/io/javaoperatorsdk/operator/glue/reconciler/glue/GlueReconciler.java @@ -24,7 +24,7 @@ import io.javaoperatorsdk.operator.glue.dependent.GCGenericBulkDependentResource; import io.javaoperatorsdk.operator.glue.dependent.GCGenericDependentResource; import io.javaoperatorsdk.operator.glue.dependent.GenericDependentResource; -import io.javaoperatorsdk.operator.glue.reconciler.ValidationAndErrorHandler; +import io.javaoperatorsdk.operator.glue.reconciler.ValidationAndStatusHandler; import io.javaoperatorsdk.operator.glue.reconciler.operator.GlueOperatorReconciler; import io.javaoperatorsdk.operator.glue.templating.GenericTemplateHandler; import io.javaoperatorsdk.operator.processing.dependent.workflow.Condition; @@ -46,7 +46,7 @@ public class GlueReconciler implements Reconciler, Cleaner { public static final String GLUE_RECONCILER_NAME = "glue"; - private final ValidationAndErrorHandler validationAndErrorHandler; + private final ValidationAndStatusHandler validationAndStatusHandler; private final InformerRegister informerRegister; private final KubernetesResourceDeletedCondition deletePostCondition = @@ -54,10 +54,10 @@ public class GlueReconciler implements Reconciler, Cleaner { private final GenericTemplateHandler genericTemplateHandler; - public GlueReconciler(ValidationAndErrorHandler validationAndErrorHandler, + public GlueReconciler(ValidationAndStatusHandler validationAndStatusHandler, InformerRegister informerRegister, GenericTemplateHandler genericTemplateHandler) { - this.validationAndErrorHandler = validationAndErrorHandler; + this.validationAndStatusHandler = validationAndStatusHandler; this.informerRegister = informerRegister; this.genericTemplateHandler = genericTemplateHandler; } @@ -78,7 +78,7 @@ public UpdateControl reconcile(Glue primary, log.debug("Reconciling glue. name: {} namespace: {}", primary.getMetadata().getName(), primary.getMetadata().getNamespace()); - validationAndErrorHandler.checkIfValidGlueSpec(primary.getSpec()); + validationAndStatusHandler.checkIfValidGlueSpec(primary.getSpec()); registerRelatedResourceInformers(context, primary); if (deletedGlueIfParentMarkedForDeletion(context, primary)) { @@ -91,7 +91,7 @@ public UpdateControl reconcile(Glue primary, informerRegister.deRegisterInformerOnResourceFlowChange(context, primary); result.throwAggregateExceptionIfErrorsPresent(); patchRelatedResourcesStatus(context, primary); - return removeErrorMessageFromGlueStatusIfPresent(primary); + return validationAndStatusHandler.handleStatusUpdate(primary); } @Override @@ -123,7 +123,7 @@ public ErrorStatusUpdateControl updateErrorStatus(Glue resource, Context context, Glue primary) { @@ -136,16 +136,6 @@ private boolean deletedGlueIfParentMarkedForDeletion(Context context, Glue } } - private UpdateControl removeErrorMessageFromGlueStatusIfPresent(Glue primary) { - if (primary.getStatus() != null && primary.getStatus().getErrorMessage() != null) { - primary.getStatus().setErrorMessage(null); - primary.getMetadata().setResourceVersion(null); - return UpdateControl.patchStatus(primary); - } else { - return UpdateControl.noUpdate(); - } - } - private void registerRelatedResourceInformers(Context context, Glue glue) { glue.getSpec().getRelatedResources() diff --git a/src/main/java/io/javaoperatorsdk/operator/glue/reconciler/operator/GlueOperatorReconciler.java b/src/main/java/io/javaoperatorsdk/operator/glue/reconciler/operator/GlueOperatorReconciler.java index 7fa0e7b..ea4d0c9 100644 --- a/src/main/java/io/javaoperatorsdk/operator/glue/reconciler/operator/GlueOperatorReconciler.java +++ b/src/main/java/io/javaoperatorsdk/operator/glue/reconciler/operator/GlueOperatorReconciler.java @@ -19,9 +19,9 @@ import io.javaoperatorsdk.operator.glue.customresource.glue.RelatedResourceSpec; import io.javaoperatorsdk.operator.glue.customresource.operator.GlueOperator; import io.javaoperatorsdk.operator.glue.customresource.operator.GlueOperatorSpec; +import io.javaoperatorsdk.operator.glue.customresource.operator.GlueOperatorStatus; import io.javaoperatorsdk.operator.glue.customresource.operator.Parent; -import io.javaoperatorsdk.operator.glue.customresource.operator.ResourceFlowOperatorStatus; -import io.javaoperatorsdk.operator.glue.reconciler.ValidationAndErrorHandler; +import io.javaoperatorsdk.operator.glue.reconciler.ValidationAndStatusHandler; import io.javaoperatorsdk.operator.glue.reconciler.glue.GlueReconciler; import io.javaoperatorsdk.operator.glue.templating.GenericTemplateHandler; import io.javaoperatorsdk.operator.processing.GroupVersionKind; @@ -49,7 +49,7 @@ public class GlueOperatorReconciler Optional glueLabelSelector; private final ControllerConfig controllerConfig; - private final ValidationAndErrorHandler validationAndErrorHandler; + private final ValidationAndStatusHandler validationAndErrorHandler; private final GenericTemplateHandler genericTemplateHandler; private Map defaultGlueLabels; @@ -57,10 +57,10 @@ public class GlueOperatorReconciler private InformerEventSource glueEventSource; public GlueOperatorReconciler(ControllerConfig controllerConfig, - ValidationAndErrorHandler validationAndErrorHandler, + ValidationAndStatusHandler validationAndStatusHandler, GenericTemplateHandler genericTemplateHandler) { this.controllerConfig = controllerConfig; - this.validationAndErrorHandler = validationAndErrorHandler; + this.validationAndErrorHandler = validationAndStatusHandler; this.genericTemplateHandler = genericTemplateHandler; } @@ -96,7 +96,7 @@ public UpdateControl reconcile(GlueOperator glueOperator, } }); - return UpdateControl.noUpdate(); + return validationAndErrorHandler.handleStatusUpdate(glueOperator); } private Glue createGlue(GenericKubernetesResource targetParentResource, @@ -213,7 +213,7 @@ public List> prepareEventSources( public ErrorStatusUpdateControl updateErrorStatus(GlueOperator resource, Context context, Exception e) { if (resource.getStatus() == null) { - resource.setStatus(new ResourceFlowOperatorStatus()); + resource.setStatus(new GlueOperatorStatus()); } return validationAndErrorHandler.updateStatusErrorMessage(e, resource); } diff --git a/src/test/java/io/javaoperatorsdk/operator/glue/GlueOperatorTest.java b/src/test/java/io/javaoperatorsdk/operator/glue/GlueOperatorTest.java index e1febf8..db0fa03 100644 --- a/src/test/java/io/javaoperatorsdk/operator/glue/GlueOperatorTest.java +++ b/src/test/java/io/javaoperatorsdk/operator/glue/GlueOperatorTest.java @@ -18,7 +18,7 @@ import io.javaoperatorsdk.operator.glue.customresource.operator.GlueOperator; import io.javaoperatorsdk.operator.glue.customresource.operator.GlueOperatorSpec; import io.javaoperatorsdk.operator.glue.customresource.operator.Parent; -import io.javaoperatorsdk.operator.glue.reconciler.ValidationAndErrorHandler; +import io.javaoperatorsdk.operator.glue.reconciler.ValidationAndStatusHandler; import io.javaoperatorsdk.operator.glue.reconciler.operator.GlueOperatorReconciler; import io.quarkus.test.junit.QuarkusTest; @@ -162,7 +162,7 @@ void nonUniqueNameTest() { assertThat(actual.getStatus()).isNotNull(); assertThat(actual.getStatus().getErrorMessage()) - .startsWith(ValidationAndErrorHandler.NON_UNIQUE_NAMES_FOUND_PREFIX); + .startsWith(ValidationAndStatusHandler.NON_UNIQUE_NAMES_FOUND_PREFIX); }); } diff --git a/src/test/java/io/javaoperatorsdk/operator/glue/GlueTest.java b/src/test/java/io/javaoperatorsdk/operator/glue/GlueTest.java index df949a4..0e1cf7d 100644 --- a/src/test/java/io/javaoperatorsdk/operator/glue/GlueTest.java +++ b/src/test/java/io/javaoperatorsdk/operator/glue/GlueTest.java @@ -19,7 +19,7 @@ import io.javaoperatorsdk.operator.glue.customresource.TestCustomResource; import io.javaoperatorsdk.operator.glue.customresource.glue.DependentResourceSpec; import io.javaoperatorsdk.operator.glue.customresource.glue.Glue; -import io.javaoperatorsdk.operator.glue.reconciler.ValidationAndErrorHandler; +import io.javaoperatorsdk.operator.glue.reconciler.ValidationAndStatusHandler; import io.quarkus.test.junit.QuarkusTest; import static io.javaoperatorsdk.operator.glue.TestUtils.INITIAL_RECONCILE_WAIT_TIMEOUT; @@ -241,7 +241,7 @@ void nonUniqueNameResultsInErrorMessageOnStatus() { assertThat(actualGlue.getStatus()).isNotNull(); Assertions.assertThat(actualGlue.getStatus().getErrorMessage()) - .startsWith(ValidationAndErrorHandler.NON_UNIQUE_NAMES_FOUND_PREFIX); + .startsWith(ValidationAndStatusHandler.NON_UNIQUE_NAMES_FOUND_PREFIX); }); } From f20d63ae397e32fcc16510d96b89849c40cd262f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Attila=20M=C3=A9sz=C3=A1ros?= Date: Mon, 3 Mar 2025 20:47:44 +0100 Subject: [PATCH 07/21] wip MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Attila Mészáros --- pom.xml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/pom.xml b/pom.xml index 8de238e..fef7e26 100644 --- a/pom.xml +++ b/pom.xml @@ -46,6 +46,12 @@ + + + io.javaoperatorsdk + operator-framework-core + 5.0.3 + io.quarkiverse.operatorsdk quarkus-operator-sdk From 6a5643a3de6db913a895343ce87d0a551428d497 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Attila=20M=C3=A9sz=C3=A1ros?= Date: Sun, 9 Mar 2025 12:00:16 +0100 Subject: [PATCH 08/21] fix MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Attila Mészáros --- .../operator/glue/dependent/GenericDependentResource.java | 5 +++++ .../operator/glue/reconciler/glue/GlueReconciler.java | 1 + .../operator/glue/sample/webpage/WebPageSampleTest.java | 3 ++- 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/main/java/io/javaoperatorsdk/operator/glue/dependent/GenericDependentResource.java b/src/main/java/io/javaoperatorsdk/operator/glue/dependent/GenericDependentResource.java index 957a9c0..df5043c 100644 --- a/src/main/java/io/javaoperatorsdk/operator/glue/dependent/GenericDependentResource.java +++ b/src/main/java/io/javaoperatorsdk/operator/glue/dependent/GenericDependentResource.java @@ -122,4 +122,9 @@ protected Optional selectTargetSecondaryResource( return Optional.empty(); } } + + @Override + public String name() { + return name; + } } diff --git a/src/main/java/io/javaoperatorsdk/operator/glue/reconciler/glue/GlueReconciler.java b/src/main/java/io/javaoperatorsdk/operator/glue/reconciler/glue/GlueReconciler.java index 07a24d8..958efdc 100644 --- a/src/main/java/io/javaoperatorsdk/operator/glue/reconciler/glue/GlueReconciler.java +++ b/src/main/java/io/javaoperatorsdk/operator/glue/reconciler/glue/GlueReconciler.java @@ -209,6 +209,7 @@ private void createAndAddDependentToWorkflow(Glue primary, Context context .ifPresent(c -> nodeBuilder.withReadyPostcondition(toCondition(c))); Optional.ofNullable(spec.getCondition()) .ifPresent(c -> nodeBuilder.withReconcilePrecondition(toCondition(c))); + } private GenericDependentResource createDependentResource(String resourceName, diff --git a/src/test/java/io/javaoperatorsdk/operator/glue/sample/webpage/WebPageSampleTest.java b/src/test/java/io/javaoperatorsdk/operator/glue/sample/webpage/WebPageSampleTest.java index ebe61f9..5da148a 100644 --- a/src/test/java/io/javaoperatorsdk/operator/glue/sample/webpage/WebPageSampleTest.java +++ b/src/test/java/io/javaoperatorsdk/operator/glue/sample/webpage/WebPageSampleTest.java @@ -1,6 +1,7 @@ package io.javaoperatorsdk.operator.glue.sample.webpage; + import org.junit.jupiter.api.Test; import io.fabric8.kubernetes.api.model.ConfigMap; @@ -15,7 +16,7 @@ import static org.awaitility.Awaitility.await; @QuarkusTest -public class WebPageSampleTest extends TestBase { +class WebPageSampleTest extends TestBase { @Test void webPageCRUD() { From 9300b14a53a64d2b5b0eb3520902ebaf66a3b3dd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Attila=20M=C3=A9sz=C3=A1ros?= Date: Sun, 9 Mar 2025 14:48:48 +0100 Subject: [PATCH 09/21] fix MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Attila Mészáros --- .../glue/reconciler/glue/GlueReconciler.java | 5 +++-- .../io/javaoperatorsdk/operator/glue/GlueTest.java | 12 ++++++------ .../io/javaoperatorsdk/operator/glue/TestBase.java | 3 ++- 3 files changed, 11 insertions(+), 9 deletions(-) diff --git a/src/main/java/io/javaoperatorsdk/operator/glue/reconciler/glue/GlueReconciler.java b/src/main/java/io/javaoperatorsdk/operator/glue/reconciler/glue/GlueReconciler.java index 958efdc..2f04f2b 100644 --- a/src/main/java/io/javaoperatorsdk/operator/glue/reconciler/glue/GlueReconciler.java +++ b/src/main/java/io/javaoperatorsdk/operator/glue/reconciler/glue/GlueReconciler.java @@ -101,10 +101,11 @@ public DeleteControl cleanup(Glue primary, Context context) { var actualWorkflow = buildWorkflowAndRegisterInformers(primary, context); var result = actualWorkflow.cleanup(primary, context); result.throwAggregateExceptionIfErrorsPresent(); - - if (!result.allPostConditionsMet()) { + if (!result.allPostConditionsMet() && result.getDeleteCalledOnDependents() + .size() < actualWorkflow.getDependentResourcesByName().size()) { return DeleteControl.noFinalizerRemoval(); } else { + log.debug("All cleanup post conditions met for glue: {} ", primary.getMetadata().getName()); removeFinalizerForParent(primary, context); actualWorkflow.getDependentResourcesWithoutActivationCondition().forEach(dr -> { var genericDependentResource = (GenericDependentResource) dr; diff --git a/src/test/java/io/javaoperatorsdk/operator/glue/GlueTest.java b/src/test/java/io/javaoperatorsdk/operator/glue/GlueTest.java index 0e1cf7d..6564439 100644 --- a/src/test/java/io/javaoperatorsdk/operator/glue/GlueTest.java +++ b/src/test/java/io/javaoperatorsdk/operator/glue/GlueTest.java @@ -60,7 +60,7 @@ void simpleTemplating() { delete(glue); - await().timeout(Duration.ofSeconds(30)).untilAsserted(() -> { + await().timeout(GC_TIMEOUT).untilAsserted(() -> { var cm1 = get(ConfigMap.class, "templconfigmap1"); var cm2 = get(ConfigMap.class, "templconfigmap2"); assertThat(cm1).isNull(); @@ -99,7 +99,7 @@ void crossReferenceResource() { delete(glue); - await().untilAsserted(() -> { + await().timeout(GC_TIMEOUT).untilAsserted(() -> { var cm1 = get(ConfigMap.class, "cm-1"); var cm2 = get(ConfigMap.class, "cm-2"); assertThat(cm1).isNull(); @@ -136,7 +136,7 @@ void javaScriptCondition() { delete(glue); - await().timeout(Duration.ofSeconds(GC_TIMEOUT_SEC)).untilAsserted(() -> { + await().timeout(GC_TIMEOUT).untilAsserted(() -> { var cm1 = get(ConfigMap.class, "configmap1"); var cm2 = get(ConfigMap.class, "configmap2"); assertThat(cm1).isNull(); @@ -159,7 +159,7 @@ void stringTemplate() { delete(glue); - await().untilAsserted(() -> { + await().timeout(GC_TIMEOUT).untilAsserted(() -> { var cm1 = get(ConfigMap.class, "templconfigmap1"); var cm2 = get(ConfigMap.class, "templconfigmap2"); assertThat(cm1).isNull(); @@ -188,7 +188,7 @@ void simpleConcurrencyTest() { })); glueList.forEach(this::delete); - await().untilAsserted(() -> IntStream.range(0, num).forEach(index -> { + await().timeout(GC_TIMEOUT).untilAsserted(() -> IntStream.range(0, num).forEach(index -> { var w = get(Glue.class, "concurrencysample" + index); assertThat(w).isNull(); })); @@ -224,7 +224,7 @@ void changingWorkflow() { glue.getMetadata().setResourceVersion(null); delete(glue); - await().untilAsserted(() -> { + await().timeout(GC_TIMEOUT).untilAsserted(() -> { var cm1 = get(ConfigMap.class, "configmap1"); var s = get(Secret.class, "secret1"); assertThat(cm1).isNull(); diff --git a/src/test/java/io/javaoperatorsdk/operator/glue/TestBase.java b/src/test/java/io/javaoperatorsdk/operator/glue/TestBase.java index 67228e8..bdc69d4 100644 --- a/src/test/java/io/javaoperatorsdk/operator/glue/TestBase.java +++ b/src/test/java/io/javaoperatorsdk/operator/glue/TestBase.java @@ -24,7 +24,8 @@ public class TestBase { - public static final int GC_TIMEOUT_SEC = 45; + public static final int GC_TIMEOUT_SEC = 120; + public static final Duration GC_TIMEOUT = Duration.ofSeconds(GC_TIMEOUT_SEC); @Inject protected KubernetesClient client; From 953a937e9fc4b6c0fa8987753bb15e863da4307c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Attila=20M=C3=A9sz=C3=A1ros?= Date: Sun, 9 Mar 2025 15:16:19 +0100 Subject: [PATCH 10/21] fix: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Attila Mészáros --- .../operator/glue/reconciler/glue/GlueReconciler.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/io/javaoperatorsdk/operator/glue/reconciler/glue/GlueReconciler.java b/src/main/java/io/javaoperatorsdk/operator/glue/reconciler/glue/GlueReconciler.java index 2f04f2b..1cb6245 100644 --- a/src/main/java/io/javaoperatorsdk/operator/glue/reconciler/glue/GlueReconciler.java +++ b/src/main/java/io/javaoperatorsdk/operator/glue/reconciler/glue/GlueReconciler.java @@ -105,7 +105,6 @@ public DeleteControl cleanup(Glue primary, Context context) { .size() < actualWorkflow.getDependentResourcesByName().size()) { return DeleteControl.noFinalizerRemoval(); } else { - log.debug("All cleanup post conditions met for glue: {} ", primary.getMetadata().getName()); removeFinalizerForParent(primary, context); actualWorkflow.getDependentResourcesWithoutActivationCondition().forEach(dr -> { var genericDependentResource = (GenericDependentResource) dr; From 75cd6c23facc12b5cd126a6ddcf4f4a142a41d40 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Attila=20M=C3=A9sz=C3=A1ros?= Date: Sun, 9 Mar 2025 19:11:41 +0100 Subject: [PATCH 11/21] wip MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Attila Mészáros --- .../operator/glue/reconciler/glue/GlueReconciler.java | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/main/java/io/javaoperatorsdk/operator/glue/reconciler/glue/GlueReconciler.java b/src/main/java/io/javaoperatorsdk/operator/glue/reconciler/glue/GlueReconciler.java index 1cb6245..17e642a 100644 --- a/src/main/java/io/javaoperatorsdk/operator/glue/reconciler/glue/GlueReconciler.java +++ b/src/main/java/io/javaoperatorsdk/operator/glue/reconciler/glue/GlueReconciler.java @@ -97,12 +97,19 @@ public UpdateControl reconcile(Glue primary, @Override public DeleteControl cleanup(Glue primary, Context context) { + log.debug("Cleanup for Glue. Name: {} namespace: {}", primary.getMetadata().getName(), + primary.getMetadata().getNamespace()); + registerRelatedResourceInformers(context, primary); var actualWorkflow = buildWorkflowAndRegisterInformers(primary, context); var result = actualWorkflow.cleanup(primary, context); result.throwAggregateExceptionIfErrorsPresent(); - if (!result.allPostConditionsMet() && result.getDeleteCalledOnDependents() - .size() < actualWorkflow.getDependentResourcesByName().size()) { + + var deletableResourceCount = actualWorkflow.getDependentResourcesByName() + .entrySet().stream().filter(e -> e.getValue().isDeletable()).count(); + + if (!result.allPostConditionsMet() || result.getDeleteCalledOnDependents() + .size() < deletableResourceCount) { return DeleteControl.noFinalizerRemoval(); } else { removeFinalizerForParent(primary, context); From edcbda193fdbd5d89300b96d037cd823381dcdb6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Attila=20M=C3=A9sz=C3=A1ros?= Date: Sun, 9 Mar 2025 21:18:43 +0100 Subject: [PATCH 12/21] fix MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Attila Mészáros --- .../glue/dependent/GenericDependentResource.java | 15 ++++++++++++++- .../glue/reconciler/glue/GlueReconciler.java | 8 +++++++- .../glue/reconciler/glue/InformerRegister.java | 4 +++- 3 files changed, 24 insertions(+), 3 deletions(-) diff --git a/src/main/java/io/javaoperatorsdk/operator/glue/dependent/GenericDependentResource.java b/src/main/java/io/javaoperatorsdk/operator/glue/dependent/GenericDependentResource.java index df5043c..1f3fc14 100644 --- a/src/main/java/io/javaoperatorsdk/operator/glue/dependent/GenericDependentResource.java +++ b/src/main/java/io/javaoperatorsdk/operator/glue/dependent/GenericDependentResource.java @@ -4,6 +4,9 @@ import java.util.Optional; import java.util.Set; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import io.fabric8.kubernetes.api.model.GenericKubernetesResource; import io.fabric8.kubernetes.client.utils.Serialization; import io.javaoperatorsdk.operator.api.reconciler.Context; @@ -24,6 +27,8 @@ public class GenericDependentResource Updater, Creator { + private static final Logger log = LoggerFactory.getLogger(GenericDependentResource.class); + protected final GenericKubernetesResource desired; protected final String desiredTemplate; protected final String name; @@ -104,7 +109,15 @@ protected Optional selectTargetSecondaryResource( Glue primary, Context context) { - var res = context.getSecondaryResources(GenericKubernetesResource.class) + var allSecondaryResources = context.getSecondaryResources(GenericKubernetesResource.class); + if (log.isDebugEnabled()) { + log.debug("All secondary resources for DR: {}, resources: {}", name, + allSecondaryResources.stream() + .map(r -> "{ Name: %s; Namespace: %s }".formatted(r.getMetadata().getName(), + r.getMetadata().getNamespace())) + .toList()); + } + var res = allSecondaryResources .stream() .filter(r -> r.getKind().equals(getGroupVersionKind().getKind()) && r.getApiVersion().equals(getGroupVersionKind().apiVersion()) && diff --git a/src/main/java/io/javaoperatorsdk/operator/glue/reconciler/glue/GlueReconciler.java b/src/main/java/io/javaoperatorsdk/operator/glue/reconciler/glue/GlueReconciler.java index 17e642a..4ab4044 100644 --- a/src/main/java/io/javaoperatorsdk/operator/glue/reconciler/glue/GlueReconciler.java +++ b/src/main/java/io/javaoperatorsdk/operator/glue/reconciler/glue/GlueReconciler.java @@ -27,6 +27,8 @@ import io.javaoperatorsdk.operator.glue.reconciler.ValidationAndStatusHandler; import io.javaoperatorsdk.operator.glue.reconciler.operator.GlueOperatorReconciler; import io.javaoperatorsdk.operator.glue.templating.GenericTemplateHandler; +import io.javaoperatorsdk.operator.processing.GroupVersionKind; +import io.javaoperatorsdk.operator.processing.dependent.kubernetes.GroupVersionKindPlural; import io.javaoperatorsdk.operator.processing.dependent.workflow.Condition; import io.javaoperatorsdk.operator.processing.dependent.workflow.KubernetesResourceDeletedCondition; import io.javaoperatorsdk.operator.processing.dependent.workflow.WorkflowBuilder; @@ -199,7 +201,11 @@ private void createAndAddDependentToWorkflow(Glue primary, Context context var name = genericTemplateHandler.processTemplate(Utils.getName(spec), primary, false, context); var dr = createDependentResource(name, spec, leafDependent, resourceInSameNamespaceAsPrimary, targetNamespace.orElse(null)); - var gvk = dr.getGroupVersionKind(); + GroupVersionKind gvk = dr.getGroupVersionKind(); + // remove when fixed in josdk + if (gvk instanceof GroupVersionKindPlural gvkp) { + gvk = new GroupVersionKind(gvkp.getGroup(), gvkp.getVersion(), gvkp.getKind()); + } var es = informerRegister.registerInformer(context, gvk, primary); dr.setEventSource(es); diff --git a/src/main/java/io/javaoperatorsdk/operator/glue/reconciler/glue/InformerRegister.java b/src/main/java/io/javaoperatorsdk/operator/glue/reconciler/glue/InformerRegister.java index 766a951..060c0ea 100644 --- a/src/main/java/io/javaoperatorsdk/operator/glue/reconciler/glue/InformerRegister.java +++ b/src/main/java/io/javaoperatorsdk/operator/glue/reconciler/glue/InformerRegister.java @@ -105,9 +105,11 @@ public InformerEventSource registerInformer( var newInformer = informerProducer.createInformer(configBuilder.build(), context); log.debug("Registering informer for gvk: {}", gvk); - return (InformerEventSource) context + var resultInformer = (InformerEventSource) context .eventSourceRetriever() .dynamicallyRegisterEventSource(newInformer); + log.debug("Actual new informer registered: {}", resultInformer == newInformer); + return resultInformer; } public synchronized void deRegisterInformer(GroupVersionKind groupVersionKind, From 947e1a31e05fde6cdf1142c2e387ad06008c7c13 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Attila=20M=C3=A9sz=C3=A1ros?= Date: Sun, 9 Mar 2025 21:30:07 +0100 Subject: [PATCH 13/21] wip MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Attila Mészáros --- .../glue/reconciler/glue/GlueReconciler.java | 20 ++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/src/main/java/io/javaoperatorsdk/operator/glue/reconciler/glue/GlueReconciler.java b/src/main/java/io/javaoperatorsdk/operator/glue/reconciler/glue/GlueReconciler.java index 4ab4044..1d0688b 100644 --- a/src/main/java/io/javaoperatorsdk/operator/glue/reconciler/glue/GlueReconciler.java +++ b/src/main/java/io/javaoperatorsdk/operator/glue/reconciler/glue/GlueReconciler.java @@ -110,6 +110,7 @@ public DeleteControl cleanup(Glue primary, Context context) { var deletableResourceCount = actualWorkflow.getDependentResourcesByName() .entrySet().stream().filter(e -> e.getValue().isDeletable()).count(); + // add this logic to josdk with deleted dependents if (!result.allPostConditionsMet() || result.getDeleteCalledOnDependents() .size() < deletableResourceCount) { return DeleteControl.noFinalizerRemoval(); @@ -117,7 +118,8 @@ public DeleteControl cleanup(Glue primary, Context context) { removeFinalizerForParent(primary, context); actualWorkflow.getDependentResourcesWithoutActivationCondition().forEach(dr -> { var genericDependentResource = (GenericDependentResource) dr; - informerRegister.deRegisterInformer(genericDependentResource.getGroupVersionKind(), + informerRegister.deRegisterInformer( + toGVKIfGVKP(genericDependentResource.getGroupVersionKind()), primary, context); }); informerRegister.deRegisterInformerForRelatedResources(primary, context); @@ -201,12 +203,7 @@ private void createAndAddDependentToWorkflow(Glue primary, Context context var name = genericTemplateHandler.processTemplate(Utils.getName(spec), primary, false, context); var dr = createDependentResource(name, spec, leafDependent, resourceInSameNamespaceAsPrimary, targetNamespace.orElse(null)); - GroupVersionKind gvk = dr.getGroupVersionKind(); - // remove when fixed in josdk - if (gvk instanceof GroupVersionKindPlural gvkp) { - gvk = new GroupVersionKind(gvkp.getGroup(), gvkp.getVersion(), gvkp.getKind()); - } - + GroupVersionKind gvk = toGVKIfGVKP(dr.getGroupVersionKind()); var es = informerRegister.registerInformer(context, gvk, primary); dr.setEventSource(es); @@ -374,4 +371,13 @@ public static boolean isGlueOfAGlueOperator(Glue glue) { } + // remove if the conversion not happens in josdk anymore + // https://github.com/operator-framework/java-operator-sdk/pull/2726 + private static GroupVersionKind toGVKIfGVKP(GroupVersionKind gvk) { + if (gvk instanceof GroupVersionKindPlural gvkp) { + gvk = new GroupVersionKind(gvkp.getGroup(), gvkp.getVersion(), gvkp.getKind()); + } + return gvk; + } + } From e75999e69d540ead894c72a9299e3b868066094e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Attila=20M=C3=A9sz=C3=A1ros?= Date: Mon, 10 Mar 2025 10:23:20 +0100 Subject: [PATCH 14/21] fix bulk MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Attila Mészáros --- .../operator/glue/reconciler/glue/GlueReconciler.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/java/io/javaoperatorsdk/operator/glue/reconciler/glue/GlueReconciler.java b/src/main/java/io/javaoperatorsdk/operator/glue/reconciler/glue/GlueReconciler.java index 1d0688b..c988524 100644 --- a/src/main/java/io/javaoperatorsdk/operator/glue/reconciler/glue/GlueReconciler.java +++ b/src/main/java/io/javaoperatorsdk/operator/glue/reconciler/glue/GlueReconciler.java @@ -199,8 +199,10 @@ private void createAndAddDependentToWorkflow(Glue primary, Context context var resourceInSameNamespaceAsPrimary = targetNamespace.map(n -> n.trim().equals(primary.getMetadata().getNamespace().trim())) .orElse(true); - - var name = genericTemplateHandler.processTemplate(Utils.getName(spec), primary, false, context); + String name = null; + if (!Boolean.TRUE.equals(spec.getBulk())) { + name = genericTemplateHandler.processTemplate(Utils.getName(spec), primary, false, context); + } var dr = createDependentResource(name, spec, leafDependent, resourceInSameNamespaceAsPrimary, targetNamespace.orElse(null)); GroupVersionKind gvk = toGVKIfGVKP(dr.getGroupVersionKind()); From f1562a12f4254d30e6e80bcd7950779985d6c3df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Attila=20M=C3=A9sz=C3=A1ros?= Date: Mon, 10 Mar 2025 10:37:25 +0100 Subject: [PATCH 15/21] fix MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Attila Mészáros --- .../operator/glue/sample/webpage/WebPageE2E.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/io/javaoperatorsdk/operator/glue/sample/webpage/WebPageE2E.java b/src/test/java/io/javaoperatorsdk/operator/glue/sample/webpage/WebPageE2E.java index c4763ba..4631639 100644 --- a/src/test/java/io/javaoperatorsdk/operator/glue/sample/webpage/WebPageE2E.java +++ b/src/test/java/io/javaoperatorsdk/operator/glue/sample/webpage/WebPageE2E.java @@ -52,7 +52,7 @@ void testWebPageCRUDOperations() { createdWebPage.getMetadata().setResourceVersion(null); createdWebPage.getSpec().setExposed(true); - createdWebPage = client.resource(createdWebPage).update(); + createdWebPage = client.resource(createdWebPage).patch(); await().untilAsserted(() -> { var ingress = client.resources(Ingress.class).withName(webPage.getMetadata().getName()).get(); From 059603deb0db03d42a1a9a3c6f28e16ec0d907ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Attila=20M=C3=A9sz=C3=A1ros?= Date: Thu, 13 Mar 2025 10:27:28 +0100 Subject: [PATCH 16/21] bump josdk MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Attila Mészáros --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index fef7e26..d564811 100644 --- a/pom.xml +++ b/pom.xml @@ -50,7 +50,7 @@ io.javaoperatorsdk operator-framework-core - 5.0.3 + 5.0.4 io.quarkiverse.operatorsdk From bd00e98124bad4156f8edffdb38de601de48b079 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Attila=20M=C3=A9sz=C3=A1ros?= Date: Mon, 24 Mar 2025 13:08:16 +0100 Subject: [PATCH 17/21] fixes on deletion MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Attila Mészáros --- .../io/javaoperatorsdk/operator/glue/Utils.java | 7 ------- .../glue/reconciler/glue/GlueReconciler.java | 14 ++++++-------- 2 files changed, 6 insertions(+), 15 deletions(-) diff --git a/src/main/java/io/javaoperatorsdk/operator/glue/Utils.java b/src/main/java/io/javaoperatorsdk/operator/glue/Utils.java index 560777f..399e92d 100644 --- a/src/main/java/io/javaoperatorsdk/operator/glue/Utils.java +++ b/src/main/java/io/javaoperatorsdk/operator/glue/Utils.java @@ -135,13 +135,6 @@ public static String getKindFromTemplate(String resourceTemplate) { return getPropertyValueFromTemplate(resourceTemplate, "kind"); } - public static Set leafResourceNames(Glue glue) { - Set result = new HashSet<>(); - glue.getSpec().getChildResources().forEach(r -> result.add(r.getName())); - glue.getSpec().getChildResources().forEach(r -> r.getDependsOn().forEach(result::remove)); - return result; - } - private static Optional getOptionalPropertyValueFromTemplate(String resourceTemplate, String property) { var finalProp = property + ":"; diff --git a/src/main/java/io/javaoperatorsdk/operator/glue/reconciler/glue/GlueReconciler.java b/src/main/java/io/javaoperatorsdk/operator/glue/reconciler/glue/GlueReconciler.java index c988524..b68bccd 100644 --- a/src/main/java/io/javaoperatorsdk/operator/glue/reconciler/glue/GlueReconciler.java +++ b/src/main/java/io/javaoperatorsdk/operator/glue/reconciler/glue/GlueReconciler.java @@ -176,12 +176,10 @@ private void cleanupRemovedResourcesFromWorkflow(Context context, private io.javaoperatorsdk.operator.processing.dependent.workflow.Workflow buildWorkflowAndRegisterInformers( Glue primary, Context context) { var builder = new WorkflowBuilder(); - Set leafDependentNames = Utils.leafResourceNames(primary); Map genericDependentResourceMap = new HashMap<>(); primary.getSpec().getChildResources().forEach(spec -> createAndAddDependentToWorkflow(primary, - context, spec, genericDependentResourceMap, builder, - leafDependentNames.contains(spec.getName()))); + context, spec, genericDependentResourceMap, builder)); return builder.build(); } @@ -189,7 +187,7 @@ private io.javaoperatorsdk.operator.processing.dependent.workflow.Workflow private void createAndAddDependentToWorkflow(Glue primary, Context context, DependentResourceSpec spec, Map genericDependentResourceMap, - WorkflowBuilder builder, boolean leafDependent) { + WorkflowBuilder builder) { // todo test processing ns not as template // todo test processing ns as template @@ -203,7 +201,7 @@ private void createAndAddDependentToWorkflow(Glue primary, Context context if (!Boolean.TRUE.equals(spec.getBulk())) { name = genericTemplateHandler.processTemplate(Utils.getName(spec), primary, false, context); } - var dr = createDependentResource(name, spec, leafDependent, resourceInSameNamespaceAsPrimary, + var dr = createDependentResource(name, spec, resourceInSameNamespaceAsPrimary, targetNamespace.orElse(null)); GroupVersionKind gvk = toGVKIfGVKP(dr.getGroupVersionKind()); var es = informerRegister.registerInformer(context, gvk, primary); @@ -225,10 +223,10 @@ private void createAndAddDependentToWorkflow(Glue primary, Context context } private GenericDependentResource createDependentResource(String resourceName, - DependentResourceSpec spec, - boolean leafDependent, Boolean resourceInSameNamespaceAsPrimary, String namespace) { + DependentResourceSpec spec, Boolean resourceInSameNamespaceAsPrimary, String namespace) { - if (leafDependent && resourceInSameNamespaceAsPrimary && !spec.isClusterScoped()) { + if (spec.getDependsOn().isEmpty() && + resourceInSameNamespaceAsPrimary && !spec.isClusterScoped()) { return spec.getResourceTemplate() != null ? spec.getBulk() ? new GCGenericBulkDependentResource(genericTemplateHandler, From dada0f2447b1baf81bd933d0d97d43b0985f998e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Attila=20M=C3=A9sz=C3=A1ros?= Date: Mon, 24 Mar 2025 13:28:51 +0100 Subject: [PATCH 18/21] fix MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Attila Mészáros --- .../glue/reconciler/operator/GlueOperatorReconciler.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/io/javaoperatorsdk/operator/glue/reconciler/operator/GlueOperatorReconciler.java b/src/main/java/io/javaoperatorsdk/operator/glue/reconciler/operator/GlueOperatorReconciler.java index ea4d0c9..ab6ac97 100644 --- a/src/main/java/io/javaoperatorsdk/operator/glue/reconciler/operator/GlueOperatorReconciler.java +++ b/src/main/java/io/javaoperatorsdk/operator/glue/reconciler/operator/GlueOperatorReconciler.java @@ -180,7 +180,7 @@ private InformerEventSource getOrRegist .eventSourceRetriever() .getEventSourceFor(GenericKubernetesResource.class, gvk.toString()); es.start(); - } catch (NoEventSourceForClassException e) { + } catch (NoEventSourceForClassException | IllegalArgumentException e) { var configBuilder = InformerEventSourceConfiguration.from(gvk, GlueOperator.class) .withName(gvk.toString()) .withSecondaryToPrimaryMapper( From 0d9c26fcac44eaab569811c9e961255183fca30a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Attila=20M=C3=A9sz=C3=A1ros?= Date: Mon, 24 Mar 2025 13:58:25 +0100 Subject: [PATCH 19/21] improvements MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Attila Mészáros --- .../glue/dependent/GenericDependentResource.java | 11 ++--------- .../operator/glue/reconciler/glue/GlueReconciler.java | 4 ++-- 2 files changed, 4 insertions(+), 11 deletions(-) diff --git a/src/main/java/io/javaoperatorsdk/operator/glue/dependent/GenericDependentResource.java b/src/main/java/io/javaoperatorsdk/operator/glue/dependent/GenericDependentResource.java index 1f3fc14..0457b56 100644 --- a/src/main/java/io/javaoperatorsdk/operator/glue/dependent/GenericDependentResource.java +++ b/src/main/java/io/javaoperatorsdk/operator/glue/dependent/GenericDependentResource.java @@ -31,7 +31,6 @@ public class GenericDependentResource protected final GenericKubernetesResource desired; protected final String desiredTemplate; - protected final String name; // resource name might be templated protected final String resourceName; protected final String namespace; @@ -43,12 +42,11 @@ public class GenericDependentResource public GenericDependentResource(GenericTemplateHandler genericTemplateHandler, GenericKubernetesResource desired, String name, String resourceName, String namespace, boolean clusterScoped, Matcher matcher) { - super(new GroupVersionKind(desired.getApiVersion(), desired.getKind())); + super(new GroupVersionKind(desired.getApiVersion(), desired.getKind()), name); this.desired = desired; this.namespace = namespace; this.matcher = matcher; this.desiredTemplate = null; - this.name = name; this.resourceName = resourceName; this.clusterScoped = clusterScoped; this.genericTemplateHandler = genericTemplateHandler; @@ -59,9 +57,8 @@ public GenericDependentResource(GenericTemplateHandler genericTemplateHandler, boolean clusterScoped, Matcher matcher) { super(new GroupVersionKind(Utils.getApiVersionFromTemplate(desiredTemplate), - Utils.getKindFromTemplate(desiredTemplate))); + Utils.getKindFromTemplate(desiredTemplate)), name); this.genericTemplateHandler = genericTemplateHandler; - this.name = name; this.resourceName = resourceName; this.desiredTemplate = desiredTemplate; this.namespace = namespace; @@ -136,8 +133,4 @@ protected Optional selectTargetSecondaryResource( } } - @Override - public String name() { - return name; - } } diff --git a/src/main/java/io/javaoperatorsdk/operator/glue/reconciler/glue/GlueReconciler.java b/src/main/java/io/javaoperatorsdk/operator/glue/reconciler/glue/GlueReconciler.java index b68bccd..20b3ab8 100644 --- a/src/main/java/io/javaoperatorsdk/operator/glue/reconciler/glue/GlueReconciler.java +++ b/src/main/java/io/javaoperatorsdk/operator/glue/reconciler/glue/GlueReconciler.java @@ -119,7 +119,7 @@ public DeleteControl cleanup(Glue primary, Context context) { actualWorkflow.getDependentResourcesWithoutActivationCondition().forEach(dr -> { var genericDependentResource = (GenericDependentResource) dr; informerRegister.deRegisterInformer( - toGVKIfGVKP(genericDependentResource.getGroupVersionKind()), + genericDependentResource.getGroupVersionKind(), primary, context); }); informerRegister.deRegisterInformerForRelatedResources(primary, context); @@ -203,7 +203,7 @@ private void createAndAddDependentToWorkflow(Glue primary, Context context } var dr = createDependentResource(name, spec, resourceInSameNamespaceAsPrimary, targetNamespace.orElse(null)); - GroupVersionKind gvk = toGVKIfGVKP(dr.getGroupVersionKind()); + GroupVersionKind gvk = dr.getGroupVersionKind(); var es = informerRegister.registerInformer(context, gvk, primary); dr.setEventSource(es); From 98c13c0835644de7a4dd312297f29219b08dce12 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Attila=20M=C3=A9sz=C3=A1ros?= Date: Mon, 24 Mar 2025 14:11:10 +0100 Subject: [PATCH 20/21] logging improve MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Attila Mészáros --- .../operator/glue/reconciler/glue/InformerRegister.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/main/java/io/javaoperatorsdk/operator/glue/reconciler/glue/InformerRegister.java b/src/main/java/io/javaoperatorsdk/operator/glue/reconciler/glue/InformerRegister.java index 060c0ea..61ef8d1 100644 --- a/src/main/java/io/javaoperatorsdk/operator/glue/reconciler/glue/InformerRegister.java +++ b/src/main/java/io/javaoperatorsdk/operator/glue/reconciler/glue/InformerRegister.java @@ -104,11 +104,15 @@ public InformerEventSource registerInformer( }); var newInformer = informerProducer.createInformer(configBuilder.build(), context); - log.debug("Registering informer for gvk: {}", gvk); + var resultInformer = (InformerEventSource) context .eventSourceRetriever() .dynamicallyRegisterEventSource(newInformer); - log.debug("Actual new informer registered: {}", resultInformer == newInformer); + if (log.isDebugEnabled()) { + log.debug("Registering informer for gvk: {} actually registered: {}", gvk, + resultInformer == newInformer); + } + return resultInformer; } From 4224b6a34a1606832e91e510d42ac246b2bb3f80 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Attila=20M=C3=A9sz=C3=A1ros?= Date: Mon, 24 Mar 2025 14:24:08 +0100 Subject: [PATCH 21/21] wip MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Attila Mészáros --- .../operator/glue/reconciler/glue/GlueReconciler.java | 10 ---------- .../glue/reconciler/glue/InformerRegister.java | 1 - 2 files changed, 11 deletions(-) diff --git a/src/main/java/io/javaoperatorsdk/operator/glue/reconciler/glue/GlueReconciler.java b/src/main/java/io/javaoperatorsdk/operator/glue/reconciler/glue/GlueReconciler.java index 20b3ab8..1dd2e47 100644 --- a/src/main/java/io/javaoperatorsdk/operator/glue/reconciler/glue/GlueReconciler.java +++ b/src/main/java/io/javaoperatorsdk/operator/glue/reconciler/glue/GlueReconciler.java @@ -28,7 +28,6 @@ import io.javaoperatorsdk.operator.glue.reconciler.operator.GlueOperatorReconciler; import io.javaoperatorsdk.operator.glue.templating.GenericTemplateHandler; import io.javaoperatorsdk.operator.processing.GroupVersionKind; -import io.javaoperatorsdk.operator.processing.dependent.kubernetes.GroupVersionKindPlural; import io.javaoperatorsdk.operator.processing.dependent.workflow.Condition; import io.javaoperatorsdk.operator.processing.dependent.workflow.KubernetesResourceDeletedCondition; import io.javaoperatorsdk.operator.processing.dependent.workflow.WorkflowBuilder; @@ -371,13 +370,4 @@ public static boolean isGlueOfAGlueOperator(Glue glue) { } - // remove if the conversion not happens in josdk anymore - // https://github.com/operator-framework/java-operator-sdk/pull/2726 - private static GroupVersionKind toGVKIfGVKP(GroupVersionKind gvk) { - if (gvk instanceof GroupVersionKindPlural gvkp) { - gvk = new GroupVersionKind(gvkp.getGroup(), gvkp.getVersion(), gvkp.getKind()); - } - return gvk; - } - } diff --git a/src/main/java/io/javaoperatorsdk/operator/glue/reconciler/glue/InformerRegister.java b/src/main/java/io/javaoperatorsdk/operator/glue/reconciler/glue/InformerRegister.java index 61ef8d1..dae2fcf 100644 --- a/src/main/java/io/javaoperatorsdk/operator/glue/reconciler/glue/InformerRegister.java +++ b/src/main/java/io/javaoperatorsdk/operator/glue/reconciler/glue/InformerRegister.java @@ -112,7 +112,6 @@ public InformerEventSource registerInformer( log.debug("Registering informer for gvk: {} actually registered: {}", gvk, resultInformer == newInformer); } - return resultInformer; }