Skip to content

Commit c354331

Browse files
committed
feat: make it possible to also check annotations/labels when matching
Fixes #1392
1 parent 7db5c33 commit c354331

File tree

2 files changed

+61
-16
lines changed

2 files changed

+61
-16
lines changed

operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/GenericKubernetesResourceMatcher.java

+20-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package io.javaoperatorsdk.operator.processing.dependent.kubernetes;
22

3+
import java.util.Objects;
4+
35
import io.fabric8.kubernetes.api.model.ConfigMap;
46
import io.fabric8.kubernetes.api.model.HasMetadata;
57
import io.fabric8.kubernetes.api.model.Secret;
@@ -41,8 +43,25 @@ static <R extends HasMetadata, P extends HasMetadata> Matcher<R, P> matcherFor(
4143

4244
@Override
4345
public Result<R> match(R actualResource, P primary, Context<P> context) {
44-
final var objectMapper = ConfigurationServiceProvider.instance().getObjectMapper();
46+
return match(dependentResource, actualResource, primary, context, false);
47+
}
48+
49+
public static <R extends HasMetadata, P extends HasMetadata> Result<R> match(
50+
KubernetesDependentResource<R, P> dependentResource, R actualResource, P primary,
51+
Context<P> context, boolean considerMetadata) {
4552
final var desired = dependentResource.desired(primary, context);
53+
if (considerMetadata) {
54+
final var desiredMetadata = desired.getMetadata();
55+
final var actualMetadata = actualResource.getMetadata();
56+
final var matched =
57+
Objects.equals(desiredMetadata.getAnnotations(), actualMetadata.getAnnotations()) &&
58+
Objects.equals(desiredMetadata.getLabels(), actualMetadata.getLabels());
59+
if (!matched) {
60+
return Result.computed(false, desired);
61+
}
62+
}
63+
64+
final var objectMapper = ConfigurationServiceProvider.instance().getObjectMapper();
4665

4766
// reflection will be replaced by this:
4867
// https://github.com/fabric8io/kubernetes-client/issues/3816

operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/GenericKubernetesResourceMatcherTest.java

+41-15
Original file line numberDiff line numberDiff line change
@@ -31,21 +31,9 @@ static void setUp() {
3131
void checksIfDesiredValuesAreTheSame() {
3232
var actual = createDeployment();
3333
final var desired = createDeployment();
34-
final var matcher = GenericKubernetesResourceMatcher.matcherFor(Deployment.class,
35-
new KubernetesDependentResource<>(Deployment.class) {
36-
@Override
37-
protected Deployment desired(HasMetadata primary, Context context) {
38-
final var currentCase = Optional.ofNullable(primary)
39-
.map(p -> p.getMetadata().getLabels().get("case"))
40-
.orElse(null);
41-
var d = desired;
42-
if ("removed".equals(currentCase)) {
43-
d = createDeployment();
44-
d.getSpec().getTemplate().getMetadata().getLabels().put("new-key", "val");
45-
}
46-
return d;
47-
}
48-
});
34+
final var dependentResource = new TestDependentResource(desired);
35+
final var matcher =
36+
GenericKubernetesResourceMatcher.matcherFor(Deployment.class, dependentResource);
4937
assertThat(matcher.match(actual, null, context).matched()).isTrue();
5038
assertThat(matcher.match(actual, null, context).computedDesired().isPresent()).isTrue();
5139
assertThat(matcher.match(actual, null, context).computedDesired().get()).isEqualTo(desired);
@@ -65,6 +53,21 @@ protected Deployment desired(HasMetadata primary, Context context) {
6553
assertThat(matcher.match(actual, null, context).matched())
6654
.withFailMessage("Changed values are not ok")
6755
.isFalse();
56+
57+
actual = new DeploymentBuilder(createDeployment())
58+
.editOrNewMetadata()
59+
.addToAnnotations("test", "value")
60+
.endMetadata()
61+
.build();
62+
assertThat(GenericKubernetesResourceMatcher
63+
.match(dependentResource, actual, null, context, false).matched())
64+
.withFailMessage("Annotations shouldn't matter when metadata is not considered")
65+
.isTrue();
66+
67+
assertThat(GenericKubernetesResourceMatcher
68+
.match(dependentResource, actual, null, context, true).matched())
69+
.withFailMessage("Annotations should matter when metadata is not considered")
70+
.isFalse();
6871
}
6972

7073
Deployment createDeployment() {
@@ -79,4 +82,27 @@ HasMetadata createPrimary(String caseName) {
7982
.endMetadata()
8083
.build();
8184
}
85+
86+
private class TestDependentResource extends KubernetesDependentResource<Deployment, HasMetadata> {
87+
88+
private final Deployment desired;
89+
90+
public TestDependentResource(Deployment desired) {
91+
super(Deployment.class);
92+
this.desired = desired;
93+
}
94+
95+
@Override
96+
protected Deployment desired(HasMetadata primary, Context context) {
97+
final var currentCase = Optional.ofNullable(primary)
98+
.map(p -> p.getMetadata().getLabels().get("case"))
99+
.orElse(null);
100+
var d = desired;
101+
if ("removed".equals(currentCase)) {
102+
d = createDeployment();
103+
d.getSpec().getTemplate().getMetadata().getLabels().put("new-key", "val");
104+
}
105+
return d;
106+
}
107+
}
82108
}

0 commit comments

Comments
 (0)