From 0260dfba0f8ae707798b3362d3e49823820633b9 Mon Sep 17 00:00:00 2001 From: csviri Date: Tue, 15 Dec 2020 16:37:09 +0100 Subject: [PATCH 1/8] update resource and status impl, unit test --- .../javaoperatorsdk/operator/api/UpdateControl.java | 9 +++++++++ .../operator/processing/EventDispatcher.java | 6 +++++- .../operator/EventDispatcherTest.java | 13 +++++++++++++ 3 files changed, 27 insertions(+), 1 deletion(-) diff --git a/operator-framework/src/main/java/io/javaoperatorsdk/operator/api/UpdateControl.java b/operator-framework/src/main/java/io/javaoperatorsdk/operator/api/UpdateControl.java index fa02e845a2..fecaa7a2ad 100644 --- a/operator-framework/src/main/java/io/javaoperatorsdk/operator/api/UpdateControl.java +++ b/operator-framework/src/main/java/io/javaoperatorsdk/operator/api/UpdateControl.java @@ -27,6 +27,11 @@ public static UpdateControl updateStatusSubResourc return new UpdateControl<>(customResource, true, false); } + public static + UpdateControl updateCustomResourceAndStatusSubResource(T customResource) { + return new UpdateControl<>(customResource, true, true); + } + public static UpdateControl noUpdate() { return new UpdateControl<>(null, false, false); } @@ -42,4 +47,8 @@ public boolean isUpdateStatusSubResource() { public boolean isUpdateCustomResource() { return updateCustomResource; } + + public boolean isUpdateCustomResourceAndStatusSubResource() { + return updateCustomResource && updateStatusSubResource; + } } diff --git a/operator-framework/src/main/java/io/javaoperatorsdk/operator/processing/EventDispatcher.java b/operator-framework/src/main/java/io/javaoperatorsdk/operator/processing/EventDispatcher.java index b3fc86228b..71c22edf99 100644 --- a/operator-framework/src/main/java/io/javaoperatorsdk/operator/processing/EventDispatcher.java +++ b/operator-framework/src/main/java/io/javaoperatorsdk/operator/processing/EventDispatcher.java @@ -103,12 +103,16 @@ private PostExecutionControl handleCreateOrUpdate( UpdateControl updateControl = controller.createOrUpdateResource(resource, context); CustomResource updatedCustomResource = null; - if (updateControl.isUpdateStatusSubResource()) { + if (updateControl.isUpdateCustomResourceAndStatusSubResource()) { + updatedCustomResource = updateCustomResource(updateControl.getCustomResource()); + updatedCustomResource = customResourceFacade.updateStatus(updatedCustomResource); + } else if (updateControl.isUpdateStatusSubResource()) { updatedCustomResource = customResourceFacade.updateStatus(updateControl.getCustomResource()); } else if (updateControl.isUpdateCustomResource()) { updatedCustomResource = updateCustomResource(updateControl.getCustomResource()); } + if (updatedCustomResource != null) { return PostExecutionControl.customResourceUpdated(updatedCustomResource); } else { diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/EventDispatcherTest.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/EventDispatcherTest.java index 4e37bc573d..6e809acec7 100644 --- a/operator-framework/src/test/java/io/javaoperatorsdk/operator/EventDispatcherTest.java +++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/EventDispatcherTest.java @@ -72,6 +72,19 @@ void updatesOnlyStatusSubResource() { verify(customResourceFacade, never()).replaceWithLock(any()); } + @Test + void updatesBothResourceAndStatus() { + when(controller.createOrUpdateResource(eq(testCustomResource), any())) + .thenReturn(UpdateControl.updateCustomResourceAndStatusSubResource(testCustomResource)); + when(customResourceFacade.replaceWithLock(testCustomResource)).thenReturn(testCustomResource); + + eventDispatcher.handleExecution( + executionScopeWithCREvent(Watcher.Action.MODIFIED, testCustomResource)); + + verify(customResourceFacade, times(1)).replaceWithLock(testCustomResource); + verify(customResourceFacade, times(1)).updateStatus(testCustomResource); + } + @Test void callCreateOrUpdateOnModifiedResource() { eventDispatcher.handleExecution( From 3b5eec28156e8f83c97c38b0632467e68f35a290 Mon Sep 17 00:00:00 2001 From: csviri Date: Wed, 16 Dec 2020 17:27:28 +0100 Subject: [PATCH 2/8] integration test (wip) --- .../operator/api/UpdateControl.java | 4 + .../operator/IntegrationTestSupport.java | 4 + .../javaoperatorsdk/operator/TestUtils.java | 8 ++ .../operator/UpdatingResAndSubResIT.java | 90 +++++++++++++++++++ .../DoubleUpdateTestCustomResource.java | 38 ++++++++ ...bleUpdateTestCustomResourceController.java | 54 +++++++++++ .../DoubleUpdateTestCustomResourceSpec.java | 15 ++++ .../DoubleUpdateTestCustomResourceStatus.java | 20 +++++ .../operator/doubleupdate-test-crd.yaml | 16 ++++ 9 files changed, 249 insertions(+) create mode 100644 operator-framework/src/test/java/io/javaoperatorsdk/operator/UpdatingResAndSubResIT.java create mode 100644 operator-framework/src/test/java/io/javaoperatorsdk/operator/doubleupdate/subresource/DoubleUpdateTestCustomResource.java create mode 100644 operator-framework/src/test/java/io/javaoperatorsdk/operator/doubleupdate/subresource/DoubleUpdateTestCustomResourceController.java create mode 100644 operator-framework/src/test/java/io/javaoperatorsdk/operator/doubleupdate/subresource/DoubleUpdateTestCustomResourceSpec.java create mode 100644 operator-framework/src/test/java/io/javaoperatorsdk/operator/doubleupdate/subresource/DoubleUpdateTestCustomResourceStatus.java create mode 100644 operator-framework/src/test/resources/io/javaoperatorsdk/operator/doubleupdate-test-crd.yaml diff --git a/operator-framework/src/main/java/io/javaoperatorsdk/operator/api/UpdateControl.java b/operator-framework/src/main/java/io/javaoperatorsdk/operator/api/UpdateControl.java index fecaa7a2ad..bb6dd5b8d3 100644 --- a/operator-framework/src/main/java/io/javaoperatorsdk/operator/api/UpdateControl.java +++ b/operator-framework/src/main/java/io/javaoperatorsdk/operator/api/UpdateControl.java @@ -27,6 +27,10 @@ public static UpdateControl updateStatusSubResourc return new UpdateControl<>(customResource, true, false); } + /** + * As a results of this there will be two call to K8S API. First the custom resource will be + * updates then the status sub-resource. + */ public static UpdateControl updateCustomResourceAndStatusSubResource(T customResource) { return new UpdateControl<>(customResource, true, true); diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/IntegrationTestSupport.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/IntegrationTestSupport.java index 78512f6fb0..7005bd100c 100644 --- a/operator-framework/src/test/java/io/javaoperatorsdk/operator/IntegrationTestSupport.java +++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/IntegrationTestSupport.java @@ -183,6 +183,10 @@ public KubernetesClient getK8sClient() { return crOperations; } + public CustomResource getCustomResource(String name) { + return getCrOperations().inNamespace(TEST_NAMESPACE).withName(name).get(); + } + public Operator getOperator() { return operator; } diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/TestUtils.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/TestUtils.java index 8189b9c574..910f6907e4 100644 --- a/operator-framework/src/test/java/io/javaoperatorsdk/operator/TestUtils.java +++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/TestUtils.java @@ -31,4 +31,12 @@ public static TestCustomResource testCustomResource(String uid) { resource.getSpec().setValue("test-value"); return resource; } + + public static void waitXms(int x) { + try { + Thread.sleep(x); + } catch (InterruptedException e) { + throw new IllegalStateException(e); + } + } } diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/UpdatingResAndSubResIT.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/UpdatingResAndSubResIT.java new file mode 100644 index 0000000000..a534fbfd09 --- /dev/null +++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/UpdatingResAndSubResIT.java @@ -0,0 +1,90 @@ +package io.javaoperatorsdk.operator; + +import io.fabric8.kubernetes.api.model.ObjectMetaBuilder; +import io.fabric8.kubernetes.client.DefaultKubernetesClient; +import io.fabric8.kubernetes.client.KubernetesClient; +import io.javaoperatorsdk.operator.doubleupdate.subresource.DoubleUpdateTestCustomResource; +import io.javaoperatorsdk.operator.doubleupdate.subresource.DoubleUpdateTestCustomResourceController; +import io.javaoperatorsdk.operator.doubleupdate.subresource.DoubleUpdateTestCustomResourceSpec; +import io.javaoperatorsdk.operator.doubleupdate.subresource.DoubleUpdateTestCustomResourceStatus; +import io.javaoperatorsdk.operator.sample.subresource.SubResourceTestCustomResourceStatus; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestInstance; + +import java.util.concurrent.TimeUnit; + +import static io.javaoperatorsdk.operator.IntegrationTestSupport.TEST_NAMESPACE; +import static io.javaoperatorsdk.operator.TestUtils.waitXms; +import static io.javaoperatorsdk.operator.doubleupdate.subresource.DoubleUpdateTestCustomResourceController.TEST_ANNOTATION; +import static org.assertj.core.api.Assertions.assertThat; +import static org.awaitility.Awaitility.await; + +@TestInstance(TestInstance.Lifecycle.PER_CLASS) +public class UpdatingResAndSubResIT { + + private IntegrationTestSupport integrationTestSupport = new IntegrationTestSupport(); + + @BeforeEach + public void initAndCleanup() { + KubernetesClient k8sClient = new DefaultKubernetesClient(); + integrationTestSupport.initialize( + k8sClient, new DoubleUpdateTestCustomResourceController(), "doubleupdate-test-crd.yaml"); + integrationTestSupport.cleanup(); + } + + @Test + public void updatesSubResourceStatus() { + integrationTestSupport.teardownIfSuccess( + () -> { + DoubleUpdateTestCustomResource resource = createTestCustomResource("1"); + integrationTestSupport.getCrOperations().inNamespace(TEST_NAMESPACE).create(resource); + + awaitStatusUpdated(resource.getMetadata().getName()); + // wait for sure, there are no more events + waitXms(200); + + DoubleUpdateTestCustomResource customResource = + (DoubleUpdateTestCustomResource) + integrationTestSupport.getCustomResource(resource.getMetadata().getName()); + assertThat(integrationTestSupport.numberOfControllerExecutions()).isEqualTo(1); + assertThat(customResource.getStatus()) + .isEqualTo(DoubleUpdateTestCustomResourceStatus.State.SUCCESS); + assertThat(customResource.getMetadata().getAnnotations().get(TEST_ANNOTATION)) + .isNotNull(); + }); + } + + void awaitStatusUpdated(String name) { + await("cr status updated") + .atMost(5, TimeUnit.SECONDS) + .untilAsserted( + () -> { + DoubleUpdateTestCustomResource cr = + (DoubleUpdateTestCustomResource) + integrationTestSupport + .getCrOperations() + .inNamespace(TEST_NAMESPACE) + .withName(name) + .get(); + assertThat(cr.getMetadata().getFinalizers()).hasSize(1); + assertThat(cr).isNotNull(); + assertThat(cr.getStatus()).isNotNull(); + assertThat(cr.getStatus().getState()) + .isEqualTo(SubResourceTestCustomResourceStatus.State.SUCCESS); + }); + } + + public DoubleUpdateTestCustomResource createTestCustomResource(String id) { + DoubleUpdateTestCustomResource resource = new DoubleUpdateTestCustomResource(); + resource.setMetadata( + new ObjectMetaBuilder() + .withName("doubleupdateresource-" + id) + .withNamespace(TEST_NAMESPACE) + .build()); + resource.setKind("DoubleUpdateSample"); + resource.setSpec(new DoubleUpdateTestCustomResourceSpec()); + resource.getSpec().setValue(id); + return resource; + } +} diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/doubleupdate/subresource/DoubleUpdateTestCustomResource.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/doubleupdate/subresource/DoubleUpdateTestCustomResource.java new file mode 100644 index 0000000000..57cbce2a19 --- /dev/null +++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/doubleupdate/subresource/DoubleUpdateTestCustomResource.java @@ -0,0 +1,38 @@ +package io.javaoperatorsdk.operator.doubleupdate.subresource; + +import io.fabric8.kubernetes.client.CustomResource; + +public class DoubleUpdateTestCustomResource extends CustomResource { + + private DoubleUpdateTestCustomResourceSpec spec; + + private DoubleUpdateTestCustomResourceStatus status; + + public DoubleUpdateTestCustomResourceSpec getSpec() { + return spec; + } + + public void setSpec(DoubleUpdateTestCustomResourceSpec spec) { + this.spec = spec; + } + + public DoubleUpdateTestCustomResourceStatus getStatus() { + return status; + } + + public void setStatus(DoubleUpdateTestCustomResourceStatus status) { + this.status = status; + } + + @Override + public String toString() { + return "TestCustomResource{" + + "spec=" + + spec + + ", status=" + + status + + ", extendedFrom=" + + super.toString() + + '}'; + } +} diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/doubleupdate/subresource/DoubleUpdateTestCustomResourceController.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/doubleupdate/subresource/DoubleUpdateTestCustomResourceController.java new file mode 100644 index 0000000000..c59401d43a --- /dev/null +++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/doubleupdate/subresource/DoubleUpdateTestCustomResourceController.java @@ -0,0 +1,54 @@ +package io.javaoperatorsdk.operator.doubleupdate.subresource; + +import io.javaoperatorsdk.operator.TestExecutionInfoProvider; +import io.javaoperatorsdk.operator.api.*; + +import java.util.HashMap; +import java.util.concurrent.atomic.AtomicInteger; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +@Controller(crdName = DoubleUpdateTestCustomResourceController.CRD_NAME) +public class DoubleUpdateTestCustomResourceController + implements ResourceController, TestExecutionInfoProvider { + + public static final String CRD_NAME = "doubleupdatesamples.sample.javaoperatorsdk"; + private static final Logger log = + LoggerFactory.getLogger(DoubleUpdateTestCustomResourceController.class); + public static final String TEST_ANNOTATION = "TestAnnotation"; + public static final String TEST_ANNOTATION_VALUE = "TestAnnotationValue"; + private final AtomicInteger numberOfExecutions = new AtomicInteger(0); + + @Override + public DeleteControl deleteResource( + DoubleUpdateTestCustomResource resource, Context context) { + return DeleteControl.DEFAULT_DELETE; + } + + @Override + public UpdateControl createOrUpdateResource( + DoubleUpdateTestCustomResource resource, Context context) { + numberOfExecutions.addAndGet(1); + + log.info("Value: " + resource.getSpec().getValue()); + + resource.getMetadata().setAnnotations(new HashMap<>()); + resource.getMetadata().getAnnotations().put(TEST_ANNOTATION, TEST_ANNOTATION_VALUE); + ensureStatusExists(resource); + resource.getStatus().setState(DoubleUpdateTestCustomResourceStatus.State.SUCCESS); + + return UpdateControl.updateCustomResourceAndStatusSubResource(resource); + } + + private void ensureStatusExists(DoubleUpdateTestCustomResource resource) { + DoubleUpdateTestCustomResourceStatus status = resource.getStatus(); + if (status == null) { + status = new DoubleUpdateTestCustomResourceStatus(); + resource.setStatus(status); + } + } + + public int getNumberOfExecutions() { + return numberOfExecutions.get(); + } +} diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/doubleupdate/subresource/DoubleUpdateTestCustomResourceSpec.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/doubleupdate/subresource/DoubleUpdateTestCustomResourceSpec.java new file mode 100644 index 0000000000..e2c894c18c --- /dev/null +++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/doubleupdate/subresource/DoubleUpdateTestCustomResourceSpec.java @@ -0,0 +1,15 @@ +package io.javaoperatorsdk.operator.doubleupdate.subresource; + +public class DoubleUpdateTestCustomResourceSpec { + + private String value; + + public String getValue() { + return value; + } + + public DoubleUpdateTestCustomResourceSpec setValue(String value) { + this.value = value; + return this; + } +} diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/doubleupdate/subresource/DoubleUpdateTestCustomResourceStatus.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/doubleupdate/subresource/DoubleUpdateTestCustomResourceStatus.java new file mode 100644 index 0000000000..46ae3d8a4b --- /dev/null +++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/doubleupdate/subresource/DoubleUpdateTestCustomResourceStatus.java @@ -0,0 +1,20 @@ +package io.javaoperatorsdk.operator.doubleupdate.subresource; + +public class DoubleUpdateTestCustomResourceStatus { + + private State state; + + public State getState() { + return state; + } + + public DoubleUpdateTestCustomResourceStatus setState(State state) { + this.state = state; + return this; + } + + public enum State { + SUCCESS, + ERROR + } +} diff --git a/operator-framework/src/test/resources/io/javaoperatorsdk/operator/doubleupdate-test-crd.yaml b/operator-framework/src/test/resources/io/javaoperatorsdk/operator/doubleupdate-test-crd.yaml new file mode 100644 index 0000000000..cc8c57b11e --- /dev/null +++ b/operator-framework/src/test/resources/io/javaoperatorsdk/operator/doubleupdate-test-crd.yaml @@ -0,0 +1,16 @@ +apiVersion: apiextensions.k8s.io/v1beta1 +kind: CustomResourceDefinition +metadata: + name: doubleupdatesamples.sample.javaoperatorsdk +spec: + group: sample.javaoperatorsdk + version: v1 + subresources: + status: {} + scope: Namespaced + names: + plural: doubleupdatesamples + singular: doubleupdatesample + kind: DoubleUpdateSample + shortNames: + - ss From fe94ed8d983ea533787085a68045b70a6aa29e2b Mon Sep 17 00:00:00 2001 From: csviri Date: Wed, 16 Dec 2020 19:00:20 +0100 Subject: [PATCH 3/8] rename from CR --- .../java/io/javaoperatorsdk/operator/api/UpdateControl.java | 2 +- .../java/io/javaoperatorsdk/operator/EventDispatcherTest.java | 2 +- .../subresource/DoubleUpdateTestCustomResourceController.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/operator-framework/src/main/java/io/javaoperatorsdk/operator/api/UpdateControl.java b/operator-framework/src/main/java/io/javaoperatorsdk/operator/api/UpdateControl.java index bb6dd5b8d3..57cc677fdd 100644 --- a/operator-framework/src/main/java/io/javaoperatorsdk/operator/api/UpdateControl.java +++ b/operator-framework/src/main/java/io/javaoperatorsdk/operator/api/UpdateControl.java @@ -32,7 +32,7 @@ public static UpdateControl updateStatusSubResourc * updates then the status sub-resource. */ public static - UpdateControl updateCustomResourceAndStatusSubResource(T customResource) { + UpdateControl updateCustomResourceAndStatus(T customResource) { return new UpdateControl<>(customResource, true, true); } diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/EventDispatcherTest.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/EventDispatcherTest.java index 6e809acec7..f33887c154 100644 --- a/operator-framework/src/test/java/io/javaoperatorsdk/operator/EventDispatcherTest.java +++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/EventDispatcherTest.java @@ -75,7 +75,7 @@ void updatesOnlyStatusSubResource() { @Test void updatesBothResourceAndStatus() { when(controller.createOrUpdateResource(eq(testCustomResource), any())) - .thenReturn(UpdateControl.updateCustomResourceAndStatusSubResource(testCustomResource)); + .thenReturn(UpdateControl.updateCustomResourceAndStatus(testCustomResource)); when(customResourceFacade.replaceWithLock(testCustomResource)).thenReturn(testCustomResource); eventDispatcher.handleExecution( diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/doubleupdate/subresource/DoubleUpdateTestCustomResourceController.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/doubleupdate/subresource/DoubleUpdateTestCustomResourceController.java index c59401d43a..20c4e755e6 100644 --- a/operator-framework/src/test/java/io/javaoperatorsdk/operator/doubleupdate/subresource/DoubleUpdateTestCustomResourceController.java +++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/doubleupdate/subresource/DoubleUpdateTestCustomResourceController.java @@ -37,7 +37,7 @@ public UpdateControl createOrUpdateResource( ensureStatusExists(resource); resource.getStatus().setState(DoubleUpdateTestCustomResourceStatus.State.SUCCESS); - return UpdateControl.updateCustomResourceAndStatusSubResource(resource); + return UpdateControl.updateCustomResourceAndStatus(resource); } private void ensureStatusExists(DoubleUpdateTestCustomResource resource) { From 0045a5431a140577c9b42d0b15b027fb290c851c Mon Sep 17 00:00:00 2001 From: csviri Date: Thu, 17 Dec 2020 16:05:36 +0100 Subject: [PATCH 4/8] remove obsolete retry config property --- .../operator/UpdatingResAndSubResIT.java | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/UpdatingResAndSubResIT.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/UpdatingResAndSubResIT.java index a534fbfd09..2c2963943b 100644 --- a/operator-framework/src/test/java/io/javaoperatorsdk/operator/UpdatingResAndSubResIT.java +++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/UpdatingResAndSubResIT.java @@ -1,5 +1,11 @@ package io.javaoperatorsdk.operator; +import static io.javaoperatorsdk.operator.IntegrationTestSupport.TEST_NAMESPACE; +import static io.javaoperatorsdk.operator.TestUtils.waitXms; +import static io.javaoperatorsdk.operator.doubleupdate.subresource.DoubleUpdateTestCustomResourceController.TEST_ANNOTATION; +import static org.assertj.core.api.Assertions.assertThat; +import static org.awaitility.Awaitility.await; + import io.fabric8.kubernetes.api.model.ObjectMetaBuilder; import io.fabric8.kubernetes.client.DefaultKubernetesClient; import io.fabric8.kubernetes.client.KubernetesClient; @@ -8,18 +14,11 @@ import io.javaoperatorsdk.operator.doubleupdate.subresource.DoubleUpdateTestCustomResourceSpec; import io.javaoperatorsdk.operator.doubleupdate.subresource.DoubleUpdateTestCustomResourceStatus; import io.javaoperatorsdk.operator.sample.subresource.SubResourceTestCustomResourceStatus; +import java.util.concurrent.TimeUnit; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.TestInstance; -import java.util.concurrent.TimeUnit; - -import static io.javaoperatorsdk.operator.IntegrationTestSupport.TEST_NAMESPACE; -import static io.javaoperatorsdk.operator.TestUtils.waitXms; -import static io.javaoperatorsdk.operator.doubleupdate.subresource.DoubleUpdateTestCustomResourceController.TEST_ANNOTATION; -import static org.assertj.core.api.Assertions.assertThat; -import static org.awaitility.Awaitility.await; - @TestInstance(TestInstance.Lifecycle.PER_CLASS) public class UpdatingResAndSubResIT { From 502f2d1b182aa1cdc9bd5dc656df449b69ffd2fe Mon Sep 17 00:00:00 2001 From: csviri Date: Thu, 17 Dec 2020 16:30:17 +0100 Subject: [PATCH 5/8] fixes on impl --- .../io/javaoperatorsdk/operator/api/UpdateControl.java | 4 ++-- .../operator/processing/EventDispatcher.java | 7 ++++++- .../javaoperatorsdk/operator/UpdatingResAndSubResIT.java | 7 +++---- .../DoubleUpdateTestCustomResourceController.java | 1 - 4 files changed, 11 insertions(+), 8 deletions(-) diff --git a/operator-framework/src/main/java/io/javaoperatorsdk/operator/api/UpdateControl.java b/operator-framework/src/main/java/io/javaoperatorsdk/operator/api/UpdateControl.java index 57cc677fdd..09bde6856a 100644 --- a/operator-framework/src/main/java/io/javaoperatorsdk/operator/api/UpdateControl.java +++ b/operator-framework/src/main/java/io/javaoperatorsdk/operator/api/UpdateControl.java @@ -31,8 +31,8 @@ public static UpdateControl updateStatusSubResourc * As a results of this there will be two call to K8S API. First the custom resource will be * updates then the status sub-resource. */ - public static - UpdateControl updateCustomResourceAndStatus(T customResource) { + public static UpdateControl updateCustomResourceAndStatus( + T customResource) { return new UpdateControl<>(customResource, true, true); } diff --git a/operator-framework/src/main/java/io/javaoperatorsdk/operator/processing/EventDispatcher.java b/operator-framework/src/main/java/io/javaoperatorsdk/operator/processing/EventDispatcher.java index 71c22edf99..1193005769 100644 --- a/operator-framework/src/main/java/io/javaoperatorsdk/operator/processing/EventDispatcher.java +++ b/operator-framework/src/main/java/io/javaoperatorsdk/operator/processing/EventDispatcher.java @@ -105,7 +105,12 @@ private PostExecutionControl handleCreateOrUpdate( CustomResource updatedCustomResource = null; if (updateControl.isUpdateCustomResourceAndStatusSubResource()) { updatedCustomResource = updateCustomResource(updateControl.getCustomResource()); - updatedCustomResource = customResourceFacade.updateStatus(updatedCustomResource); + updateControl + .getCustomResource() + .getMetadata() + .setResourceVersion(updatedCustomResource.getMetadata().getResourceVersion()); + updatedCustomResource = + customResourceFacade.updateStatus(updateControl.getCustomResource()); } else if (updateControl.isUpdateStatusSubResource()) { updatedCustomResource = customResourceFacade.updateStatus(updateControl.getCustomResource()); diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/UpdatingResAndSubResIT.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/UpdatingResAndSubResIT.java index 2c2963943b..00ee80354e 100644 --- a/operator-framework/src/test/java/io/javaoperatorsdk/operator/UpdatingResAndSubResIT.java +++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/UpdatingResAndSubResIT.java @@ -13,7 +13,6 @@ import io.javaoperatorsdk.operator.doubleupdate.subresource.DoubleUpdateTestCustomResourceController; import io.javaoperatorsdk.operator.doubleupdate.subresource.DoubleUpdateTestCustomResourceSpec; import io.javaoperatorsdk.operator.doubleupdate.subresource.DoubleUpdateTestCustomResourceStatus; -import io.javaoperatorsdk.operator.sample.subresource.SubResourceTestCustomResourceStatus; import java.util.concurrent.TimeUnit; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -41,13 +40,13 @@ public void updatesSubResourceStatus() { awaitStatusUpdated(resource.getMetadata().getName()); // wait for sure, there are no more events - waitXms(200); + waitXms(300); DoubleUpdateTestCustomResource customResource = (DoubleUpdateTestCustomResource) integrationTestSupport.getCustomResource(resource.getMetadata().getName()); assertThat(integrationTestSupport.numberOfControllerExecutions()).isEqualTo(1); - assertThat(customResource.getStatus()) + assertThat(customResource.getStatus().getState()) .isEqualTo(DoubleUpdateTestCustomResourceStatus.State.SUCCESS); assertThat(customResource.getMetadata().getAnnotations().get(TEST_ANNOTATION)) .isNotNull(); @@ -70,7 +69,7 @@ void awaitStatusUpdated(String name) { assertThat(cr).isNotNull(); assertThat(cr.getStatus()).isNotNull(); assertThat(cr.getStatus().getState()) - .isEqualTo(SubResourceTestCustomResourceStatus.State.SUCCESS); + .isEqualTo(DoubleUpdateTestCustomResourceStatus.State.SUCCESS); }); } diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/doubleupdate/subresource/DoubleUpdateTestCustomResourceController.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/doubleupdate/subresource/DoubleUpdateTestCustomResourceController.java index 20c4e755e6..46ba6133ab 100644 --- a/operator-framework/src/test/java/io/javaoperatorsdk/operator/doubleupdate/subresource/DoubleUpdateTestCustomResourceController.java +++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/doubleupdate/subresource/DoubleUpdateTestCustomResourceController.java @@ -2,7 +2,6 @@ import io.javaoperatorsdk.operator.TestExecutionInfoProvider; import io.javaoperatorsdk.operator.api.*; - import java.util.HashMap; import java.util.concurrent.atomic.AtomicInteger; import org.slf4j.Logger; From 3ddcbc444167d30b45e8e962cc01245a9be37edd Mon Sep 17 00:00:00 2001 From: csviri Date: Thu, 17 Dec 2020 16:50:58 +0100 Subject: [PATCH 6/8] package fix --- .../operator/UpdatingResAndSubResIT.java | 10 +++++----- .../DoubleUpdateTestCustomResource.java | 2 +- .../DoubleUpdateTestCustomResourceController.java | 2 +- .../DoubleUpdateTestCustomResourceSpec.java | 2 +- .../DoubleUpdateTestCustomResourceStatus.java | 2 +- 5 files changed, 9 insertions(+), 9 deletions(-) rename operator-framework/src/test/java/io/javaoperatorsdk/operator/doubleupdate/{subresource => }/DoubleUpdateTestCustomResource.java (92%) rename operator-framework/src/test/java/io/javaoperatorsdk/operator/doubleupdate/{subresource => }/DoubleUpdateTestCustomResourceController.java (97%) rename operator-framework/src/test/java/io/javaoperatorsdk/operator/doubleupdate/{subresource => }/DoubleUpdateTestCustomResourceSpec.java (79%) rename operator-framework/src/test/java/io/javaoperatorsdk/operator/doubleupdate/{subresource => }/DoubleUpdateTestCustomResourceStatus.java (82%) diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/UpdatingResAndSubResIT.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/UpdatingResAndSubResIT.java index 00ee80354e..8c903fb8d3 100644 --- a/operator-framework/src/test/java/io/javaoperatorsdk/operator/UpdatingResAndSubResIT.java +++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/UpdatingResAndSubResIT.java @@ -2,17 +2,17 @@ import static io.javaoperatorsdk.operator.IntegrationTestSupport.TEST_NAMESPACE; import static io.javaoperatorsdk.operator.TestUtils.waitXms; -import static io.javaoperatorsdk.operator.doubleupdate.subresource.DoubleUpdateTestCustomResourceController.TEST_ANNOTATION; +import static io.javaoperatorsdk.operator.doubleupdate.DoubleUpdateTestCustomResourceController.TEST_ANNOTATION; import static org.assertj.core.api.Assertions.assertThat; import static org.awaitility.Awaitility.await; import io.fabric8.kubernetes.api.model.ObjectMetaBuilder; import io.fabric8.kubernetes.client.DefaultKubernetesClient; import io.fabric8.kubernetes.client.KubernetesClient; -import io.javaoperatorsdk.operator.doubleupdate.subresource.DoubleUpdateTestCustomResource; -import io.javaoperatorsdk.operator.doubleupdate.subresource.DoubleUpdateTestCustomResourceController; -import io.javaoperatorsdk.operator.doubleupdate.subresource.DoubleUpdateTestCustomResourceSpec; -import io.javaoperatorsdk.operator.doubleupdate.subresource.DoubleUpdateTestCustomResourceStatus; +import io.javaoperatorsdk.operator.doubleupdate.DoubleUpdateTestCustomResource; +import io.javaoperatorsdk.operator.doubleupdate.DoubleUpdateTestCustomResourceController; +import io.javaoperatorsdk.operator.doubleupdate.DoubleUpdateTestCustomResourceSpec; +import io.javaoperatorsdk.operator.doubleupdate.DoubleUpdateTestCustomResourceStatus; import java.util.concurrent.TimeUnit; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/doubleupdate/subresource/DoubleUpdateTestCustomResource.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/doubleupdate/DoubleUpdateTestCustomResource.java similarity index 92% rename from operator-framework/src/test/java/io/javaoperatorsdk/operator/doubleupdate/subresource/DoubleUpdateTestCustomResource.java rename to operator-framework/src/test/java/io/javaoperatorsdk/operator/doubleupdate/DoubleUpdateTestCustomResource.java index 57cbce2a19..6fe7482a60 100644 --- a/operator-framework/src/test/java/io/javaoperatorsdk/operator/doubleupdate/subresource/DoubleUpdateTestCustomResource.java +++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/doubleupdate/DoubleUpdateTestCustomResource.java @@ -1,4 +1,4 @@ -package io.javaoperatorsdk.operator.doubleupdate.subresource; +package io.javaoperatorsdk.operator.doubleupdate; import io.fabric8.kubernetes.client.CustomResource; diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/doubleupdate/subresource/DoubleUpdateTestCustomResourceController.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/doubleupdate/DoubleUpdateTestCustomResourceController.java similarity index 97% rename from operator-framework/src/test/java/io/javaoperatorsdk/operator/doubleupdate/subresource/DoubleUpdateTestCustomResourceController.java rename to operator-framework/src/test/java/io/javaoperatorsdk/operator/doubleupdate/DoubleUpdateTestCustomResourceController.java index 46ba6133ab..62f3a53e7f 100644 --- a/operator-framework/src/test/java/io/javaoperatorsdk/operator/doubleupdate/subresource/DoubleUpdateTestCustomResourceController.java +++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/doubleupdate/DoubleUpdateTestCustomResourceController.java @@ -1,4 +1,4 @@ -package io.javaoperatorsdk.operator.doubleupdate.subresource; +package io.javaoperatorsdk.operator.doubleupdate; import io.javaoperatorsdk.operator.TestExecutionInfoProvider; import io.javaoperatorsdk.operator.api.*; diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/doubleupdate/subresource/DoubleUpdateTestCustomResourceSpec.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/doubleupdate/DoubleUpdateTestCustomResourceSpec.java similarity index 79% rename from operator-framework/src/test/java/io/javaoperatorsdk/operator/doubleupdate/subresource/DoubleUpdateTestCustomResourceSpec.java rename to operator-framework/src/test/java/io/javaoperatorsdk/operator/doubleupdate/DoubleUpdateTestCustomResourceSpec.java index e2c894c18c..ea1428bf51 100644 --- a/operator-framework/src/test/java/io/javaoperatorsdk/operator/doubleupdate/subresource/DoubleUpdateTestCustomResourceSpec.java +++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/doubleupdate/DoubleUpdateTestCustomResourceSpec.java @@ -1,4 +1,4 @@ -package io.javaoperatorsdk.operator.doubleupdate.subresource; +package io.javaoperatorsdk.operator.doubleupdate; public class DoubleUpdateTestCustomResourceSpec { diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/doubleupdate/subresource/DoubleUpdateTestCustomResourceStatus.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/doubleupdate/DoubleUpdateTestCustomResourceStatus.java similarity index 82% rename from operator-framework/src/test/java/io/javaoperatorsdk/operator/doubleupdate/subresource/DoubleUpdateTestCustomResourceStatus.java rename to operator-framework/src/test/java/io/javaoperatorsdk/operator/doubleupdate/DoubleUpdateTestCustomResourceStatus.java index 46ae3d8a4b..78245b4058 100644 --- a/operator-framework/src/test/java/io/javaoperatorsdk/operator/doubleupdate/subresource/DoubleUpdateTestCustomResourceStatus.java +++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/doubleupdate/DoubleUpdateTestCustomResourceStatus.java @@ -1,4 +1,4 @@ -package io.javaoperatorsdk.operator.doubleupdate.subresource; +package io.javaoperatorsdk.operator.doubleupdate; public class DoubleUpdateTestCustomResourceStatus { From fe478babab4ed4b01ae13227c8a4d4d9b1899160 Mon Sep 17 00:00:00 2001 From: csviri Date: Thu, 17 Dec 2020 16:51:52 +0100 Subject: [PATCH 7/8] shortname fix crd --- .../io/javaoperatorsdk/operator/doubleupdate-test-crd.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/operator-framework/src/test/resources/io/javaoperatorsdk/operator/doubleupdate-test-crd.yaml b/operator-framework/src/test/resources/io/javaoperatorsdk/operator/doubleupdate-test-crd.yaml index cc8c57b11e..afaa0ecab7 100644 --- a/operator-framework/src/test/resources/io/javaoperatorsdk/operator/doubleupdate-test-crd.yaml +++ b/operator-framework/src/test/resources/io/javaoperatorsdk/operator/doubleupdate-test-crd.yaml @@ -13,4 +13,4 @@ spec: singular: doubleupdatesample kind: DoubleUpdateSample shortNames: - - ss + - du From 45088945de07260e5323cf3b3c92ca498f662e68 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Attila=20M=C3=A9sz=C3=A1ros?= Date: Thu, 17 Dec 2020 18:05:36 +0100 Subject: [PATCH 8/8] Update operator-framework/src/test/java/io/javaoperatorsdk/operator/doubleupdate/DoubleUpdateTestCustomResource.java Co-authored-by: Chris Laprun --- .../operator/doubleupdate/DoubleUpdateTestCustomResource.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/doubleupdate/DoubleUpdateTestCustomResource.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/doubleupdate/DoubleUpdateTestCustomResource.java index 6fe7482a60..b5e21452d5 100644 --- a/operator-framework/src/test/java/io/javaoperatorsdk/operator/doubleupdate/DoubleUpdateTestCustomResource.java +++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/doubleupdate/DoubleUpdateTestCustomResource.java @@ -26,7 +26,7 @@ public void setStatus(DoubleUpdateTestCustomResourceStatus status) { @Override public String toString() { - return "TestCustomResource{" + return "DoubleUpdateTestCustomResource{" + "spec=" + spec + ", status="