Skip to content

Commit 856d8b7

Browse files
committed
feat: read-only bulkd dependent
Signed-off-by: Attila Mészáros <csviri@gmail.com>
1 parent 5ab2658 commit 856d8b7

File tree

6 files changed

+52
-31
lines changed

6 files changed

+52
-31
lines changed

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

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ public ReconcileResult<R> reconcile(P primary, Context<P> context) {
6060
}
6161

6262
protected ReconcileResult<R> reconcile(P primary, R actualResource, Context<P> context) {
63-
if (creatable || updatable) {
63+
if (creatable() || updatable()) {
6464
if (actualResource == null) {
6565
if (creatable) {
6666
var desired = desired(primary, context);
@@ -70,7 +70,7 @@ protected ReconcileResult<R> reconcile(P primary, R actualResource, Context<P> c
7070
return ReconcileResult.resourceCreated(createdResource);
7171
}
7272
} else {
73-
if (updatable) {
73+
if (updatable()) {
7474
final Matcher.Result<R> match = match(actualResource, primary, context);
7575
if (!match.matched()) {
7676
final var desired = match.computedDesired().orElseGet(() -> desired(primary, context));
@@ -216,4 +216,12 @@ public String name() {
216216
public void setName(String name) {
217217
this.name = name;
218218
}
219+
220+
protected boolean creatable() {
221+
return creatable;
222+
}
223+
224+
protected boolean updatable() {
225+
return updatable;
226+
}
219227
}

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

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,7 @@
1313
* {@link Creator} and {@link Deleter} interfaces out of the box. A concrete dependent resource can
1414
* implement additionally also {@link Updater}.
1515
*/
16-
public interface BulkDependentResource<R, P extends HasMetadata>
17-
extends Creator<R, P>, Deleter<P> {
16+
public interface BulkDependentResource<R, P extends HasMetadata> {
1817

1918
/**
2019
* Retrieves a map of desired secondary resources associated with the specified primary resource,
@@ -26,7 +25,10 @@ public interface BulkDependentResource<R, P extends HasMetadata>
2625
* @return a Map associating desired secondary resources with the specified primary via arbitrary
2726
* identifiers
2827
*/
29-
Map<String, R> desiredResources(P primary, Context<P> context);
28+
default Map<String, R> desiredResources(P primary, Context<P> context) {
29+
throw new IllegalStateException(
30+
"Implement desiredResources in case a non read-only bulk dependent resource");
31+
}
3032

3133
/**
3234
* Retrieves the actual secondary resources currently existing on the server and associated with

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

Lines changed: 16 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -33,9 +33,7 @@ public ReconcileResult<R> reconcile(P primary, Context<P> context) {
3333
final List<ReconcileResult<R>> results = new ArrayList<>(desiredResources.size());
3434
final var updatable = bulkDependentResource instanceof Updater;
3535
desiredResources.forEach((key, value) -> {
36-
final var instance =
37-
updatable ? new UpdatableBulkDependentResourceInstance<>(bulkDependentResource, value)
38-
: new BulkDependentResourceInstance<>(bulkDependentResource, value);
36+
final var instance = new BulkDependentResourceInstance<>(bulkDependentResource, value);
3937
results.add(instance.reconcile(primary, actualResources.get(key), context));
4038
});
4139

@@ -67,7 +65,7 @@ private void deleteExtraResources(Set<String> expectedKeys,
6765
@Ignore
6866
private static class BulkDependentResourceInstance<R, P extends HasMetadata>
6967
extends AbstractDependentResource<R, P>
70-
implements Creator<R, P>, Deleter<P> {
68+
implements Creator<R, P>, Deleter<P>, Updater<R, P> {
7169
private final BulkDependentResource<R, P> bulkDependentResource;
7270
private final R desired;
7371

@@ -112,26 +110,24 @@ public Class<R> resourceType() {
112110
return asAbstractDependentResource().resourceType();
113111
}
114112

115-
@Override
113+
@SuppressWarnings("unchecked")
116114
public R create(R desired, P primary, Context<P> context) {
117-
return bulkDependentResource.create(desired, primary, context);
115+
return ((Creator<R, P>) bulkDependentResource).create(desired, primary, context);
118116
}
119-
}
120117

121-
/**
122-
* Makes sure that the instance implements Updater if its precursor does as well.
123-
*
124-
* @param <R>
125-
* @param <P>
126-
*/
127-
@Ignore
128-
private static class UpdatableBulkDependentResourceInstance<R, P extends HasMetadata>
129-
extends BulkDependentResourceInstance<R, P> implements Updater<R, P> {
118+
@Override
119+
protected boolean isCreatable() {
120+
return bulkDependentResource instanceof Creator<?, ?>;
121+
}
130122

131-
private UpdatableBulkDependentResourceInstance(
132-
BulkDependentResource<R, P> bulkDependentResource,
133-
R desired) {
134-
super(bulkDependentResource, desired);
123+
@Override
124+
protected boolean isUpdatable() {
125+
return bulkDependentResource instanceof Updater<?, ?>;
126+
}
127+
128+
@Override
129+
public boolean isDeletable() {
130+
return bulkDependentResource instanceof Deleter<?>;
135131
}
136132
}
137133
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package io.javaoperatorsdk.operator.processing.dependent;
2+
3+
import io.fabric8.kubernetes.api.model.HasMetadata;
4+
import io.javaoperatorsdk.operator.api.reconciler.dependent.Deleter;
5+
6+
public interface CRUDBulkDependentResource<R, P extends HasMetadata>
7+
extends BulkDependentResource<R, P>,
8+
Creator<R, P>,
9+
BulkUpdater<R, P>,
10+
Deleter<P> {
11+
}

operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/bulkdependent/external/ExternalBulkDependentResource.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,19 @@
77
import java.util.stream.Collectors;
88

99
import io.javaoperatorsdk.operator.api.reconciler.Context;
10+
import io.javaoperatorsdk.operator.api.reconciler.dependent.Deleter;
1011
import io.javaoperatorsdk.operator.processing.dependent.BulkDependentResource;
1112
import io.javaoperatorsdk.operator.processing.dependent.BulkUpdater;
13+
import io.javaoperatorsdk.operator.processing.dependent.Creator;
1214
import io.javaoperatorsdk.operator.processing.dependent.external.PollingDependentResource;
1315
import io.javaoperatorsdk.operator.processing.event.ResourceID;
1416
import io.javaoperatorsdk.operator.sample.bulkdependent.BulkDependentTestCustomResource;
1517

1618
public class ExternalBulkDependentResource
1719
extends PollingDependentResource<ExternalResource, BulkDependentTestCustomResource>
1820
implements BulkDependentResource<ExternalResource, BulkDependentTestCustomResource>,
21+
Creator<ExternalResource, BulkDependentTestCustomResource>,
22+
Deleter<BulkDependentTestCustomResource>,
1923
BulkUpdater<ExternalResource, BulkDependentTestCustomResource> {
2024

2125
public static final String EXTERNAL_RESOURCE_NAME_DELIMITER = "#";

operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/externalstate/externalstatebulkdependent/BulkDependentResourceExternalWithState.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,8 @@
1111
import io.fabric8.kubernetes.api.model.ConfigMapBuilder;
1212
import io.fabric8.kubernetes.api.model.ObjectMetaBuilder;
1313
import io.javaoperatorsdk.operator.api.reconciler.Context;
14-
import io.javaoperatorsdk.operator.processing.dependent.BulkDependentResource;
15-
import io.javaoperatorsdk.operator.processing.dependent.BulkUpdater;
16-
import io.javaoperatorsdk.operator.processing.dependent.DependentResourceWithExplicitState;
17-
import io.javaoperatorsdk.operator.processing.dependent.Matcher;
14+
import io.javaoperatorsdk.operator.api.reconciler.dependent.Deleter;
15+
import io.javaoperatorsdk.operator.processing.dependent.*;
1816
import io.javaoperatorsdk.operator.processing.dependent.external.PerResourcePollingDependentResource;
1917
import io.javaoperatorsdk.operator.support.ExternalIDGenServiceMock;
2018
import io.javaoperatorsdk.operator.support.ExternalResource;
@@ -25,8 +23,10 @@ public class BulkDependentResourceExternalWithState extends
2523
PerResourcePollingDependentResource<ExternalResource, ExternalStateBulkDependentCustomResource>
2624
implements
2725
BulkDependentResource<ExternalResource, ExternalStateBulkDependentCustomResource>,
28-
DependentResourceWithExplicitState<ExternalResource, ExternalStateBulkDependentCustomResource, ConfigMap>,
29-
BulkUpdater<ExternalResource, ExternalStateBulkDependentCustomResource> {
26+
Creator<ExternalResource, ExternalStateBulkDependentCustomResource>,
27+
Deleter<ExternalStateBulkDependentCustomResource>,
28+
BulkUpdater<ExternalResource, ExternalStateBulkDependentCustomResource>,
29+
DependentResourceWithExplicitState<ExternalResource, ExternalStateBulkDependentCustomResource, ConfigMap> {
3030

3131
public static final String DELIMITER = "-";
3232
ExternalIDGenServiceMock externalService = ExternalIDGenServiceMock.getInstance();

0 commit comments

Comments
 (0)