diff --git a/docs/documentation/v4-4-migration.md b/docs/documentation/v4-4-migration.md index 7bbf222b98..0f7d1929af 100644 --- a/docs/documentation/v4-4-migration.md +++ b/docs/documentation/v4-4-migration.md @@ -62,19 +62,23 @@ default [Dependent Resources](https://javaoperatorsdk.io/docs/dependent-resource [Server Side Apply (SSA)](https://kubernetes.io/docs/reference/using-api/server-side-apply/) to create and update Kubernetes resources. A -new [default matching](https://github.com/java-operator-sdk/java-operator-sdk/blob/e95f9c8a8b8a8561c9a735e60fc5d82b7758df8e/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/KubernetesDependentResource.java#L163-L163) +new [default matching](https://github.com/java-operator-sdk/java-operator-sdk/blob/2cc3bb7710adb8fca14767fbff8d93533dd05ef0/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/KubernetesDependentResource.java#L157-L157) algorithm is provided for `KubernetesDependentResource` that is based on `managedFields` of SSA. For details -see [SSABasedGenericKubernetesResourceMatcher](https://github.com/java-operator-sdk/java-operator-sdk/blob/e95f9c8a8b8a8561c9a735e60fc5d82b7758df8e/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/SSABasedGenericKubernetesResourceMatcher.java) +see [SSABasedGenericKubernetesResourceMatcher](https://github.com/java-operator-sdk/java-operator-sdk/blob/main/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/SSABasedGenericKubernetesResourceMatcher.java) Since those features are hard to completely test, we provided feature flags to revert to the legacy behavior if needed, -see those -in [ConfigurationService](https://github.com/java-operator-sdk/java-operator-sdk/blob/e95f9c8a8b8a8561c9a735e60fc5d82b7758df8e/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/ConfigurationService.java#L268-L289) +see +in [ConfigurationService](https://github.com/java-operator-sdk/java-operator-sdk/blob/2cc3bb7710adb8fca14767fbff8d93533dd05ef0/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/ConfigurationService.java#L332-L347) Note that it is possible to override the related methods/behavior on class level when extending the `KubernetesDependentResource`. +The SSA based create/update can be combined with the legacy matcher, simply override the `match` method +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) +directly. + ### Migration from plain Update/Create to SSA Based Patch Migration to SSA might not be trivial based on the uses cases and the type of managed resources. diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/ConfigurationService.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/ConfigurationService.java index c75494d972..2422f6ef74 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/ConfigurationService.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/ConfigurationService.java @@ -330,27 +330,18 @@ default ExecutorServiceManager getExecutorServiceManager() { } /** - * Allows to revert to the 4.3 behavior when it comes to creating or updating Kubernetes Dependent - * Resources when set to {@code false}. The default approach how these resources are - * created/updated was change to use + * Allows to revert to the 4.3 behavior when it comes to creating, updating and matching + * Kubernetes Dependent Resources when set to {@code false}. The default approach how these + * resources are created/updated and match was change to use * Server-Side * Apply (SSA) by default. * - * @since 4.4.0 - */ - default boolean ssaBasedCreateUpdateForDependentResources() { - return true; - } - - /** - * Allows to revert to the 4.3 generic matching algorithm for Kubernetes Dependent Resources when - * set to {@code false}. Version 4.4 introduced a new generic matching algorithm for Kubernetes - * Dependent Resources which is quite complex. As a consequence, we introduced this setting to - * allow folks to revert to the previous matching algorithm if needed. + * SSA based create/update can be still used with the legacy matching, just overriding the match + * method of Kubernetes Dependent Resource. * * @since 4.4.0 */ - default boolean ssaBasedDefaultMatchingForDependentResources() { + default boolean ssaBasedCreateUpdateMatchForDependentResources() { return true; } diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/ConfigurationServiceOverrider.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/ConfigurationServiceOverrider.java index 3006665297..ebac41f640 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/ConfigurationServiceOverrider.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/ConfigurationServiceOverrider.java @@ -34,8 +34,7 @@ public class ConfigurationServiceOverrider { private Boolean stopOnInformerErrorDuringStartup; private Duration cacheSyncTimeout; private ResourceClassResolver resourceClassResolver; - private Boolean ssaBasedCreateUpdateForDependentResources; - private Boolean ssaBasedDefaultMatchingForDependentResources; + private Boolean ssaBasedCreateUpdateMatchForDependentResources; ConfigurationServiceOverrider(ConfigurationService original) { this.original = original; @@ -145,15 +144,9 @@ public ConfigurationServiceOverrider withResourceClassResolver( return this; } - public ConfigurationServiceOverrider withSSABasedCreateUpdateForDependentResources( + public ConfigurationServiceOverrider withSSABasedCreateUpdateMatchForDependentResources( boolean value) { - this.ssaBasedCreateUpdateForDependentResources = value; - return this; - } - - public ConfigurationServiceOverrider withSSABasedDefaultMatchingForDependentResources( - boolean value) { - this.ssaBasedDefaultMatchingForDependentResources = value; + this.ssaBasedCreateUpdateMatchForDependentResources = value; return this; } @@ -258,17 +251,10 @@ public ResourceClassResolver getResourceClassResolver() { } @Override - public boolean ssaBasedCreateUpdateForDependentResources() { - return ssaBasedCreateUpdateForDependentResources != null - ? ssaBasedCreateUpdateForDependentResources - : super.ssaBasedCreateUpdateForDependentResources(); - } - - @Override - public boolean ssaBasedDefaultMatchingForDependentResources() { - return ssaBasedDefaultMatchingForDependentResources != null - ? ssaBasedDefaultMatchingForDependentResources - : super.ssaBasedDefaultMatchingForDependentResources(); + public boolean ssaBasedCreateUpdateMatchForDependentResources() { + return ssaBasedCreateUpdateMatchForDependentResources != null + ? ssaBasedCreateUpdateMatchForDependentResources + : super.ssaBasedCreateUpdateMatchForDependentResources(); } }; } diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/GenericKubernetesResourceMatcher.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/GenericKubernetesResourceMatcher.java index 1d189bd5c9..054dacef23 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/GenericKubernetesResourceMatcher.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/GenericKubernetesResourceMatcher.java @@ -13,14 +13,13 @@ import io.fabric8.zjsonpatch.JsonDiff; import io.javaoperatorsdk.operator.api.reconciler.Context; import io.javaoperatorsdk.operator.processing.dependent.Matcher; -import io.javaoperatorsdk.operator.processing.dependent.kubernetes.processors.GenericResourceUpdatePreProcessor; import com.fasterxml.jackson.databind.JsonNode; public class GenericKubernetesResourceMatcher implements Matcher { - + private static String SPEC = "/spec"; private static final String ADD = "add"; private static final String OP = "op"; public static final String METADATA_LABELS = "/metadata/labels"; @@ -171,7 +170,6 @@ public static Result match( labelsAndAnnotationsEquality, specEquality, context); } - @SuppressWarnings("unchecked") public static Result match(R desired, R actualResource, boolean considerMetadata, boolean labelsAndAnnotationsEquality, boolean specEquality, @@ -194,13 +192,50 @@ public static Result match(R d } } - final ResourceUpdatePreProcessor processor = - GenericResourceUpdatePreProcessor.processorFor((Class) desired.getClass()); - final var matched = - processor.matches(actualResource, desired, specEquality, context, ignoredPaths); + final var matched = matchSpec(actualResource, desired, specEquality, context, ignoredPaths); return Result.computed(matched, desired); } + private static boolean matchSpec(R actual, R desired, boolean equality, + Context context, + String[] ignoredPaths) { + + final var kubernetesSerialization = context.getClient().getKubernetesSerialization(); + var desiredNode = kubernetesSerialization.convertValue(desired, JsonNode.class); + var actualNode = kubernetesSerialization.convertValue(actual, JsonNode.class); + var wholeDiffJsonPatch = JsonDiff.asJson(desiredNode, actualNode); + + final List ignoreList = + ignoredPaths != null && ignoredPaths.length > 0 ? Arrays.asList(ignoredPaths) + : Collections.emptyList(); + // reflection will be replaced by this: + // https://github.com/fabric8io/kubernetes-client/issues/3816 + var specDiffJsonPatch = getDiffsImpactingPathsWithPrefixes(wholeDiffJsonPatch, SPEC); + // In case of equality is set to true, no diffs are allowed, so we return early if diffs exist + // On contrary (if equality is false), "add" is allowed for cases when for some + // resources Kubernetes fills-in values into spec. + if (equality && !specDiffJsonPatch.isEmpty()) { + return false; + } + if (!equality && !ignoreList.isEmpty()) { + if (!allDiffsOnIgnoreList(specDiffJsonPatch, ignoreList)) { + return false; + } + } else { + if (!allDiffsAreAddOps(specDiffJsonPatch)) { + return false; + } + } + return true; + } + + private static boolean allDiffsOnIgnoreList(List metadataJSonDiffs, + List ignoreList) { + if (metadataJSonDiffs.isEmpty()) { + return false; + } + return metadataJSonDiffs.stream().allMatch(n -> nodeIsChildOf(n, ignoreList)); + } private static Optional> matchMetadata( R desired, diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/GenericResourceUpdatePreProcessor.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/GenericResourceUpdatePreProcessor.java deleted file mode 100644 index 223f9483e8..0000000000 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/GenericResourceUpdatePreProcessor.java +++ /dev/null @@ -1,20 +0,0 @@ -package io.javaoperatorsdk.operator.processing.dependent.kubernetes; - -import io.fabric8.kubernetes.api.model.HasMetadata; -import io.javaoperatorsdk.operator.api.reconciler.Context; - -public abstract class GenericResourceUpdatePreProcessor implements - ResourceUpdatePreProcessor { - - private GenericResourceUpdatePreProcessor() {} - - public R replaceSpecOnActual(R actual, R desired, Context context) { - var clonedActual = context.getControllerConfiguration().getConfigurationService() - .getResourceCloner() - .clone(actual); - updateClonedActual(clonedActual, desired); - return clonedActual; - } - - protected abstract void updateClonedActual(R actual, R desired); -} diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/KubernetesDependentResource.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/KubernetesDependentResource.java index 3fc0c414e2..9a2603d54c 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/KubernetesDependentResource.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/KubernetesDependentResource.java @@ -23,7 +23,7 @@ import io.javaoperatorsdk.operator.api.reconciler.dependent.managed.KubernetesClientAware; import io.javaoperatorsdk.operator.processing.dependent.AbstractEventSourceHolderDependentResource; import io.javaoperatorsdk.operator.processing.dependent.Matcher.Result; -import io.javaoperatorsdk.operator.processing.dependent.kubernetes.processors.GenericResourceUpdatePreProcessor; +import io.javaoperatorsdk.operator.processing.dependent.kubernetes.updatermatcher.GenericResourceUpdaterMatcher; import io.javaoperatorsdk.operator.processing.event.ResourceID; import io.javaoperatorsdk.operator.processing.event.source.SecondaryToPrimaryMapper; import io.javaoperatorsdk.operator.processing.event.source.informer.InformerEventSource; @@ -40,18 +40,17 @@ public abstract class KubernetesDependentResource processor; + private final ResourceUpdaterMatcher updaterMatcher; private final boolean garbageCollected = this instanceof GarbageCollected; private KubernetesDependentResourceConfig kubernetesDependentResourceConfig; - @SuppressWarnings("unchecked") public KubernetesDependentResource(Class resourceType) { super(resourceType); - processor = this instanceof ResourceUpdatePreProcessor - ? (ResourceUpdatePreProcessor) this - : GenericResourceUpdatePreProcessor.processorFor(resourceType); + updaterMatcher = this instanceof ResourceUpdaterMatcher + ? (ResourceUpdaterMatcher) this + : GenericResourceUpdaterMatcher.updaterMatcherFor(resourceType); } @SuppressWarnings("unchecked") @@ -129,57 +128,59 @@ protected R handleUpdate(R actual, R desired, P primary, Context

context) { @SuppressWarnings("unused") public R create(R target, P primary, Context

context) { - if (!context.getControllerConfiguration().getConfigurationService() - .ssaBasedCreateUpdateForDependentResources()) { - return prepare(target, primary, "Creating").create(); - } else { - return prepare(target, primary, "Creating") - .fieldManager(context.getControllerConfiguration().fieldManager()) - .forceConflicts() - .serverSideApply(); - } + final var resource = prepare(target, primary, "Creating"); + return useSSA(context) + ? resource + .fieldManager(context.getControllerConfiguration().fieldManager()) + .forceConflicts() + .serverSideApply() + : resource.create(); } public R update(R actual, R target, P primary, Context

context) { - if (!context.getControllerConfiguration().getConfigurationService() - .ssaBasedCreateUpdateForDependentResources()) { - var updatedActual = processor.replaceSpecOnActual(actual, target, context); - return prepare(updatedActual, primary, "Updating").replace(); - } else { + if (useSSA(context)) { target.getMetadata().setResourceVersion(actual.getMetadata().getResourceVersion()); return prepare(target, primary, "Updating") .fieldManager(context.getControllerConfiguration().fieldManager()) .forceConflicts().serverSideApply(); + } else { + var updatedActual = updaterMatcher.updateResource(actual, target, context); + return prepare(updatedActual, primary, "Updating").replace(); } } public Result match(R actualResource, P primary, Context

context) { - if (!context.getControllerConfiguration().getConfigurationService() - .ssaBasedDefaultMatchingForDependentResources()) { - return GenericKubernetesResourceMatcher.match(this, actualResource, primary, context, false); - } else { - final var desired = desired(primary, context); + final var desired = desired(primary, context); + final boolean matches; + if (useSSA(context)) { addReferenceHandlingMetadata(desired, primary); - var matches = SSABasedGenericKubernetesResourceMatcher.getInstance().matches(actualResource, - desired, context); - return Result.computed(matches, desired); + matches = SSABasedGenericKubernetesResourceMatcher.getInstance() + .matches(actualResource, desired, context); + } else { + matches = updaterMatcher.matches(actualResource, desired, context); } + return Result.computed(matches, desired); } @SuppressWarnings("unused") public Result match(R actualResource, R desired, P primary, Context

context) { - if (!context.getControllerConfiguration().getConfigurationService() - .ssaBasedDefaultMatchingForDependentResources()) { - return GenericKubernetesResourceMatcher.match(desired, actualResource, false, - false, false, context); - } else { + if (useSSA(context)) { addReferenceHandlingMetadata(desired, primary); - var matches = SSABasedGenericKubernetesResourceMatcher.getInstance().matches(actualResource, - desired, context); + var matches = SSABasedGenericKubernetesResourceMatcher.getInstance() + .matches(actualResource, desired, context); return Result.computed(matches, desired); + } else { + return GenericKubernetesResourceMatcher + .match(desired, actualResource, true, + false, false, context); } } + private boolean useSSA(Context

context) { + return context.getControllerConfiguration().getConfigurationService() + .ssaBasedCreateUpdateMatchForDependentResources(); + } + protected void handleDelete(P primary, R secondary, Context

context) { if (secondary != null) { client.resource(secondary).delete(); diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/ResourceUpdatePreProcessor.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/ResourceUpdatePreProcessor.java deleted file mode 100644 index e2ebc85d48..0000000000 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/ResourceUpdatePreProcessor.java +++ /dev/null @@ -1,63 +0,0 @@ -package io.javaoperatorsdk.operator.processing.dependent.kubernetes; - -import java.util.Arrays; -import java.util.Collections; -import java.util.List; - -import io.fabric8.kubernetes.api.model.HasMetadata; -import io.fabric8.zjsonpatch.JsonDiff; -import io.javaoperatorsdk.operator.api.reconciler.Context; - -import com.fasterxml.jackson.databind.JsonNode; - -import static io.javaoperatorsdk.operator.processing.dependent.kubernetes.GenericKubernetesResourceMatcher.allDiffsAreAddOps; -import static io.javaoperatorsdk.operator.processing.dependent.kubernetes.GenericKubernetesResourceMatcher.getDiffsImpactingPathsWithPrefixes; -import static io.javaoperatorsdk.operator.processing.dependent.kubernetes.GenericKubernetesResourceMatcher.nodeIsChildOf; - -public interface ResourceUpdatePreProcessor { - - String SPEC = "/spec"; - - R replaceSpecOnActual(R actual, R desired, Context context); - - default boolean matches(R actual, R desired, boolean equality, Context context, - String[] ignoredPaths) { - - final var objectMapper = context.getClient().getKubernetesSerialization(); - var desiredNode = objectMapper.convertValue(desired, JsonNode.class); - var actualNode = objectMapper.convertValue(actual, JsonNode.class); - var wholeDiffJsonPatch = JsonDiff.asJson(desiredNode, actualNode); - - final List ignoreList = - ignoredPaths != null && ignoredPaths.length > 0 ? Arrays.asList(ignoredPaths) - : Collections.emptyList(); - // reflection will be replaced by this: - // https://github.com/fabric8io/kubernetes-client/issues/3816 - var specDiffJsonPatch = getDiffsImpactingPathsWithPrefixes(wholeDiffJsonPatch, SPEC); - // In case of equality is set to true, no diffs are allowed, so we return early if diffs exist - // On contrary (if equality is false), "add" is allowed for cases when for some - // resources Kubernetes fills-in values into spec. - if (equality && !specDiffJsonPatch.isEmpty()) { - return false; - } - if (!equality && !ignoreList.isEmpty()) { - if (!allDiffsOnIgnoreList(specDiffJsonPatch, ignoreList)) { - return false; - } - } else { - if (!allDiffsAreAddOps(specDiffJsonPatch)) { - return false; - } - } - return true; - } - - private static boolean allDiffsOnIgnoreList(List metadataJSonDiffs, - List ignoreList) { - if (metadataJSonDiffs.isEmpty()) { - return false; - } - return metadataJSonDiffs.stream().allMatch(n -> nodeIsChildOf(n, ignoreList)); - } - -} diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/ResourceUpdaterMatcher.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/ResourceUpdaterMatcher.java new file mode 100644 index 0000000000..0da1aef9dc --- /dev/null +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/ResourceUpdaterMatcher.java @@ -0,0 +1,12 @@ +package io.javaoperatorsdk.operator.processing.dependent.kubernetes; + +import io.fabric8.kubernetes.api.model.HasMetadata; +import io.javaoperatorsdk.operator.api.reconciler.Context; + +public interface ResourceUpdaterMatcher { + + R updateResource(R actual, R desired, Context context); + + boolean matches(R actual, R desired, Context context); + +} diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/processors/GenericResourceUpdatePreProcessor.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/processors/GenericResourceUpdatePreProcessor.java deleted file mode 100644 index d74b16d24b..0000000000 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/processors/GenericResourceUpdatePreProcessor.java +++ /dev/null @@ -1,52 +0,0 @@ -package io.javaoperatorsdk.operator.processing.dependent.kubernetes.processors; - -import java.util.Map; - -import io.fabric8.kubernetes.api.model.ConfigMap; -import io.fabric8.kubernetes.api.model.HasMetadata; -import io.fabric8.kubernetes.api.model.Secret; -import io.fabric8.kubernetes.api.model.ServiceAccount; -import io.fabric8.kubernetes.api.model.rbac.ClusterRole; -import io.fabric8.kubernetes.api.model.rbac.ClusterRoleBinding; -import io.fabric8.kubernetes.api.model.rbac.Role; -import io.fabric8.kubernetes.api.model.rbac.RoleBinding; -import io.javaoperatorsdk.operator.ReconcilerUtils; -import io.javaoperatorsdk.operator.api.reconciler.Context; -import io.javaoperatorsdk.operator.processing.dependent.kubernetes.ResourceUpdatePreProcessor; - -public class GenericResourceUpdatePreProcessor implements - ResourceUpdatePreProcessor { - private static final ResourceUpdatePreProcessor INSTANCE = - new GenericResourceUpdatePreProcessor<>(); - - @SuppressWarnings("rawtypes") - private static final Map processors = Map.of( - Secret.class, new SecretResourceUpdatePreProcessor(), - ConfigMap.class, new ConfigMapResourceUpdatePreProcessor(), - ServiceAccount.class, new ServiceAccountResourceUpdateProcessor(), - Role.class, new RoleResourceUpdatePreProcessor(), - ClusterRole.class, new ClusterRoleResourceUpdatePreProcessor(), - RoleBinding.class, new RoleBindingResourceUpdatePreProcessor(), - ClusterRoleBinding.class, new ClusterRoleBindingResourceUpdatePreProcessor()); - - protected GenericResourceUpdatePreProcessor() {} - - @SuppressWarnings("unchecked") - public static ResourceUpdatePreProcessor processorFor( - Class resourceType) { - final var processor = processors.get(resourceType); - return processor != null ? processor : (ResourceUpdatePreProcessor) INSTANCE; - } - - public R replaceSpecOnActual(R actual, R desired, Context context) { - var clonedActual = context.getControllerConfiguration().getConfigurationService() - .getResourceCloner().clone(actual); - updateClonedActual(clonedActual, desired); - return clonedActual; - } - - protected void updateClonedActual(R actual, R desired) { - var desiredSpec = ReconcilerUtils.getSpec(desired); - ReconcilerUtils.setSpec(actual, desiredSpec); - } -} diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/processors/ClusterRoleBindingResourceUpdatePreProcessor.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/updatermatcher/ClusterRoleBindingResourceUpdaterMatcher.java similarity index 73% rename from operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/processors/ClusterRoleBindingResourceUpdatePreProcessor.java rename to operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/updatermatcher/ClusterRoleBindingResourceUpdaterMatcher.java index 9fc5718a45..f6f6d1ef54 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/processors/ClusterRoleBindingResourceUpdatePreProcessor.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/updatermatcher/ClusterRoleBindingResourceUpdaterMatcher.java @@ -1,12 +1,12 @@ -package io.javaoperatorsdk.operator.processing.dependent.kubernetes.processors; +package io.javaoperatorsdk.operator.processing.dependent.kubernetes.updatermatcher; import java.util.Objects; import io.fabric8.kubernetes.api.model.rbac.ClusterRoleBinding; import io.javaoperatorsdk.operator.api.reconciler.Context; -public class ClusterRoleBindingResourceUpdatePreProcessor - extends GenericResourceUpdatePreProcessor { +public class ClusterRoleBindingResourceUpdaterMatcher + extends GenericResourceUpdaterMatcher { @Override protected void updateClonedActual(ClusterRoleBinding actual, ClusterRoleBinding desired) { @@ -15,8 +15,8 @@ protected void updateClonedActual(ClusterRoleBinding actual, ClusterRoleBinding } @Override - public boolean matches(ClusterRoleBinding actual, ClusterRoleBinding desired, boolean equality, - Context context, String[] ignoredPaths) { + public boolean matches(ClusterRoleBinding actual, ClusterRoleBinding desired, + Context context) { return Objects.equals(actual.getRoleRef(), desired.getRoleRef()) && Objects.equals(actual.getSubjects(), desired.getSubjects()); } diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/processors/ClusterRoleResourceUpdatePreProcessor.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/updatermatcher/ClusterRoleResourceUpdaterMatcher.java similarity index 76% rename from operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/processors/ClusterRoleResourceUpdatePreProcessor.java rename to operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/updatermatcher/ClusterRoleResourceUpdaterMatcher.java index 26e2431e21..da7997c040 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/processors/ClusterRoleResourceUpdatePreProcessor.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/updatermatcher/ClusterRoleResourceUpdaterMatcher.java @@ -1,12 +1,12 @@ -package io.javaoperatorsdk.operator.processing.dependent.kubernetes.processors; +package io.javaoperatorsdk.operator.processing.dependent.kubernetes.updatermatcher; import java.util.Objects; import io.fabric8.kubernetes.api.model.rbac.ClusterRole; import io.javaoperatorsdk.operator.api.reconciler.Context; -public class ClusterRoleResourceUpdatePreProcessor - extends GenericResourceUpdatePreProcessor { +public class ClusterRoleResourceUpdaterMatcher + extends GenericResourceUpdaterMatcher { @Override protected void updateClonedActual(ClusterRole actual, ClusterRole desired) { @@ -15,8 +15,7 @@ protected void updateClonedActual(ClusterRole actual, ClusterRole desired) { } @Override - public boolean matches(ClusterRole actual, ClusterRole desired, boolean equality, - Context context, String[] ignoredPaths) { + public boolean matches(ClusterRole actual, ClusterRole desired, Context context) { return Objects.equals(actual.getRules(), desired.getRules()) && Objects.equals(actual.getAggregationRule(), desired.getAggregationRule()); } diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/processors/ConfigMapResourceUpdatePreProcessor.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/updatermatcher/ConfigMapResourceUpdaterMatcher.java similarity index 72% rename from operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/processors/ConfigMapResourceUpdatePreProcessor.java rename to operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/updatermatcher/ConfigMapResourceUpdaterMatcher.java index f306d733f7..7f89d45ff5 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/processors/ConfigMapResourceUpdatePreProcessor.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/updatermatcher/ConfigMapResourceUpdaterMatcher.java @@ -1,12 +1,12 @@ -package io.javaoperatorsdk.operator.processing.dependent.kubernetes.processors; +package io.javaoperatorsdk.operator.processing.dependent.kubernetes.updatermatcher; import java.util.Objects; import io.fabric8.kubernetes.api.model.ConfigMap; import io.javaoperatorsdk.operator.api.reconciler.Context; -public class ConfigMapResourceUpdatePreProcessor - extends GenericResourceUpdatePreProcessor { +public class ConfigMapResourceUpdaterMatcher + extends GenericResourceUpdaterMatcher { @Override protected void updateClonedActual(ConfigMap actual, ConfigMap desired) { @@ -16,8 +16,7 @@ protected void updateClonedActual(ConfigMap actual, ConfigMap desired) { } @Override - public boolean matches(ConfigMap actual, ConfigMap desired, boolean equality, - Context context, String[] ignoredPaths) { + public boolean matches(ConfigMap actual, ConfigMap desired, Context context) { return Objects.equals(actual.getImmutable(), desired.getImmutable()) && Objects.equals(actual.getData(), desired.getData()) && Objects.equals(actual.getBinaryData(), desired.getBinaryData()); diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/updatermatcher/GenericResourceUpdaterMatcher.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/updatermatcher/GenericResourceUpdaterMatcher.java new file mode 100644 index 0000000000..3a293f0513 --- /dev/null +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/updatermatcher/GenericResourceUpdaterMatcher.java @@ -0,0 +1,70 @@ +package io.javaoperatorsdk.operator.processing.dependent.kubernetes.updatermatcher; + +import java.util.Map; + +import io.fabric8.kubernetes.api.model.ConfigMap; +import io.fabric8.kubernetes.api.model.HasMetadata; +import io.fabric8.kubernetes.api.model.Secret; +import io.fabric8.kubernetes.api.model.ServiceAccount; +import io.fabric8.kubernetes.api.model.rbac.ClusterRole; +import io.fabric8.kubernetes.api.model.rbac.ClusterRoleBinding; +import io.fabric8.kubernetes.api.model.rbac.Role; +import io.fabric8.kubernetes.api.model.rbac.RoleBinding; +import io.javaoperatorsdk.operator.ReconcilerUtils; +import io.javaoperatorsdk.operator.api.reconciler.Context; +import io.javaoperatorsdk.operator.processing.dependent.kubernetes.GenericKubernetesResourceMatcher; +import io.javaoperatorsdk.operator.processing.dependent.kubernetes.ResourceUpdaterMatcher; + +public class GenericResourceUpdaterMatcher implements + ResourceUpdaterMatcher { + + private static final ResourceUpdaterMatcher INSTANCE = new GenericResourceUpdaterMatcher<>(); + + @SuppressWarnings("rawtypes") + private static final Map processors = Map.of( + Secret.class, new SecretResourceUpdaterMatcher(), + ConfigMap.class, new ConfigMapResourceUpdaterMatcher(), + ServiceAccount.class, new ServiceAccountResourceUpdaterMatcher(), + Role.class, new RoleResourceUpdaterMatcher(), + ClusterRole.class, new ClusterRoleResourceUpdaterMatcher(), + RoleBinding.class, new RoleBindingResourceUpdaterMatcher(), + ClusterRoleBinding.class, new ClusterRoleBindingResourceUpdaterMatcher()); + + protected GenericResourceUpdaterMatcher() {} + + @SuppressWarnings("unchecked") + public static ResourceUpdaterMatcher updaterMatcherFor( + Class resourceType) { + final var processor = processors.get(resourceType); + return processor != null ? processor : (ResourceUpdaterMatcher) INSTANCE; + } + + public R updateResource(R actual, R desired, Context context) { + var clonedActual = context.getControllerConfiguration().getConfigurationService() + .getResourceCloner().clone(actual); + updateLabelsAndAnnotation(clonedActual, desired); + updateClonedActual(clonedActual, desired); + return clonedActual; + } + + @Override + public boolean matches(R actual, R desired, Context context) { + return GenericKubernetesResourceMatcher.match(desired, actual, true, + false, false, context).matched(); + } + + protected void updateClonedActual(R actual, R desired) { + updateSpec(actual, desired); + } + + public static void updateSpec(K actual, K desired) { + var desiredSpec = ReconcilerUtils.getSpec(desired); + ReconcilerUtils.setSpec(actual, desiredSpec); + } + + public static void updateLabelsAndAnnotation(K actual, K desired) { + actual.getMetadata().getLabels().putAll(desired.getMetadata().getLabels()); + actual.getMetadata().getAnnotations().putAll(desired.getMetadata().getAnnotations()); + } + +} diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/processors/RoleBindingResourceUpdatePreProcessor.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/updatermatcher/RoleBindingResourceUpdaterMatcher.java similarity index 75% rename from operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/processors/RoleBindingResourceUpdatePreProcessor.java rename to operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/updatermatcher/RoleBindingResourceUpdaterMatcher.java index 45c8cb50ba..c6a87cdae3 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/processors/RoleBindingResourceUpdatePreProcessor.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/updatermatcher/RoleBindingResourceUpdaterMatcher.java @@ -1,12 +1,12 @@ -package io.javaoperatorsdk.operator.processing.dependent.kubernetes.processors; +package io.javaoperatorsdk.operator.processing.dependent.kubernetes.updatermatcher; import java.util.Objects; import io.fabric8.kubernetes.api.model.rbac.RoleBinding; import io.javaoperatorsdk.operator.api.reconciler.Context; -public class RoleBindingResourceUpdatePreProcessor - extends GenericResourceUpdatePreProcessor { +public class RoleBindingResourceUpdaterMatcher + extends GenericResourceUpdaterMatcher { @Override protected void updateClonedActual(RoleBinding actual, RoleBinding desired) { @@ -15,9 +15,8 @@ protected void updateClonedActual(RoleBinding actual, RoleBinding desired) { } @Override - public boolean matches(RoleBinding actual, RoleBinding desired, boolean equality, - Context context, - String[] ignoredPaths) { + public boolean matches(RoleBinding actual, RoleBinding desired, + Context context) { return Objects.equals(actual.getRoleRef(), desired.getRoleRef()) && Objects.equals(actual.getSubjects(), desired.getSubjects()); } diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/processors/RoleResourceUpdatePreProcessor.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/updatermatcher/RoleResourceUpdaterMatcher.java similarity index 63% rename from operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/processors/RoleResourceUpdatePreProcessor.java rename to operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/updatermatcher/RoleResourceUpdaterMatcher.java index 86241e3957..f02d946db8 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/processors/RoleResourceUpdatePreProcessor.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/updatermatcher/RoleResourceUpdaterMatcher.java @@ -1,11 +1,11 @@ -package io.javaoperatorsdk.operator.processing.dependent.kubernetes.processors; +package io.javaoperatorsdk.operator.processing.dependent.kubernetes.updatermatcher; import java.util.Objects; import io.fabric8.kubernetes.api.model.rbac.Role; import io.javaoperatorsdk.operator.api.reconciler.Context; -public class RoleResourceUpdatePreProcessor extends GenericResourceUpdatePreProcessor { +public class RoleResourceUpdaterMatcher extends GenericResourceUpdaterMatcher { @Override protected void updateClonedActual(Role actual, Role desired) { @@ -13,8 +13,7 @@ protected void updateClonedActual(Role actual, Role desired) { } @Override - public boolean matches(Role actual, Role desired, boolean equality, Context context, - String[] ignoredPaths) { + public boolean matches(Role actual, Role desired, Context context) { return Objects.equals(actual.getRules(), desired.getRules()); } } diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/processors/SecretResourceUpdatePreProcessor.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/updatermatcher/SecretResourceUpdaterMatcher.java similarity index 76% rename from operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/processors/SecretResourceUpdatePreProcessor.java rename to operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/updatermatcher/SecretResourceUpdaterMatcher.java index 163c93aba6..14e8696704 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/processors/SecretResourceUpdatePreProcessor.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/updatermatcher/SecretResourceUpdaterMatcher.java @@ -1,11 +1,11 @@ -package io.javaoperatorsdk.operator.processing.dependent.kubernetes.processors; +package io.javaoperatorsdk.operator.processing.dependent.kubernetes.updatermatcher; import java.util.Objects; import io.fabric8.kubernetes.api.model.Secret; import io.javaoperatorsdk.operator.api.reconciler.Context; -public class SecretResourceUpdatePreProcessor extends GenericResourceUpdatePreProcessor { +public class SecretResourceUpdaterMatcher extends GenericResourceUpdaterMatcher { @Override protected void updateClonedActual(Secret actual, Secret desired) { @@ -16,8 +16,7 @@ protected void updateClonedActual(Secret actual, Secret desired) { } @Override - public boolean matches(Secret actual, Secret desired, boolean equality, Context context, - String[] ignoredPaths) { + public boolean matches(Secret actual, Secret desired, Context context) { return Objects.equals(actual.getImmutable(), desired.getImmutable()) && Objects.equals(actual.getType(), desired.getType()) && Objects.equals(actual.getData(), desired.getData()) && diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/processors/ServiceAccountResourceUpdateProcessor.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/updatermatcher/ServiceAccountResourceUpdaterMatcher.java similarity index 80% rename from operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/processors/ServiceAccountResourceUpdateProcessor.java rename to operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/updatermatcher/ServiceAccountResourceUpdaterMatcher.java index 60f3e559bc..f3d625c778 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/processors/ServiceAccountResourceUpdateProcessor.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/updatermatcher/ServiceAccountResourceUpdaterMatcher.java @@ -1,12 +1,12 @@ -package io.javaoperatorsdk.operator.processing.dependent.kubernetes.processors; +package io.javaoperatorsdk.operator.processing.dependent.kubernetes.updatermatcher; import java.util.Objects; import io.fabric8.kubernetes.api.model.ServiceAccount; import io.javaoperatorsdk.operator.api.reconciler.Context; -public class ServiceAccountResourceUpdateProcessor - extends GenericResourceUpdatePreProcessor { +public class ServiceAccountResourceUpdaterMatcher + extends GenericResourceUpdaterMatcher { @Override protected void updateClonedActual(ServiceAccount actual, ServiceAccount desired) { @@ -16,8 +16,7 @@ protected void updateClonedActual(ServiceAccount actual, ServiceAccount desired) } @Override - public boolean matches(ServiceAccount actual, ServiceAccount desired, boolean equality, - Context context, String[] ignoredPaths) { + public boolean matches(ServiceAccount actual, ServiceAccount desired, Context context) { return Objects.equals(actual.getAutomountServiceAccountToken(), desired.getAutomountServiceAccountToken()) && Objects.equals(actual.getImagePullSecrets(), desired.getImagePullSecrets()) && diff --git a/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/GenericKubernetesResourceMatcherTest.java b/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/GenericKubernetesResourceMatcherTest.java index 2544e3977b..41bafe00e4 100644 --- a/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/GenericKubernetesResourceMatcherTest.java +++ b/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/GenericKubernetesResourceMatcherTest.java @@ -14,6 +14,7 @@ import io.javaoperatorsdk.operator.ReconcilerUtils; import io.javaoperatorsdk.operator.api.reconciler.Context; import io.javaoperatorsdk.operator.processing.dependent.Matcher; +import io.javaoperatorsdk.operator.processing.dependent.kubernetes.updatermatcher.GenericResourceUpdaterMatcher; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.mock; @@ -143,8 +144,8 @@ void checkServiceAccount() { .addNewImagePullSecret("imagePullSecret3") .build(); - final var matcher = GenericKubernetesResourceMatcher.matcherFor(serviceAccountDR); - assertThat(matcher.match(actual, null, context).matched()).isFalse(); + final var matcher = GenericResourceUpdaterMatcher.updaterMatcherFor(ServiceAccount.class); + assertThat(matcher.matches(actual, desired, context)).isFalse(); } Deployment createDeployment() { diff --git a/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/GenericResourceUpdatePreProcessorTest.java b/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/GenericResourceUpdaterMatcherTest.java similarity index 73% rename from operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/GenericResourceUpdatePreProcessorTest.java rename to operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/GenericResourceUpdaterMatcherTest.java index bcd0ca6c6e..c1d9b4a5a5 100644 --- a/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/GenericResourceUpdatePreProcessorTest.java +++ b/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/GenericResourceUpdaterMatcherTest.java @@ -6,26 +6,21 @@ import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; -import io.fabric8.kubernetes.api.model.HasMetadata; -import io.fabric8.kubernetes.api.model.Namespace; -import io.fabric8.kubernetes.api.model.NamespaceBuilder; -import io.fabric8.kubernetes.api.model.NamespaceSpec; -import io.fabric8.kubernetes.api.model.Secret; -import io.fabric8.kubernetes.api.model.SecretBuilder; +import io.fabric8.kubernetes.api.model.*; import io.fabric8.kubernetes.api.model.apps.Deployment; import io.javaoperatorsdk.operator.MockKubernetesClient; import io.javaoperatorsdk.operator.ReconcilerUtils; import io.javaoperatorsdk.operator.api.config.ConfigurationService; import io.javaoperatorsdk.operator.api.config.ControllerConfiguration; import io.javaoperatorsdk.operator.api.reconciler.Context; -import io.javaoperatorsdk.operator.processing.dependent.kubernetes.processors.GenericResourceUpdatePreProcessor; +import io.javaoperatorsdk.operator.processing.dependent.kubernetes.updatermatcher.GenericResourceUpdaterMatcher; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; @SuppressWarnings("rawtypes") -class GenericResourceUpdatePreProcessorTest { +class GenericResourceUpdaterMatcherTest { private static final Context context = mock(Context.class); @@ -44,7 +39,7 @@ static void setUp() { @Test void preservesValues() { - var processor = GenericResourceUpdatePreProcessor.processorFor(Deployment.class); + var processor = GenericResourceUpdaterMatcher.updaterMatcherFor(Deployment.class); var desired = createDeployment(); var actual = createDeployment(); actual.getMetadata().setLabels(new HashMap<>()); @@ -52,7 +47,7 @@ void preservesValues() { actual.getMetadata().setResourceVersion("1234"); actual.getSpec().setRevisionHistoryLimit(5); - var result = processor.replaceSpecOnActual(actual, desired, context); + var result = processor.updateResource(actual, desired, context); assertThat(result.getMetadata().getLabels().get("additionalActualKey")).isEqualTo("value"); assertThat(result.getMetadata().getResourceVersion()).isEqualTo("1234"); @@ -61,27 +56,27 @@ void preservesValues() { @Test void checkNamespaces() { - var processor = GenericResourceUpdatePreProcessor.processorFor(Namespace.class); + var processor = GenericResourceUpdaterMatcher.updaterMatcherFor(Namespace.class); var desired = new NamespaceBuilder().withNewMetadata().withName("foo").endMetadata().build(); var actual = new NamespaceBuilder().withNewMetadata().withName("foo").endMetadata().build(); actual.getMetadata().setLabels(new HashMap<>()); actual.getMetadata().getLabels().put("additionalActualKey", "value"); actual.getMetadata().setResourceVersion("1234"); - var result = processor.replaceSpecOnActual(actual, desired, context); + var result = processor.updateResource(actual, desired, context); assertThat(result.getMetadata().getLabels().get("additionalActualKey")).isEqualTo("value"); assertThat(result.getMetadata().getResourceVersion()).isEqualTo("1234"); desired.setSpec(new NamespaceSpec(List.of("halkyon.io/finalizer"))); - result = processor.replaceSpecOnActual(actual, desired, context); + result = processor.updateResource(actual, desired, context); assertThat(result.getMetadata().getLabels().get("additionalActualKey")).isEqualTo("value"); assertThat(result.getMetadata().getResourceVersion()).isEqualTo("1234"); assertThat(result.getSpec().getFinalizers()).containsExactly("halkyon.io/finalizer"); desired = new NamespaceBuilder().withNewMetadata().withName("foo").endMetadata().build(); - result = processor.replaceSpecOnActual(actual, desired, context); + result = processor.updateResource(actual, desired, context); assertThat(result.getMetadata().getLabels().get("additionalActualKey")).isEqualTo("value"); assertThat(result.getMetadata().getResourceVersion()).isEqualTo("1234"); assertThat(result.getSpec()).isNull(); @@ -89,12 +84,16 @@ void checkNamespaces() { @Test void checkSecret() { - var processor = GenericResourceUpdatePreProcessor.processorFor(Secret.class); + var processor = GenericResourceUpdaterMatcher.updaterMatcherFor(Secret.class); var desired = - new SecretBuilder().withImmutable().withType("Opaque").addToData("foo", "bar").build(); - var actual = new SecretBuilder().build(); - - final var secret = processor.replaceSpecOnActual(actual, desired, context); + new SecretBuilder() + .withMetadata(new ObjectMeta()) + .withImmutable().withType("Opaque").addToData("foo", "bar").build(); + var actual = new SecretBuilder() + .withMetadata(new ObjectMeta()) + .build(); + + final var secret = processor.updateResource(actual, desired, context); assertThat(secret.getImmutable()).isTrue(); assertThat(secret.getType()).isEqualTo("Opaque"); assertThat(secret.getData()).containsOnlyKeys("foo"); @@ -102,7 +101,7 @@ void checkSecret() { Deployment createDeployment() { return ReconcilerUtils.loadYaml( - Deployment.class, GenericResourceUpdatePreProcessorTest.class, "nginx-deployment.yaml"); + Deployment.class, GenericResourceUpdaterMatcherTest.class, "nginx-deployment.yaml"); } } diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/DependentSSAMigrationIT.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/DependentSSAMigrationIT.java index 7bedde86fe..7e226eca38 100644 --- a/operator-framework/src/test/java/io/javaoperatorsdk/operator/DependentSSAMigrationIT.java +++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/DependentSSAMigrationIT.java @@ -144,8 +144,7 @@ private DependnetSSACustomResource reconcileWithLegacyOperator(Operator legacyOp private Operator createOperator(KubernetesClient client, boolean legacyDependentHandling, String fieldManager) { Operator operator = new Operator(client, - o -> o.withSSABasedCreateUpdateForDependentResources(!legacyDependentHandling) - .withSSABasedDefaultMatchingForDependentResources(!legacyDependentHandling) + o -> o.withSSABasedCreateUpdateMatchForDependentResources(!legacyDependentHandling) .withCloseClientOnStop(false)); operator.register(new DependentSSAReconciler(), o -> { o.settingNamespace(namespace);