Skip to content

Commit 58d6a86

Browse files
committed
integration test added
1 parent 5e18dcd commit 58d6a86

File tree

5 files changed

+130
-0
lines changed

5 files changed

+130
-0
lines changed
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
package io.javaoperatorsdk.operator;
2+
3+
import java.time.Duration;
4+
import java.util.stream.IntStream;
5+
6+
import org.junit.jupiter.api.Test;
7+
import org.junit.jupiter.api.extension.RegisterExtension;
8+
import org.slf4j.Logger;
9+
import org.slf4j.LoggerFactory;
10+
11+
import io.fabric8.kubernetes.api.model.ObjectMetaBuilder;
12+
import io.javaoperatorsdk.operator.junit.LocallyRunOperatorExtension;
13+
import io.javaoperatorsdk.operator.sample.ratelimit.RateLimitCustomResource;
14+
import io.javaoperatorsdk.operator.sample.ratelimit.RateLimitCustomResourceSpec;
15+
import io.javaoperatorsdk.operator.sample.ratelimit.RateLimitReconciler;
16+
17+
import static io.javaoperatorsdk.operator.sample.ratelimit.RateLimitReconciler.REFRESH_PERIOD;
18+
import static org.assertj.core.api.Assertions.assertThat;
19+
import static org.awaitility.Awaitility.await;
20+
21+
class RateLimitIT {
22+
23+
private final static Logger log = LoggerFactory.getLogger(RateLimitIT.class);
24+
25+
@RegisterExtension
26+
LocallyRunOperatorExtension operator =
27+
LocallyRunOperatorExtension.builder()
28+
.withReconciler(new RateLimitReconciler())
29+
.build();
30+
31+
@Test
32+
void rateLimitsExecution() {
33+
var res = operator.create(RateLimitCustomResource.class, createResource());
34+
IntStream.rangeClosed(1, 5).forEach(i -> {
35+
log.debug("replacing resource version: {}", i);
36+
var resource = createResource();
37+
resource.getSpec().setNumber(i);
38+
operator.replace(RateLimitCustomResource.class, resource);
39+
});
40+
await().pollInterval(Duration.ofMillis(100))
41+
.pollDelay(Duration.ofMillis(REFRESH_PERIOD / 2))
42+
.untilAsserted(() -> assertThat(
43+
operator.getReconcilerOfType(RateLimitReconciler.class).getNumberOfExecutions())
44+
.isEqualTo(1));
45+
46+
await().pollDelay(Duration.ofMillis(REFRESH_PERIOD))
47+
.untilAsserted(() -> assertThat(
48+
operator.getReconcilerOfType(RateLimitReconciler.class).getNumberOfExecutions())
49+
.isEqualTo(2));
50+
}
51+
52+
public RateLimitCustomResource createResource() {
53+
RateLimitCustomResource res = new RateLimitCustomResource();
54+
res.setMetadata(new ObjectMetaBuilder()
55+
.withName("test")
56+
.build());
57+
res.setSpec(new RateLimitCustomResourceSpec());
58+
res.getSpec().setNumber(0);
59+
return res;
60+
}
61+
62+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package io.javaoperatorsdk.operator.sample.ratelimit;
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("rlc")
12+
public class RateLimitCustomResource
13+
extends CustomResource<RateLimitCustomResourceSpec, RateLimitCustomResourceStatus>
14+
implements Namespaced {
15+
16+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package io.javaoperatorsdk.operator.sample.ratelimit;
2+
3+
public class RateLimitCustomResourceSpec {
4+
5+
private int number;
6+
7+
public int getNumber() {
8+
return number;
9+
}
10+
11+
public RateLimitCustomResourceSpec setNumber(int number) {
12+
this.number = number;
13+
return this;
14+
}
15+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package io.javaoperatorsdk.operator.sample.ratelimit;
2+
3+
import io.javaoperatorsdk.operator.api.ObservedGenerationAwareStatus;
4+
5+
public class RateLimitCustomResourceStatus extends ObservedGenerationAwareStatus {
6+
7+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package io.javaoperatorsdk.operator.sample.ratelimit;
2+
3+
import java.util.concurrent.TimeUnit;
4+
import java.util.concurrent.atomic.AtomicInteger;
5+
6+
import io.javaoperatorsdk.operator.api.reconciler.*;
7+
8+
@ControllerConfiguration(rateLimiter = @RateLimiter(limitForPeriod = 1,
9+
refreshPeriod = RateLimitReconciler.REFRESH_PERIOD,
10+
refreshPeriodTimeUnit = TimeUnit.MILLISECONDS))
11+
public class RateLimitReconciler
12+
implements Reconciler<RateLimitCustomResource> {
13+
14+
public static final int REFRESH_PERIOD = 3000;
15+
16+
private final AtomicInteger numberOfExecutions = new AtomicInteger(0);
17+
18+
@Override
19+
public UpdateControl<RateLimitCustomResource> reconcile(
20+
RateLimitCustomResource resource,
21+
Context<RateLimitCustomResource> context) {
22+
23+
numberOfExecutions.addAndGet(1);
24+
return UpdateControl.noUpdate();
25+
}
26+
27+
public int getNumberOfExecutions() {
28+
return numberOfExecutions.get();
29+
}
30+
}

0 commit comments

Comments
 (0)