Skip to content

Commit c1775a9

Browse files
committed
Integration test
Signed-off-by: Attila Mészáros <[email protected]>
1 parent 08e1b34 commit c1775a9

File tree

5 files changed

+157
-0
lines changed

5 files changed

+157
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package io.javaoperatorsdk.operator.baseapi.statuscache.updatecontrol;
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("ucpc")
12+
public class UpdateControlPrimaryCacheCustomResource
13+
extends CustomResource<UpdateControlPrimaryCacheSpec, UpdateControlPrimaryCacheStatus>
14+
implements Namespaced {}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
package io.javaoperatorsdk.operator.baseapi.statuscache.updatecontrol;
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 UpdateControlPrimaryCacheIT {
15+
16+
public static final String TEST_1 = "test1";
17+
18+
@RegisterExtension
19+
LocallyRunOperatorExtension extension =
20+
LocallyRunOperatorExtension.builder()
21+
.withReconciler(UpdateControlPrimaryReconciler.class)
22+
.withConfigurationService(
23+
o ->
24+
o.withParseResourceVersions(true)
25+
.withGuaranteeUpdatedPrimaryIsAvailableForNextReconciliation(true))
26+
.build();
27+
28+
@Test
29+
void testStatusAlwaysUpToDate() {
30+
var reconciler = extension.getReconcilerOfType(UpdateControlPrimaryReconciler.class);
31+
32+
extension.create(testResource());
33+
34+
// the reconciliation is periodically triggered, the status values should be increasing
35+
// monotonically
36+
await()
37+
.pollDelay(Duration.ofSeconds(1))
38+
.pollInterval(Duration.ofMillis(30))
39+
.untilAsserted(
40+
() -> {
41+
assertThat(reconciler.errorPresent).isFalse();
42+
assertThat(reconciler.latestValue).isGreaterThan(10);
43+
});
44+
}
45+
46+
UpdateControlPrimaryCacheCustomResource testResource() {
47+
var res = new UpdateControlPrimaryCacheCustomResource();
48+
res.setMetadata(new ObjectMetaBuilder().withName(TEST_1).build());
49+
res.setSpec(new UpdateControlPrimaryCacheSpec());
50+
return res;
51+
}
52+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package io.javaoperatorsdk.operator.baseapi.statuscache.updatecontrol;
2+
3+
public class UpdateControlPrimaryCacheSpec {
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.updatecontrol;
2+
3+
public class UpdateControlPrimaryCacheStatus {
4+
5+
private Integer value = 0;
6+
7+
public Integer getValue() {
8+
return value;
9+
}
10+
11+
public UpdateControlPrimaryCacheStatus setValue(Integer value) {
12+
this.value = value;
13+
return this;
14+
}
15+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
package io.javaoperatorsdk.operator.baseapi.statuscache.updatecontrol;
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.Reconciler;
10+
import io.javaoperatorsdk.operator.api.reconciler.UpdateControl;
11+
import io.javaoperatorsdk.operator.baseapi.statuscache.PeriodicTriggerEventSource;
12+
import io.javaoperatorsdk.operator.processing.event.source.EventSource;
13+
14+
@ControllerConfiguration
15+
public class UpdateControlPrimaryReconciler
16+
implements Reconciler<UpdateControlPrimaryCacheCustomResource> {
17+
18+
public volatile int latestValue = 0;
19+
public volatile boolean errorPresent = false;
20+
21+
@Override
22+
public UpdateControl<UpdateControlPrimaryCacheCustomResource> reconcile(
23+
UpdateControlPrimaryCacheCustomResource resource,
24+
Context<UpdateControlPrimaryCacheCustomResource> context) {
25+
26+
if (resource.getStatus() != null && resource.getStatus().getValue() != latestValue) {
27+
errorPresent = true;
28+
throw new IllegalStateException(
29+
"status is not up to date. Latest value: "
30+
+ latestValue
31+
+ " status values: "
32+
+ resource.getStatus().getValue());
33+
}
34+
35+
var freshCopy = createFreshCopy(resource);
36+
37+
latestValue = resource.getStatus() == null ? 1 : resource.getStatus().getValue() + 1;
38+
freshCopy.getStatus().setValue(latestValue);
39+
40+
return UpdateControl.patchStatus(freshCopy);
41+
}
42+
43+
@Override
44+
public List<EventSource<?, UpdateControlPrimaryCacheCustomResource>> prepareEventSources(
45+
EventSourceContext<UpdateControlPrimaryCacheCustomResource> context) {
46+
// periodic event triggering for testing purposes
47+
return List.of(new PeriodicTriggerEventSource<>(context.getPrimaryCache()));
48+
}
49+
50+
private UpdateControlPrimaryCacheCustomResource createFreshCopy(
51+
UpdateControlPrimaryCacheCustomResource resource) {
52+
var res = new UpdateControlPrimaryCacheCustomResource();
53+
res.setMetadata(
54+
new ObjectMetaBuilder()
55+
.withName(resource.getMetadata().getName())
56+
.withNamespace(resource.getMetadata().getNamespace())
57+
.build());
58+
res.setStatus(new UpdateControlPrimaryCacheStatus());
59+
60+
return res;
61+
}
62+
}

0 commit comments

Comments
 (0)