diff --git a/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/patch.go b/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/patch.go index ca561192f50..8209efef708 100644 --- a/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/patch.go +++ b/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/patch.go @@ -344,6 +344,11 @@ func (p *jsonPatcher) applyPatchToCurrentObject(requestContext context.Context, } } + if p.options == nil { + // Provide a more informative error for the crash that would + // happen on the next line + panic("PatchOptions required but not provided") + } objToUpdate = p.fieldManager.UpdateNoErrors(currentObject, objToUpdate, managerOrUserAgent(p.options.FieldManager, p.userAgent)) return objToUpdate, nil } diff --git a/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/rest_test.go b/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/rest_test.go index ff5f0dc47b1..b0165e23fd2 100644 --- a/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/rest_test.go +++ b/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/rest_test.go @@ -40,6 +40,7 @@ import ( "k8s.io/apimachinery/pkg/runtime/serializer" "k8s.io/apimachinery/pkg/types" "k8s.io/apimachinery/pkg/util/json" + "k8s.io/apimachinery/pkg/util/managedfields" utilruntime "k8s.io/apimachinery/pkg/util/runtime" "k8s.io/apimachinery/pkg/util/strategicpatch" "k8s.io/apimachinery/pkg/util/yaml" @@ -451,6 +452,13 @@ func (tc *patchTestCase) Run(t *testing.T) { schemaReferenceObj := &examplev1.Pod{} hubVersion := example.SchemeGroupVersion + fieldmanager, err := managedfields.NewDefaultFieldManager( + managedfields.NewDeducedTypeConverter(), + convertor, defaulter, creater, kind, hubVersion, "", nil) + + if err != nil { + t.Fatalf("failed to create field manager: %v", err) + } for _, patchType := range []types.PatchType{types.JSONPatchType, types.MergePatchType, types.StrategicMergePatchType} { // This needs to be reset on each iteration. testPatcher := &testPatcher{ @@ -536,10 +544,15 @@ func (tc *patchTestCase) Run(t *testing.T) { name: name, patchType: patchType, patchBytes: patch, + options: &metav1.PatchOptions{ + FieldManager: "test-manager", + }, } ctx, cancel := context.WithTimeout(ctx, time.Second) - resultObj, _, err := p.patchResource(ctx, &RequestScope{}) + resultObj, _, err := p.patchResource(ctx, &RequestScope{ + FieldManager: fieldmanager, + }) cancel() if len(tc.expectedError) != 0 {