Skip to content

Commit

Permalink
remove deprecated field mgr before apply patch
Browse files Browse the repository at this point in the history
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 <jluhrsen@gmail.com>
  • Loading branch information
jluhrsen committed Dec 19, 2023
1 parent 73a1db2 commit 7256803
Showing 1 changed file with 25 additions and 17 deletions.
42 changes: 25 additions & 17 deletions pkg/apply/apply.go
Expand Up @@ -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
}
Expand Down

0 comments on commit 7256803

Please sign in to comment.