diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/expectation/PeriodicCleanerExpectationManager.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/expectation/PeriodicCleanerExpectationManager.java index 9350f436e8..cabf697e20 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/expectation/PeriodicCleanerExpectationManager.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/expectation/PeriodicCleanerExpectationManager.java @@ -56,7 +56,7 @@ public PeriodicCleanerExpectationManager(IndexedResourceCache
primaryCache) { public PeriodicCleanerExpectationManager(Duration period, IndexedResourceCache
primaryCache) {
this.primaryCache = primaryCache;
scheduler.scheduleWithFixedDelay(
- this::clean, period.toMillis(), period.toMillis(), TimeUnit.MICROSECONDS);
+ this::clean, period.toMillis(), period.toMillis(), TimeUnit.MILLISECONDS);
}
protected void clean() {
diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/baseapi/expectation/ExpectationCustomResource.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/baseapi/expectation/onallevent/ExpectationCustomResource.java
similarity index 94%
rename from operator-framework/src/test/java/io/javaoperatorsdk/operator/baseapi/expectation/ExpectationCustomResource.java
rename to operator-framework/src/test/java/io/javaoperatorsdk/operator/baseapi/expectation/onallevent/ExpectationCustomResource.java
index 4568550b9e..277e2a8e70 100644
--- a/operator-framework/src/test/java/io/javaoperatorsdk/operator/baseapi/expectation/ExpectationCustomResource.java
+++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/baseapi/expectation/onallevent/ExpectationCustomResource.java
@@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package io.javaoperatorsdk.operator.baseapi.expectation;
+package io.javaoperatorsdk.operator.baseapi.expectation.onallevent;
import io.fabric8.kubernetes.api.model.Namespaced;
import io.fabric8.kubernetes.client.CustomResource;
diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/baseapi/expectation/ExpectationCustomResourceStatus.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/baseapi/expectation/onallevent/ExpectationCustomResourceStatus.java
similarity index 92%
rename from operator-framework/src/test/java/io/javaoperatorsdk/operator/baseapi/expectation/ExpectationCustomResourceStatus.java
rename to operator-framework/src/test/java/io/javaoperatorsdk/operator/baseapi/expectation/onallevent/ExpectationCustomResourceStatus.java
index f6ae538d4f..66a2e22d01 100644
--- a/operator-framework/src/test/java/io/javaoperatorsdk/operator/baseapi/expectation/ExpectationCustomResourceStatus.java
+++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/baseapi/expectation/onallevent/ExpectationCustomResourceStatus.java
@@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package io.javaoperatorsdk.operator.baseapi.expectation;
+package io.javaoperatorsdk.operator.baseapi.expectation.onallevent;
public class ExpectationCustomResourceStatus {
diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/baseapi/expectation/ExpectationIT.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/baseapi/expectation/onallevent/ExpectationIT.java
similarity index 92%
rename from operator-framework/src/test/java/io/javaoperatorsdk/operator/baseapi/expectation/ExpectationIT.java
rename to operator-framework/src/test/java/io/javaoperatorsdk/operator/baseapi/expectation/onallevent/ExpectationIT.java
index 4bfe89734d..00f3e1d441 100644
--- a/operator-framework/src/test/java/io/javaoperatorsdk/operator/baseapi/expectation/ExpectationIT.java
+++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/baseapi/expectation/onallevent/ExpectationIT.java
@@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package io.javaoperatorsdk.operator.baseapi.expectation;
+package io.javaoperatorsdk.operator.baseapi.expectation.onallevent;
import java.time.Duration;
@@ -23,7 +23,7 @@
import io.fabric8.kubernetes.api.model.ObjectMetaBuilder;
import io.javaoperatorsdk.operator.junit.LocallyRunOperatorExtension;
-import static io.javaoperatorsdk.operator.baseapi.expectation.ExpectationReconciler.DEPLOYMENT_READY;
+import static io.javaoperatorsdk.operator.baseapi.expectation.onallevent.ExpectationReconciler.DEPLOYMENT_READY;
import static org.assertj.core.api.Assertions.assertThat;
import static org.awaitility.Awaitility.await;
diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/baseapi/expectation/ExpectationReconciler.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/baseapi/expectation/onallevent/ExpectationReconciler.java
similarity index 99%
rename from operator-framework/src/test/java/io/javaoperatorsdk/operator/baseapi/expectation/ExpectationReconciler.java
rename to operator-framework/src/test/java/io/javaoperatorsdk/operator/baseapi/expectation/onallevent/ExpectationReconciler.java
index 48512ef140..5c0b4dcebe 100644
--- a/operator-framework/src/test/java/io/javaoperatorsdk/operator/baseapi/expectation/ExpectationReconciler.java
+++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/baseapi/expectation/onallevent/ExpectationReconciler.java
@@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package io.javaoperatorsdk.operator.baseapi.expectation;
+package io.javaoperatorsdk.operator.baseapi.expectation.onallevent;
import java.time.Duration;
import java.util.List;
diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/baseapi/expectation/periodicclean/PeriodicCleanerExpectationCustomResource.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/baseapi/expectation/periodicclean/PeriodicCleanerExpectationCustomResource.java
new file mode 100644
index 0000000000..228b2b1a45
--- /dev/null
+++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/baseapi/expectation/periodicclean/PeriodicCleanerExpectationCustomResource.java
@@ -0,0 +1,29 @@
+/*
+ * Copyright Java Operator SDK Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package io.javaoperatorsdk.operator.baseapi.expectation.periodicclean;
+
+import io.fabric8.kubernetes.api.model.Namespaced;
+import io.fabric8.kubernetes.client.CustomResource;
+import io.fabric8.kubernetes.model.annotation.Group;
+import io.fabric8.kubernetes.model.annotation.ShortNames;
+import io.fabric8.kubernetes.model.annotation.Version;
+
+@Group("sample.javaoperatorsdk")
+@Version("v1")
+@ShortNames("pcecr")
+public class PeriodicCleanerExpectationCustomResource
+ extends CustomResource This test demonstrates the key benefits of PeriodicCleanerExpectationManager: 1. Works without
+ * requiring @ControllerConfiguration(triggerReconcilerOnAllEvents = true) 2. Automatically cleans
+ * up stale expectations periodically 3. Maintains the same expectation API and functionality as the
+ * regular ExpectationManager
+ */
+class PeriodicCleanerExpectationIT {
+
+ public static final String TEST_1 = "test1";
+ public static final String TEST_2 = "test2";
+
+ @RegisterExtension
+ LocallyRunOperatorExtension extension =
+ LocallyRunOperatorExtension.builder()
+ .withReconciler(new PeriodicCleanerExpectationReconciler())
+ .build();
+
+ @Test
+ void testPeriodicCleanerExpectationBasicFlow() {
+ extension
+ .getReconcilerOfType(PeriodicCleanerExpectationReconciler.class)
+ .setTimeout(Duration.ofSeconds(30));
+ var res = testResource();
+ extension.create(res);
+
+ await()
+ .untilAsserted(
+ () -> {
+ var actual = extension.get(PeriodicCleanerExpectationCustomResource.class, TEST_1);
+ assertThat(actual.getStatus()).isNotNull();
+ assertThat(actual.getStatus().getMessage()).isEqualTo(DEPLOYMENT_READY);
+ });
+ }
+
+ @Test
+ void demonstratesNoTriggerReconcilerOnAllEventsNeededForCleanup() {
+ // This test demonstrates that PeriodicCleanerExpectationManager works
+ // without @ControllerConfiguration(triggerReconcilerOnAllEvents = true)
+
+ // The PeriodicCleanerExpectationReconciler doesn't use triggerReconcilerOnAllEvents = true
+ // yet expectations still work properly due to the periodic cleanup functionality
+
+ var reconciler = extension.getReconcilerOfType(PeriodicCleanerExpectationReconciler.class);
+ reconciler.setTimeout(Duration.ofSeconds(30));
+
+ var res = testResource("no-trigger-test");
+ var created = extension.create(res);
+
+ await()
+ .untilAsserted(
+ () -> {
+ assertThat(reconciler.getExpectationManager().getExpectation(created)).isPresent();
+ });
+
+ extension.delete(res);
+
+ await()
+ .untilAsserted(
+ () -> {
+ assertThat(reconciler.getExpectationManager().getExpectation(created)).isEmpty();
+ });
+ }
+
+ private PeriodicCleanerExpectationCustomResource testResource() {
+ return testResource(TEST_1);
+ }
+
+ private PeriodicCleanerExpectationCustomResource testResource(String name) {
+ var res = new PeriodicCleanerExpectationCustomResource();
+ res.setMetadata(new ObjectMetaBuilder().withName(name).build());
+ return res;
+ }
+}
diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/baseapi/expectation/periodicclean/PeriodicCleanerExpectationReconciler.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/baseapi/expectation/periodicclean/PeriodicCleanerExpectationReconciler.java
new file mode 100644
index 0000000000..7fc6f5bf82
--- /dev/null
+++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/baseapi/expectation/periodicclean/PeriodicCleanerExpectationReconciler.java
@@ -0,0 +1,194 @@
+/*
+ * Copyright Java Operator SDK Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package io.javaoperatorsdk.operator.baseapi.expectation.periodicclean;
+
+import java.time.Duration;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.atomic.AtomicReference;
+
+import io.fabric8.kubernetes.api.model.ContainerBuilder;
+import io.fabric8.kubernetes.api.model.ContainerPortBuilder;
+import io.fabric8.kubernetes.api.model.LabelSelectorBuilder;
+import io.fabric8.kubernetes.api.model.ObjectMetaBuilder;
+import io.fabric8.kubernetes.api.model.PodSpecBuilder;
+import io.fabric8.kubernetes.api.model.PodTemplateSpecBuilder;
+import io.fabric8.kubernetes.api.model.apps.Deployment;
+import io.fabric8.kubernetes.api.model.apps.DeploymentBuilder;
+import io.fabric8.kubernetes.api.model.apps.DeploymentSpecBuilder;
+import io.javaoperatorsdk.operator.api.config.informer.InformerEventSourceConfiguration;
+import io.javaoperatorsdk.operator.api.reconciler.Context;
+import io.javaoperatorsdk.operator.api.reconciler.ControllerConfiguration;
+import io.javaoperatorsdk.operator.api.reconciler.EventSourceContext;
+import io.javaoperatorsdk.operator.api.reconciler.Reconciler;
+import io.javaoperatorsdk.operator.api.reconciler.UpdateControl;
+import io.javaoperatorsdk.operator.processing.event.source.EventSource;
+import io.javaoperatorsdk.operator.processing.event.source.informer.InformerEventSource;
+import io.javaoperatorsdk.operator.processing.expectation.Expectation;
+import io.javaoperatorsdk.operator.processing.expectation.PeriodicCleanerExpectationManager;
+
+/**
+ * Integration test reconciler showcasing PeriodicCleanerExpectationManager usage.
+ *
+ * Key differences from ExpectationReconciler: - Uses PeriodicCleanerExpectationManager instead
+ * of ExpectationManager - Does NOT use @ControllerConfiguration(triggerReconcilerOnAllEvents =
+ * true) - Demonstrates periodic cleanup functionality without requiring reconciler triggers on all
+ * events
+ */
+@ControllerConfiguration
+public class PeriodicCleanerExpectationReconciler
+ implements Reconciler