Skip to content

chore: quarkus operator sdk and related version updates #139

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 21 commits into from
Mar 24, 2025
12 changes: 9 additions & 3 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -17,11 +17,11 @@
<surefire-plugin.version>3.5.2</surefire-plugin.version>
<sonar.organization>java-operator-sdk</sonar.organization>
<sonar.host.url>https://sonarcloud.io</sonar.host.url>
<fabric8-client.version>6.13.1</fabric8-client.version>
<quarkus.version>3.8.3</quarkus.version>
<fabric8-client.version>7.1.0</fabric8-client.version>
<quarkus.version>3.19.0</quarkus.version>
<graalvm.version>24.1.2</graalvm.version>
<mokito.version>5.11.0</mokito.version>
<qosdk.version>6.6.8</qosdk.version>
<qosdk.version>7.1.0</qosdk.version>
<assertj.version>3.27.3</assertj.version>
<spotless.version>2.43.0</spotless.version>
</properties>
Expand All @@ -46,6 +46,12 @@
</dependencyManagement>

<dependencies>
<!-- TODO remove after released as part of QOSDK -->
<dependency>
<groupId>io.javaoperatorsdk</groupId>
<artifactId>operator-framework-core</artifactId>
<version>5.0.4</version>
</dependency>
<dependency>
<groupId>io.quarkiverse.operatorsdk</groupId>
<artifactId>quarkus-operator-sdk</artifactId>
Expand Down
9 changes: 1 addition & 8 deletions src/main/java/io/javaoperatorsdk/operator/glue/Utils.java
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ public static Map<String, GenericKubernetesResource> getRelatedResources(Glue gl
var es =
(InformerEventSource<GenericKubernetesResource, Glue>) context
.eventSourceRetriever()
.getResourceEventSourceFor(GenericKubernetesResource.class, gvk.toString());
.getEventSourceFor(GenericKubernetesResource.class, gvk.toString());

var namespace = relatedResourceSpec.isClusterScoped() ? null
: relatedResourceSpec.getNamespace() == null ? glue.getMetadata().getNamespace()
Expand Down Expand Up @@ -135,13 +135,6 @@ public static String getKindFromTemplate(String resourceTemplate) {
return getPropertyValueFromTemplate(resourceTemplate, "kind");
}

public static Set<String> leafResourceNames(Glue glue) {
Set<String> 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<String> getOptionalPropertyValueFromTemplate(String resourceTemplate,
String property) {
var finalProp = property + ":";
Expand Down
Original file line number Diff line number Diff line change
@@ -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;

Expand All @@ -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;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,6 @@
@Version("v1beta1")
@ShortNames("go")
public class GlueOperator
extends CustomResource<GlueOperatorSpec, ResourceFlowOperatorStatus>
extends CustomResource<GlueOperatorSpec, GlueOperatorStatus>
implements Namespaced {
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

import io.javaoperatorsdk.operator.glue.customresource.AbstractStatus;

public class ResourceFlowOperatorStatus extends AbstractStatus {
public class GlueOperatorStatus extends AbstractStatus {


}
Original file line number Diff line number Diff line change
Expand Up @@ -10,13 +10,16 @@ public class GCGenericDependentResource extends GenericDependentResource
implements GarbageCollected<Glue> {

public GCGenericDependentResource(GenericTemplateHandler genericTemplateHandler,
GenericKubernetesResource desired, String name,
GenericKubernetesResource desired, String name, String resourceName, String namespace,
boolean clusterScoped, Matcher matcher) {
super(genericTemplateHandler, desired, name, clusterScoped, matcher);
super(genericTemplateHandler, desired, name, resourceName, 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 resourceName, String namespace,
boolean clusterScoped,
Matcher matcher) {
super(genericTemplateHandler, desiredTemplate, name, resourceName, namespace, clusterScoped,
matcher);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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, null, clusterScoped, matcher);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,12 @@
package io.javaoperatorsdk.operator.glue.dependent;

import java.util.Objects;
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;
Expand All @@ -20,33 +27,41 @@ public class GenericDependentResource
Updater<GenericKubernetesResource, Glue>,
Creator<GenericKubernetesResource, Glue> {

private static final Logger log = LoggerFactory.getLogger(GenericDependentResource.class);

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;

protected final GenericTemplateHandler genericTemplateHandler;

public GenericDependentResource(GenericTemplateHandler genericTemplateHandler,
GenericKubernetesResource desired, String name,
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;
}

public GenericDependentResource(GenericTemplateHandler genericTemplateHandler,
String desiredTemplate, String name, boolean clusterScoped, Matcher matcher) {
String desiredTemplate, String name, String resourceName, String namespace,
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;
this.matcher = matcher;
this.desired = null;
this.clusterScoped = clusterScoped;
Expand Down Expand Up @@ -84,4 +99,38 @@ public Result<GenericKubernetesResource> match(GenericKubernetesResource actualR
return Result.nonComputed(false);
}
}

@Override
protected Optional<GenericKubernetesResource> selectTargetSecondaryResource(
Set<GenericKubernetesResource> secondaryResources,
Glue primary,
Context<Glue> context) {

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()) &&
r.getMetadata().getName().equals(resourceName) &&
(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();
}
}

}

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -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: ";

Expand All @@ -34,18 +39,58 @@ 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.updateStatus(resource).withNoRetry();
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) + "...";
}
resource.getStatus().setErrorMessage("Error: " + message);
return ErrorStatusUpdateControl.updateStatus(resource);
return ErrorStatusUpdateControl.patchStatus(resource);
}
}

public UpdateControl<GlueOperator> handleStatusUpdate(GlueOperator primary) {
if (primary.getStatus() == null) {
primary.setStatus(new GlueOperatorStatus());
}
return handleGenericStatusUpdate(primary);
}

public UpdateControl<Glue> handleStatusUpdate(Glue primary) {
if (primary.getStatus() == null) {
primary.setStatus(new GlueStatus());
}
return handleGenericStatusUpdate(primary);
}

private <T extends CustomResource<?, ? extends AbstractStatus>> UpdateControl<T> 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) {
Expand Down
Loading