From 7256803c68d7f483ca479eeceb425d5a16ad238a Mon Sep 17 00:00:00 2001 From: Jamo Luhrsen Date: Tue, 14 Nov 2023 16:54:25 -0800 Subject: [PATCH] remove deprecated field mgr before apply patch in the case that we have a deprecated field manager that we need to remove, if the Patch() were to fail that code path would not execute. To move it before the Patch() we also have to do one Get() to know if the removal is neccessary. this was uncovered while debugging this upgrade problem: JIRA: https://issues.redhat.com/browse/OCPBUGS-22293 Signed-off-by: Jamo Luhrsen --- pkg/apply/apply.go | 42 +++++++++++++++++++++++++----------------- 1 file changed, 25 insertions(+), 17 deletions(-) diff --git a/pkg/apply/apply.go b/pkg/apply/apply.go index 9e4752790e..bcc75630dd 100644 --- a/pkg/apply/apply.go +++ b/pkg/apply/apply.go @@ -125,29 +125,37 @@ func ApplyObject(ctx context.Context, client cnoclient.Client, obj Object, subco log.Printf("could not encode %s for apply", objDesc) return fmt.Errorf("could not encode for patching: %w", err) } - us, err := clusterClient.Dynamic().Resource(rm.Resource).Namespace(namespace).Patch(ctx, name, types.ApplyPatchType, data, patchOptions, subresources...) - if err != nil { - return fmt.Errorf("failed to apply / update %s: %w", objDesc, err) - } - // consider removing in OCP 4.18 when we know field manager 'cluster-network-operator' no longer possibly // exists in any object from all upgrade paths + // Retrieve the current state of the resource if isDepFieldManagerCleanupNeeded(subcontroller) { - us.SetGroupVersionKind(gvk) - - if doesManagerOpExist(us.GetManagedFields(), depreciatedFieldManager, metav1.ManagedFieldsOperationUpdate, - metav1.ManagedFieldsOperationApply) { - - us.SetGroupVersionKind(obj.GetObjectKind().GroupVersionKind()) - if err = mergeManager(ctx, clusterClient, us, depreciatedFieldManager, fieldManager, rm.Resource); err != nil { - klog.Errorf("Failed to merge field managers %q for object %q %s %s: %v", depreciatedFieldManager, - gvk.String(), obj.GetNamespace(), obj.GetName(), err) - } else { - klog.Infof("Depreciated field manager %s for object %q %s %s", depreciatedFieldManager, - gvk.String(), obj.GetNamespace(), obj.GetName()) + us, err := clusterClient.Dynamic().Resource(rm.Resource).Namespace(namespace).Get(ctx, name, metav1.GetOptions{}) + if err != nil && !apierrors.IsNotFound(err) { + return fmt.Errorf("failed to get current state of %s: %w", objDesc, err) + } + if us != nil { + us.SetGroupVersionKind(gvk) + + if doesManagerOpExist(us.GetManagedFields(), depreciatedFieldManager, metav1.ManagedFieldsOperationUpdate, + metav1.ManagedFieldsOperationApply) { + + us.SetGroupVersionKind(obj.GetObjectKind().GroupVersionKind()) + if err = mergeManager(ctx, clusterClient, us, depreciatedFieldManager, fieldManager, rm.Resource); err != nil { + klog.Errorf("Failed to merge field managers %q for object %q %s %s: %v", depreciatedFieldManager, + gvk.String(), obj.GetNamespace(), obj.GetName(), err) + } else { + klog.Infof("Depreciated field manager %s for object %q %s %s", depreciatedFieldManager, + gvk.String(), obj.GetNamespace(), obj.GetName()) + } } } } + + _, err = clusterClient.Dynamic().Resource(rm.Resource).Namespace(namespace).Patch(ctx, name, types.ApplyPatchType, data, patchOptions, subresources...) + if err != nil { + return fmt.Errorf("failed to apply / update %s: %w", objDesc, err) + } + log.Printf("Apply / Create of %s was successful", objDesc) return nil }