Skip to content

Commit 08f8d85

Browse files
csvirimetacosm
authored andcommitted
feat: showcase sample for matcher with ssa in DR (#1964)
* feat: shocase sample for matcher with ssa in DR * docs update
1 parent c063eb1 commit 08f8d85

File tree

7 files changed

+175
-2
lines changed

7 files changed

+175
-2
lines changed

docs/documentation/v4-4-migration.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ the `KubernetesDependentResource`.
7777

7878
The SSA based create/update can be combined with the legacy matcher, simply override the `match` method
7979
and use the [GenericKubernetesResourceMatcher](https://github.com/java-operator-sdk/java-operator-sdk/blob/main/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/GenericKubernetesResourceMatcher.java#L19-L19)
80-
directly.
80+
directly. See related [sample](https://github.com/java-operator-sdk/java-operator-sdk/blob/main/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/ssalegacymatcher/ServiceDependentResource.java#L39-L44).
8181

8282
### Migration from plain Update/Create to SSA Based Patch
8383

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
public class GenericKubernetesResourceMatcher<R extends HasMetadata, P extends HasMetadata>
2020
implements Matcher<R, P> {
2121

22-
private static String SPEC = "/spec";
22+
private static final String SPEC = "/spec";
2323
private static final String ADD = "add";
2424
private static final String OP = "op";
2525
public static final String METADATA_LABELS = "/metadata/labels";
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
package io.javaoperatorsdk.operator;
2+
3+
import org.junit.jupiter.api.Test;
4+
import org.junit.jupiter.api.extension.RegisterExtension;
5+
6+
import io.fabric8.kubernetes.api.model.ObjectMetaBuilder;
7+
import io.fabric8.kubernetes.api.model.Service;
8+
import io.javaoperatorsdk.operator.junit.LocallyRunOperatorExtension;
9+
import io.javaoperatorsdk.operator.sample.ssalegacymatcher.SSALegacyMatcherCustomResource;
10+
import io.javaoperatorsdk.operator.sample.ssalegacymatcher.SSALegacyMatcherReconciler;
11+
import io.javaoperatorsdk.operator.sample.ssalegacymatcher.SSALegacyMatcherSpec;
12+
import io.javaoperatorsdk.operator.sample.ssalegacymatcher.ServiceDependentResource;
13+
14+
import static org.assertj.core.api.Assertions.assertThat;
15+
import static org.awaitility.Awaitility.await;
16+
17+
public class SSAWithLegacyMatcherIT {
18+
19+
public static final String TEST_RESOURCE_NAME = "test1";
20+
21+
@RegisterExtension
22+
LocallyRunOperatorExtension extension =
23+
LocallyRunOperatorExtension.builder().withReconciler(new SSALegacyMatcherReconciler())
24+
.build();
25+
26+
@Test
27+
void matchesDependentWithLegacyMatcher() {
28+
var resource = extension.create(testResource());
29+
30+
await().untilAsserted(() -> {
31+
var service = extension.get(Service.class, TEST_RESOURCE_NAME);
32+
assertThat(service).isNotNull();
33+
assertThat(ServiceDependentResource.createUpdateCount.get()).isEqualTo(1);
34+
});
35+
36+
resource.getSpec().setValue("other_value");
37+
38+
await().untilAsserted(() -> {
39+
assertThat(ServiceDependentResource.createUpdateCount.get()).isEqualTo(1);
40+
});
41+
}
42+
43+
SSALegacyMatcherCustomResource testResource() {
44+
SSALegacyMatcherCustomResource res = new SSALegacyMatcherCustomResource();
45+
res.setMetadata(new ObjectMetaBuilder()
46+
.withName(TEST_RESOURCE_NAME)
47+
.build());
48+
res.setSpec(new SSALegacyMatcherSpec());
49+
res.getSpec().setValue("initial-value");
50+
return res;
51+
}
52+
53+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package io.javaoperatorsdk.operator.sample.ssalegacymatcher;
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("slm")
12+
public class SSALegacyMatcherCustomResource
13+
extends CustomResource<SSALegacyMatcherSpec, Void>
14+
implements Namespaced {
15+
16+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package io.javaoperatorsdk.operator.sample.ssalegacymatcher;
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 SSALegacyMatcherReconciler
13+
implements Reconciler<SSALegacyMatcherCustomResource> {
14+
15+
private final AtomicInteger numberOfExecutions = new AtomicInteger(0);
16+
17+
@Override
18+
public UpdateControl<SSALegacyMatcherCustomResource> reconcile(
19+
SSALegacyMatcherCustomResource resource,
20+
Context<SSALegacyMatcherCustomResource> context) {
21+
numberOfExecutions.addAndGet(1);
22+
return UpdateControl.noUpdate();
23+
}
24+
25+
public int getNumberOfExecutions() {
26+
return numberOfExecutions.get();
27+
}
28+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package io.javaoperatorsdk.operator.sample.ssalegacymatcher;
2+
3+
public class SSALegacyMatcherSpec {
4+
5+
private String value;
6+
7+
public String getValue() {
8+
return value;
9+
}
10+
11+
public SSALegacyMatcherSpec setValue(String value) {
12+
this.value = value;
13+
return this;
14+
}
15+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
package io.javaoperatorsdk.operator.sample.ssalegacymatcher;
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.SSAWithLegacyMatcherIT;
9+
import io.javaoperatorsdk.operator.api.reconciler.Context;
10+
import io.javaoperatorsdk.operator.processing.dependent.kubernetes.CRUDKubernetesDependentResource;
11+
import io.javaoperatorsdk.operator.processing.dependent.kubernetes.GenericKubernetesResourceMatcher;
12+
import io.javaoperatorsdk.operator.processing.dependent.kubernetes.KubernetesDependent;
13+
14+
import static io.javaoperatorsdk.operator.ReconcilerUtils.loadYaml;
15+
16+
@KubernetesDependent
17+
public class ServiceDependentResource
18+
extends CRUDKubernetesDependentResource<Service, SSALegacyMatcherCustomResource> {
19+
20+
public static AtomicInteger createUpdateCount = new AtomicInteger(0);
21+
22+
public ServiceDependentResource() {
23+
super(Service.class);
24+
}
25+
26+
@Override
27+
protected Service desired(SSALegacyMatcherCustomResource primary,
28+
Context<SSALegacyMatcherCustomResource> context) {
29+
30+
Service service = loadYaml(Service.class, SSAWithLegacyMatcherIT.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 Result<Service> match(Service actualResource, SSALegacyMatcherCustomResource primary,
41+
Context<SSALegacyMatcherCustomResource> context) {
42+
return GenericKubernetesResourceMatcher.match(this, actualResource, primary, context,
43+
true, false, false);
44+
}
45+
46+
// override just to check the exec count
47+
@Override
48+
public Service update(Service actual, Service target, SSALegacyMatcherCustomResource primary,
49+
Context<SSALegacyMatcherCustomResource> context) {
50+
createUpdateCount.addAndGet(1);
51+
return super.update(actual, target, primary, context);
52+
}
53+
54+
// override just to check the exec count
55+
@Override
56+
public Service create(Service target, SSALegacyMatcherCustomResource primary,
57+
Context<SSALegacyMatcherCustomResource> context) {
58+
createUpdateCount.addAndGet(1);
59+
return super.create(target, primary, context);
60+
}
61+
}

0 commit comments

Comments
 (0)