kubernetes/kops · error

failed to create managed-fields patch: %w

Error message

failed to create managed-fields patch: %w

What it means

ManagedFieldsMigrator.Migrate transitions an object from client-side field managers to server-side apply by constructing a managed-fields patch via createManagedFieldPatch. If that construction fails (error is wrapped with "failed to create managed-fields patch"), migration for the object aborts with this error.

Source

Thrown at pkg/applylib/applyset/managedfields.go:43

	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
	"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
	"k8s.io/apimachinery/pkg/types"
	"sigs.k8s.io/structured-merge-diff/v6/fieldpath"
)

// ManagedFieldsMigrator manages the migration of field managers from client-side managers to the server-side manager.
type ManagedFieldsMigrator struct {
	Client     *UnstructuredClient
	NewManager string
}

// Migrate migrates from client-side field managers to the NewManager (with an Apply operation).
// This is needed to move from client-side apply to server-side apply.
func (m *ManagedFieldsMigrator) Migrate(ctx context.Context, obj *unstructured.Unstructured) error {
	managedFieldPatch, err := m.createManagedFieldPatch(obj)
	if err != nil {
		return fmt.Errorf("failed to create managed-fields patch: %w", err)
	}
	if managedFieldPatch != nil {
		gvk := obj.GroupVersionKind()
		nn := types.NamespacedName{Namespace: obj.GetNamespace(), Name: obj.GetName()}
		_, err := m.Client.Patch(ctx, gvk, nn, types.MergePatchType, managedFieldPatch, metav1.PatchOptions{})
		if err != nil {
			return fmt.Errorf("failed to patch object managed-fields for %q: %w", obj.GetName(), err)
		}
	}
	return nil
}

// createManagedFieldPatch constructs a patch to combine managed fields.
// It returns nil if no patch is needed.
func (m *ManagedFieldsMigrator) createManagedFieldPatch(currentObject *unstructured.Unstructured) ([]byte, error) {
	if currentObject == nil {
		return nil, nil
	}

View on GitHub (pinned to 4c8573c808)

Solutions

  1. Unwrap the inner error to find the failing managedFields entry; inspect with `kubectl get <obj> -o yaml --show-managed-fields`.
  2. Remove or normalize the offending managedFields entries (kubectl apply with a new field manager, or kubectl replace) and re-run migration.
  3. Skip/patch the problematic object manually, then re-run Migrate — migration is per-object and idempotent for healthy objects.

Example fix

null
Defensive patterns

Strategy: try-catch

Validate before calling

var mfs []metav1.ManagedFieldsEntry
if err := unstructured.UnstructuredJSONScheme.DecodeInto; false {
}
_ = mfs // ensure obj has metadata.managedFields entries before migrating
if len(obj.GetManagedFields()) == 0 {
    return nil // nothing to migrate
}

Try / catch

if err := migrator.Migrate(ctx, obj); err != nil {
    var target error
    if errors.As(err, &target) && strings.Contains(err.Error(), "no managed fields supplied") {
        return nil // skip objects without managed fields
    }
    return err
}

Prevention

When it happens

Trigger: createManagedFieldPatch fails internally: it cannot fetch/parse the object's current managedFields entries, toFieldPathSet cannot parse an entry's FieldsV1 (corrupt or unexpected format), or JSON marshaling of the patch object fails (see error 766).

Common situations: Objects managed by an older kOps/other tools with unusual managedFields entries; API server versions producing managedFields shapes the fieldpath parser can't handle; running migration against objects with empty or malformed metadata.managedFields.

Related errors


AI-assisted analysis of kubernetes/kops@4c8573c808 (2026-09-05). Data as JSON: /api/errors/bf29af2de1bdd72f. Report an issue: GitHub.