Skip to content

Commit 47e954a

Browse files
committed
test passes
1 parent a67b530 commit 47e954a

File tree

4 files changed

+67
-15
lines changed

4 files changed

+67
-15
lines changed

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

+34-14
Original file line numberDiff line numberDiff line change
@@ -40,27 +40,41 @@ public AbstractDependentResource() {
4040
public ReconcileResult<R> reconcile(P primary, Context<P> context) {
4141
var count = count(primary, context).orElse(1);
4242
if (isBulkResourceCreation(primary, context)) {
43-
initDiscriminators(count);
43+
cleanupBulkResourcesIfRequired(count, resourceDiscriminator.size(), primary, context);
44+
adjustDiscriminators(count);
4445
}
4546
ReconcileResult<R> result = new ReconcileResult<>();
4647
for (int i = 0; i < count; i++) {
47-
var res = reconcileWithIndex(primary, i, context);
48+
var res = reconcileIndexAware(primary, i, context);
4849
result.addReconcileResult(res);
4950
}
5051
return result;
5152
}
5253

53-
private void initDiscriminators(int count) {
54-
if (resourceDiscriminator.size() == count) {
54+
private void cleanupBulkResourcesIfRequired(int targetCount, int actualCount, P primary,
55+
Context<P> context) {
56+
if (targetCount >= actualCount) {
5557
return;
5658
}
57-
if (resourceDiscriminator.size() < count) {
58-
for (int i = resourceDiscriminator.size() - 1; i < count; i++) {
59-
resourceDiscriminator.add(bulkResourceDiscriminatorFactory.createResourceDiscriminator(i));
60-
}
59+
for (int i = targetCount; i < actualCount; i++) {
60+
var resource = getSecondaryResourceIndexAware(primary, i, context);
61+
var index = i;
62+
resource.ifPresent(r -> {
63+
deleteBulkResourceWithIndex(primary, r, index, context);
64+
});
65+
}
66+
}
67+
68+
protected void deleteBulkResourceWithIndex(P primary, R resource, int i, Context<P> context) {
69+
throw new IllegalStateException("Implement if handling bulk resources.");
70+
}
71+
72+
private void adjustDiscriminators(int count) {
73+
if (resourceDiscriminator.size() == count) {
74+
return;
6175
}
6276
if (resourceDiscriminator.size() < count) {
63-
for (int i = resourceDiscriminator.size() - 1; i < count; i++) {
77+
for (int i = resourceDiscriminator.size(); i < count; i++) {
6478
resourceDiscriminator.add(bulkResourceDiscriminatorFactory.createResourceDiscriminator(i));
6579
}
6680
}
@@ -69,12 +83,12 @@ private void initDiscriminators(int count) {
6983
}
7084
}
7185

72-
protected ReconcileResult<R> reconcileWithIndex(P primary, int i, Context<P> context) {
73-
Optional<R> maybeActual = getSecondaryResource(primary, i, context);
86+
protected ReconcileResult<R> reconcileIndexAware(P primary, int i, Context<P> context) {
87+
Optional<R> maybeActual = getSecondaryResourceIndexAware(primary, i, context);
7488
if (creatable || updatable) {
7589
if (maybeActual.isEmpty()) {
7690
if (creatable) {
77-
var desired = desired(primary, i, context);
91+
var desired = desiredIndexAware(primary, i, context);
7892
throwIfNull(desired, primary, "Desired");
7993
logForOperation("Creating", primary, desired);
8094
var createdResource = handleCreate(desired, primary, context);
@@ -90,7 +104,8 @@ protected ReconcileResult<R> reconcileWithIndex(P primary, int i, Context<P> con
90104
match = updater.match(actual, primary, context);
91105
}
92106
if (!match.matched()) {
93-
final var desired = match.computedDesired().orElse(desired(primary, context));
107+
final var desired =
108+
match.computedDesired().orElse(desiredIndexAware(primary, i, context));
94109
throwIfNull(desired, primary, "Desired");
95110
logForOperation("Updating", primary, desired);
96111
var updatedResource = handleUpdate(actual, desired, primary, context);
@@ -108,6 +123,11 @@ protected ReconcileResult<R> reconcileWithIndex(P primary, int i, Context<P> con
108123
return ReconcileResult.noOperation(maybeActual.orElse(null));
109124
}
110125

126+
private R desiredIndexAware(P primary, int i, Context<P> context) {
127+
return isBulkResourceCreation(primary, context) ? desired(primary, i, context)
128+
: desired(primary, context);
129+
}
130+
111131
// todo check
112132
protected Optional<R> getSecondaryResource(P primary, Context<P> context) {
113133
if (resourceDiscriminator.isEmpty()) {
@@ -117,7 +137,7 @@ protected Optional<R> getSecondaryResource(P primary, Context<P> context) {
117137
}
118138
}
119139

120-
protected Optional<R> getSecondaryResource(P primary, int index, Context<P> context) {
140+
protected Optional<R> getSecondaryResourceIndexAware(P primary, int index, Context<P> context) {
121141
if (index > 0 && resourceDiscriminator.isEmpty()) {
122142
throw new IllegalStateException(
123143
"Handling resources in bulk bot no resource discriminators set.");

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

+9
Original file line numberDiff line numberDiff line change
@@ -137,11 +137,20 @@ public Result<R> match(R actualResource, P primary, Context<P> context) {
137137
return matcher.match(actualResource, primary, context);
138138
}
139139

140+
public Result<R> match(R actualResource, P primary, int index, Context<P> context) {
141+
return matcher.match(actualResource, primary, index, context);
142+
}
143+
140144
public void delete(P primary, Context<P> context) {
141145
var resource = getSecondaryResource(primary, context);
142146
resource.ifPresent(r -> client.resource(r).delete());
143147
}
144148

149+
@Override
150+
protected void deleteBulkResourceWithIndex(P primary, R resource, int i, Context<P> context) {
151+
client.resource(resource).delete();
152+
}
153+
145154
@SuppressWarnings("unchecked")
146155
protected NonNamespaceOperation<R, KubernetesResourceList<R>, Resource<R>> prepare(R desired,
147156
P primary, String actionName) {

operator-framework/src/test/java/io/javaoperatorsdk/operator/StandaloneBulkDependentIT.java

+19-1
Original file line numberDiff line numberDiff line change
@@ -27,15 +27,33 @@ class StandaloneBulkDependentIT {
2727
@Test
2828
void managesBulkConfigMaps() {
2929
operator.create(testResource());
30+
assertNumberOfConfigMaps(3);
3031

32+
updateSpecWithNumber(1);
33+
assertNumberOfConfigMaps(1);
34+
35+
updateSpecWithNumber(5);
36+
assertNumberOfConfigMaps(5);
37+
38+
operator.delete(testResource());
39+
assertNumberOfConfigMaps(0);
40+
}
41+
42+
void assertNumberOfConfigMaps(int n) {
3143
await().untilAsserted(() -> {
3244
var cms = operator.getKubernetesClient().configMaps().inNamespace(operator.getNamespace())
3345
.withLabel(LABEL_KEY, LABEL_VALUE)
3446
.list().getItems();
35-
assertThat(cms).hasSize(NUMBER_OF_CONFIG_MAPS);
47+
assertThat(cms).hasSize(n);
3648
});
3749
}
3850

51+
private void updateSpecWithNumber(int n) {
52+
var resource = testResource();
53+
resource.getSpec().setNumberOfResources(n);
54+
operator.replace(resource);
55+
}
56+
3957
private StandaloneBulkDependentTestCustomResource testResource() {
4058
StandaloneBulkDependentTestCustomResource cr = new StandaloneBulkDependentTestCustomResource();
4159
cr.setMetadata(new ObjectMeta());

operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/standalonebulkdependent/ConfigMapBulkDependentResource.java

+5
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@
44
import java.util.Optional;
55
import java.util.stream.Collectors;
66

7+
import org.slf4j.Logger;
8+
import org.slf4j.LoggerFactory;
9+
710
import io.fabric8.kubernetes.api.model.ConfigMap;
811
import io.fabric8.kubernetes.api.model.ObjectMetaBuilder;
912
import io.javaoperatorsdk.operator.api.reconciler.Context;
@@ -12,6 +15,8 @@
1215
public class ConfigMapBulkDependentResource
1316
extends CRUDKubernetesDependentResource<ConfigMap, StandaloneBulkDependentTestCustomResource> {
1417

18+
private final static Logger log = LoggerFactory.getLogger(ConfigMapBulkDependentResource.class);
19+
1520
public static final String LABEL_KEY = "bulk";
1621
public static final String LABEL_VALUE = "true";
1722

0 commit comments

Comments
 (0)