Skip to content

Commit edf7f15

Browse files
authored
chore: quarkus operator sdk and related version updates (#139)
Signed-off-by: Attila Mészáros <[email protected]>
1 parent 5a99276 commit edf7f15

22 files changed

+251
-178
lines changed

pom.xml

+9-3
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,11 @@
1717
<surefire-plugin.version>3.5.2</surefire-plugin.version>
1818
<sonar.organization>java-operator-sdk</sonar.organization>
1919
<sonar.host.url>https://sonarcloud.io</sonar.host.url>
20-
<fabric8-client.version>6.13.1</fabric8-client.version>
21-
<quarkus.version>3.8.3</quarkus.version>
20+
<fabric8-client.version>7.1.0</fabric8-client.version>
21+
<quarkus.version>3.19.0</quarkus.version>
2222
<graalvm.version>24.1.2</graalvm.version>
2323
<mokito.version>5.11.0</mokito.version>
24-
<qosdk.version>6.6.8</qosdk.version>
24+
<qosdk.version>7.1.0</qosdk.version>
2525
<assertj.version>3.27.3</assertj.version>
2626
<spotless.version>2.43.0</spotless.version>
2727
</properties>
@@ -46,6 +46,12 @@
4646
</dependencyManagement>
4747

4848
<dependencies>
49+
<!-- TODO remove after released as part of QOSDK -->
50+
<dependency>
51+
<groupId>io.javaoperatorsdk</groupId>
52+
<artifactId>operator-framework-core</artifactId>
53+
<version>5.0.4</version>
54+
</dependency>
4955
<dependency>
5056
<groupId>io.quarkiverse.operatorsdk</groupId>
5157
<artifactId>quarkus-operator-sdk</artifactId>

src/main/java/io/javaoperatorsdk/operator/glue/Utils.java

+1-8
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ public static Map<String, GenericKubernetesResource> getRelatedResources(Glue gl
6666
var es =
6767
(InformerEventSource<GenericKubernetesResource, Glue>) context
6868
.eventSourceRetriever()
69-
.getResourceEventSourceFor(GenericKubernetesResource.class, gvk.toString());
69+
.getEventSourceFor(GenericKubernetesResource.class, gvk.toString());
7070

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

138-
public static Set<String> leafResourceNames(Glue glue) {
139-
Set<String> result = new HashSet<>();
140-
glue.getSpec().getChildResources().forEach(r -> result.add(r.getName()));
141-
glue.getSpec().getChildResources().forEach(r -> r.getDependsOn().forEach(result::remove));
142-
return result;
143-
}
144-
145138
private static Optional<String> getOptionalPropertyValueFromTemplate(String resourceTemplate,
146139
String property) {
147140
var finalProp = property + ":";

src/main/java/io/javaoperatorsdk/operator/glue/customresource/AbstractStatus.java

+9-2
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
package io.javaoperatorsdk.operator.glue.customresource;
22

3-
import io.javaoperatorsdk.operator.api.ObservedGenerationAwareStatus;
3+
public class AbstractStatus {
44

5-
public class AbstractStatus extends ObservedGenerationAwareStatus {
5+
private Long observedGeneration = null;
66

77
private String errorMessage;
88

@@ -14,4 +14,11 @@ public void setErrorMessage(String errorMessage) {
1414
this.errorMessage = errorMessage;
1515
}
1616

17+
public Long getObservedGeneration() {
18+
return observedGeneration;
19+
}
20+
21+
public void setObservedGeneration(Long observedGeneration) {
22+
this.observedGeneration = observedGeneration;
23+
}
1724
}

src/main/java/io/javaoperatorsdk/operator/glue/customresource/operator/GlueOperator.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,6 @@
1010
@Version("v1beta1")
1111
@ShortNames("go")
1212
public class GlueOperator
13-
extends CustomResource<GlueOperatorSpec, ResourceFlowOperatorStatus>
13+
extends CustomResource<GlueOperatorSpec, GlueOperatorStatus>
1414
implements Namespaced {
1515
}

src/main/java/io/javaoperatorsdk/operator/glue/customresource/operator/ResourceFlowOperatorStatus.java src/main/java/io/javaoperatorsdk/operator/glue/customresource/operator/GlueOperatorStatus.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

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

5-
public class ResourceFlowOperatorStatus extends AbstractStatus {
5+
public class GlueOperatorStatus extends AbstractStatus {
66

77

88
}

src/main/java/io/javaoperatorsdk/operator/glue/dependent/GCGenericDependentResource.java

+7-4
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,16 @@ public class GCGenericDependentResource extends GenericDependentResource
1010
implements GarbageCollected<Glue> {
1111

1212
public GCGenericDependentResource(GenericTemplateHandler genericTemplateHandler,
13-
GenericKubernetesResource desired, String name,
13+
GenericKubernetesResource desired, String name, String resourceName, String namespace,
1414
boolean clusterScoped, Matcher matcher) {
15-
super(genericTemplateHandler, desired, name, clusterScoped, matcher);
15+
super(genericTemplateHandler, desired, name, resourceName, namespace, clusterScoped, matcher);
1616
}
1717

1818
public GCGenericDependentResource(GenericTemplateHandler genericTemplateHandler,
19-
String desiredTemplate, String name, boolean clusterScoped, Matcher matcher) {
20-
super(genericTemplateHandler, desiredTemplate, name, clusterScoped, matcher);
19+
String desiredTemplate, String name, String resourceName, String namespace,
20+
boolean clusterScoped,
21+
Matcher matcher) {
22+
super(genericTemplateHandler, desiredTemplate, name, resourceName, namespace, clusterScoped,
23+
matcher);
2124
}
2225
}

src/main/java/io/javaoperatorsdk/operator/glue/dependent/GenericBulkDependentResource.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ public GenericBulkDependentResource(GenericTemplateHandler genericTemplateHandle
2222
String desiredTemplate, String name,
2323
boolean clusterScoped,
2424
Matcher matcher) {
25-
super(genericTemplateHandler, desiredTemplate, name, clusterScoped, matcher);
25+
super(genericTemplateHandler, desiredTemplate, name, null, null, clusterScoped, matcher);
2626
}
2727

2828
@Override

src/main/java/io/javaoperatorsdk/operator/glue/dependent/GenericDependentResource.java

+56-7
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,12 @@
11
package io.javaoperatorsdk.operator.glue.dependent;
22

3+
import java.util.Objects;
4+
import java.util.Optional;
5+
import java.util.Set;
6+
7+
import org.slf4j.Logger;
8+
import org.slf4j.LoggerFactory;
9+
310
import io.fabric8.kubernetes.api.model.GenericKubernetesResource;
411
import io.fabric8.kubernetes.client.utils.Serialization;
512
import io.javaoperatorsdk.operator.api.reconciler.Context;
@@ -20,33 +27,41 @@ public class GenericDependentResource
2027
Updater<GenericKubernetesResource, Glue>,
2128
Creator<GenericKubernetesResource, Glue> {
2229

30+
private static final Logger log = LoggerFactory.getLogger(GenericDependentResource.class);
31+
2332
protected final GenericKubernetesResource desired;
2433
protected final String desiredTemplate;
25-
protected final String name;
34+
// resource name might be templated
35+
protected final String resourceName;
36+
protected final String namespace;
2637
protected final boolean clusterScoped;
2738
protected final Matcher matcher;
2839

2940
protected final GenericTemplateHandler genericTemplateHandler;
3041

3142
public GenericDependentResource(GenericTemplateHandler genericTemplateHandler,
32-
GenericKubernetesResource desired, String name,
43+
GenericKubernetesResource desired, String name, String resourceName, String namespace,
3344
boolean clusterScoped, Matcher matcher) {
34-
super(new GroupVersionKind(desired.getApiVersion(), desired.getKind()));
45+
super(new GroupVersionKind(desired.getApiVersion(), desired.getKind()), name);
3546
this.desired = desired;
47+
this.namespace = namespace;
3648
this.matcher = matcher;
3749
this.desiredTemplate = null;
38-
this.name = name;
50+
this.resourceName = resourceName;
3951
this.clusterScoped = clusterScoped;
4052
this.genericTemplateHandler = genericTemplateHandler;
4153
}
4254

4355
public GenericDependentResource(GenericTemplateHandler genericTemplateHandler,
44-
String desiredTemplate, String name, boolean clusterScoped, Matcher matcher) {
56+
String desiredTemplate, String name, String resourceName, String namespace,
57+
boolean clusterScoped,
58+
Matcher matcher) {
4559
super(new GroupVersionKind(Utils.getApiVersionFromTemplate(desiredTemplate),
46-
Utils.getKindFromTemplate(desiredTemplate)));
60+
Utils.getKindFromTemplate(desiredTemplate)), name);
4761
this.genericTemplateHandler = genericTemplateHandler;
48-
this.name = name;
62+
this.resourceName = resourceName;
4963
this.desiredTemplate = desiredTemplate;
64+
this.namespace = namespace;
5065
this.matcher = matcher;
5166
this.desired = null;
5267
this.clusterScoped = clusterScoped;
@@ -84,4 +99,38 @@ public Result<GenericKubernetesResource> match(GenericKubernetesResource actualR
8499
return Result.nonComputed(false);
85100
}
86101
}
102+
103+
@Override
104+
protected Optional<GenericKubernetesResource> selectTargetSecondaryResource(
105+
Set<GenericKubernetesResource> secondaryResources,
106+
Glue primary,
107+
Context<Glue> context) {
108+
109+
var allSecondaryResources = context.getSecondaryResources(GenericKubernetesResource.class);
110+
if (log.isDebugEnabled()) {
111+
log.debug("All secondary resources for DR: {}, resources: {}", name,
112+
allSecondaryResources.stream()
113+
.map(r -> "{ Name: %s; Namespace: %s }".formatted(r.getMetadata().getName(),
114+
r.getMetadata().getNamespace()))
115+
.toList());
116+
}
117+
var res = allSecondaryResources
118+
.stream()
119+
.filter(r -> r.getKind().equals(getGroupVersionKind().getKind()) &&
120+
r.getApiVersion().equals(getGroupVersionKind().apiVersion()) &&
121+
r.getMetadata().getName().equals(resourceName) &&
122+
(namespace == null || Objects.equals(namespace, r.getMetadata().getNamespace())))
123+
.toList();
124+
125+
if (res.size() > 1) {
126+
throw new IllegalStateException("Multiple resources found for gvk: " + getGroupVersionKind()
127+
+ " name:" + name
128+
+ " namespace:" + namespace);
129+
} else if (res.size() == 1) {
130+
return Optional.of(res.get(0));
131+
} else {
132+
return Optional.empty();
133+
}
134+
}
135+
87136
}

src/main/java/io/javaoperatorsdk/operator/glue/dependent/GenericResourceDiscriminator.java

-48
This file was deleted.

src/main/java/io/javaoperatorsdk/operator/glue/reconciler/ValidationAndErrorHandler.java src/main/java/io/javaoperatorsdk/operator/glue/reconciler/ValidationAndStatusHandler.java

+50-5
Original file line numberDiff line numberDiff line change
@@ -11,20 +11,25 @@
1111

1212
import io.fabric8.kubernetes.client.CustomResource;
1313
import io.javaoperatorsdk.operator.api.reconciler.ErrorStatusUpdateControl;
14+
import io.javaoperatorsdk.operator.api.reconciler.UpdateControl;
1415
import io.javaoperatorsdk.operator.glue.GlueException;
1516
import io.javaoperatorsdk.operator.glue.customresource.AbstractStatus;
1617
import io.javaoperatorsdk.operator.glue.customresource.glue.DependentResourceSpec;
18+
import io.javaoperatorsdk.operator.glue.customresource.glue.Glue;
1719
import io.javaoperatorsdk.operator.glue.customresource.glue.GlueSpec;
20+
import io.javaoperatorsdk.operator.glue.customresource.glue.GlueStatus;
1821
import io.javaoperatorsdk.operator.glue.customresource.glue.RelatedResourceSpec;
22+
import io.javaoperatorsdk.operator.glue.customresource.operator.GlueOperator;
23+
import io.javaoperatorsdk.operator.glue.customresource.operator.GlueOperatorStatus;
1924

2025
import jakarta.inject.Singleton;
2126

2227
@Singleton
23-
public class ValidationAndErrorHandler {
28+
public class ValidationAndStatusHandler {
2429

2530
public static final int MAX_MESSAGE_SIZE = 150;
2631

27-
private static final Logger log = LoggerFactory.getLogger(ValidationAndErrorHandler.class);
32+
private static final Logger log = LoggerFactory.getLogger(ValidationAndStatusHandler.class);
2833

2934
public static final String NON_UNIQUE_NAMES_FOUND_PREFIX = "Non unique names found: ";
3035

@@ -34,18 +39,58 @@ public class ValidationAndErrorHandler {
3439
log.error("Error during reconciliation of resource. Name: {} namespace: {}, Kind: {}",
3540
resource.getMetadata().getName(), resource.getMetadata().getNamespace(), resource.getKind(),
3641
e);
37-
if (e instanceof ValidationAndErrorHandler.NonUniqueNameException ex) {
42+
if (e instanceof ValidationAndStatusHandler.NonUniqueNameException ex) {
3843
resource.getStatus()
3944
.setErrorMessage(NON_UNIQUE_NAMES_FOUND_PREFIX + String.join(",", ex.getDuplicates()));
40-
return ErrorStatusUpdateControl.updateStatus(resource).withNoRetry();
45+
return ErrorStatusUpdateControl.patchStatus(resource).withNoRetry();
4146
} else {
4247
var message = e.getMessage();
48+
if (message == null) {
49+
message = e.getClass().getName();
50+
}
4351
if (message.length() > MAX_MESSAGE_SIZE) {
4452
message = message.substring(0, MAX_MESSAGE_SIZE) + "...";
4553
}
4654
resource.getStatus().setErrorMessage("Error: " + message);
47-
return ErrorStatusUpdateControl.updateStatus(resource);
55+
return ErrorStatusUpdateControl.patchStatus(resource);
56+
}
57+
}
58+
59+
public UpdateControl<GlueOperator> handleStatusUpdate(GlueOperator primary) {
60+
if (primary.getStatus() == null) {
61+
primary.setStatus(new GlueOperatorStatus());
62+
}
63+
return handleGenericStatusUpdate(primary);
64+
}
65+
66+
public UpdateControl<Glue> handleStatusUpdate(Glue primary) {
67+
if (primary.getStatus() == null) {
68+
primary.setStatus(new GlueStatus());
69+
}
70+
return handleGenericStatusUpdate(primary);
71+
}
72+
73+
private <T extends CustomResource<?, ? extends AbstractStatus>> UpdateControl<T> handleGenericStatusUpdate(
74+
T primary) {
75+
boolean patch = false;
76+
77+
if (primary.getStatus().getErrorMessage() != null) {
78+
patch = true;
79+
primary.getStatus().setErrorMessage(null);
80+
}
81+
if (!primary.getMetadata().getGeneration()
82+
.equals(primary.getStatus().getObservedGeneration())) {
83+
patch = true;
84+
primary.getStatus().setObservedGeneration(primary.getMetadata().getGeneration());
4885
}
86+
87+
if (patch) {
88+
primary.getMetadata().setResourceVersion(null);
89+
return UpdateControl.patchStatus(primary);
90+
} else {
91+
return UpdateControl.noUpdate();
92+
}
93+
4994
}
5095

5196
public void checkIfValidGlueSpec(GlueSpec glueSpec) {

0 commit comments

Comments
 (0)