|
12 | 12 | import io.fabric8.kubernetes.client.KubernetesClientException;
|
13 | 13 | import io.fabric8.kubernetes.client.dsl.MixedOperation;
|
14 | 14 | import io.fabric8.kubernetes.client.dsl.Resource;
|
| 15 | +import io.fabric8.kubernetes.client.dsl.base.PatchContext; |
| 16 | +import io.fabric8.kubernetes.client.dsl.base.PatchType; |
15 | 17 | import io.javaoperatorsdk.operator.OperatorException;
|
16 | 18 | import io.javaoperatorsdk.operator.api.ObservedGenerationAware;
|
17 | 19 | import io.javaoperatorsdk.operator.api.config.Cloner;
|
@@ -147,24 +149,24 @@ private PostExecutionControl<P> reconcileExecution(ExecutionScope<P> executionSc
|
147 | 149 | .setResourceVersion(updatedCustomResource.getMetadata().getResourceVersion());
|
148 | 150 | updatedCustomResource =
|
149 | 151 | updateStatusGenerationAware(updateControl.getResource(), originalResource,
|
150 |
| - updateControl.isPatchStatus()); |
| 152 | + updateControl.isPatchStatus(), context); |
151 | 153 | } else if (updateControl.isUpdateStatus()) {
|
152 | 154 | updatedCustomResource =
|
153 | 155 | updateStatusGenerationAware(updateControl.getResource(), originalResource,
|
154 |
| - updateControl.isPatchStatus()); |
| 156 | + updateControl.isPatchStatus(), context); |
155 | 157 | } else if (updateControl.isUpdateResource()) {
|
156 | 158 | updatedCustomResource =
|
157 | 159 | updateCustomResource(updateControl.getResource());
|
158 | 160 | if (shouldUpdateObservedGenerationAutomatically(updatedCustomResource)) {
|
159 | 161 | updatedCustomResource =
|
160 | 162 | updateStatusGenerationAware(updateControl.getResource(), originalResource,
|
161 |
| - updateControl.isPatchStatus()); |
| 163 | + updateControl.isPatchStatus(), context); |
162 | 164 | }
|
163 | 165 | } else if (updateControl.isNoUpdate()
|
164 | 166 | && shouldUpdateObservedGenerationAutomatically(resourceForExecution)) {
|
165 | 167 | updatedCustomResource =
|
166 | 168 | updateStatusGenerationAware(originalResource, originalResource,
|
167 |
| - updateControl.isPatchStatus()); |
| 169 | + updateControl.isPatchStatus(), context); |
168 | 170 | }
|
169 | 171 | return createPostExecutionControl(updatedCustomResource, updateControl);
|
170 | 172 | }
|
@@ -195,7 +197,8 @@ public boolean isLastAttempt() {
|
195 | 197 | P updatedResource = null;
|
196 | 198 | if (errorStatusUpdateControl.getResource().isPresent()) {
|
197 | 199 | updatedResource = errorStatusUpdateControl.isPatch() ? customResourceFacade
|
198 |
| - .patchStatus(errorStatusUpdateControl.getResource().orElseThrow(), originalResource) |
| 200 | + .patchStatus(errorStatusUpdateControl.getResource().orElseThrow(), originalResource, |
| 201 | + context) |
199 | 202 | : customResourceFacade
|
200 | 203 | .updateStatus(errorStatusUpdateControl.getResource().orElseThrow());
|
201 | 204 | }
|
@@ -223,10 +226,11 @@ private boolean isErrorStatusHandlerPresent() {
|
223 | 226 | return controller.getReconciler() instanceof ErrorStatusHandler;
|
224 | 227 | }
|
225 | 228 |
|
226 |
| - private P updateStatusGenerationAware(P resource, P originalResource, boolean patch) { |
| 229 | + private P updateStatusGenerationAware(P resource, P originalResource, boolean patch, |
| 230 | + Context<P> context) { |
227 | 231 | updateStatusObservedGenerationIfRequired(resource);
|
228 | 232 | if (patch) {
|
229 |
| - return customResourceFacade.patchStatus(resource, originalResource); |
| 233 | + return customResourceFacade.patchStatus(resource, originalResource, context); |
230 | 234 | } else {
|
231 | 235 | return customResourceFacade.updateStatus(resource);
|
232 | 236 | }
|
@@ -411,15 +415,24 @@ public R updateStatus(R resource) {
|
411 | 415 | .updateStatus();
|
412 | 416 | }
|
413 | 417 |
|
414 |
| - public R patchStatus(R resource, R originalResource) { |
415 |
| - log.trace("Updating status for resource: {}", resource); |
| 418 | + public R patchStatus(R resource, R originalResource, Context<?> context) { |
| 419 | + var useSSA = context.getControllerConfiguration().getConfigurationService() |
| 420 | + .useSSAForResourceStatusPatch(); |
| 421 | + log.trace("Patching status for resource: {} with ssa: {}", resource, useSSA); |
416 | 422 | String resourceVersion = resource.getMetadata().getResourceVersion();
|
417 | 423 | // don't do optimistic locking on patch
|
418 | 424 | originalResource.getMetadata().setResourceVersion(null);
|
419 | 425 | resource.getMetadata().setResourceVersion(null);
|
420 | 426 | try {
|
421 |
| - return resource(originalResource) |
422 |
| - .editStatus(r -> resource); |
| 427 | + var res = resource(originalResource); |
| 428 | + if (useSSA) { |
| 429 | + return res.subresource("status").patch(new PatchContext.Builder() |
| 430 | + .withFieldManager(context.getControllerConfiguration().fieldManager()) |
| 431 | + .withPatchType(PatchType.SERVER_SIDE_APPLY) |
| 432 | + .build()); |
| 433 | + } else { |
| 434 | + return res.editStatus(r -> resource); |
| 435 | + } |
423 | 436 | } finally {
|
424 | 437 | // restore initial resource version
|
425 | 438 | originalResource.getMetadata().setResourceVersion(resourceVersion);
|
|
0 commit comments