Skip to content

Commit c6cefac

Browse files
committed
wip
Signed-off-by: Attila Mészáros <[email protected]>
1 parent 4064492 commit c6cefac

File tree

6 files changed

+84
-117
lines changed

6 files changed

+84
-117
lines changed
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
/*
2+
* Copyright Java Operator SDK Authors
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
package io.javaoperatorsdk.operator.api.reconciler;
17+
18+
public abstract class AbstractUpdateControl<T extends BaseControl<T>> extends BaseControl<T> {
19+
20+
private boolean filterPatchEvent = true;
21+
22+
public T filterPatchEvent(boolean filterPatchEvent) {
23+
this.filterPatchEvent = filterPatchEvent;
24+
return (T) this;
25+
}
26+
27+
public boolean isFilterPatchEvent() {
28+
return filterPatchEvent;
29+
}
30+
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
import io.fabric8.kubernetes.api.model.HasMetadata;
2222

2323
public class ErrorStatusUpdateControl<P extends HasMetadata>
24-
extends BaseControl<ErrorStatusUpdateControl<P>> {
24+
extends AbstractUpdateControl<ErrorStatusUpdateControl<P>> {
2525

2626
private final P resource;
2727
private boolean noRetry = false;

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
import io.fabric8.kubernetes.api.model.HasMetadata;
2121
import io.fabric8.kubernetes.client.CustomResource;
2222

23-
public class UpdateControl<P extends HasMetadata> extends BaseControl<UpdateControl<P>> {
23+
public class UpdateControl<P extends HasMetadata> extends AbstractUpdateControl<UpdateControl<P>> {
2424

2525
private final P resource;
2626
private final boolean patchResource;

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

Lines changed: 21 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@
2323

2424
import io.fabric8.kubernetes.api.model.HasMetadata;
2525
import io.fabric8.kubernetes.api.model.KubernetesResourceList;
26-
import io.fabric8.kubernetes.api.model.Namespaced;
2726
import io.fabric8.kubernetes.client.KubernetesClientException;
2827
import io.fabric8.kubernetes.client.dsl.MixedOperation;
2928
import io.fabric8.kubernetes.client.dsl.Resource;
@@ -188,7 +187,8 @@ private PostExecutionControl<P> reconcileExecution(
188187
}
189188

190189
if (updateControl.isPatchResource()) {
191-
updatedCustomResource = patchResource(context, toUpdate, originalResource);
190+
updatedCustomResource =
191+
patchResource(context, toUpdate, originalResource, updateControl.isFilterPatchEvent());
192192
if (!useSSA) {
193193
toUpdate
194194
.getMetadata()
@@ -197,7 +197,8 @@ private PostExecutionControl<P> reconcileExecution(
197197
}
198198

199199
if (updateControl.isPatchStatus()) {
200-
customResourceFacade.patchStatus(context, toUpdate, originalResource);
200+
customResourceFacade.patchStatus(
201+
context, toUpdate, originalResource, updateControl.isFilterPatchEvent());
201202
}
202203
return createPostExecutionControl(updatedCustomResource, updateControl, executionScope);
203204
}
@@ -235,7 +236,10 @@ public boolean isLastAttempt() {
235236
try {
236237
updatedResource =
237238
customResourceFacade.patchStatus(
238-
context, errorStatusUpdateControl.getResource().orElseThrow(), originalResource);
239+
context,
240+
errorStatusUpdateControl.getResource().orElseThrow(),
241+
originalResource,
242+
errorStatusUpdateControl.isFilterPatchEvent());
239243
} catch (Exception ex) {
240244
int code = ex instanceof KubernetesClientException kcex ? kcex.getCode() : -1;
241245
Level exceptionLevel = Level.ERROR;
@@ -341,7 +345,7 @@ private PostExecutionControl<P> handleCleanup(
341345
return postExecutionControl;
342346
}
343347

344-
private P patchResource(Context<P> context, P resource, P originalResource) {
348+
private P patchResource(Context<P> context, P resource, P originalResource, boolean filterEvent) {
345349
log.debug(
346350
"Updating resource: {} with version: {}; SSA: {}",
347351
getUID(resource),
@@ -354,7 +358,7 @@ private P patchResource(Context<P> context, P resource, P originalResource) {
354358
// addFinalizer already prevents adding an already present finalizer so no need to check
355359
resource.addFinalizer(finalizerName);
356360
}
357-
return customResourceFacade.patchResource(context, resource, originalResource);
361+
return customResourceFacade.patchResource(context, resource, originalResource, filterEvent);
358362
}
359363

360364
ControllerConfiguration<P> configuration() {
@@ -394,40 +398,38 @@ public R getResource(String namespace, String name) {
394398
}
395399
}
396400

397-
public R patchResourceWithoutSSA(R resource, R originalResource) {
398-
return resource(originalResource).edit(r -> resource);
399-
}
400-
401-
public R patchResource(Context<R> context, R resource, R originalResource) {
401+
public R patchResource(
402+
Context<R> context, R resource, R originalResource, boolean filterEvent) {
402403
if (log.isDebugEnabled()) {
403404
log.debug(
404405
"Trying to replace resource {}, version: {}",
405406
ResourceID.fromResource(resource),
406407
resource.getMetadata().getResourceVersion());
407408
}
408409
if (useSSA) {
409-
return ReconcileUtils.serverSideApplyPrimary(context, resource);
410+
return ReconcileUtils.serverSideApplyPrimary(context, resource, filterEvent);
410411
} else {
411-
return ReconcileUtils.jsonPatchPrimary(context, originalResource, r -> resource);
412+
return ReconcileUtils.jsonPatchPrimary(
413+
context, originalResource, r -> resource, filterEvent);
412414
}
413415
}
414416

415-
public R patchStatus(Context<R> context, R resource, R originalResource) {
417+
public R patchStatus(Context<R> context, R resource, R originalResource, boolean filterEvent) {
416418
log.trace("Patching status for resource: {} with ssa: {}", resource, useSSA);
417419
if (useSSA) {
418420
var managedFields = resource.getMetadata().getManagedFields();
419421
try {
420422
resource.getMetadata().setManagedFields(null);
421-
return ReconcileUtils.serverSideApplyPrimaryStatus(context, resource);
423+
return ReconcileUtils.serverSideApplyPrimaryStatus(context, resource, filterEvent);
422424
} finally {
423425
resource.getMetadata().setManagedFields(managedFields);
424426
}
425427
} else {
426-
return editStatus(context, resource, originalResource);
428+
return editStatus(context, resource, originalResource, filterEvent);
427429
}
428430
}
429431

430-
private R editStatus(Context<R> context, R resource, R originalResource) {
432+
private R editStatus(Context<R> context, R resource, R originalResource, boolean filterEvent) {
431433
String resourceVersion = resource.getMetadata().getResourceVersion();
432434
// the cached resource should not be changed in any circumstances
433435
// that can lead to all kinds of race conditions.
@@ -441,19 +443,14 @@ private R editStatus(Context<R> context, R resource, R originalResource) {
441443
r -> {
442444
ReconcilerUtilsInternal.setStatus(r, ReconcilerUtilsInternal.getStatus(resource));
443445
return r;
444-
});
446+
},
447+
filterEvent);
445448
} finally {
446449
// restore initial resource version
447450
clonedOriginal.getMetadata().setResourceVersion(resourceVersion);
448451
resource.getMetadata().setResourceVersion(resourceVersion);
449452
}
450453
}
451-
452-
private Resource<R> resource(R resource) {
453-
return resource instanceof Namespaced
454-
? resourceOperation.inNamespace(resource.getMetadata().getNamespace()).resource(resource)
455-
: resourceOperation.resource(resource);
456-
}
457454
}
458455

459456
private boolean triggerOnAllEvents() {

operator-framework-core/src/test/java/io/javaoperatorsdk/operator/api/reconciler/ReconcileUtilsTest.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,4 +76,9 @@ public void compareResourcePerformanceTest() {
7676

7777
assertThat(dur1).isLessThan(dur2);
7878
}
79+
80+
@Test
81+
void retriesAddingFinalizerWithoutSSA() {
82+
// todo
83+
}
7984
}

0 commit comments

Comments
 (0)