Skip to content
Merged
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