Skip to content

Commit 1544389

Browse files
committed
integration test for ignore list
1 parent b631cc9 commit 1544389

File tree

6 files changed

+186
-0
lines changed

6 files changed

+186
-0
lines changed
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
package io.javaoperatorsdk.operator;
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+
import io.javaoperatorsdk.operator.sample.servicestrictmatcher.ServiceDependentResource;
11+
import io.javaoperatorsdk.operator.sample.servicestrictmatcher.ServiceStrictMatcherSpec;
12+
import io.javaoperatorsdk.operator.sample.servicestrictmatcher.ServiceStrictMatcherTestCustomResource;
13+
import io.javaoperatorsdk.operator.sample.servicestrictmatcher.ServiceStrictMatcherTestReconciler;
14+
15+
import static org.assertj.core.api.Assertions.assertThat;
16+
import static org.awaitility.Awaitility.await;
17+
18+
public class ServiceStrictMatcherIT {
19+
20+
@RegisterExtension
21+
LocallyRunOperatorExtension operator =
22+
LocallyRunOperatorExtension.builder().withReconciler(new ServiceStrictMatcherTestReconciler())
23+
.build();
24+
25+
26+
@Test
27+
void testTheMatchingDoesNoTTriggersFurtherUpdates() {
28+
var resource = operator.create(testResource());
29+
30+
// make an update to spec to reconcile again
31+
resource.getSpec().setValue(2);
32+
operator.replace(resource);
33+
34+
await().pollDelay(Duration.ofMillis(300)).untilAsserted(() -> {
35+
assertThat(operator.getReconcilerOfType(ServiceStrictMatcherTestReconciler.class)
36+
.getNumberOfExecutions()).isEqualTo(2);
37+
assertThat(ServiceDependentResource.updated.get()).isEqualTo(0);
38+
});
39+
}
40+
41+
42+
ServiceStrictMatcherTestCustomResource testResource() {
43+
var res = new ServiceStrictMatcherTestCustomResource();
44+
res.setSpec(new ServiceStrictMatcherSpec());
45+
res.getSpec().setValue(1);
46+
res.setMetadata(new ObjectMetaBuilder()
47+
.withName("test1")
48+
.build());
49+
return res;
50+
}
51+
52+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
package io.javaoperatorsdk.operator.sample.servicestrictmatcher;
2+
3+
import java.util.HashMap;
4+
import java.util.Map;
5+
import java.util.concurrent.atomic.AtomicInteger;
6+
7+
import io.fabric8.kubernetes.api.model.Service;
8+
import io.javaoperatorsdk.operator.ServiceStrictMatcherIT;
9+
import io.javaoperatorsdk.operator.api.reconciler.Context;
10+
import io.javaoperatorsdk.operator.processing.dependent.Matcher;
11+
import io.javaoperatorsdk.operator.processing.dependent.kubernetes.CRUDKubernetesDependentResource;
12+
import io.javaoperatorsdk.operator.processing.dependent.kubernetes.GenericKubernetesResourceMatcher;
13+
import io.javaoperatorsdk.operator.processing.dependent.kubernetes.KubernetesDependent;
14+
15+
import static io.javaoperatorsdk.operator.ReconcilerUtils.loadYaml;
16+
17+
@KubernetesDependent
18+
public class ServiceDependentResource
19+
extends CRUDKubernetesDependentResource<Service, ServiceStrictMatcherTestCustomResource> {
20+
21+
public static AtomicInteger updated = new AtomicInteger(0);
22+
23+
public ServiceDependentResource() {
24+
super(Service.class);
25+
}
26+
27+
@Override
28+
protected Service desired(ServiceStrictMatcherTestCustomResource primary,
29+
Context<ServiceStrictMatcherTestCustomResource> context) {
30+
Service service = loadYaml(Service.class, ServiceStrictMatcherIT.class, "service.yaml");
31+
service.getMetadata().setName(primary.getMetadata().getName());
32+
service.getMetadata().setNamespace(primary.getMetadata().getNamespace());
33+
Map<String, String> labels = new HashMap<>();
34+
labels.put("app", "deployment-name");
35+
service.getSpec().setSelector(labels);
36+
return service;
37+
}
38+
39+
@Override
40+
public Matcher.Result<Service> match(Service actualResource,
41+
ServiceStrictMatcherTestCustomResource primary,
42+
Context<ServiceStrictMatcherTestCustomResource> context) {
43+
return GenericKubernetesResourceMatcher.match(this, actualResource, primary, context, false,
44+
false,
45+
"/spec/ports",
46+
"/spec/clusterIP",
47+
"/spec/clusterIPs",
48+
"/spec/externalTrafficPolicy",
49+
"/spec/internalTrafficPolicy",
50+
"/spec/ipFamilies",
51+
"/spec/ipFamilyPolicy",
52+
"/spec/sessionAffinity");
53+
}
54+
55+
@Override
56+
public Service update(Service actual, Service target,
57+
ServiceStrictMatcherTestCustomResource primary,
58+
Context<ServiceStrictMatcherTestCustomResource> context) {
59+
updated.addAndGet(1);
60+
return super.update(actual, target, primary, context);
61+
}
62+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package io.javaoperatorsdk.operator.sample.servicestrictmatcher;
2+
3+
public class ServiceStrictMatcherSpec {
4+
5+
private int value;
6+
7+
public int getValue() {
8+
return value;
9+
}
10+
11+
public ServiceStrictMatcherSpec setValue(int value) {
12+
this.value = value;
13+
return this;
14+
}
15+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package io.javaoperatorsdk.operator.sample.servicestrictmatcher;
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("ssm")
12+
public class ServiceStrictMatcherTestCustomResource
13+
extends CustomResource<ServiceStrictMatcherSpec, Void>
14+
implements Namespaced {
15+
16+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package io.javaoperatorsdk.operator.sample.servicestrictmatcher;
2+
3+
import java.util.concurrent.atomic.AtomicInteger;
4+
5+
import io.javaoperatorsdk.operator.api.reconciler.Context;
6+
import io.javaoperatorsdk.operator.api.reconciler.ControllerConfiguration;
7+
import io.javaoperatorsdk.operator.api.reconciler.Reconciler;
8+
import io.javaoperatorsdk.operator.api.reconciler.UpdateControl;
9+
import io.javaoperatorsdk.operator.api.reconciler.dependent.Dependent;
10+
11+
@ControllerConfiguration(dependents = {@Dependent(type = ServiceDependentResource.class)})
12+
public class ServiceStrictMatcherTestReconciler
13+
implements Reconciler<ServiceStrictMatcherTestCustomResource> {
14+
15+
16+
private final AtomicInteger numberOfExecutions = new AtomicInteger(0);
17+
18+
@Override
19+
public UpdateControl<ServiceStrictMatcherTestCustomResource> reconcile(
20+
ServiceStrictMatcherTestCustomResource resource,
21+
Context<ServiceStrictMatcherTestCustomResource> context) {
22+
numberOfExecutions.addAndGet(1);
23+
return UpdateControl.noUpdate();
24+
}
25+
26+
public int getNumberOfExecutions() {
27+
return numberOfExecutions.get();
28+
}
29+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
apiVersion: v1
2+
kind: Service
3+
metadata:
4+
name: ""
5+
spec:
6+
selector:
7+
app: ""
8+
ports:
9+
- protocol: TCP
10+
port: 80
11+
targetPort: 80
12+
type: NodePort

0 commit comments

Comments
 (0)