Skip to content

Commit 8402026

Browse files
committed
feat: initial upgrade of client to 5.0.0 and quarkus to 1.11.0.CR1
Quarkus 1.11.0.CR1 is the first version to use Fabric8's client 5.0 so we need to update both at the same time. Note that tests are not expected to pass at this point yet.
1 parent 1bdad85 commit 8402026

File tree

55 files changed

+200
-694
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

55 files changed

+200
-694
lines changed

operator-framework-core/src/main/java/io/javaoperatorsdk/operator/Operator.java

Lines changed: 5 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,11 @@
22

33
import io.fabric8.kubernetes.api.model.apiextensions.v1beta1.CustomResourceDefinition;
44
import io.fabric8.kubernetes.client.CustomResource;
5-
import io.fabric8.kubernetes.client.CustomResourceDoneable;
65
import io.fabric8.kubernetes.client.CustomResourceList;
76
import io.fabric8.kubernetes.client.KubernetesClient;
87
import io.fabric8.kubernetes.client.dsl.MixedOperation;
98
import io.fabric8.kubernetes.client.dsl.base.CustomResourceDefinitionContext;
109
import io.fabric8.kubernetes.client.dsl.internal.CustomResourceOperationsImpl;
11-
import io.fabric8.kubernetes.internal.KubernetesDeserializer;
1210
import io.javaoperatorsdk.operator.api.ResourceController;
1311
import io.javaoperatorsdk.operator.api.config.ConfigurationService;
1412
import io.javaoperatorsdk.operator.processing.CustomResourceCache;
@@ -76,12 +74,10 @@ private <R extends CustomResource> void registerController(
7674
throws OperatorException {
7775
final var configuration = configurationService.getConfigurationFor(controller);
7876
Class<R> resClass = configuration.getCustomResourceClass();
79-
CustomResourceDefinitionContext crd = getCustomResourceDefinitionForController(controller);
80-
KubernetesDeserializer.registerCustomKind(crd.getVersion(), crd.getKind(), resClass);
77+
/*CustomResourceDefinitionContext crd = getCustomResourceDefinitionForController(controller);
78+
KubernetesDeserializer.registerCustomKind(crd.getVersion(), crd.getKind(), resClass);*/
8179
String finalizer = configuration.getFinalizer();
82-
MixedOperation client =
83-
k8sClient.customResources(
84-
crd, resClass, CustomResourceList.class, configuration.getDoneableClass());
80+
MixedOperation client = k8sClient.customResources(resClass);
8581
EventDispatcher eventDispatcher =
8682
new EventDispatcher(
8783
controller, finalizer, new EventDispatcher.CustomResourceFacade(client));
@@ -156,11 +152,8 @@ private CustomResourceDefinitionContext getCustomResourceDefinitionForController
156152
return customResourceClients;
157153
}
158154

159-
public <
160-
T extends CustomResource,
161-
L extends CustomResourceList<T>,
162-
D extends CustomResourceDoneable<T>>
163-
CustomResourceOperationsImpl<T, L, D> getCustomResourceClients(Class<T> customResourceClass) {
155+
public <T extends CustomResource, L extends CustomResourceList<T>>
156+
CustomResourceOperationsImpl<T, L> getCustomResourceClients(Class<T> customResourceClass) {
164157
return customResourceClients.get(customResourceClass);
165158
}
166159
}

operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/Controller.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,6 @@
1111

1212
String NULL = "";
1313

14-
String crdName();
15-
1614
String name() default NULL;
1715

1816
/**

operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/ControllerConfiguration.java

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package io.javaoperatorsdk.operator.api.config;
22

33
import io.fabric8.kubernetes.client.CustomResource;
4-
import io.fabric8.kubernetes.client.CustomResourceDoneable;
54
import java.util.Collections;
65
import java.util.Set;
76

@@ -19,8 +18,6 @@ public interface ControllerConfiguration<R extends CustomResource> {
1918

2019
Class<R> getCustomResourceClass();
2120

22-
Class<? extends CustomResourceDoneable<R>> getDoneableClass();
23-
2421
String getAssociatedControllerClassName();
2522

2623
default boolean isClusterScoped() {

operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/EventDispatcher.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -191,10 +191,9 @@ private void addFinalizerIfNotPresent(CustomResource resource) {
191191
// created to support unit testing
192192
public static class CustomResourceFacade {
193193

194-
private final MixedOperation<?, ?, ?, Resource<CustomResource, ?>> resourceOperation;
194+
private final MixedOperation<?, ?, Resource<CustomResource>> resourceOperation;
195195

196-
public CustomResourceFacade(
197-
MixedOperation<?, ?, ?, Resource<CustomResource, ?>> resourceOperation) {
196+
public CustomResourceFacade(MixedOperation<?, ?, Resource<CustomResource>> resourceOperation) {
198197
this.resourceOperation = resourceOperation;
199198
}
200199

operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/internal/CustomResourceEventSource.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,10 @@
33
import static io.javaoperatorsdk.operator.processing.KubernetesResourceUtils.getUID;
44
import static io.javaoperatorsdk.operator.processing.KubernetesResourceUtils.getVersion;
55
import static io.javaoperatorsdk.operator.processing.KubernetesResourceUtils.markedForDeletion;
6-
import static java.net.HttpURLConnection.HTTP_GONE;
76

87
import io.fabric8.kubernetes.client.CustomResource;
9-
import io.fabric8.kubernetes.client.KubernetesClientException;
108
import io.fabric8.kubernetes.client.Watcher;
9+
import io.fabric8.kubernetes.client.WatcherException;
1110
import io.fabric8.kubernetes.client.dsl.MixedOperation;
1211
import io.fabric8.kubernetes.client.dsl.internal.CustomResourceOperationsImpl;
1312
import io.javaoperatorsdk.operator.ControllerUtils;
@@ -151,11 +150,11 @@ public void eventSourceDeRegisteredForResource(String customResourceUid) {
151150
}
152151

153152
@Override
154-
public void onClose(KubernetesClientException e) {
153+
public void onClose(WatcherException e) {
155154
if (e == null) {
156155
return;
157156
}
158-
if (e.getCode() == HTTP_GONE) {
157+
if (e.isHttpGone()) {
159158
log.warn("Received error for watch, will try to reconnect.", e);
160159
registerWatch();
161160
} else {
Lines changed: 6 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,38 +1,10 @@
11
package io.javaoperatorsdk.operator.sample.simple;
22

33
import io.fabric8.kubernetes.client.CustomResource;
4+
import io.fabric8.kubernetes.model.annotation.Group;
5+
import io.fabric8.kubernetes.model.annotation.Version;
46

5-
public class TestCustomResource extends CustomResource {
6-
7-
private TestCustomResourceSpec spec;
8-
9-
private TestCustomResourceStatus status;
10-
11-
public TestCustomResourceSpec getSpec() {
12-
return spec;
13-
}
14-
15-
public void setSpec(TestCustomResourceSpec spec) {
16-
this.spec = spec;
17-
}
18-
19-
public TestCustomResourceStatus getStatus() {
20-
return status;
21-
}
22-
23-
public void setStatus(TestCustomResourceStatus status) {
24-
this.status = status;
25-
}
26-
27-
@Override
28-
public String toString() {
29-
return "TestCustomResource{"
30-
+ "spec="
31-
+ spec
32-
+ ", status="
33-
+ status
34-
+ ", extendedFrom="
35-
+ super.toString()
36-
+ '}';
37-
}
38-
}
7+
@Group("sample.javaoperatorsdk.io")
8+
@Version("v1")
9+
public class TestCustomResource
10+
extends CustomResource<TestCustomResourceSpec, TestCustomResourceStatus> {}

operator-framework-core/src/test/java/io/javaoperatorsdk/operator/sample/simple/TestCustomResourceController.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import io.fabric8.kubernetes.api.model.ConfigMap;
44
import io.fabric8.kubernetes.api.model.ConfigMapBuilder;
55
import io.fabric8.kubernetes.api.model.ObjectMetaBuilder;
6+
import io.fabric8.kubernetes.client.CustomResource;
67
import io.fabric8.kubernetes.client.KubernetesClient;
78
import io.javaoperatorsdk.operator.api.Context;
89
import io.javaoperatorsdk.operator.api.Controller;
@@ -14,12 +15,12 @@
1415
import org.slf4j.Logger;
1516
import org.slf4j.LoggerFactory;
1617

17-
@Controller(generationAwareEventProcessing = false, crdName = TestCustomResourceController.CRD_NAME)
18+
@Controller(generationAwareEventProcessing = false)
1819
public class TestCustomResourceController implements ResourceController<TestCustomResource> {
1920

2021
private static final Logger log = LoggerFactory.getLogger(TestCustomResourceController.class);
2122

22-
public static final String CRD_NAME = "customservices.sample.javaoperatorsdk";
23+
public static final String CRD_NAME = CustomResource.getCRDName(TestCustomResource.class);
2324
public static final String FINALIZER_NAME = CRD_NAME + "/finalizer";
2425

2526
private final KubernetesClient kubernetesClient;

operator-framework-quarkus-extension/deployment/src/main/java/io/javaoperatorsdk/quarkus/extension/deployment/QuarkusExtensionProcessor.java

Lines changed: 16 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package io.javaoperatorsdk.quarkus.extension.deployment;
22

33
import io.fabric8.kubernetes.client.CustomResource;
4-
import io.fabric8.kubernetes.client.CustomResourceDoneable;
54
import io.javaoperatorsdk.operator.ControllerUtils;
65
import io.javaoperatorsdk.operator.api.Controller;
76
import io.javaoperatorsdk.operator.api.ResourceController;
@@ -13,21 +12,14 @@
1312
import io.javaoperatorsdk.quarkus.extension.QuarkusControllerConfiguration;
1413
import io.quarkus.arc.deployment.AdditionalBeanBuildItem;
1514
import io.quarkus.arc.deployment.SyntheticBeanBuildItem;
16-
import io.quarkus.deployment.GeneratedClassGizmoAdaptor;
1715
import io.quarkus.deployment.annotations.BuildProducer;
1816
import io.quarkus.deployment.annotations.BuildStep;
1917
import io.quarkus.deployment.annotations.ExecutionTime;
2018
import io.quarkus.deployment.annotations.Record;
2119
import io.quarkus.deployment.builditem.CombinedIndexBuildItem;
2220
import io.quarkus.deployment.builditem.FeatureBuildItem;
23-
import io.quarkus.deployment.builditem.GeneratedClassBuildItem;
2421
import io.quarkus.deployment.builditem.IndexDependencyBuildItem;
25-
import io.quarkus.gizmo.ClassCreator;
26-
import io.quarkus.gizmo.ClassOutput;
27-
import io.quarkus.gizmo.MethodCreator;
28-
import io.quarkus.gizmo.MethodDescriptor;
2922
import io.quarkus.kubernetes.client.spi.KubernetesClientBuildItem;
30-
import java.lang.reflect.Modifier;
3123
import java.util.List;
3224
import java.util.Optional;
3325
import java.util.function.Function;
@@ -66,18 +58,16 @@ void indexSDKDependencies(BuildProducer<IndexDependencyBuildItem> indexDependenc
6658
@Record(ExecutionTime.RUNTIME_INIT)
6759
void createConfigurationServiceAndOperator(
6860
CombinedIndexBuildItem combinedIndexBuildItem,
69-
BuildProducer<GeneratedClassBuildItem> generatedClass,
7061
BuildProducer<SyntheticBeanBuildItem> syntheticBeanBuildItemBuildProducer,
7162
BuildProducer<AdditionalBeanBuildItem> additionalBeans,
7263
KubernetesClientBuildItem clientBuildItem,
7364
ConfigurationServiceRecorder recorder) {
7465
final var index = combinedIndexBuildItem.getIndex();
7566
final var resourceControllers = index.getAllKnownImplementors(RESOURCE_CONTROLLER);
7667

77-
final var classOutput = new GeneratedClassGizmoAdaptor(generatedClass, true);
7868
final List<ControllerConfiguration> controllerConfigs =
7969
resourceControllers.stream()
80-
.map(ci -> createControllerConfiguration(ci, classOutput, additionalBeans))
70+
.map(ci -> createControllerConfiguration(ci, additionalBeans))
8171
.collect(Collectors.toList());
8272

8373
final var supplier = recorder.configurationServiceSupplier(controllerConfigs);
@@ -93,9 +83,7 @@ void createConfigurationServiceAndOperator(
9383
}
9484

9585
private ControllerConfiguration createControllerConfiguration(
96-
ClassInfo info,
97-
ClassOutput classOutput,
98-
BuildProducer<AdditionalBeanBuildItem> additionalBeans) {
86+
ClassInfo info, BuildProducer<AdditionalBeanBuildItem> additionalBeans) {
9987
// first retrieve the custom resource class
10088
final var rcInterface =
10189
info.interfaceTypes().stream()
@@ -111,33 +99,6 @@ private ControllerConfiguration createControllerConfiguration(
11199
final var resourceControllerClassName = info.name().toString();
112100
additionalBeans.produce(AdditionalBeanBuildItem.unremovableOf(resourceControllerClassName));
113101

114-
// generate associated Doneable class
115-
final var doneableClassName = crType + "Doneable";
116-
final var crDoneableClassName = CustomResourceDoneable.class.getName();
117-
try (ClassCreator cc =
118-
ClassCreator.builder()
119-
.signature(
120-
String.format(
121-
"Lio/fabric8/kubernetes/client/CustomResourceDoneable<L%s;>;",
122-
crType.replace('.', '/')))
123-
.classOutput(classOutput)
124-
.className(doneableClassName)
125-
.superClass(crDoneableClassName)
126-
.build()) {
127-
128-
final var functionName = io.fabric8.kubernetes.api.builder.Function.class.getName();
129-
MethodCreator ctor =
130-
cc.getMethodCreator("<init>", void.class.getName(), crType, functionName);
131-
ctor.setModifiers(Modifier.PUBLIC);
132-
ctor.invokeSpecialMethod(
133-
MethodDescriptor.ofConstructor(
134-
crDoneableClassName, CustomResource.class.getName(), functionName),
135-
ctor.getThis(),
136-
ctor.getMethodParam(0),
137-
ctor.getMethodParam(1));
138-
ctor.returnValue(null);
139-
}
140-
141102
// generate configuration
142103
final var controllerAnnotation = info.classAnnotation(CONTROLLER);
143104
if (controllerAnnotation == null) {
@@ -147,9 +108,12 @@ private ControllerConfiguration createControllerConfiguration(
147108
+ Controller.class.getCanonicalName()
148109
+ " annotation");
149110
}
150-
final var crdName =
151-
valueOrDefault(
152-
controllerAnnotation, "crdName", AnnotationValue::asString, EXCEPTION_SUPPLIER);
111+
112+
// retrieve CRD name from CR type
113+
final Class<CustomResource> crClass = (Class<CustomResource>) loadClass(crType);
114+
final var crdName = CustomResource.getCRDName(crClass);
115+
116+
// create the configuration
153117
final var configuration =
154118
new QuarkusControllerConfiguration(
155119
resourceControllerClassName,
@@ -179,7 +143,6 @@ private ControllerConfiguration createControllerConfiguration(
179143
AnnotationValue::asStringArray,
180144
() -> new String[] {})),
181145
crType,
182-
doneableClassName,
183146
null // todo: fix-me
184147
);
185148

@@ -193,4 +156,12 @@ private <T> T valueOrDefault(
193156
Supplier<T> defaultValue) {
194157
return Optional.ofNullable(annotation.value(name)).map(converter).orElseGet(defaultValue);
195158
}
159+
160+
private Class<?> loadClass(String className) {
161+
try {
162+
return Thread.currentThread().getContextClassLoader().loadClass(className);
163+
} catch (ClassNotFoundException e) {
164+
throw new IllegalArgumentException("Couldn't find class " + className);
165+
}
166+
}
196167
}

operator-framework-quarkus-extension/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
2020
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
2121
<maven.compiler.parameters>true</maven.compiler.parameters>
22-
<quarkus.version>1.10.5.Final</quarkus.version>
22+
<quarkus.version>1.11.0.CR1</quarkus.version>
2323
<compiler-plugin.version>3.8.1</compiler-plugin.version>
2424
<maven.surefire.version>3.0.0-M5</maven.surefire.version>
2525
</properties>

operator-framework-quarkus-extension/runtime/src/main/java/io/javaoperatorsdk/quarkus/extension/QuarkusControllerConfiguration.java

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package io.javaoperatorsdk.quarkus.extension;
22

33
import io.fabric8.kubernetes.client.CustomResource;
4-
import io.fabric8.kubernetes.client.CustomResourceDoneable;
54
import io.javaoperatorsdk.operator.api.config.ControllerConfiguration;
65
import io.javaoperatorsdk.operator.api.config.RetryConfiguration;
76
import io.quarkus.runtime.annotations.RecordableConstructor;
@@ -18,7 +17,6 @@ public class QuarkusControllerConfiguration<R extends CustomResource>
1817
private final boolean clusterScoped;
1918
private final Set<String> namespaces;
2019
private final String crClass;
21-
private final String doneableClassName;
2220
private final boolean watchAllNamespaces;
2321
private final RetryConfiguration retryConfiguration;
2422

@@ -32,7 +30,6 @@ public QuarkusControllerConfiguration(
3230
boolean clusterScoped,
3331
Set<String> namespaces,
3432
String crClass,
35-
String doneableClassName,
3633
RetryConfiguration retryConfiguration) {
3734
this.associatedControllerClassName = associatedControllerClassName;
3835
this.name = name;
@@ -42,7 +39,6 @@ public QuarkusControllerConfiguration(
4239
this.clusterScoped = clusterScoped;
4340
this.namespaces = namespaces;
4441
this.crClass = crClass;
45-
this.doneableClassName = doneableClassName;
4642
this.watchAllNamespaces = this.namespaces.contains(WATCH_ALL_NAMESPACES_MARKER);
4743
this.retryConfiguration =
4844
retryConfiguration == null
@@ -64,10 +60,6 @@ public String getCrClass() {
6460
return crClass;
6561
}
6662

67-
public String getDoneableClassName() {
68-
return doneableClassName;
69-
}
70-
7163
@Override
7264
public String getName() {
7365
return name;
@@ -93,11 +85,6 @@ public Class<R> getCustomResourceClass() {
9385
return (Class<R>) loadClass(crClass);
9486
}
9587

96-
@Override
97-
public Class<? extends CustomResourceDoneable<R>> getDoneableClass() {
98-
return (Class<? extends CustomResourceDoneable<R>>) loadClass(doneableClassName);
99-
}
100-
10188
private Class<?> loadClass(String className) {
10289
try {
10390
return Thread.currentThread().getContextClassLoader().loadClass(className);

operator-framework-quarkus-extension/tests/src/main/java/io/javaoperatorsdk/quarkus/it/TestController.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,9 @@
66
import io.javaoperatorsdk.operator.api.ResourceController;
77
import io.javaoperatorsdk.operator.api.UpdateControl;
88

9-
@Controller(crdName = TestController.CRD_NAME, name = TestController.NAME)
9+
@Controller(name = TestController.NAME)
1010
public class TestController implements ResourceController<TestResource> {
1111
public static final String NAME = "test";
12-
public static final String CRD_NAME = "test.example.com";
1312

1413
@Override
1514
public DeleteControl deleteResource(TestResource resource, Context<TestResource> context) {
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
package io.javaoperatorsdk.quarkus.it;
22

33
import io.fabric8.kubernetes.client.CustomResource;
4+
import io.fabric8.kubernetes.model.annotation.Group;
5+
import io.fabric8.kubernetes.model.annotation.Version;
46

7+
@Group("example.com")
8+
@Version("v1")
59
public class TestResource extends CustomResource {}

0 commit comments

Comments
 (0)