Skip to content

Commit 6c8affc

Browse files
authored
Reconcile api proposal (#1030)
1 parent 261a38c commit 6c8affc

File tree

4 files changed

+62
-16
lines changed

4 files changed

+62
-16
lines changed

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

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -26,25 +26,27 @@ public AbstractDependentResource() {
2626
}
2727

2828
@Override
29-
public void reconcile(P primary, Context<P> context) {
30-
final var creatable = isCreatable(primary, context);
31-
final var updatable = isUpdatable(primary, context);
32-
if (creatable || updatable) {
33-
var maybeActual = getResource(primary);
29+
public ReconcileResult<R> reconcile(P primary, Context<P> context) {
30+
final var isCreatable = isCreatable(primary, context);
31+
final var isUpdatable = isUpdatable(primary, context);
32+
var maybeActual = getResource(primary);
33+
if (isCreatable || isUpdatable) {
3434
if (maybeActual.isEmpty()) {
35-
if (creatable) {
35+
if (isCreatable) {
3636
var desired = desired(primary, context);
3737
log.debug("Creating dependent {} for primary {}", desired, primary);
38-
handleCreate(desired, primary, context);
38+
var createdResource = handleCreate(desired, primary, context);
39+
return ReconcileResult.resourceCreated(createdResource);
3940
}
4041
} else {
4142
final var actual = maybeActual.get();
42-
if (updatable) {
43+
if (isUpdatable) {
4344
final var match = updater.match(actual, primary, context);
4445
if (!match.matched()) {
4546
final var desired = match.computedDesired().orElse(desired(primary, context));
4647
log.debug("Updating dependent {} for primary {}", desired, primary);
47-
handleUpdate(actual, desired, primary, context);
48+
var updatedResource = handleUpdate(actual, desired, primary, context);
49+
return ReconcileResult.resourceUpdated(updatedResource);
4850
}
4951
} else {
5052
log.debug("Update skipped for dependent {} as it matched the existing one", actual);
@@ -55,15 +57,17 @@ public void reconcile(P primary, Context<P> context) {
5557
"Dependent {} is read-only, implement Creator and/or Updater interfaces to modify it",
5658
getClass().getSimpleName());
5759
}
60+
return ReconcileResult.noOperation(maybeActual.orElse(null));
5861
}
5962

60-
protected void handleCreate(R desired, P primary, Context<P> context) {
63+
protected R handleCreate(R desired, P primary, Context<P> context) {
6164
ResourceID resourceID = ResourceID.fromResource(primary);
6265
R created = null;
6366
try {
6467
prepareEventFiltering(desired, resourceID);
6568
created = creator.create(desired, primary, context);
6669
cacheAfterCreate(resourceID, created);
70+
return created;
6771
} catch (RuntimeException e) {
6872
cleanupAfterEventFiltering(desired, resourceID, created);
6973
throw e;
@@ -97,13 +101,14 @@ private void prepareEventFiltering(R desired, ResourceID resourceID) {
97101
}
98102
}
99103

100-
protected void handleUpdate(R actual, R desired, P primary, Context<P> context) {
104+
protected R handleUpdate(R actual, R desired, P primary, Context<P> context) {
101105
ResourceID resourceID = ResourceID.fromResource(primary);
102106
R updated = null;
103107
try {
104108
prepareEventFiltering(desired, resourceID);
105109
updated = updater.update(actual, desired, primary, context);
106110
cacheAfterUpdate(actual, resourceID, updated);
111+
return updated;
107112
} catch (RuntimeException e) {
108113
cleanupAfterEventFiltering(desired, resourceID, updated);
109114
throw e;

operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/reconciler/dependent/DependentResource.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
import io.javaoperatorsdk.operator.api.reconciler.Context;
77

88
public interface DependentResource<R, P extends HasMetadata> {
9-
void reconcile(P primary, Context<P> context);
9+
ReconcileResult<R> reconcile(P primary, Context<P> context);
1010

1111
default void cleanup(P primary, Context<P> context) {}
1212

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package io.javaoperatorsdk.operator.api.reconciler.dependent;
2+
3+
import java.util.Optional;
4+
5+
public class ReconcileResult<R> {
6+
7+
private R resource;
8+
private Operation operation;
9+
10+
public static <T> ReconcileResult<T> resourceCreated(T resource) {
11+
return new ReconcileResult<>(resource, Operation.CREATED);
12+
}
13+
14+
public static <T> ReconcileResult<T> resourceUpdated(T resource) {
15+
return new ReconcileResult<>(resource, Operation.UPDATED);
16+
}
17+
18+
public static <T> ReconcileResult<T> noOperation(T resource) {
19+
return new ReconcileResult<>(resource, Operation.NONE);
20+
}
21+
22+
private ReconcileResult(R resource, Operation operation) {
23+
this.resource = resource;
24+
this.operation = operation;
25+
}
26+
27+
public Optional<R> getResource() {
28+
return Optional.ofNullable(resource);
29+
}
30+
31+
public Operation getOperation() {
32+
return operation;
33+
}
34+
35+
public enum Operation {
36+
CREATED, UPDATED, NONE
37+
}
38+
}

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

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import io.javaoperatorsdk.operator.api.reconciler.dependent.AbstractDependentResource;
88
import io.javaoperatorsdk.operator.api.reconciler.dependent.DesiredEqualsMatcher;
99
import io.javaoperatorsdk.operator.api.reconciler.dependent.Matcher;
10+
import io.javaoperatorsdk.operator.api.reconciler.dependent.ReconcileResult;
1011
import io.javaoperatorsdk.operator.processing.event.ResourceID;
1112
import io.javaoperatorsdk.operator.processing.event.source.ConcurrentHashMapCache;
1213
import io.javaoperatorsdk.operator.processing.event.source.UpdatableCache;
@@ -43,11 +44,11 @@ public Optional<R> getResource(HasMetadata primaryResource) {
4344
public abstract Optional<R> fetchResource(HasMetadata primaryResource);
4445

4546
@Override
46-
public void reconcile(P primary, Context<P> context) {
47+
public ReconcileResult<R> reconcile(P primary, Context<P> context) {
4748
var resourceId = ResourceID.fromResource(primary);
4849
Optional<R> resource = fetchResource(primary);
4950
resource.ifPresentOrElse(r -> cache.put(resourceId, r), () -> cache.remove(resourceId));
50-
super.reconcile(primary, context);
51+
return super.reconcile(primary, context);
5152
}
5253

5354
public void cleanup(P primary, Context<P> context) {
@@ -56,15 +57,17 @@ public void cleanup(P primary, Context<P> context) {
5657
}
5758

5859
@Override
59-
protected void handleCreate(R desired, P primary, Context<P> context) {
60+
protected R handleCreate(R desired, P primary, Context<P> context) {
6061
var res = this.creator.create(desired, primary, context);
6162
cache.put(ResourceID.fromResource(primary), res);
63+
return res;
6264
}
6365

6466
@Override
65-
protected void handleUpdate(R actual, R desired, P primary, Context<P> context) {
67+
protected R handleUpdate(R actual, R desired, P primary, Context<P> context) {
6668
var res = updater.update(actual, desired, primary, context);
6769
cache.put(ResourceID.fromResource(primary), res);
70+
return res;
6871
}
6972

7073
public Matcher.Result<R> match(R actualResource, P primary, Context context) {

0 commit comments

Comments
 (0)