Skip to content

Commit cfd0ad7

Browse files
committed
Integration test
Signed-off-by: Attila Mészáros <a_meszaros@apple.com>
1 parent 562416a commit cfd0ad7

File tree

6 files changed

+161
-0
lines changed

6 files changed

+161
-0
lines changed

operator-framework/src/test/java/io/javaoperatorsdk/operator/baseapi/statuscache/internal/StatusPatchCacheIT.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ public class StatusPatchCacheIT {
1818
@RegisterExtension
1919
LocallyRunOperatorExtension extension =
2020
LocallyRunOperatorExtension.builder()
21+
.withConfigurationService(o -> o.withParseResourceVersions(true))
2122
.withReconciler(StatusPatchCacheReconciler.class)
2223
.build();
2324

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package io.javaoperatorsdk.operator.baseapi.statuscache.internalwithlock;
2+
3+
import io.fabric8.kubernetes.api.model.Namespaced;
4+
import io.fabric8.kubernetes.client.CustomResource;
5+
import io.fabric8.kubernetes.model.annotation.Group;
6+
import io.fabric8.kubernetes.model.annotation.ShortNames;
7+
import io.fabric8.kubernetes.model.annotation.Version;
8+
9+
@Group("sample.javaoperatorsdk")
10+
@Version("v1")
11+
@ShortNames("spwl")
12+
public class StatusPatchCacheWithLockCustomResource
13+
extends CustomResource<StatusPatchCacheWithLockSpec, StatusPatchCacheWithLockStatus>
14+
implements Namespaced {}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
package io.javaoperatorsdk.operator.baseapi.statuscache.internalwithlock;
2+
3+
import java.time.Duration;
4+
5+
import org.junit.jupiter.api.Test;
6+
import org.junit.jupiter.api.extension.RegisterExtension;
7+
8+
import io.fabric8.kubernetes.api.model.ObjectMetaBuilder;
9+
import io.javaoperatorsdk.operator.junit.LocallyRunOperatorExtension;
10+
11+
import static org.assertj.core.api.Assertions.assertThat;
12+
import static org.awaitility.Awaitility.await;
13+
14+
public class StatusPatchCacheWithLockIT {
15+
16+
public static final String TEST_1 = "test1";
17+
18+
@RegisterExtension
19+
LocallyRunOperatorExtension extension =
20+
LocallyRunOperatorExtension.builder()
21+
.withReconciler(StatusPatchCacheWithLockReconciler.class)
22+
.build();
23+
24+
@Test
25+
void testStatusAlwaysUpToDate() {
26+
var reconciler = extension.getReconcilerOfType(StatusPatchCacheWithLockReconciler.class);
27+
28+
extension.create(testResource());
29+
30+
// the reconciliation is periodically triggered, the status values should be increasing
31+
// monotonically
32+
await()
33+
.pollDelay(Duration.ofSeconds(1))
34+
.pollInterval(Duration.ofMillis(30))
35+
.untilAsserted(
36+
() -> {
37+
assertThat(reconciler.errorPresent).isFalse();
38+
assertThat(reconciler.latestValue).isGreaterThan(10);
39+
});
40+
}
41+
42+
StatusPatchCacheWithLockCustomResource testResource() {
43+
var res = new StatusPatchCacheWithLockCustomResource();
44+
res.setMetadata(new ObjectMetaBuilder().withName(TEST_1).build());
45+
res.setSpec(new StatusPatchCacheWithLockSpec());
46+
return res;
47+
}
48+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
package io.javaoperatorsdk.operator.baseapi.statuscache.internalwithlock;
2+
3+
import java.util.List;
4+
5+
import io.fabric8.kubernetes.api.model.ObjectMetaBuilder;
6+
import io.javaoperatorsdk.operator.api.reconciler.Context;
7+
import io.javaoperatorsdk.operator.api.reconciler.ControllerConfiguration;
8+
import io.javaoperatorsdk.operator.api.reconciler.EventSourceContext;
9+
import io.javaoperatorsdk.operator.api.reconciler.PrimaryUpdateAndCacheUtils;
10+
import io.javaoperatorsdk.operator.api.reconciler.Reconciler;
11+
import io.javaoperatorsdk.operator.api.reconciler.UpdateControl;
12+
import io.javaoperatorsdk.operator.baseapi.statuscache.PeriodicTriggerEventSource;
13+
import io.javaoperatorsdk.operator.processing.event.source.EventSource;
14+
15+
@ControllerConfiguration
16+
public class StatusPatchCacheWithLockReconciler
17+
implements Reconciler<StatusPatchCacheWithLockCustomResource> {
18+
19+
public volatile int latestValue = 0;
20+
public volatile boolean errorPresent = false;
21+
22+
@Override
23+
public UpdateControl<StatusPatchCacheWithLockCustomResource> reconcile(
24+
StatusPatchCacheWithLockCustomResource resource,
25+
Context<StatusPatchCacheWithLockCustomResource> context) {
26+
27+
if (resource.getStatus() != null && resource.getStatus().getValue() != latestValue) {
28+
errorPresent = true;
29+
throw new IllegalStateException(
30+
"status is not up to date. Latest value: "
31+
+ latestValue
32+
+ " status values: "
33+
+ resource.getStatus().getValue());
34+
}
35+
36+
var freshCopy = createFreshCopy(resource);
37+
38+
freshCopy
39+
.getStatus()
40+
.setValue(resource.getStatus() == null ? 1 : resource.getStatus().getValue() + 1);
41+
42+
var updated =
43+
PrimaryUpdateAndCacheUtils.ssaPatchStatusAndCacheResourceWithLock(
44+
resource, freshCopy, context);
45+
latestValue = updated.getStatus().getValue();
46+
47+
return UpdateControl.noUpdate();
48+
}
49+
50+
@Override
51+
public List<EventSource<?, StatusPatchCacheWithLockCustomResource>> prepareEventSources(
52+
EventSourceContext<StatusPatchCacheWithLockCustomResource> context) {
53+
// periodic event triggering for testing purposes
54+
return List.of(new PeriodicTriggerEventSource<>(context.getPrimaryCache()));
55+
}
56+
57+
private StatusPatchCacheWithLockCustomResource createFreshCopy(
58+
StatusPatchCacheWithLockCustomResource resource) {
59+
var res = new StatusPatchCacheWithLockCustomResource();
60+
res.setMetadata(
61+
new ObjectMetaBuilder()
62+
.withName(resource.getMetadata().getName())
63+
.withNamespace(resource.getMetadata().getNamespace())
64+
.build());
65+
res.setStatus(new StatusPatchCacheWithLockStatus());
66+
67+
return res;
68+
}
69+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package io.javaoperatorsdk.operator.baseapi.statuscache.internalwithlock;
2+
3+
public class StatusPatchCacheWithLockSpec {
4+
5+
private int counter = 0;
6+
7+
public int getCounter() {
8+
return counter;
9+
}
10+
11+
public void setCounter(int counter) {
12+
this.counter = counter;
13+
}
14+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package io.javaoperatorsdk.operator.baseapi.statuscache.internalwithlock;
2+
3+
public class StatusPatchCacheWithLockStatus {
4+
5+
private Integer value = 0;
6+
7+
public Integer getValue() {
8+
return value;
9+
}
10+
11+
public StatusPatchCacheWithLockStatus setValue(Integer value) {
12+
this.value = value;
13+
return this;
14+
}
15+
}

0 commit comments

Comments
 (0)