From 112c06338005c951ef64ba1ec683d2d932d1a647 Mon Sep 17 00:00:00 2001 From: Chris Laprun Date: Mon, 22 Feb 2021 14:17:48 +0100 Subject: [PATCH 1/3] fix: do not run extension on abstract controllers Fixes #346 --- .../extension/deployment/QuarkusExtensionProcessor.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/operator-framework-quarkus-extension/deployment/src/main/java/io/javaoperatorsdk/quarkus/extension/deployment/QuarkusExtensionProcessor.java b/operator-framework-quarkus-extension/deployment/src/main/java/io/javaoperatorsdk/quarkus/extension/deployment/QuarkusExtensionProcessor.java index 878a8e31b3..310ce410bd 100644 --- a/operator-framework-quarkus-extension/deployment/src/main/java/io/javaoperatorsdk/quarkus/extension/deployment/QuarkusExtensionProcessor.java +++ b/operator-framework-quarkus-extension/deployment/src/main/java/io/javaoperatorsdk/quarkus/extension/deployment/QuarkusExtensionProcessor.java @@ -26,6 +26,7 @@ import io.quarkus.deployment.builditem.IndexDependencyBuildItem; import io.quarkus.deployment.builditem.nativeimage.ReflectiveClassBuildItem; import io.quarkus.deployment.util.JandexUtil; +import java.lang.reflect.Modifier; import java.util.List; import java.util.Optional; import java.util.function.Function; @@ -75,6 +76,7 @@ void createConfigurationServiceAndOperator( final List controllerConfigs = resourceControllers.stream() + .filter(ci -> !Modifier.isAbstract(ci.flags())) .map(ci -> createControllerConfiguration(ci, additionalBeans, reflectionClasses, index)) .collect(Collectors.toList()); @@ -124,7 +126,7 @@ private ControllerConfiguration createControllerConfiguration( try { cr = crClass.getConstructor().newInstance(); } catch (Exception e) { - throw new IllegalArgumentException(e.getCause()); + throw new IllegalArgumentException("Cannot instantiate '" + crType + "' CR class", e); } // retrieve CRD name from CR type From 5db936b8dbc4499b51b810ea6586fc79ab8f06a5 Mon Sep 17 00:00:00 2001 From: Chris Laprun Date: Mon, 22 Feb 2021 14:18:55 +0100 Subject: [PATCH 2/3] feat: make tests work with QuarkusTest. Check controller hierarchies. --- .../tests/pom.xml | 17 ++++++++++ .../quarkus/it/AbstractController.java | 34 +++++++++++++++++++ .../quarkus/it/ChildTestResource.java | 8 +++++ .../quarkus/it/ConfiguredController.java | 17 +--------- .../quarkus/it/TestController.java | 17 +--------- .../quarkus/it/TestResource.java | 2 +- .../it/QuarkusExtensionProcessorTest.java | 26 ++++---------- 7 files changed, 68 insertions(+), 53 deletions(-) create mode 100644 operator-framework-quarkus-extension/tests/src/main/java/io/javaoperatorsdk/quarkus/it/AbstractController.java create mode 100644 operator-framework-quarkus-extension/tests/src/main/java/io/javaoperatorsdk/quarkus/it/ChildTestResource.java diff --git a/operator-framework-quarkus-extension/tests/pom.xml b/operator-framework-quarkus-extension/tests/pom.xml index a423b69f0e..915dd92d4b 100644 --- a/operator-framework-quarkus-extension/tests/pom.xml +++ b/operator-framework-quarkus-extension/tests/pom.xml @@ -33,6 +33,11 @@ quarkus-junit5-internal test + + io.quarkus + quarkus-test-kubernetes-client + test + io.quarkus quarkus-junit5 @@ -74,6 +79,18 @@ + + io.quarkus + quarkus-maven-plugin + ${quarkus.version} + + + + build + + + + diff --git a/operator-framework-quarkus-extension/tests/src/main/java/io/javaoperatorsdk/quarkus/it/AbstractController.java b/operator-framework-quarkus-extension/tests/src/main/java/io/javaoperatorsdk/quarkus/it/AbstractController.java new file mode 100644 index 0000000000..123934dd31 --- /dev/null +++ b/operator-framework-quarkus-extension/tests/src/main/java/io/javaoperatorsdk/quarkus/it/AbstractController.java @@ -0,0 +1,34 @@ +package io.javaoperatorsdk.quarkus.it; + +import io.javaoperatorsdk.operator.api.Context; +import io.javaoperatorsdk.operator.api.DeleteControl; +import io.javaoperatorsdk.operator.api.ResourceController; +import io.javaoperatorsdk.operator.api.UpdateControl; + +public abstract class AbstractController implements ResourceController { + + @Override + public DeleteControl deleteResource(T resource, Context context) { + return null; + } + + @Override + public UpdateControl createOrUpdateResource(T resource, Context context) { + return null; + } + + /* + + public abstract class AbstractPipelineRunController implements ResourceController {} + @Controller public class ClusterPipelineRunController extends AbstractPipelineRunController {} + @Controller public class PipelineRunController extends AbstractPipelineRunController {} + + And for model classes: + + public abstract class AbstractPipelineRun extends CustomResource {} + public class PipelineRunResource extends AbstractPipelineRun implements Namespaced {} + public class ClusterPipelineRunResource extends AbstractPipelineRun {} + + */ + +} diff --git a/operator-framework-quarkus-extension/tests/src/main/java/io/javaoperatorsdk/quarkus/it/ChildTestResource.java b/operator-framework-quarkus-extension/tests/src/main/java/io/javaoperatorsdk/quarkus/it/ChildTestResource.java new file mode 100644 index 0000000000..9b704aaa26 --- /dev/null +++ b/operator-framework-quarkus-extension/tests/src/main/java/io/javaoperatorsdk/quarkus/it/ChildTestResource.java @@ -0,0 +1,8 @@ +package io.javaoperatorsdk.quarkus.it; + +import io.fabric8.kubernetes.model.annotation.Group; +import io.fabric8.kubernetes.model.annotation.Version; + +@Group("example.com") +@Version("v1") +public class ChildTestResource extends TestResource {} diff --git a/operator-framework-quarkus-extension/tests/src/main/java/io/javaoperatorsdk/quarkus/it/ConfiguredController.java b/operator-framework-quarkus-extension/tests/src/main/java/io/javaoperatorsdk/quarkus/it/ConfiguredController.java index 7e9097bb8f..1ec45f315e 100644 --- a/operator-framework-quarkus-extension/tests/src/main/java/io/javaoperatorsdk/quarkus/it/ConfiguredController.java +++ b/operator-framework-quarkus-extension/tests/src/main/java/io/javaoperatorsdk/quarkus/it/ConfiguredController.java @@ -1,24 +1,9 @@ package io.javaoperatorsdk.quarkus.it; -import io.javaoperatorsdk.operator.api.Context; import io.javaoperatorsdk.operator.api.Controller; -import io.javaoperatorsdk.operator.api.DeleteControl; -import io.javaoperatorsdk.operator.api.ResourceController; -import io.javaoperatorsdk.operator.api.UpdateControl; @Controller(name = ConfiguredController.NAME, namespaces = "foo") -public class ConfiguredController implements ResourceController { +public class ConfiguredController extends AbstractController { public static final String NAME = "annotation"; - - @Override - public DeleteControl deleteResource(TestResource resource, Context context) { - return null; - } - - @Override - public UpdateControl createOrUpdateResource( - TestResource resource, Context context) { - return null; - } } diff --git a/operator-framework-quarkus-extension/tests/src/main/java/io/javaoperatorsdk/quarkus/it/TestController.java b/operator-framework-quarkus-extension/tests/src/main/java/io/javaoperatorsdk/quarkus/it/TestController.java index a837bcfd61..3794619084 100644 --- a/operator-framework-quarkus-extension/tests/src/main/java/io/javaoperatorsdk/quarkus/it/TestController.java +++ b/operator-framework-quarkus-extension/tests/src/main/java/io/javaoperatorsdk/quarkus/it/TestController.java @@ -1,23 +1,8 @@ package io.javaoperatorsdk.quarkus.it; -import io.javaoperatorsdk.operator.api.Context; import io.javaoperatorsdk.operator.api.Controller; -import io.javaoperatorsdk.operator.api.DeleteControl; -import io.javaoperatorsdk.operator.api.ResourceController; -import io.javaoperatorsdk.operator.api.UpdateControl; @Controller(name = TestController.NAME) -public class TestController implements ResourceController { +public class TestController extends AbstractController { public static final String NAME = "test"; - - @Override - public DeleteControl deleteResource(TestResource resource, Context context) { - return null; - } - - @Override - public UpdateControl createOrUpdateResource( - TestResource resource, Context context) { - return null; - } } diff --git a/operator-framework-quarkus-extension/tests/src/main/java/io/javaoperatorsdk/quarkus/it/TestResource.java b/operator-framework-quarkus-extension/tests/src/main/java/io/javaoperatorsdk/quarkus/it/TestResource.java index 0b70aed902..e04a0ca4f5 100644 --- a/operator-framework-quarkus-extension/tests/src/main/java/io/javaoperatorsdk/quarkus/it/TestResource.java +++ b/operator-framework-quarkus-extension/tests/src/main/java/io/javaoperatorsdk/quarkus/it/TestResource.java @@ -6,4 +6,4 @@ @Group("example.com") @Version("v1") -public class TestResource extends CustomResource {} +public abstract class TestResource extends CustomResource {} diff --git a/operator-framework-quarkus-extension/tests/src/test/java/io/javaoperatorsdk/quarkus/it/QuarkusExtensionProcessorTest.java b/operator-framework-quarkus-extension/tests/src/test/java/io/javaoperatorsdk/quarkus/it/QuarkusExtensionProcessorTest.java index e01b3d754b..b8aea4a628 100644 --- a/operator-framework-quarkus-extension/tests/src/test/java/io/javaoperatorsdk/quarkus/it/QuarkusExtensionProcessorTest.java +++ b/operator-framework-quarkus-extension/tests/src/test/java/io/javaoperatorsdk/quarkus/it/QuarkusExtensionProcessorTest.java @@ -5,33 +5,19 @@ import static org.hamcrest.Matchers.hasItem; import static org.hamcrest.Matchers.is; -import io.quarkus.test.QuarkusProdModeTest; -import org.jboss.shrinkwrap.api.ShrinkWrap; -import org.jboss.shrinkwrap.api.spec.JavaArchive; +import io.quarkus.test.common.QuarkusTestResource; +import io.quarkus.test.junit.QuarkusTest; +import io.quarkus.test.kubernetes.client.KubernetesMockServerTestResource; import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.RegisterExtension; /** * This tests creates and starts an application accessed over REST to assess that injected values * are present and what we expect. */ +@QuarkusTest +@QuarkusTestResource(KubernetesMockServerTestResource.class) public class QuarkusExtensionProcessorTest { - @RegisterExtension - static final QuarkusProdModeTest config = - new QuarkusProdModeTest() - .setArchiveProducer( - () -> - ShrinkWrap.create(JavaArchive.class) - .addClasses( - TestOperatorApp.class, - TestController.class, - ConfiguredController.class, - TestResource.class)) - .setApplicationName("basic-app") - .setApplicationVersion("0.1-SNAPSHOT") - .setRun(true); - @Test void controllerShouldExist() { // first check that we're not always returning true for any controller name :) @@ -46,7 +32,7 @@ void controllerShouldExist() { void configurationForControllerShouldExist() { // check that the config for the test controller can be retrieved and is conform to our // expectations - final var resourceName = TestResource.class.getCanonicalName(); + final var resourceName = ChildTestResource.class.getCanonicalName(); given() .when() .get("/operator/" + TestController.NAME + "/config") From 4ee525a5ecae5c1dd38833b59165a6d2b7ca0c5a Mon Sep 17 00:00:00 2001 From: Chris Laprun Date: Mon, 22 Feb 2021 15:50:58 +0100 Subject: [PATCH 3/3] chore: clean up --- .../quarkus/it/AbstractController.java | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/operator-framework-quarkus-extension/tests/src/main/java/io/javaoperatorsdk/quarkus/it/AbstractController.java b/operator-framework-quarkus-extension/tests/src/main/java/io/javaoperatorsdk/quarkus/it/AbstractController.java index 123934dd31..56e2cd0443 100644 --- a/operator-framework-quarkus-extension/tests/src/main/java/io/javaoperatorsdk/quarkus/it/AbstractController.java +++ b/operator-framework-quarkus-extension/tests/src/main/java/io/javaoperatorsdk/quarkus/it/AbstractController.java @@ -16,19 +16,4 @@ public DeleteControl deleteResource(T resource, Context context) { public UpdateControl createOrUpdateResource(T resource, Context context) { return null; } - - /* - - public abstract class AbstractPipelineRunController implements ResourceController {} - @Controller public class ClusterPipelineRunController extends AbstractPipelineRunController {} - @Controller public class PipelineRunController extends AbstractPipelineRunController {} - - And for model classes: - - public abstract class AbstractPipelineRun extends CustomResource {} - public class PipelineRunResource extends AbstractPipelineRun implements Namespaced {} - public class ClusterPipelineRunResource extends AbstractPipelineRun {} - - */ - }