8000 feat: showcase sample for matcher with ssa in DR (#1964) · ForeverL/java-operator-sdk@08f8d85 · GitHub
[go: up one dir, main page]

Skip to content

Commit 08f8d85

Browse files
csvirimetacosm
authored andcommitted
feat: showcase sample for matcher with ssa in DR (operator-framework#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

    Lines changed: 1 addition & 1 deletion
    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

    Lines changed: 1 addition & 1 deletion
    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";
    Lines changed: 53 additions & 0 deletions
    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 A3D4 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)
    0