From 8c1e8355f8efb322ad6e53229f0cbb14999a8fc2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wojciech=20Tyczy=C5=84ski?= Date: Fri, 14 Jan 2022 10:14:17 +0100 Subject: [PATCH] Ensure non-nil items in lists --- .../apiserver/pkg/endpoints/handlers/patch.go | 6 --- .../pkg/endpoints/handlers/response.go | 2 +- .../apiserver/pkg/endpoints/handlers/rest.go | 43 ++----------------- 3 files changed, 5 insertions(+), 46 deletions(-) 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 d407dcd5039..17919e4aa17 100644 --- a/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/patch.go +++ b/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/patch.go @@ -236,12 +236,6 @@ func PatchResource(r rest.Patcher, scope *RequestScope, admit admission.Interfac } trace.Step("Object stored in database") - if err := setObjectSelfLink(ctx, result, req, scope.Namer); err != nil { - scope.err(err, w, req) - return - } - trace.Step("Self-link added") - status := http.StatusOK if wasCreated { status = http.StatusCreated diff --git a/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/response.go b/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/response.go index e19cafdda11..52f083f672f 100644 --- a/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/response.go +++ b/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/response.go @@ -59,7 +59,7 @@ func doTransformObject(ctx context.Context, obj runtime.Object, opts interface{} if _, ok := obj.(*metav1.Status); ok { return obj, nil } - if err := setObjectSelfLink(ctx, obj, req, scope.Namer); err != nil { + if err := ensureNonNilItems(obj); err != nil { return nil, err } diff --git a/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/rest.go b/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/rest.go index aba9a3f882a..b40423dac34 100644 --- a/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/rest.go +++ b/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/rest.go @@ -356,49 +356,14 @@ func dedupOwnerReferencesAndAddWarning(obj runtime.Object, requestContext contex } } -// setObjectSelfLink sets the self link of an object as needed. -// TODO: remove the need for the namer LinkSetters by requiring objects implement either Object or List -// interfaces -func setObjectSelfLink(ctx context.Context, obj runtime.Object, req *http.Request, namer ScopeNamer) error { - if utilfeature.DefaultFeatureGate.Enabled(features.RemoveSelfLink) { - // Ensure that for empty lists we don't return items. - if meta.IsListType(obj) && meta.LenList(obj) == 0 { - if err := meta.SetList(obj, []runtime.Object{}); err != nil { - return err - } - } - return nil - } - - // We only generate list links on objects that implement ListInterface - historically we duck typed this - // check via reflection, but as we move away from reflection we require that you not only carry Items but - // ListMeta into order to be identified as a list. - if !meta.IsListType(obj) { - _, ok := request.RequestInfoFrom(ctx) - if !ok { - return fmt.Errorf("missing requestInfo") - } - return nil - } - - _, ok := request.RequestInfoFrom(ctx) - if !ok { - return fmt.Errorf("missing requestInfo") - } - - count := 0 - err := meta.EachListItem(obj, func(obj runtime.Object) error { - count++ - return nil - }) - - if count == 0 { +// ensureNonNilItems ensures that for empty lists we don't return items. +func ensureNonNilItems(obj runtime.Object) error { + if meta.IsListType(obj) && meta.LenList(obj) == 0 { if err := meta.SetList(obj, []runtime.Object{}); err != nil { return err } } - - return err + return nil } func summarizeData(data []byte, maxLength int) string {