From edb17f2539be4e89691d630e4feaa70dc3e3e7d3 Mon Sep 17 00:00:00 2001 From: Chris Laprun Date: Wed, 12 Oct 2022 13:11:40 +0200 Subject: [PATCH 1/6] refactor: deleteBulkResource -> deleteTargetResource --- .../processing/dependent/BulkDependentResource.java | 10 ++++++---- .../dependent/BulkDependentResourceReconciler.java | 2 +- .../kubernetes/KubernetesDependentResource.java | 2 +- .../external/ExternalBulkDependentResource.java | 3 ++- 4 files changed, 10 insertions(+), 7 deletions(-) diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/BulkDependentResource.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/BulkDependentResource.java index 5912a0f75c..a86b6ee0e8 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/BulkDependentResource.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/BulkDependentResource.java @@ -41,14 +41,16 @@ public interface BulkDependentResource Map getSecondaryResources(P primary, Context

context); /** - * Used to delete resource if the desired count is lower than the actual count of a resource. + * Deletes the actual resource identified by the specified key if it's not in the set of desired + * secondary resources for the specified primary. * - * @param primary resource - * @param resource actual resource from the cache for the index + * @param primary the primary resource for which we want to remove now undesired secondary + * resources still present on the cluster + * @param resource the actual resource existing on the cluster that needs to be removed * @param key key of the resource * @param context actual context */ - void deleteBulkResource(P primary, R resource, String key, Context

context); + void deleteTargetResource(P primary, R resource, String key, Context

context); /** * Determines whether the specified secondary resource matches the desired state with target index diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/BulkDependentResourceReconciler.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/BulkDependentResourceReconciler.java index d0e3128983..b61d43e79e 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/BulkDependentResourceReconciler.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/BulkDependentResourceReconciler.java @@ -52,7 +52,7 @@ private void deleteBulkResourcesIfRequired(Set expectedKeys, Map actualResources, P primary, Context

context) { actualResources.forEach((key, value) -> { if (!expectedKeys.contains(key)) { - bulkDependentResource.deleteBulkResource(primary, value, key, context); + bulkDependentResource.deleteTargetResource(primary, value, key, context); } }); } 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 8674da97d2..070c8f8ffe 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 @@ -150,7 +150,7 @@ protected void handleDelete(P primary, Context

context) { } @SuppressWarnings("unused") - public void deleteBulkResource(P primary, R resource, String key, Context

context) { + public void deleteTargetResource(P primary, R resource, String key, Context

context) { client.resource(resource).delete(); } diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/bulkdependent/external/ExternalBulkDependentResource.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/bulkdependent/external/ExternalBulkDependentResource.java index ec8161bae8..afad17b1d9 100644 --- a/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/bulkdependent/external/ExternalBulkDependentResource.java +++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/bulkdependent/external/ExternalBulkDependentResource.java @@ -86,7 +86,8 @@ public Map getSecondaryResources( } @Override - public void deleteBulkResource(BulkDependentTestCustomResource primary, ExternalResource resource, + public void deleteTargetResource(BulkDependentTestCustomResource primary, + ExternalResource resource, String key, Context context) { externalServiceMock.delete(resource.getId()); From bad4d3b4ab7b30da55391094f6c46133f68e2a86 Mon Sep 17 00:00:00 2001 From: Chris Laprun Date: Wed, 12 Oct 2022 13:12:26 +0200 Subject: [PATCH 2/6] refactor: remove unneeded key parameter --- .../processing/dependent/BulkDependentResource.java | 9 ++++----- .../dependent/BulkDependentResourceReconciler.java | 2 +- .../kubernetes/KubernetesDependentResource.java | 2 +- .../external/ExternalBulkDependentResource.java | 1 - 4 files changed, 6 insertions(+), 8 deletions(-) diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/BulkDependentResource.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/BulkDependentResource.java index a86b6ee0e8..cbcddb84a4 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/BulkDependentResource.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/BulkDependentResource.java @@ -44,13 +44,12 @@ public interface BulkDependentResource * Deletes the actual resource identified by the specified key if it's not in the set of desired * secondary resources for the specified primary. * - * @param primary the primary resource for which we want to remove now undesired secondary - * resources still present on the cluster + * @param primary the primary resource for which we want to remove now undesired secondary + * resources still present on the cluster * @param resource the actual resource existing on the cluster that needs to be removed - * @param key key of the resource - * @param context actual context + * @param context actual context */ - void deleteTargetResource(P primary, R resource, String key, Context

context); + void deleteTargetResource(P primary, R resource, Context

context); /** * Determines whether the specified secondary resource matches the desired state with target index diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/BulkDependentResourceReconciler.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/BulkDependentResourceReconciler.java index b61d43e79e..7ec895ad7b 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/BulkDependentResourceReconciler.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/BulkDependentResourceReconciler.java @@ -52,7 +52,7 @@ private void deleteBulkResourcesIfRequired(Set expectedKeys, Map actualResources, P primary, Context

context) { actualResources.forEach((key, value) -> { if (!expectedKeys.contains(key)) { - bulkDependentResource.deleteTargetResource(primary, value, key, context); + bulkDependentResource.deleteTargetResource(primary, value, context); } }); } 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 070c8f8ffe..d48a0c0572 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 @@ -150,7 +150,7 @@ protected void handleDelete(P primary, Context

context) { } @SuppressWarnings("unused") - public void deleteTargetResource(P primary, R resource, String key, Context

context) { + public void deleteTargetResource(P primary, R resource, Context

context) { client.resource(resource).delete(); } diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/bulkdependent/external/ExternalBulkDependentResource.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/bulkdependent/external/ExternalBulkDependentResource.java index afad17b1d9..3deef8d634 100644 --- a/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/bulkdependent/external/ExternalBulkDependentResource.java +++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/bulkdependent/external/ExternalBulkDependentResource.java @@ -88,7 +88,6 @@ public Map getSecondaryResources( @Override public void deleteTargetResource(BulkDependentTestCustomResource primary, ExternalResource resource, - String key, Context context) { externalServiceMock.delete(resource.getId()); } From 6f59d12313933769c4ed797723c89cf512d877fb Mon Sep 17 00:00:00 2001 From: Chris Laprun Date: Wed, 12 Oct 2022 13:12:52 +0200 Subject: [PATCH 3/6] refactor: remove unneeded key parameter --- .../processing/dependent/BulkDependentResource.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/BulkDependentResource.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/BulkDependentResource.java index cbcddb84a4..ff9f7fc823 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/BulkDependentResource.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/BulkDependentResource.java @@ -41,13 +41,13 @@ public interface BulkDependentResource Map getSecondaryResources(P primary, Context

context); /** - * Deletes the actual resource identified by the specified key if it's not in the set of desired - * secondary resources for the specified primary. + * Deletes the actual resource if it's not in the set of desired secondary resources for the + * specified primary. * - * @param primary the primary resource for which we want to remove now undesired secondary - * resources still present on the cluster + * @param primary the primary resource for which we want to remove now undesired secondary + * resources still present on the cluster * @param resource the actual resource existing on the cluster that needs to be removed - * @param context actual context + * @param context actual context */ void deleteTargetResource(P primary, R resource, Context

context); From 94b056a6367919882575486128d205496f359084 Mon Sep 17 00:00:00 2001 From: Chris Laprun Date: Wed, 12 Oct 2022 13:44:03 +0200 Subject: [PATCH 4/6] refactor: rename bulk to dynamically created to be more accurate --- .../dependent/AbstractDependentResource.java | 5 +- .../processing/dependent/BulkUpdater.java | 24 --------- ... DynamicallyCreatedDependentResource.java} | 2 +- ...lyCreatedDependentResourceReconciler.java} | 51 ++++++++++--------- .../dependent/DynamicallyCreatedUpdater.java | 25 +++++++++ ...T.java => DynamicExternalDependentIT.java} | 8 +-- ...DynamicallyCreatedDependentDeleterIT.java} | 2 +- ... DynamicallyCreatedDependentTestBase.java} | 21 ++++---- ...ManagedDynamicallyCreatedDependentIT.java} | 6 +-- ...ndaloneDynamicallyCreatedDependentIT.java} | 7 +-- .../CRUDConfigMapBulkDependentResource.java | 7 --- ...apDynamicallyCreatedDependentResource.java | 8 +++ ...rDynamicallyCreatedDependentResource.java} | 28 +++++----- ...> DynamicDependentTestCustomResource.java} | 2 +- .../ManagedDeleterBulkReconciler.java | 11 ++-- ...=> ManagedDynamicDependentReconciler.java} | 13 ++--- ...StandaloneDynamicDependentReconciler.java} | 20 ++++---- .../ExternalBulkResourceReconciler.java | 19 ------- .../ExternalDynamicResourceReconciler.java | 22 ++++++++ ...lDynamicallyCreatedDependentResource.java} | 39 +++++++------- 20 files changed, 166 insertions(+), 154 deletions(-) delete mode 100644 operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/BulkUpdater.java rename operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/{BulkDependentResource.java => DynamicallyCreatedDependentResource.java} (97%) rename operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/{BulkDependentResourceReconciler.java => DynamicallyCreatedDependentResourceReconciler.java} (63%) create mode 100644 operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/DynamicallyCreatedUpdater.java rename operator-framework/src/test/java/io/javaoperatorsdk/operator/bulkdependent/{BulkExternalDependentIT.java => DynamicExternalDependentIT.java} (89%) rename operator-framework/src/test/java/io/javaoperatorsdk/operator/bulkdependent/{BulkDependentDeleterIT.java => DynamicallyCreatedDependentDeleterIT.java} (84%) rename operator-framework/src/test/java/io/javaoperatorsdk/operator/bulkdependent/{BulkDependentTestBase.java => DynamicallyCreatedDependentTestBase.java} (84%) rename operator-framework/src/test/java/io/javaoperatorsdk/operator/bulkdependent/{ManagedBulkDependentIT.java => ManagedDynamicallyCreatedDependentIT.java} (65%) rename operator-framework/src/test/java/io/javaoperatorsdk/operator/bulkdependent/{StandaloneBulkDependentIT.java => StandaloneDynamicallyCreatedDependentIT.java} (63%) delete mode 100644 operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/bulkdependent/CRUDConfigMapBulkDependentResource.java create mode 100644 operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/bulkdependent/CRUDConfigMapDynamicallyCreatedDependentResource.java rename operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/bulkdependent/{ConfigMapDeleterBulkDependentResource.java => ConfigMapDeleterDynamicallyCreatedDependentResource.java} (66%) rename operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/bulkdependent/{BulkDependentTestCustomResource.java => DynamicDependentTestCustomResource.java} (90%) rename operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/bulkdependent/{ManagedBulkDependentReconciler.java => ManagedDynamicDependentReconciler.java} (58%) rename operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/bulkdependent/{StandaloneBulkDependentReconciler.java => StandaloneDynamicDependentReconciler.java} (64%) delete mode 100644 operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/bulkdependent/external/ExternalBulkResourceReconciler.java create mode 100644 operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/bulkdependent/external/ExternalDynamicResourceReconciler.java rename operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/bulkdependent/external/{ExternalBulkDependentResource.java => ExternalDynamicallyCreatedDependentResource.java} (64%) diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/AbstractDependentResource.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/AbstractDependentResource.java index 2c8e5af017..b9629de14a 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/AbstractDependentResource.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/AbstractDependentResource.java @@ -32,8 +32,9 @@ protected AbstractDependentResource() { creator = creatable ? (Creator) this : null; updater = updatable ? (Updater) this : null; - dependentResourceReconciler = this instanceof BulkDependentResource - ? new BulkDependentResourceReconciler<>((BulkDependentResource) this) + dependentResourceReconciler = this instanceof DynamicallyCreatedDependentResource + ? new DynamicallyCreatedDependentResourceReconciler<>( + (DynamicallyCreatedDependentResource) this) : new SingleDependentResourceReconciler<>(this); } diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/BulkUpdater.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/BulkUpdater.java deleted file mode 100644 index ee8f08a68d..0000000000 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/BulkUpdater.java +++ /dev/null @@ -1,24 +0,0 @@ -package io.javaoperatorsdk.operator.processing.dependent; - -import io.fabric8.kubernetes.api.model.HasMetadata; -import io.javaoperatorsdk.operator.api.reconciler.Context; - -/** - * Helper for the Bulk Dependent Resources to make it more explicit that bulk needs to only - * implement the index aware match method. - * - * @param secondary resource type - * @param

primary resource type - */ -public interface BulkUpdater extends Updater { - - default Matcher.Result match(R actualResource, P primary, Context

context) { - if (!(this instanceof BulkDependentResource)) { - throw new IllegalStateException( - BulkUpdater.class.getSimpleName() + " interface should only be implemented by " - + BulkDependentResource.class.getSimpleName() + " implementations"); - } - throw new IllegalStateException("This method should not be called from a " - + BulkDependentResource.class.getSimpleName() + " implementation"); - } -} diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/BulkDependentResource.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/DynamicallyCreatedDependentResource.java similarity index 97% rename from operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/BulkDependentResource.java rename to operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/DynamicallyCreatedDependentResource.java index ff9f7fc823..4e761fa759 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/BulkDependentResource.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/DynamicallyCreatedDependentResource.java @@ -13,7 +13,7 @@ * {@link Creator} and {@link Deleter} interfaces out of the box. A concrete dependent resource can * implement additionally also {@link Updater}. */ -public interface BulkDependentResource +public interface DynamicallyCreatedDependentResource extends Creator, Deleter

{ /** diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/BulkDependentResourceReconciler.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/DynamicallyCreatedDependentResourceReconciler.java similarity index 63% rename from operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/BulkDependentResourceReconciler.java rename to operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/DynamicallyCreatedDependentResourceReconciler.java index 7ec895ad7b..ba737b19e5 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/BulkDependentResourceReconciler.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/DynamicallyCreatedDependentResourceReconciler.java @@ -13,29 +13,29 @@ import io.javaoperatorsdk.operator.processing.dependent.Matcher.Result; import io.javaoperatorsdk.operator.processing.event.ResourceID; -class BulkDependentResourceReconciler +class DynamicallyCreatedDependentResourceReconciler implements DependentResourceReconciler { - private final BulkDependentResource bulkDependentResource; + private final DynamicallyCreatedDependentResource delegate; - BulkDependentResourceReconciler(BulkDependentResource bulkDependentResource) { - this.bulkDependentResource = bulkDependentResource; + DynamicallyCreatedDependentResourceReconciler( + DynamicallyCreatedDependentResource delegate) { + this.delegate = delegate; } @Override public ReconcileResult reconcile(P primary, Context

context) { - final var desiredResources = bulkDependentResource.desiredResources(primary, context); - Map actualResources = bulkDependentResource.getSecondaryResources(primary, context); + final var desiredResources = delegate.desiredResources(primary, context); + Map actualResources = delegate.getSecondaryResources(primary, context); // remove existing resources that are not needed anymore according to the primary state deleteBulkResourcesIfRequired(desiredResources.keySet(), actualResources, primary, context); final List> results = new ArrayList<>(desiredResources.size()); - final var updatable = bulkDependentResource instanceof Updater; + final var updatable = delegate instanceof Updater; desiredResources.forEach((key, value) -> { - final var instance = - updatable ? new UpdatableBulkDependentResourceInstance<>(bulkDependentResource, value) - : new BulkDependentResourceInstance<>(bulkDependentResource, value); + final var instance = updatable ? new UpdatableDynamicDependentInstance<>(delegate, value) + : new DynamicDependentInstance<>(delegate, value); results.add(instance.reconcile(primary, actualResources.get(key), context)); }); @@ -44,7 +44,8 @@ public ReconcileResult reconcile(P primary, Context

context) { @Override public void delete(P primary, Context

context) { - var actualResources = bulkDependentResource.getSecondaryResources(primary, context); + var actualResources = + delegate.getSecondaryResources(primary, context); deleteBulkResourcesIfRequired(Collections.emptySet(), actualResources, primary, context); } @@ -52,7 +53,7 @@ private void deleteBulkResourcesIfRequired(Set expectedKeys, Map actualResources, P primary, Context

context) { actualResources.forEach((key, value) -> { if (!expectedKeys.contains(key)) { - bulkDependentResource.deleteTargetResource(primary, value, context); + delegate.deleteTargetResource(primary, value, context); } }); } @@ -64,21 +65,21 @@ private void deleteBulkResourcesIfRequired(Set expectedKeys, * @param * @param

*/ - private static class BulkDependentResourceInstance + private static class DynamicDependentInstance extends AbstractDependentResource implements Creator, Deleter

{ - private final BulkDependentResource bulkDependentResource; + private final DynamicallyCreatedDependentResource delegate; private final R desired; - private BulkDependentResourceInstance(BulkDependentResource bulkDependentResource, + private DynamicDependentInstance(DynamicallyCreatedDependentResource delegate, R desired) { - this.bulkDependentResource = bulkDependentResource; + this.delegate = delegate; this.desired = desired; } @SuppressWarnings("unchecked") private AbstractDependentResource asAbstractDependentResource() { - return (AbstractDependentResource) bulkDependentResource; + return (AbstractDependentResource) delegate; } @Override @@ -88,12 +89,13 @@ protected R desired(P primary, Context

context) { @SuppressWarnings("unchecked") public R update(R actual, R desired, P primary, Context

context) { - return ((Updater) bulkDependentResource).update(actual, desired, primary, context); + return ((Updater) delegate).update(actual, desired, primary, + context); } @Override public Result match(R resource, P primary, Context

context) { - return bulkDependentResource.match(resource, desired, primary, context); + return delegate.match(resource, desired, primary, context); } @Override @@ -113,7 +115,7 @@ public Class resourceType() { @Override public R create(R desired, P primary, Context

context) { - return bulkDependentResource.create(desired, primary, context); + return delegate.create(desired, primary, context); } } @@ -123,13 +125,12 @@ public R create(R desired, P primary, Context

context) { * @param * @param

*/ - private static class UpdatableBulkDependentResourceInstance - extends BulkDependentResourceInstance implements Updater { + private static class UpdatableDynamicDependentInstance + extends DynamicDependentInstance implements Updater { - private UpdatableBulkDependentResourceInstance( - BulkDependentResource bulkDependentResource, + private UpdatableDynamicDependentInstance(DynamicallyCreatedDependentResource delegate, R desired) { - super(bulkDependentResource, desired); + super(delegate, desired); } } } diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/DynamicallyCreatedUpdater.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/DynamicallyCreatedUpdater.java new file mode 100644 index 0000000000..403c7d2e04 --- /dev/null +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/DynamicallyCreatedUpdater.java @@ -0,0 +1,25 @@ +package io.javaoperatorsdk.operator.processing.dependent; + +import io.fabric8.kubernetes.api.model.HasMetadata; +import io.javaoperatorsdk.operator.api.reconciler.Context; + +/** + * Helper for the dynamically-created Dependent Resources to make it more explicit that such + * dependents only to implement + * {@link DynamicallyCreatedDependentResource#match(Object, Object, HasMetadata, Context)} + * + * @param secondary resource type + * @param

primary resource type + */ +public interface DynamicallyCreatedUpdater extends Updater { + + default Matcher.Result match(R actualResource, P primary, Context

context) { + if (!(this instanceof DynamicallyCreatedDependentResource)) { + throw new IllegalStateException(DynamicallyCreatedUpdater.class.getSimpleName() + + " interface should only be implemented by " + + DynamicallyCreatedDependentResource.class.getSimpleName() + " implementations"); + } + throw new IllegalStateException("This method should not be called from a " + + DynamicallyCreatedDependentResource.class.getSimpleName() + " implementation"); + } +} diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/bulkdependent/BulkExternalDependentIT.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/bulkdependent/DynamicExternalDependentIT.java similarity index 89% rename from operator-framework/src/test/java/io/javaoperatorsdk/operator/bulkdependent/BulkExternalDependentIT.java rename to operator-framework/src/test/java/io/javaoperatorsdk/operator/bulkdependent/DynamicExternalDependentIT.java index 29f66e8205..a78741dcb9 100644 --- a/operator-framework/src/test/java/io/javaoperatorsdk/operator/bulkdependent/BulkExternalDependentIT.java +++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/bulkdependent/DynamicExternalDependentIT.java @@ -4,18 +4,18 @@ import org.junit.jupiter.api.extension.RegisterExtension; import io.javaoperatorsdk.operator.junit.LocallyRunOperatorExtension; -import io.javaoperatorsdk.operator.sample.bulkdependent.external.ExternalBulkResourceReconciler; +import io.javaoperatorsdk.operator.sample.bulkdependent.external.ExternalDynamicResourceReconciler; import io.javaoperatorsdk.operator.sample.bulkdependent.external.ExternalServiceMock; -import static io.javaoperatorsdk.operator.bulkdependent.BulkDependentTestBase.*; +import static io.javaoperatorsdk.operator.bulkdependent.DynamicallyCreatedDependentTestBase.*; import static org.assertj.core.api.Assertions.assertThat; import static org.awaitility.Awaitility.await; -class BulkExternalDependentIT { +class DynamicExternalDependentIT { @RegisterExtension LocallyRunOperatorExtension extension = - LocallyRunOperatorExtension.builder().withReconciler(new ExternalBulkResourceReconciler()) + LocallyRunOperatorExtension.builder().withReconciler(new ExternalDynamicResourceReconciler()) .build(); ExternalServiceMock externalServiceMock = ExternalServiceMock.getInstance(); diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/bulkdependent/BulkDependentDeleterIT.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/bulkdependent/DynamicallyCreatedDependentDeleterIT.java similarity index 84% rename from operator-framework/src/test/java/io/javaoperatorsdk/operator/bulkdependent/BulkDependentDeleterIT.java rename to operator-framework/src/test/java/io/javaoperatorsdk/operator/bulkdependent/DynamicallyCreatedDependentDeleterIT.java index a934bdd1f3..268609d502 100644 --- a/operator-framework/src/test/java/io/javaoperatorsdk/operator/bulkdependent/BulkDependentDeleterIT.java +++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/bulkdependent/DynamicallyCreatedDependentDeleterIT.java @@ -5,7 +5,7 @@ import io.javaoperatorsdk.operator.junit.LocallyRunOperatorExtension; import io.javaoperatorsdk.operator.sample.bulkdependent.ManagedDeleterBulkReconciler; -public class BulkDependentDeleterIT extends BulkDependentTestBase { +public class DynamicallyCreatedDependentDeleterIT extends DynamicallyCreatedDependentTestBase { @RegisterExtension LocallyRunOperatorExtension extension = diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/bulkdependent/BulkDependentTestBase.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/bulkdependent/DynamicallyCreatedDependentTestBase.java similarity index 84% rename from operator-framework/src/test/java/io/javaoperatorsdk/operator/bulkdependent/BulkDependentTestBase.java rename to operator-framework/src/test/java/io/javaoperatorsdk/operator/bulkdependent/DynamicallyCreatedDependentTestBase.java index 605731623c..907b8eb284 100644 --- a/operator-framework/src/test/java/io/javaoperatorsdk/operator/bulkdependent/BulkDependentTestBase.java +++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/bulkdependent/DynamicallyCreatedDependentTestBase.java @@ -6,16 +6,16 @@ import io.fabric8.kubernetes.api.model.ObjectMeta; import io.javaoperatorsdk.operator.junit.LocallyRunOperatorExtension; -import io.javaoperatorsdk.operator.sample.bulkdependent.BulkDependentTestCustomResource; import io.javaoperatorsdk.operator.sample.bulkdependent.BulkDependentTestSpec; -import io.javaoperatorsdk.operator.sample.bulkdependent.ConfigMapDeleterBulkDependentResource; +import io.javaoperatorsdk.operator.sample.bulkdependent.ConfigMapDeleterDynamicallyCreatedDependentResource; +import io.javaoperatorsdk.operator.sample.bulkdependent.DynamicDependentTestCustomResource; -import static io.javaoperatorsdk.operator.sample.bulkdependent.ConfigMapDeleterBulkDependentResource.LABEL_KEY; -import static io.javaoperatorsdk.operator.sample.bulkdependent.ConfigMapDeleterBulkDependentResource.LABEL_VALUE; +import static io.javaoperatorsdk.operator.sample.bulkdependent.ConfigMapDeleterDynamicallyCreatedDependentResource.LABEL_KEY; +import static io.javaoperatorsdk.operator.sample.bulkdependent.ConfigMapDeleterDynamicallyCreatedDependentResource.LABEL_VALUE; import static org.assertj.core.api.Assertions.assertThat; import static org.awaitility.Awaitility.await; -public abstract class BulkDependentTestBase { +public abstract class DynamicallyCreatedDependentTestBase { public static final String TEST_RESOURCE_NAME = "test"; public static final int INITIAL_NUMBER_OF_CONFIG_MAPS = 3; @@ -68,15 +68,14 @@ private void assertAdditionalDataOnConfigMaps(String expectedValue) { extension().getKubernetesClient().configMaps().inNamespace(extension().getNamespace()) .withLabel(LABEL_KEY, LABEL_VALUE) .list().getItems(); - cms.forEach(cm -> { - assertThat(cm.getData().get(ConfigMapDeleterBulkDependentResource.ADDITIONAL_DATA_KEY)) - .isEqualTo(expectedValue); - }); + cms.forEach(cm -> assertThat(cm.getData() + .get(ConfigMapDeleterDynamicallyCreatedDependentResource.ADDITIONAL_DATA_KEY)) + .isEqualTo(expectedValue)); }); } - public static BulkDependentTestCustomResource testResource() { - BulkDependentTestCustomResource cr = new BulkDependentTestCustomResource(); + public static DynamicDependentTestCustomResource testResource() { + DynamicDependentTestCustomResource cr = new DynamicDependentTestCustomResource(); cr.setMetadata(new ObjectMeta()); cr.getMetadata().setName(TEST_RESOURCE_NAME); cr.setSpec(new BulkDependentTestSpec()); diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/bulkdependent/ManagedBulkDependentIT.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/bulkdependent/ManagedDynamicallyCreatedDependentIT.java similarity index 65% rename from operator-framework/src/test/java/io/javaoperatorsdk/operator/bulkdependent/ManagedBulkDependentIT.java rename to operator-framework/src/test/java/io/javaoperatorsdk/operator/bulkdependent/ManagedDynamicallyCreatedDependentIT.java index 7f074ac8f5..05143b6e1b 100644 --- a/operator-framework/src/test/java/io/javaoperatorsdk/operator/bulkdependent/ManagedBulkDependentIT.java +++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/bulkdependent/ManagedDynamicallyCreatedDependentIT.java @@ -3,13 +3,13 @@ import org.junit.jupiter.api.extension.RegisterExtension; import io.javaoperatorsdk.operator.junit.LocallyRunOperatorExtension; -import io.javaoperatorsdk.operator.sample.bulkdependent.ManagedBulkDependentReconciler; +import io.javaoperatorsdk.operator.sample.bulkdependent.ManagedDynamicDependentReconciler; -class ManagedBulkDependentIT extends BulkDependentTestBase { +class ManagedDynamicallyCreatedDependentIT extends DynamicallyCreatedDependentTestBase { @RegisterExtension LocallyRunOperatorExtension extension = - LocallyRunOperatorExtension.builder().withReconciler(new ManagedBulkDependentReconciler()) + LocallyRunOperatorExtension.builder().withReconciler(new ManagedDynamicDependentReconciler()) .build(); diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/bulkdependent/StandaloneBulkDependentIT.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/bulkdependent/StandaloneDynamicallyCreatedDependentIT.java similarity index 63% rename from operator-framework/src/test/java/io/javaoperatorsdk/operator/bulkdependent/StandaloneBulkDependentIT.java rename to operator-framework/src/test/java/io/javaoperatorsdk/operator/bulkdependent/StandaloneDynamicallyCreatedDependentIT.java index 683cc1662b..81d5da8382 100644 --- a/operator-framework/src/test/java/io/javaoperatorsdk/operator/bulkdependent/StandaloneBulkDependentIT.java +++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/bulkdependent/StandaloneDynamicallyCreatedDependentIT.java @@ -3,13 +3,14 @@ import org.junit.jupiter.api.extension.RegisterExtension; import io.javaoperatorsdk.operator.junit.LocallyRunOperatorExtension; -import io.javaoperatorsdk.operator.sample.bulkdependent.StandaloneBulkDependentReconciler; +import io.javaoperatorsdk.operator.sample.bulkdependent.StandaloneDynamicDependentReconciler; -class StandaloneBulkDependentIT extends BulkDependentTestBase { +class StandaloneDynamicallyCreatedDependentIT extends DynamicallyCreatedDependentTestBase { @RegisterExtension LocallyRunOperatorExtension extension = - LocallyRunOperatorExtension.builder().withReconciler(new StandaloneBulkDependentReconciler()) + LocallyRunOperatorExtension.builder() + .withReconciler(new StandaloneDynamicDependentReconciler()) .build(); @Override diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/bulkdependent/CRUDConfigMapBulkDependentResource.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/bulkdependent/CRUDConfigMapBulkDependentResource.java deleted file mode 100644 index 83cec0bb69..0000000000 --- a/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/bulkdependent/CRUDConfigMapBulkDependentResource.java +++ /dev/null @@ -1,7 +0,0 @@ -package io.javaoperatorsdk.operator.sample.bulkdependent; - -import io.javaoperatorsdk.operator.api.reconciler.dependent.GarbageCollected; - -public class CRUDConfigMapBulkDependentResource extends ConfigMapDeleterBulkDependentResource - implements GarbageCollected { -} diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/bulkdependent/CRUDConfigMapDynamicallyCreatedDependentResource.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/bulkdependent/CRUDConfigMapDynamicallyCreatedDependentResource.java new file mode 100644 index 0000000000..d16c3a9247 --- /dev/null +++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/bulkdependent/CRUDConfigMapDynamicallyCreatedDependentResource.java @@ -0,0 +1,8 @@ +package io.javaoperatorsdk.operator.sample.bulkdependent; + +import io.javaoperatorsdk.operator.api.reconciler.dependent.GarbageCollected; + +public class CRUDConfigMapDynamicallyCreatedDependentResource extends + ConfigMapDeleterDynamicallyCreatedDependentResource + implements GarbageCollected { +} diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/bulkdependent/ConfigMapDeleterBulkDependentResource.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/bulkdependent/ConfigMapDeleterDynamicallyCreatedDependentResource.java similarity index 66% rename from operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/bulkdependent/ConfigMapDeleterBulkDependentResource.java rename to operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/bulkdependent/ConfigMapDeleterDynamicallyCreatedDependentResource.java index a04224790c..6bc73d42d7 100644 --- a/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/bulkdependent/ConfigMapDeleterBulkDependentResource.java +++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/bulkdependent/ConfigMapDeleterDynamicallyCreatedDependentResource.java @@ -6,34 +6,34 @@ import io.fabric8.kubernetes.api.model.ObjectMetaBuilder; import io.javaoperatorsdk.operator.api.reconciler.Context; import io.javaoperatorsdk.operator.api.reconciler.dependent.Deleter; -import io.javaoperatorsdk.operator.processing.dependent.BulkDependentResource; import io.javaoperatorsdk.operator.processing.dependent.Creator; +import io.javaoperatorsdk.operator.processing.dependent.DynamicallyCreatedDependentResource; import io.javaoperatorsdk.operator.processing.dependent.Updater; import io.javaoperatorsdk.operator.processing.dependent.kubernetes.KubernetesDependentResource; /** * Not using CRUDKubernetesDependentResource so the delete functionality can be tested. */ -public class ConfigMapDeleterBulkDependentResource +public class ConfigMapDeleterDynamicallyCreatedDependentResource extends - KubernetesDependentResource - implements Creator, - Updater, - Deleter, - BulkDependentResource { + KubernetesDependentResource + implements Creator, + Updater, + Deleter, + DynamicallyCreatedDependentResource { public static final String LABEL_KEY = "bulk"; public static final String LABEL_VALUE = "true"; public static final String ADDITIONAL_DATA_KEY = "additionalData"; public static final String INDEX_DELIMITER = "-"; - public ConfigMapDeleterBulkDependentResource() { + public ConfigMapDeleterDynamicallyCreatedDependentResource() { super(ConfigMap.class); } @Override - public Map desiredResources(BulkDependentTestCustomResource primary, - Context context) { + public Map desiredResources(DynamicDependentTestCustomResource primary, + Context context) { var number = primary.getSpec().getNumberOfResources(); Map res = new HashMap<>(); for (int i = 0; i < number; i++) { @@ -43,8 +43,8 @@ public Map desiredResources(BulkDependentTestCustomResource p return res; } - public ConfigMap desired(BulkDependentTestCustomResource primary, String key, - Context context) { + public ConfigMap desired(DynamicDependentTestCustomResource primary, String key, + Context context) { ConfigMap configMap = new ConfigMap(); configMap.setMetadata(new ObjectMetaBuilder() .withName(primary.getMetadata().getName() + INDEX_DELIMITER + key) @@ -57,8 +57,8 @@ public ConfigMap desired(BulkDependentTestCustomResource primary, String key, } @Override - public Map getSecondaryResources(BulkDependentTestCustomResource primary, - Context context) { + public Map getSecondaryResources(DynamicDependentTestCustomResource primary, + Context context) { var configMaps = context.getSecondaryResources(ConfigMap.class); Map result = new HashMap<>(configMaps.size()); configMaps.forEach(cm -> { diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/bulkdependent/BulkDependentTestCustomResource.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/bulkdependent/DynamicDependentTestCustomResource.java similarity index 90% rename from operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/bulkdependent/BulkDependentTestCustomResource.java rename to operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/bulkdependent/DynamicDependentTestCustomResource.java index 68e6297f8c..46da72fb56 100644 --- a/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/bulkdependent/BulkDependentTestCustomResource.java +++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/bulkdependent/DynamicDependentTestCustomResource.java @@ -9,7 +9,7 @@ @Group("sample.javaoperatorsdk") @Version("v1") @ShortNames("sbd") -public class BulkDependentTestCustomResource +public class DynamicDependentTestCustomResource extends CustomResource implements Namespaced { } diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/bulkdependent/ManagedDeleterBulkReconciler.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/bulkdependent/ManagedDeleterBulkReconciler.java index e759bdd200..bcf1d8513a 100644 --- a/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/bulkdependent/ManagedDeleterBulkReconciler.java +++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/bulkdependent/ManagedDeleterBulkReconciler.java @@ -7,12 +7,13 @@ import io.javaoperatorsdk.operator.api.reconciler.dependent.Dependent; @ControllerConfiguration( - dependents = @Dependent(type = ConfigMapDeleterBulkDependentResource.class)) -public class ManagedDeleterBulkReconciler implements Reconciler { + dependents = @Dependent(type = ConfigMapDeleterDynamicallyCreatedDependentResource.class)) +public class ManagedDeleterBulkReconciler + implements Reconciler { @Override - public UpdateControl reconcile( - BulkDependentTestCustomResource resource, - Context context) + public UpdateControl reconcile( + DynamicDependentTestCustomResource resource, + Context context) throws Exception { return UpdateControl.noUpdate(); diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/bulkdependent/ManagedBulkDependentReconciler.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/bulkdependent/ManagedDynamicDependentReconciler.java similarity index 58% rename from operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/bulkdependent/ManagedBulkDependentReconciler.java rename to operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/bulkdependent/ManagedDynamicDependentReconciler.java index 3b2acd942e..52e5155263 100644 --- a/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/bulkdependent/ManagedBulkDependentReconciler.java +++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/bulkdependent/ManagedDynamicDependentReconciler.java @@ -8,16 +8,17 @@ import io.javaoperatorsdk.operator.api.reconciler.UpdateControl; import io.javaoperatorsdk.operator.api.reconciler.dependent.Dependent; -@ControllerConfiguration(dependents = @Dependent(type = CRUDConfigMapBulkDependentResource.class)) -public class ManagedBulkDependentReconciler - implements Reconciler { +@ControllerConfiguration( + dependents = @Dependent(type = CRUDConfigMapDynamicallyCreatedDependentResource.class)) +public class ManagedDynamicDependentReconciler + implements Reconciler { private final AtomicInteger numberOfExecutions = new AtomicInteger(0); @Override - public UpdateControl reconcile( - BulkDependentTestCustomResource resource, - Context context) throws Exception { + public UpdateControl reconcile( + DynamicDependentTestCustomResource resource, + Context context) throws Exception { numberOfExecutions.addAndGet(1); return UpdateControl.noUpdate(); diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/bulkdependent/StandaloneBulkDependentReconciler.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/bulkdependent/StandaloneDynamicDependentReconciler.java similarity index 64% rename from operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/bulkdependent/StandaloneBulkDependentReconciler.java rename to operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/bulkdependent/StandaloneDynamicDependentReconciler.java index 4033583340..bab2eb8b45 100644 --- a/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/bulkdependent/StandaloneBulkDependentReconciler.java +++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/bulkdependent/StandaloneDynamicDependentReconciler.java @@ -10,23 +10,23 @@ import io.javaoperatorsdk.operator.support.TestExecutionInfoProvider; @ControllerConfiguration -public class StandaloneBulkDependentReconciler - implements Reconciler, TestExecutionInfoProvider, - EventSourceInitializer, KubernetesClientAware { +public class StandaloneDynamicDependentReconciler + implements Reconciler, TestExecutionInfoProvider, + EventSourceInitializer, KubernetesClientAware { private final AtomicInteger numberOfExecutions = new AtomicInteger(0); - private ConfigMapDeleterBulkDependentResource dependent; + private final ConfigMapDeleterDynamicallyCreatedDependentResource dependent; private KubernetesClient kubernetesClient; - public StandaloneBulkDependentReconciler() { - dependent = new CRUDConfigMapBulkDependentResource(); + public StandaloneDynamicDependentReconciler() { + dependent = new CRUDConfigMapDynamicallyCreatedDependentResource(); } @Override - public UpdateControl reconcile( - BulkDependentTestCustomResource resource, - Context context) { + public UpdateControl reconcile( + DynamicDependentTestCustomResource resource, + Context context) { numberOfExecutions.addAndGet(1); dependent.reconcile(resource, context); @@ -40,7 +40,7 @@ public int getNumberOfExecutions() { @Override public Map prepareEventSources( - EventSourceContext context) { + EventSourceContext context) { return EventSourceInitializer .nameEventSources(dependent.initEventSource(context)); } diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/bulkdependent/external/ExternalBulkResourceReconciler.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/bulkdependent/external/ExternalBulkResourceReconciler.java deleted file mode 100644 index 2543422d74..0000000000 --- a/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/bulkdependent/external/ExternalBulkResourceReconciler.java +++ /dev/null @@ -1,19 +0,0 @@ -package io.javaoperatorsdk.operator.sample.bulkdependent.external; - -import io.javaoperatorsdk.operator.api.reconciler.Context; -import io.javaoperatorsdk.operator.api.reconciler.ControllerConfiguration; -import io.javaoperatorsdk.operator.api.reconciler.Reconciler; -import io.javaoperatorsdk.operator.api.reconciler.UpdateControl; -import io.javaoperatorsdk.operator.api.reconciler.dependent.Dependent; -import io.javaoperatorsdk.operator.sample.bulkdependent.BulkDependentTestCustomResource; - -@ControllerConfiguration(dependents = @Dependent(type = ExternalBulkDependentResource.class)) -public class ExternalBulkResourceReconciler implements Reconciler { - - @Override - public UpdateControl reconcile( - BulkDependentTestCustomResource resource, Context context) - throws Exception { - return UpdateControl.noUpdate(); - } -} diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/bulkdependent/external/ExternalDynamicResourceReconciler.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/bulkdependent/external/ExternalDynamicResourceReconciler.java new file mode 100644 index 0000000000..e1dae5b790 --- /dev/null +++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/bulkdependent/external/ExternalDynamicResourceReconciler.java @@ -0,0 +1,22 @@ +package io.javaoperatorsdk.operator.sample.bulkdependent.external; + +import io.javaoperatorsdk.operator.api.reconciler.Context; +import io.javaoperatorsdk.operator.api.reconciler.ControllerConfiguration; +import io.javaoperatorsdk.operator.api.reconciler.Reconciler; +import io.javaoperatorsdk.operator.api.reconciler.UpdateControl; +import io.javaoperatorsdk.operator.api.reconciler.dependent.Dependent; +import io.javaoperatorsdk.operator.sample.bulkdependent.DynamicDependentTestCustomResource; + +@ControllerConfiguration( + dependents = @Dependent(type = ExternalDynamicallyCreatedDependentResource.class)) +public class ExternalDynamicResourceReconciler + implements Reconciler { + + @Override + public UpdateControl reconcile( + DynamicDependentTestCustomResource resource, + Context context) + throws Exception { + return UpdateControl.noUpdate(); + } +} diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/bulkdependent/external/ExternalBulkDependentResource.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/bulkdependent/external/ExternalDynamicallyCreatedDependentResource.java similarity index 64% rename from operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/bulkdependent/external/ExternalBulkDependentResource.java rename to operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/bulkdependent/external/ExternalDynamicallyCreatedDependentResource.java index 3deef8d634..a2ec8a3aea 100644 --- a/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/bulkdependent/external/ExternalBulkDependentResource.java +++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/bulkdependent/external/ExternalDynamicallyCreatedDependentResource.java @@ -4,22 +4,23 @@ import java.util.stream.Collectors; import io.javaoperatorsdk.operator.api.reconciler.Context; -import io.javaoperatorsdk.operator.processing.dependent.BulkDependentResource; -import io.javaoperatorsdk.operator.processing.dependent.BulkUpdater; +import io.javaoperatorsdk.operator.processing.dependent.DynamicallyCreatedDependentResource; +import io.javaoperatorsdk.operator.processing.dependent.DynamicallyCreatedUpdater; import io.javaoperatorsdk.operator.processing.dependent.external.PollingDependentResource; import io.javaoperatorsdk.operator.processing.event.ResourceID; -import io.javaoperatorsdk.operator.sample.bulkdependent.BulkDependentTestCustomResource; +import io.javaoperatorsdk.operator.sample.bulkdependent.DynamicDependentTestCustomResource; -public class ExternalBulkDependentResource - extends PollingDependentResource - implements BulkDependentResource, - BulkUpdater { +public class ExternalDynamicallyCreatedDependentResource + extends PollingDependentResource + implements + DynamicallyCreatedDependentResource, + DynamicallyCreatedUpdater { public static final String EXTERNAL_RESOURCE_NAME_DELIMITER = "#"; private final ExternalServiceMock externalServiceMock = ExternalServiceMock.getInstance(); - public ExternalBulkDependentResource() { + public ExternalDynamicallyCreatedDependentResource() { super(ExternalResource.class, ExternalResource::getId); } @@ -36,18 +37,20 @@ public Map> fetchResources() { } @Override - public ExternalResource create(ExternalResource desired, BulkDependentTestCustomResource primary, - Context context) { + public ExternalResource create(ExternalResource desired, + DynamicDependentTestCustomResource primary, + Context context) { return externalServiceMock.create(desired); } @Override public ExternalResource update(ExternalResource actual, ExternalResource desired, - BulkDependentTestCustomResource primary, Context context) { + DynamicDependentTestCustomResource primary, + Context context) { return externalServiceMock.update(desired); } - private static String toExternalResourceId(BulkDependentTestCustomResource primary, String i) { + private static String toExternalResourceId(DynamicDependentTestCustomResource primary, String i) { return primary.getMetadata().getName() + EXTERNAL_RESOURCE_NAME_DELIMITER + primary.getMetadata().getNamespace() + EXTERNAL_RESOURCE_NAME_DELIMITER + i; @@ -59,8 +62,8 @@ private ResourceID toResourceID(ExternalResource externalResource) { } @Override - public Map desiredResources(BulkDependentTestCustomResource primary, - Context context) { + public Map desiredResources(DynamicDependentTestCustomResource primary, + Context context) { var number = primary.getSpec().getNumberOfResources(); Map res = new HashMap<>(); for (int i = 0; i < number; i++) { @@ -73,8 +76,8 @@ public Map desiredResources(BulkDependentTestCustomRes @Override public Map getSecondaryResources( - BulkDependentTestCustomResource primary, - Context context) { + DynamicDependentTestCustomResource primary, + Context context) { return context.getSecondaryResources(resourceType()).stream() .filter(r -> r.getId() .startsWith(primary.getMetadata().getName() + EXTERNAL_RESOURCE_NAME_DELIMITER + @@ -86,9 +89,9 @@ public Map getSecondaryResources( } @Override - public void deleteTargetResource(BulkDependentTestCustomResource primary, + public void deleteTargetResource(DynamicDependentTestCustomResource primary, ExternalResource resource, - Context context) { + Context context) { externalServiceMock.delete(resource.getId()); } } From ca390efcae735fa9ed254ebde15175cffaa985e8 Mon Sep 17 00:00:00 2001 From: Chris Laprun Date: Wed, 12 Oct 2022 13:48:01 +0200 Subject: [PATCH 5/6] refactor: remove now unneeded class --- .../dependent/BulkResourceDiscriminatorFactory.java | 10 ---------- 1 file changed, 10 deletions(-) delete mode 100644 operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/BulkResourceDiscriminatorFactory.java diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/BulkResourceDiscriminatorFactory.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/BulkResourceDiscriminatorFactory.java deleted file mode 100644 index 8b9b6e968d..0000000000 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/BulkResourceDiscriminatorFactory.java +++ /dev/null @@ -1,10 +0,0 @@ -package io.javaoperatorsdk.operator.processing.dependent; - -import io.fabric8.kubernetes.api.model.HasMetadata; -import io.javaoperatorsdk.operator.api.reconciler.ResourceDiscriminator; - -public interface BulkResourceDiscriminatorFactory { - - ResourceDiscriminator createResourceDiscriminator(int index); - -} From 2ab160e0fd364fb87a745f3a647aab51fdde6f20 Mon Sep 17 00:00:00 2001 From: Chris Laprun Date: Wed, 12 Oct 2022 13:58:55 +0200 Subject: [PATCH 6/6] refactor: more renaming --- .../DynamicallyCreatedDependentResource.java | 14 +++++++------- ...amicallyCreatedDependentResourceReconciler.java | 10 +++++----- .../DynamicallyCreatedDependentDeleterIT.java | 5 +++-- .../DynamicallyCreatedDependentTestBase.java | 4 ++-- ...DeleterDynamicallyCreatedDependentResource.java | 2 +- .../DynamicDependentTestCustomResource.java | 2 +- ...TestSpec.java => DynamicDependentTestSpec.java} | 6 +++--- ... ManagedDeleterDynamicDependentReconciler.java} | 2 +- 8 files changed, 23 insertions(+), 22 deletions(-) rename operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/bulkdependent/{BulkDependentTestSpec.java => DynamicDependentTestSpec.java} (67%) rename operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/bulkdependent/{ManagedDeleterBulkReconciler.java => ManagedDeleterDynamicDependentReconciler.java} (93%) diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/DynamicallyCreatedDependentResource.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/DynamicallyCreatedDependentResource.java index 4e761fa759..65f5aa46d3 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/DynamicallyCreatedDependentResource.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/DynamicallyCreatedDependentResource.java @@ -8,10 +8,11 @@ import io.javaoperatorsdk.operator.processing.dependent.Matcher.Result; /** - * Manages dynamic number of resources created for a primary resource. Since the point of a bulk - * dependent resource is to manage the number of secondary resources dynamically it implement - * {@link Creator} and {@link Deleter} interfaces out of the box. A concrete dependent resource can - * implement additionally also {@link Updater}. + * Manages dynamic number of resources created for a primary resource. Since the point of a + * dynamically-created dependent resource is to manage secondary resources dynamically depending on + * the state of the primary resource, it implements {@link Creator} and {@link Deleter} interfaces + * out of the box. A concrete dynamically-created dependent resource could also additionally + * implement {@link Updater}. */ public interface DynamicallyCreatedDependentResource extends Creator, Deleter

{ @@ -52,9 +53,8 @@ public interface DynamicallyCreatedDependentResource void deleteTargetResource(P primary, R resource, Context

context); /** - * Determines whether the specified secondary resource matches the desired state with target index - * of a bulk resource as defined from the specified primary resource, given the specified - * {@link Context}. + * Determines whether the specified secondary resource matches the desired state as defined from + * the specified primary resource, given the specified {@link Context}. * * @param actualResource the resource we want to determine whether it's matching the desired state * @param desired the resource's desired state diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/DynamicallyCreatedDependentResourceReconciler.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/DynamicallyCreatedDependentResourceReconciler.java index ba737b19e5..fbbdd9ca80 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/DynamicallyCreatedDependentResourceReconciler.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/DynamicallyCreatedDependentResourceReconciler.java @@ -29,7 +29,7 @@ public ReconcileResult reconcile(P primary, Context

context) { Map actualResources = delegate.getSecondaryResources(primary, context); // remove existing resources that are not needed anymore according to the primary state - deleteBulkResourcesIfRequired(desiredResources.keySet(), actualResources, primary, context); + deleteUnexpectedDynamicResources(desiredResources.keySet(), actualResources, primary, context); final List> results = new ArrayList<>(desiredResources.size()); final var updatable = delegate instanceof Updater; @@ -46,10 +46,10 @@ public ReconcileResult reconcile(P primary, Context

context) { public void delete(P primary, Context

context) { var actualResources = delegate.getSecondaryResources(primary, context); - deleteBulkResourcesIfRequired(Collections.emptySet(), actualResources, primary, context); + deleteUnexpectedDynamicResources(Collections.emptySet(), actualResources, primary, context); } - private void deleteBulkResourcesIfRequired(Set expectedKeys, + private void deleteUnexpectedDynamicResources(Set expectedKeys, Map actualResources, P primary, Context

context) { actualResources.forEach((key, value) -> { if (!expectedKeys.contains(key)) { @@ -59,8 +59,8 @@ private void deleteBulkResourcesIfRequired(Set expectedKeys, } /** - * Exposes a dynamically-created instance of the bulk dependent resource precursor as an - * AbstractDependentResource so that we can reuse its reconciliation logic. + * Exposes a dynamically-created instance of the dynamically-created dependent resource precursor + * as an AbstractDependentResource so that we can reuse its reconciliation logic. * * @param * @param

diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/bulkdependent/DynamicallyCreatedDependentDeleterIT.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/bulkdependent/DynamicallyCreatedDependentDeleterIT.java index 268609d502..61def7d13c 100644 --- a/operator-framework/src/test/java/io/javaoperatorsdk/operator/bulkdependent/DynamicallyCreatedDependentDeleterIT.java +++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/bulkdependent/DynamicallyCreatedDependentDeleterIT.java @@ -3,13 +3,14 @@ import org.junit.jupiter.api.extension.RegisterExtension; import io.javaoperatorsdk.operator.junit.LocallyRunOperatorExtension; -import io.javaoperatorsdk.operator.sample.bulkdependent.ManagedDeleterBulkReconciler; +import io.javaoperatorsdk.operator.sample.bulkdependent.ManagedDeleterDynamicDependentReconciler; public class DynamicallyCreatedDependentDeleterIT extends DynamicallyCreatedDependentTestBase { @RegisterExtension LocallyRunOperatorExtension extension = - LocallyRunOperatorExtension.builder().withReconciler(new ManagedDeleterBulkReconciler()) + LocallyRunOperatorExtension.builder() + .withReconciler(new ManagedDeleterDynamicDependentReconciler()) .build(); @Override diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/bulkdependent/DynamicallyCreatedDependentTestBase.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/bulkdependent/DynamicallyCreatedDependentTestBase.java index 907b8eb284..be6a5f9f0c 100644 --- a/operator-framework/src/test/java/io/javaoperatorsdk/operator/bulkdependent/DynamicallyCreatedDependentTestBase.java +++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/bulkdependent/DynamicallyCreatedDependentTestBase.java @@ -6,9 +6,9 @@ import io.fabric8.kubernetes.api.model.ObjectMeta; import io.javaoperatorsdk.operator.junit.LocallyRunOperatorExtension; -import io.javaoperatorsdk.operator.sample.bulkdependent.BulkDependentTestSpec; import io.javaoperatorsdk.operator.sample.bulkdependent.ConfigMapDeleterDynamicallyCreatedDependentResource; import io.javaoperatorsdk.operator.sample.bulkdependent.DynamicDependentTestCustomResource; +import io.javaoperatorsdk.operator.sample.bulkdependent.DynamicDependentTestSpec; import static io.javaoperatorsdk.operator.sample.bulkdependent.ConfigMapDeleterDynamicallyCreatedDependentResource.LABEL_KEY; import static io.javaoperatorsdk.operator.sample.bulkdependent.ConfigMapDeleterDynamicallyCreatedDependentResource.LABEL_VALUE; @@ -78,7 +78,7 @@ public static DynamicDependentTestCustomResource testResource() { DynamicDependentTestCustomResource cr = new DynamicDependentTestCustomResource(); cr.setMetadata(new ObjectMeta()); cr.getMetadata().setName(TEST_RESOURCE_NAME); - cr.setSpec(new BulkDependentTestSpec()); + cr.setSpec(new DynamicDependentTestSpec()); cr.getSpec().setNumberOfResources(INITIAL_NUMBER_OF_CONFIG_MAPS); cr.getSpec().setAdditionalData(INITIAL_ADDITIONAL_DATA); return cr; diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/bulkdependent/ConfigMapDeleterDynamicallyCreatedDependentResource.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/bulkdependent/ConfigMapDeleterDynamicallyCreatedDependentResource.java index 6bc73d42d7..6b286803f6 100644 --- a/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/bulkdependent/ConfigMapDeleterDynamicallyCreatedDependentResource.java +++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/bulkdependent/ConfigMapDeleterDynamicallyCreatedDependentResource.java @@ -22,7 +22,7 @@ public class ConfigMapDeleterDynamicallyCreatedDependentResource Deleter, DynamicallyCreatedDependentResource { - public static final String LABEL_KEY = "bulk"; + public static final String LABEL_KEY = "dynamic"; public static final String LABEL_VALUE = "true"; public static final String ADDITIONAL_DATA_KEY = "additionalData"; public static final String INDEX_DELIMITER = "-"; diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/bulkdependent/DynamicDependentTestCustomResource.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/bulkdependent/DynamicDependentTestCustomResource.java index 46da72fb56..4397d2ea75 100644 --- a/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/bulkdependent/DynamicDependentTestCustomResource.java +++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/bulkdependent/DynamicDependentTestCustomResource.java @@ -10,6 +10,6 @@ @Version("v1") @ShortNames("sbd") public class DynamicDependentTestCustomResource - extends CustomResource + extends CustomResource implements Namespaced { } diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/bulkdependent/BulkDependentTestSpec.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/bulkdependent/DynamicDependentTestSpec.java similarity index 67% rename from operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/bulkdependent/BulkDependentTestSpec.java rename to operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/bulkdependent/DynamicDependentTestSpec.java index 5266950b41..6727aa7dfb 100644 --- a/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/bulkdependent/BulkDependentTestSpec.java +++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/bulkdependent/DynamicDependentTestSpec.java @@ -1,6 +1,6 @@ package io.javaoperatorsdk.operator.sample.bulkdependent; -public class BulkDependentTestSpec { +public class DynamicDependentTestSpec { private Integer numberOfResources; private String additionalData; @@ -9,12 +9,12 @@ public Integer getNumberOfResources() { return numberOfResources; } - public BulkDependentTestSpec setNumberOfResources(Integer numberOfResources) { + public DynamicDependentTestSpec setNumberOfResources(Integer numberOfResources) { this.numberOfResources = numberOfResources; return this; } - public BulkDependentTestSpec setAdditionalData(String additionalData) { + public DynamicDependentTestSpec setAdditionalData(String additionalData) { this.additionalData = additionalData; return this; } diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/bulkdependent/ManagedDeleterBulkReconciler.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/bulkdependent/ManagedDeleterDynamicDependentReconciler.java similarity index 93% rename from operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/bulkdependent/ManagedDeleterBulkReconciler.java rename to operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/bulkdependent/ManagedDeleterDynamicDependentReconciler.java index bcf1d8513a..0f3105a2c2 100644 --- a/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/bulkdependent/ManagedDeleterBulkReconciler.java +++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/bulkdependent/ManagedDeleterDynamicDependentReconciler.java @@ -8,7 +8,7 @@ @ControllerConfiguration( dependents = @Dependent(type = ConfigMapDeleterDynamicallyCreatedDependentResource.class)) -public class ManagedDeleterBulkReconciler +public class ManagedDeleterDynamicDependentReconciler implements Reconciler { @Override public UpdateControl reconcile(