Skip to content

Commit 7986fc8

Browse files
committed
finalizer removal with patch without SSA
Signed-off-by: Attila Mészáros <[email protected]>
1 parent 74bb719 commit 7986fc8

File tree

3 files changed

+23
-14
lines changed

3 files changed

+23
-14
lines changed

operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/ReconciliationDispatcher.java

+13-4
Original file line numberDiff line numberDiff line change
@@ -312,7 +312,7 @@ private PostExecutionControl<P> handleCleanup(P resource,
312312
return false;
313313
}
314314
return r.removeFinalizer(finalizerName);
315-
});
315+
},true);
316316
return PostExecutionControl.customResourceFinalizerRemoved(customResource);
317317
}
318318
}
@@ -351,7 +351,7 @@ private P updateCustomResourceWithFinalizer(P resourceForExecution, P originalRe
351351
"Adding finalizer for resource: {} version: {}", getUID(originalResource),
352352
getVersion(originalResource));
353353
return conflictRetryingPatch(resourceForExecution, originalResource,
354-
r -> r.addFinalizer(configuration().getFinalizerName()));
354+
r -> r.addFinalizer(configuration().getFinalizerName()), false);
355355
}
356356

357357
private P patchResource(P resource, P originalResource) {
@@ -373,7 +373,7 @@ ControllerConfiguration<P> configuration() {
373373
}
374374

375375
public P conflictRetryingPatch(P resource, P originalResource,
376-
Function<P, Boolean> modificationFunction) {
376+
Function<P, Boolean> modificationFunction, boolean forceNotUseSSA) {
377377
if (log.isDebugEnabled()) {
378378
log.debug("Conflict retrying update for: {}", ResourceID.fromResource(resource));
379379
}
@@ -384,7 +384,11 @@ public P conflictRetryingPatch(P resource, P originalResource,
384384
if (Boolean.FALSE.equals(modified)) {
385385
return resource;
386386
}
387-
return customResourceFacade.patchResource(resource, originalResource);
387+
if (forceNotUseSSA) {
388+
return customResourceFacade.patchResourceWithoutSSA(resource,originalResource);
389+
} else {
390+
return customResourceFacade.patchResource(resource, originalResource);
391+
}
388392
} catch (KubernetesClientException e) {
389393
log.trace("Exception during patch for resource: {}", resource);
390394
retryIndex++;
@@ -428,6 +432,10 @@ public R getResource(String namespace, String name) {
428432
}
429433
}
430434

435+
public R patchResourceWithoutSSA(R resource, R originalResource) {
436+
return resource(originalResource).edit(r -> resource);
437+
}
438+
431439
public R patchResource(R resource, R originalResource) {
432440
if (log.isDebugEnabled()) {
433441
log.debug(
@@ -475,6 +483,7 @@ public R patchStatus(R resource, R originalResource) {
475483

476484
public R patchResourceWithSSA(R resource) {
477485
var managedFields = resource.getMetadata().getManagedFields();
486+
resource.getMetadata().setManagedFields(null);
478487
try {
479488
return resource(resource).patch(new PatchContext.Builder()
480489
.withFieldManager(fieldManager)

operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/event/ReconciliationDispatcherTest.java

+9-9
Original file line numberDiff line numberDiff line change
@@ -197,7 +197,7 @@ void removesDefaultFinalizerOnDeleteIfSet() {
197197
reconciliationDispatcher.handleExecution(executionScopeWithCREvent(testCustomResource));
198198

199199
assertThat(postExecControl.isFinalizerRemoved()).isTrue();
200-
verify(customResourceFacade, times(1)).patchResource(eq(testCustomResource), any());
200+
verify(customResourceFacade, times(1)).patchResourceWithoutSSA(eq(testCustomResource), any());
201201
}
202202

203203
@Test
@@ -206,7 +206,7 @@ void retriesFinalizerRemovalWithFreshResource() {
206206
markForDeletion(testCustomResource);
207207
var resourceWithFinalizer = TestUtils.testCustomResource();
208208
resourceWithFinalizer.addFinalizer(DEFAULT_FINALIZER);
209-
when(customResourceFacade.patchResource(eq(testCustomResource), any()))
209+
when(customResourceFacade.patchResourceWithoutSSA(eq(testCustomResource), any()))
210210
.thenThrow(new KubernetesClientException(null, 409, null))
211211
.thenReturn(testCustomResource);
212212
when(customResourceFacade.getResource(any(), any())).thenReturn(resourceWithFinalizer);
@@ -215,7 +215,7 @@ void retriesFinalizerRemovalWithFreshResource() {
215215
reconciliationDispatcher.handleExecution(executionScopeWithCREvent(testCustomResource));
216216

217217
assertThat(postExecControl.isFinalizerRemoved()).isTrue();
218-
verify(customResourceFacade, times(2)).patchResource(any(), any());
218+
verify(customResourceFacade, times(2)).patchResourceWithoutSSA(any(), any());
219219
verify(customResourceFacade, times(1)).getResource(any(), any());
220220
}
221221

@@ -225,23 +225,23 @@ void nullResourceIsGracefullyHandledOnFinalizerRemovalRetry() {
225225
// of the finalizer removal
226226
testCustomResource.addFinalizer(DEFAULT_FINALIZER);
227227
markForDeletion(testCustomResource);
228-
when(customResourceFacade.patchResource(any(), any()))
228+
when(customResourceFacade.patchResourceWithoutSSA(any(), any()))
229229
.thenThrow(new KubernetesClientException(null, 409, null));
230230
when(customResourceFacade.getResource(any(), any())).thenReturn(null);
231231

232232
var postExecControl =
233233
reconciliationDispatcher.handleExecution(executionScopeWithCREvent(testCustomResource));
234234

235235
assertThat(postExecControl.isFinalizerRemoved()).isTrue();
236-
verify(customResourceFacade, times(1)).patchResource(eq(testCustomResource), any());
236+
verify(customResourceFacade, times(1)).patchResourceWithoutSSA(eq(testCustomResource), any());
237237
verify(customResourceFacade, times(1)).getResource(any(), any());
238238
}
239239

240240
@Test
241241
void throwsExceptionIfFinalizerRemovalRetryExceeded() {
242242
testCustomResource.addFinalizer(DEFAULT_FINALIZER);
243243
markForDeletion(testCustomResource);
244-
when(customResourceFacade.patchResource(any(), any()))
244+
when(customResourceFacade.patchResourceWithoutSSA(any(), any()))
245245
.thenThrow(new KubernetesClientException(null, 409, null));
246246
when(customResourceFacade.getResource(any(), any()))
247247
.thenAnswer((Answer<TestCustomResource>) invocationOnMock -> createResourceWithFinalizer());
@@ -253,7 +253,7 @@ void throwsExceptionIfFinalizerRemovalRetryExceeded() {
253253
assertThat(postExecControl.getRuntimeException()).isPresent();
254254
assertThat(postExecControl.getRuntimeException().get())
255255
.isInstanceOf(OperatorException.class);
256-
verify(customResourceFacade, times(MAX_UPDATE_RETRY)).patchResource(any(), any());
256+
verify(customResourceFacade, times(MAX_UPDATE_RETRY)).patchResourceWithoutSSA(any(), any());
257257
verify(customResourceFacade, times(MAX_UPDATE_RETRY - 1)).getResource(any(),
258258
any());
259259
}
@@ -262,15 +262,15 @@ void throwsExceptionIfFinalizerRemovalRetryExceeded() {
262262
void throwsExceptionIfFinalizerRemovalClientExceptionIsNotConflict() {
263263
testCustomResource.addFinalizer(DEFAULT_FINALIZER);
264264
markForDeletion(testCustomResource);
265-
when(customResourceFacade.patchResource(any(), any()))
265+
when(customResourceFacade.patchResourceWithoutSSA(any(), any()))
266266
.thenThrow(new KubernetesClientException(null, 400, null));
267267

268268
var res =
269269
reconciliationDispatcher.handleExecution(executionScopeWithCREvent(testCustomResource));
270270

271271
assertThat(res.getRuntimeException()).isPresent();
272272
assertThat(res.getRuntimeException().get()).isInstanceOf(KubernetesClientException.class);
273-
verify(customResourceFacade, times(1)).patchResource(any(), any());
273+
verify(customResourceFacade, times(1)).patchResourceWithoutSSA(any(), any());
274274
verify(customResourceFacade, never()).getResource(any(), any());
275275
}
276276

sample-operators/webpage/src/test/java/io/javaoperatorsdk/operator/sample/WebPageOperatorAbstractTest.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ public abstract class WebPageOperatorAbstractTest {
3737
public static final String TEST_PAGE = "test-page";
3838
public static final String TITLE1 = "Hello Operator World";
3939
public static final String TITLE2 = "Hello Operator World Title 2";
40-
public static final int WAIT_SECONDS = 20;
40+
public static final int WAIT_SECONDS = 360;
4141
public static final int LONG_WAIT_SECONDS = 120;
4242
public static final Duration POLL_INTERVAL = Duration.ofSeconds(1);
4343

0 commit comments

Comments
 (0)