28
28
import io .javaoperatorsdk .operator .api .reconciler .UpdateControl ;
29
29
import io .javaoperatorsdk .operator .processing .Controller ;
30
30
31
- import static io .javaoperatorsdk .operator .processing .KubernetesResourceUtils .getName ;
32
- import static io .javaoperatorsdk .operator .processing .KubernetesResourceUtils .getUID ;
33
- import static io .javaoperatorsdk .operator .processing .KubernetesResourceUtils .getVersion ;
31
+ import static io .javaoperatorsdk .operator .processing .KubernetesResourceUtils .*;
34
32
35
33
/**
36
34
* Handles calls and results of a Reconciler and finalizer related logic
@@ -48,8 +46,7 @@ class ReconciliationDispatcher<P extends HasMetadata> {
48
46
private final boolean retryConfigurationHasZeroAttempts ;
49
47
private final Cloner cloner ;
50
48
51
- ReconciliationDispatcher (Controller <P > controller ,
52
- CustomResourceFacade <P > customResourceFacade ) {
49
+ ReconciliationDispatcher (Controller <P > controller , CustomResourceFacade <P > customResourceFacade ) {
53
50
this .controller = controller ;
54
51
this .customResourceFacade = customResourceFacade ;
55
52
this .cloner = controller .getConfiguration ().getConfigurationService ().getResourceCloner ();
@@ -59,7 +56,8 @@ class ReconciliationDispatcher<P extends HasMetadata> {
59
56
}
60
57
61
58
public ReconciliationDispatcher (Controller <P > controller ) {
62
- this (controller , new CustomResourceFacade <>(controller .getCRClient ()));
59
+ this (controller ,
60
+ new CustomResourceFacade <>(controller .getCRClient (), controller .getConfiguration ()));
63
61
}
64
62
65
63
public PostExecutionControl <P > handleExecution (ExecutionScope <P > executionScope ) {
@@ -141,33 +139,24 @@ private PostExecutionControl<P> reconcileExecution(ExecutionScope<P> executionSc
141
139
142
140
UpdateControl <P > updateControl = controller .reconcile (resourceForExecution , context );
143
141
P updatedCustomResource = null ;
142
+ final var toUpdate =
143
+ updateControl .isNoUpdate () ? originalResource : updateControl .getResource ();
144
144
if (updateControl .isUpdateResourceAndStatus ()) {
145
- updatedCustomResource =
146
- updateCustomResource (updateControl .getResource ());
147
- updateControl
148
- .getResource ()
145
+ updatedCustomResource = updateCustomResource (toUpdate );
146
+ toUpdate
149
147
.getMetadata ()
150
148
.setResourceVersion (updatedCustomResource .getMetadata ().getResourceVersion ());
151
- updatedCustomResource =
152
- updateStatusGenerationAware (updateControl .getResource (), originalResource ,
153
- updateControl .isPatchStatus (), context );
154
- } else if (updateControl .isUpdateStatus ()) {
155
- updatedCustomResource =
156
- updateStatusGenerationAware (updateControl .getResource (), originalResource ,
157
- updateControl .isPatchStatus (), context );
158
149
} else if (updateControl .isUpdateResource ()) {
150
+ updatedCustomResource = updateCustomResource (toUpdate );
151
+ }
152
+
153
+ // check if status also needs to be updated
154
+ final var updateObservedGeneration = updateControl .isNoUpdate () ?
155
+ shouldUpdateObservedGenerationAutomatically (resourceForExecution ) :
156
+ shouldUpdateObservedGenerationAutomatically (updatedCustomResource );
157
+ if (updateControl .isUpdateResourceAndStatus () || updateControl .isUpdateStatus () || updateObservedGeneration ) {
159
158
updatedCustomResource =
160
- updateCustomResource (updateControl .getResource ());
161
- if (shouldUpdateObservedGenerationAutomatically (updatedCustomResource )) {
162
- updatedCustomResource =
163
- updateStatusGenerationAware (updateControl .getResource (), originalResource ,
164
- updateControl .isPatchStatus (), context );
165
- }
166
- } else if (updateControl .isNoUpdate ()
167
- && shouldUpdateObservedGenerationAutomatically (resourceForExecution )) {
168
- updatedCustomResource =
169
- updateStatusGenerationAware (originalResource , originalResource ,
170
- updateControl .isPatchStatus (), context );
159
+ updateStatusGenerationAware (toUpdate , originalResource , updateControl .isPatchStatus ());
171
160
}
172
161
return createPostExecutionControl (updatedCustomResource , updateControl );
173
162
}
@@ -198,8 +187,7 @@ public boolean isLastAttempt() {
198
187
P updatedResource = null ;
199
188
if (errorStatusUpdateControl .getResource ().isPresent ()) {
200
189
updatedResource = errorStatusUpdateControl .isPatch () ? customResourceFacade
201
- .patchStatus (errorStatusUpdateControl .getResource ().orElseThrow (), originalResource ,
202
- context )
190
+ .patchStatus (errorStatusUpdateControl .getResource ().orElseThrow (), originalResource )
203
191
: customResourceFacade
204
192
.updateStatus (errorStatusUpdateControl .getResource ().orElseThrow ());
205
193
}
@@ -227,11 +215,10 @@ private boolean isErrorStatusHandlerPresent() {
227
215
return controller .getReconciler () instanceof ErrorStatusHandler ;
228
216
}
229
217
230
- private P updateStatusGenerationAware (P resource , P originalResource , boolean patch ,
231
- Context <P > context ) {
218
+ private P updateStatusGenerationAware (P resource , P originalResource , boolean patch ) {
232
219
updateStatusObservedGenerationIfRequired (resource );
233
220
if (patch ) {
234
- return customResourceFacade .patchStatus (resource , originalResource , context );
221
+ return customResourceFacade .patchStatus (resource , originalResource );
235
222
} else {
236
223
return customResourceFacade .updateStatus (resource );
237
224
}
@@ -384,10 +371,16 @@ public P conflictRetryingUpdate(P resource, Function<P, Boolean> modificationFun
384
371
static class CustomResourceFacade <R extends HasMetadata > {
385
372
386
373
private final MixedOperation <R , KubernetesResourceList <R >, Resource <R >> resourceOperation ;
374
+ private final boolean useSSAToUpdateStatus ;
375
+ private final String fieldManager ;
387
376
388
377
public CustomResourceFacade (
389
- MixedOperation <R , KubernetesResourceList <R >, Resource <R >> resourceOperation ) {
378
+ MixedOperation <R , KubernetesResourceList <R >, Resource <R >> resourceOperation ,
379
+ ControllerConfiguration <R > configuration ) {
390
380
this .resourceOperation = resourceOperation ;
381
+ this .useSSAToUpdateStatus =
382
+ configuration .getConfigurationService ().useSSAForResourceStatusPatch ();
383
+ this .fieldManager = configuration .fieldManager ();
391
384
}
392
385
393
386
public R getResource (String namespace , String name ) {
@@ -416,23 +409,21 @@ public R updateStatus(R resource) {
416
409
.updateStatus ();
417
410
}
418
411
419
- public R patchStatus (R resource , R originalResource , Context <?> context ) {
420
- var useSSA = context .getControllerConfiguration ().getConfigurationService ()
421
- .useSSAForResourceStatusPatch ();
422
- log .trace ("Patching status for resource: {} with ssa: {}" , resource , useSSA );
412
+ public R patchStatus (R resource , R originalResource ) {
413
+ log .trace ("Patching status for resource: {} with ssa: {}" , resource , useSSAToUpdateStatus );
423
414
String resourceVersion = resource .getMetadata ().getResourceVersion ();
424
415
// don't do optimistic locking on patch
425
416
originalResource .getMetadata ().setResourceVersion (null );
426
417
resource .getMetadata ().setResourceVersion (null );
427
418
try {
428
- if (useSSA ) {
419
+ if (useSSAToUpdateStatus ) {
429
420
var managedFields = resource .getMetadata ().getManagedFields ();
430
421
try {
431
422
432
423
resource .getMetadata ().setManagedFields (Collections .emptyList ());
433
424
var res = resource (resource );
434
425
return res .subresource ("status" ).patch (new PatchContext .Builder ()
435
- .withFieldManager (context . getControllerConfiguration (). fieldManager () )
426
+ .withFieldManager (fieldManager )
436
427
.withForce (true )
437
428
.withPatchType (PatchType .SERVER_SIDE_APPLY )
438
429
.build ());
0 commit comments