From a5e842830389722bbfb73c6b737258379ee7e613 Mon Sep 17 00:00:00 2001 From: Chris Laprun Date: Wed, 7 Sep 2022 18:03:15 +0200 Subject: [PATCH] chore: update to JOSDK 3.2 & fabric8 client 6.1, pending Quarkus update Requires quarkusio/quarkus#26107 --- .../common/ConfigurationUtils.java | 10 -------- .../deployment/AddClusterRolesDecorator.java | 12 +++++----- ...QuarkusControllerConfigurationBuilder.java | 24 +++++++++---------- .../operatorsdk/it/OperatorSDKResource.java | 5 +++- .../it/NativeOperatorSDKResourceIT.java | 4 ++-- .../it/OperatorSDKResourceTest.java | 4 ++-- pom.xml | 6 ++--- .../java/io/halkyon/IngressDependent.java | 10 ++++---- .../java/io/halkyon/ServiceDependent.java | 2 +- .../io/halkyon/ExposedAppReconcilerTest.java | 5 ++-- 10 files changed, 36 insertions(+), 46 deletions(-) diff --git a/common-deployment/src/main/java/io/quarkiverse/operatorsdk/common/ConfigurationUtils.java b/common-deployment/src/main/java/io/quarkiverse/operatorsdk/common/ConfigurationUtils.java index 65589708b..511565ee0 100644 --- a/common-deployment/src/main/java/io/quarkiverse/operatorsdk/common/ConfigurationUtils.java +++ b/common-deployment/src/main/java/io/quarkiverse/operatorsdk/common/ConfigurationUtils.java @@ -82,16 +82,6 @@ public static ClassInfo getClassInfoForInstantiation(AnnotationValue toInsta return expectedTypeInfo; } - public static T instantiateImplementationClass( - AnnotationInstance annotation, - String annotationFieldName, - Class interfaceClass, - Class defaultImplementation, - IndexView index) { - return instantiateImplementationClass(annotation, annotationFieldName, interfaceClass, defaultImplementation, false, - index); - } - @SuppressWarnings("unchecked") public static T instantiateImplementationClass( AnnotationInstance annotation, diff --git a/core/deployment/src/main/java/io/quarkiverse/operatorsdk/deployment/AddClusterRolesDecorator.java b/core/deployment/src/main/java/io/quarkiverse/operatorsdk/deployment/AddClusterRolesDecorator.java index 3e528de09..e9022b465 100644 --- a/core/deployment/src/main/java/io/quarkiverse/operatorsdk/deployment/AddClusterRolesDecorator.java +++ b/core/deployment/src/main/java/io/quarkiverse/operatorsdk/deployment/AddClusterRolesDecorator.java @@ -28,18 +28,18 @@ public void visit(KubernetesListBuilder list) { controllerToCustomResourceMappings.forEach((controller, cri) -> { final var rule = new PolicyRuleBuilder(); final var plural = cri.getPlural(); - rule.addNewResource(plural); + rule.addToResources(plural); // if the resource has a non-Void status, also add the status resource if (cri.isStatusPresentAndNotVoid()) { - rule.addNewResource(plural + "/status"); + rule.addToResources(plural + "/status"); } // add finalizers sub-resource because it's used in several contexts, even in the absence of finalizers // see: https://kubernetes.io/docs/reference/access-authn-authz/admission-controllers/#ownerreferencespermissionenforcement - rule.addNewResource(plural + "/finalizers"); + rule.addToResources(plural + "/finalizers"); - rule.addNewApiGroup(cri.getGroup()) + rule.addToApiGroups(cri.getGroup()) .addToVerbs(ALL_VERBS) .build(); @@ -59,8 +59,8 @@ public void visit(KubernetesListBuilder list) { if (!contains(list, HasMetadata.getApiVersion(ClusterRole.class), HasMetadata.getKind(ClusterRole.class), crName)) { list.addToItems(new ClusterRoleBuilder().withNewMetadata().withName(crName).endMetadata() .addToRules(new PolicyRuleBuilder() - .addNewApiGroup("apiextensions.k8s.io") - .addNewResource("customresourcedefinitions") + .addToApiGroups("apiextensions.k8s.io") + .addToResources("customresourcedefinitions") .addToVerbs("get", "list") .build())); } diff --git a/core/deployment/src/main/java/io/quarkiverse/operatorsdk/deployment/QuarkusControllerConfigurationBuilder.java b/core/deployment/src/main/java/io/quarkiverse/operatorsdk/deployment/QuarkusControllerConfigurationBuilder.java index 07920b17c..9dc6b4fdc 100644 --- a/core/deployment/src/main/java/io/quarkiverse/operatorsdk/deployment/QuarkusControllerConfigurationBuilder.java +++ b/core/deployment/src/main/java/io/quarkiverse/operatorsdk/deployment/QuarkusControllerConfigurationBuilder.java @@ -37,10 +37,6 @@ import io.javaoperatorsdk.operator.processing.event.source.filter.OnAddFilter; import io.javaoperatorsdk.operator.processing.event.source.filter.OnDeleteFilter; import io.javaoperatorsdk.operator.processing.event.source.filter.OnUpdateFilter; -import io.javaoperatorsdk.operator.processing.event.source.filter.VoidGenericFilter; -import io.javaoperatorsdk.operator.processing.event.source.filter.VoidOnAddFilter; -import io.javaoperatorsdk.operator.processing.event.source.filter.VoidOnDeleteFilter; -import io.javaoperatorsdk.operator.processing.event.source.filter.VoidOnUpdateFilter; import io.javaoperatorsdk.operator.processing.retry.GenericRetry; import io.javaoperatorsdk.operator.processing.retry.Retry; import io.quarkiverse.operatorsdk.common.AnnotationConfigurableAugmentedClassInfo; @@ -217,21 +213,23 @@ QuarkusControllerConfiguration build(ReconcilerAugmentedClassInfo reconcilerInfo } onAddFilter = ConfigurationUtils.instantiateImplementationClass( - controllerAnnotation, "onAddFilter", OnAddFilter.class, VoidOnAddFilter.class, index); + controllerAnnotation, "onAddFilter", OnAddFilter.class, OnAddFilter.class, true, index); onUpdateFilter = ConfigurationUtils.instantiateImplementationClass( - controllerAnnotation, "onUpdateFilter", OnUpdateFilter.class, VoidOnUpdateFilter.class, - index); + controllerAnnotation, "onUpdateFilter", OnUpdateFilter.class, OnUpdateFilter.class, + true, index); genericFilter = ConfigurationUtils.instantiateImplementationClass( - controllerAnnotation, "genericFilter", GenericFilter.class, VoidGenericFilter.class, - index); + controllerAnnotation, "genericFilter", GenericFilter.class, GenericFilter.class, + true, index); retry = ConfigurationUtils.instantiateImplementationClass( controllerAnnotation, "retry", Retry.class, GenericRetry.class, false, index); + assert retry != null; final var retryConfigurableInfo = configurableInfos.get(retry.getClass().getName()); retryConfigurationClass = getConfigurationClass(reconcilerInfo, retryConfigurableInfo); rateLimiter = ConfigurationUtils.instantiateImplementationClass( controllerAnnotation, "rateLimiter", RateLimiter.class, DefaultRateLimiter.class, false, index); + assert rateLimiter != null; final var rateLimiterConfigurableInfo = configurableInfos.get(rateLimiter.getClass().getName()); rateLimiterConfigurationClass = getConfigurationClass(reconcilerInfo, rateLimiterConfigurableInfo); } @@ -341,18 +339,18 @@ private Map createDependentResources( } final var onAddFilter = ConfigurationUtils.instantiateImplementationClass( kubeDepConfig, "onAddFilter", OnAddFilter.class, - VoidOnAddFilter.class, index); + OnAddFilter.class, true, index); final var onUpdateFilter = ConfigurationUtils.instantiateImplementationClass( kubeDepConfig, "onUpdateFilter", OnUpdateFilter.class, - VoidOnUpdateFilter.class, + OnUpdateFilter.class, true, index); final var onDeleteFilter = ConfigurationUtils.instantiateImplementationClass( kubeDepConfig, "onDeleteFilter", OnDeleteFilter.class, - VoidOnDeleteFilter.class, + OnDeleteFilter.class, true, index); final var genericFilter = ConfigurationUtils.instantiateImplementationClass( kubeDepConfig, "genericFilter", GenericFilter.class, - VoidGenericFilter.class, + GenericFilter.class, true, index); cfg = new QuarkusKubernetesDependentResourceConfig(dependentNamespaces, labelSelector, configuredNS, diff --git a/integration-tests/src/main/java/io/quarkiverse/operatorsdk/it/OperatorSDKResource.java b/integration-tests/src/main/java/io/quarkiverse/operatorsdk/it/OperatorSDKResource.java index 5e830e743..13ce6ca1e 100644 --- a/integration-tests/src/main/java/io/quarkiverse/operatorsdk/it/OperatorSDKResource.java +++ b/integration-tests/src/main/java/io/quarkiverse/operatorsdk/it/OperatorSDKResource.java @@ -3,6 +3,7 @@ import java.time.Duration; import java.util.ArrayList; import java.util.List; +import java.util.Optional; import java.util.Set; import java.util.stream.Collectors; @@ -208,7 +209,9 @@ static class JSONKubernetesResourceConfig { } public String getOnAddFilter() { - return config.onAddFilter().getClass().getCanonicalName(); + return Optional.ofNullable(config.onAddFilter()) + .map(f -> f.getClass().getCanonicalName()) + .orElse(null); } public String getLabelSelector() { diff --git a/integration-tests/src/test/java/io/quarkiverse/operatorsdk/it/NativeOperatorSDKResourceIT.java b/integration-tests/src/test/java/io/quarkiverse/operatorsdk/it/NativeOperatorSDKResourceIT.java index 5f1e27248..8c75156e2 100644 --- a/integration-tests/src/test/java/io/quarkiverse/operatorsdk/it/NativeOperatorSDKResourceIT.java +++ b/integration-tests/src/test/java/io/quarkiverse/operatorsdk/it/NativeOperatorSDKResourceIT.java @@ -1,8 +1,8 @@ package io.quarkiverse.operatorsdk.it; -import io.quarkus.test.junit.NativeImageTest; +import io.quarkus.test.junit.QuarkusIntegrationTest; -@NativeImageTest +@QuarkusIntegrationTest public class NativeOperatorSDKResourceIT extends OperatorSDKResourceTest { } diff --git a/integration-tests/src/test/java/io/quarkiverse/operatorsdk/it/OperatorSDKResourceTest.java b/integration-tests/src/test/java/io/quarkiverse/operatorsdk/it/OperatorSDKResourceTest.java index f6a9c1a66..1959a45e9 100644 --- a/integration-tests/src/test/java/io/quarkiverse/operatorsdk/it/OperatorSDKResourceTest.java +++ b/integration-tests/src/test/java/io/quarkiverse/operatorsdk/it/OperatorSDKResourceTest.java @@ -16,7 +16,7 @@ import io.javaoperatorsdk.operator.api.reconciler.Constants; import io.quarkus.test.common.QuarkusTestResource; -import io.quarkus.test.junit.DisabledOnNativeImage; +import io.quarkus.test.junit.DisabledOnIntegrationTest; import io.quarkus.test.junit.QuarkusTest; @QuarkusTest @@ -35,7 +35,7 @@ void shouldNotValidateCRs() { } @Test - @DisabledOnNativeImage("Skipped because native tests are run using LaunchMode.NORMAL") + @DisabledOnIntegrationTest("Skipped because native tests are run using LaunchMode.NORMAL") void shouldApplyCRDsByDefaultInTestMode() { given().when().get("/operator/config").then().statusCode(200).body( "applyCRDs", equalTo(true)); diff --git a/pom.xml b/pom.xml index 3f982318d..795abe77c 100644 --- a/pom.xml +++ b/pom.xml @@ -12,9 +12,9 @@ pom Quarkus - Operator SDK - Parent - 2.12.0.Final - 3.1.1 - 5.12.3 + 999-SNAPSHOT + 3.2.0 + 6.1.1 diff --git a/samples/exposedapp/src/main/java/io/halkyon/IngressDependent.java b/samples/exposedapp/src/main/java/io/halkyon/IngressDependent.java index 2bb780e52..52b09e4df 100644 --- a/samples/exposedapp/src/main/java/io/halkyon/IngressDependent.java +++ b/samples/exposedapp/src/main/java/io/halkyon/IngressDependent.java @@ -9,7 +9,6 @@ import io.fabric8.kubernetes.api.model.networking.v1.Ingress; import io.fabric8.kubernetes.api.model.networking.v1.IngressBuilder; import io.javaoperatorsdk.operator.api.reconciler.Context; -import io.javaoperatorsdk.operator.api.reconciler.dependent.DependentResource; import io.javaoperatorsdk.operator.processing.dependent.kubernetes.CRUDKubernetesDependentResource; import io.javaoperatorsdk.operator.processing.dependent.workflow.Condition; @@ -52,7 +51,7 @@ public Ingress desired(ExposedApp exposedApp, Context context) { } /** - * Assumes Ingress is ready as determined by {@link #isMet(DependentResource, ExposedApp, Context)} + * Assumes Ingress is ready as determined by {@link #isMet(ExposedApp, Ingress, Context)} * * @param ingress the ingress * @return the URL exposed by the specified Ingress @@ -66,10 +65,9 @@ static String getExposedURL(Ingress ingress) { } @Override - public boolean isMet(DependentResource dependentResource, - ExposedApp exposedApp, Context context) { - return context.getSecondaryResource(Ingress.class).map(ingress -> { - final var status = ingress.getStatus(); + public boolean isMet(ExposedApp exposedApp, Ingress ingress, Context context) { + return context.getSecondaryResource(Ingress.class).map(in -> { + final var status = in.getStatus(); if (status != null) { final var ingresses = status.getLoadBalancer().getIngress(); // only set the status if the ingress is ready to provide the info we need diff --git a/samples/exposedapp/src/main/java/io/halkyon/ServiceDependent.java b/samples/exposedapp/src/main/java/io/halkyon/ServiceDependent.java index 8d0d5d2c8..4445d6f28 100644 --- a/samples/exposedapp/src/main/java/io/halkyon/ServiceDependent.java +++ b/samples/exposedapp/src/main/java/io/halkyon/ServiceDependent.java @@ -28,7 +28,7 @@ public Service desired(ExposedApp exposedApp, Context context) { .addNewPort() .withName("http") .withPort(8080) - .withNewTargetPort().withIntVal(8080).endTargetPort() + .withNewTargetPort().withValue(8080).endTargetPort() .endPort() .withSelector(labels) .withType("ClusterIP") diff --git a/samples/exposedapp/src/test/java/io/halkyon/ExposedAppReconcilerTest.java b/samples/exposedapp/src/test/java/io/halkyon/ExposedAppReconcilerTest.java index 10c94eed0..11d2663f6 100644 --- a/samples/exposedapp/src/test/java/io/halkyon/ExposedAppReconcilerTest.java +++ b/samples/exposedapp/src/test/java/io/halkyon/ExposedAppReconcilerTest.java @@ -33,14 +33,15 @@ void reconcileShouldWork() { final var app = new ExposedApp(); final var client = mockServer.getClient(); + final String namespace = client.getNamespace(); final var metadata = new ObjectMetaBuilder() .withName("test-app") - .withNamespace(client.getNamespace()) + .withNamespace(namespace) .build(); app.setMetadata(metadata); app.getSpec().setImageRef("group/imageName:tag"); - client.resources(ExposedApp.class).create(app); + client.resource(app).inNamespace(namespace).create(); await().ignoreException(NullPointerException.class).atMost(10, TimeUnit.SECONDS).untilAsserted(() -> { // check that we create the deployment