Skip to content

Commit e63b720

Browse files
authored
improve: delete GC dependent if reconcile precondition not met (#1871)
1 parent b5d71c2 commit e63b720

File tree

3 files changed

+31
-4
lines changed

3 files changed

+31
-4
lines changed

Diff for: operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/workflow/WorkflowReconcileExecutor.java

+4-1
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,10 @@ protected void doRun(DependentResourceNode<R, P> dependentResourceNode,
149149
DependentResource<R, P> dependentResource) {
150150
var deletePostCondition = dependentResourceNode.getDeletePostcondition();
151151

152-
if (dependentResource.isDeletable()) {
152+
// GarbageCollected status is irrelevant here, as this method is only called when a
153+
// precondition does not hold,
154+
// a deleter should be deleted even if it is otherwise garbage collected
155+
if (dependentResource instanceof Deleter) {
153156
((Deleter<P>) dependentResource).delete(primary, context);
154157
}
155158
boolean deletePostConditionMet = isConditionMet(deletePostCondition, dependentResource);

Diff for: operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/dependent/workflow/WorkflowCleanupExecutorTest.java

+2-3
Original file line numberDiff line numberDiff line change
@@ -117,15 +117,14 @@ void cleanupConditionDiamondWorkflow() {
117117

118118
@Test
119119
void dontDeleteIfGarbageCollected() {
120-
GarbageCollectedDeleter gcDel = new GarbageCollectedDeleter("GC_DELETER");
121120
var workflow = new WorkflowBuilder<TestCustomResource>()
122-
.addDependentResource(gcDel)
121+
.addDependentResource(gcDeleter)
123122
.build();
124123

125124
var res = workflow.cleanup(new TestCustomResource(), null);
126125

127126
assertThat(executionHistory)
128-
.notReconciled(gcDel);
127+
.notReconciled(gcDeleter);
129128

130129
Assertions.assertThat(res.getDeleteCalledOnDependents()).isEmpty();
131130
}

Diff for: operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/dependent/workflow/WorkflowReconcileExecutorTest.java

+25
Original file line numberDiff line numberDiff line change
@@ -453,4 +453,29 @@ void diamondShareWithReadyCondition() {
453453
Assertions.assertThat(res.getNotReadyDependents()).containsExactlyInAnyOrder(dr2);
454454
}
455455

456+
@Test
457+
void garbageCollectedResourceIsDeletedIfReconcilePreconditionDoesNotHold() {
458+
var workflow = new WorkflowBuilder<TestCustomResource>()
459+
.addDependentResource(gcDeleter).withReconcilePrecondition(not_met_reconcile_condition)
460+
.build();
461+
462+
var res = workflow.reconcile(new TestCustomResource(), mockContext);
463+
464+
Assertions.assertThat(res.getErroredDependents()).isEmpty();
465+
assertThat(executionHistory).deleted(gcDeleter);
466+
}
467+
468+
@Test
469+
void garbageCollectedDeepResourceIsDeletedIfReconcilePreconditionDoesNotHold() {
470+
var workflow = new WorkflowBuilder<TestCustomResource>()
471+
.addDependentResource(dr1).withReconcilePrecondition(not_met_reconcile_condition)
472+
.addDependentResource(gcDeleter).dependsOn(dr1)
473+
.build();
474+
475+
var res = workflow.reconcile(new TestCustomResource(), mockContext);
476+
477+
Assertions.assertThat(res.getErroredDependents()).isEmpty();
478+
assertThat(executionHistory).deleted(gcDeleter);
479+
}
480+
456481
}

0 commit comments

Comments
 (0)