From 911e46c08b47b2e60ed5cf09623765a3219674e3 Mon Sep 17 00:00:00 2001 From: Goend Date: Tue, 23 Sep 2025 15:48:27 +0800 Subject: [PATCH] fixed the CRD statusResetFields init issue --- .../pkg/apiserver/customresource_handler.go | 62 ++++++++++++------- 1 file changed, 38 insertions(+), 24 deletions(-) diff --git a/staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/customresource_handler.go b/staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/customresource_handler.go index 77f717528e3..4ec10bc2f2a 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/customresource_handler.go +++ b/staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/customresource_handler.go @@ -1039,30 +1039,6 @@ func (r *crdHandler) getOrCreateServingInfoFor(uid types.UID, name string) (*crd scaleScopes[v.Name] = &scaleScope - // override status subresource values - // shallow copy - statusScope := *requestScopes[v.Name] - statusScope.Subresource = "status" - statusScope.Namer = handlers.ContextBasedNaming{ - Namer: meta.NewAccessor(), - ClusterScoped: clusterScoped, - } - - if subresources != nil && subresources.Status != nil { - resetFields := storages[v.Name].Status.GetResetFields() - statusScope, err = scopeWithFieldManager( - typeConverter, - statusScope, - resetFields, - "status", - ) - if err != nil { - return nil, err - } - } - - statusScopes[v.Name] = &statusScope - if v.Deprecated { deprecated[v.Name] = true if v.DeprecationWarning != nil { @@ -1073,6 +1049,44 @@ func (r *crdHandler) getOrCreateServingInfoFor(uid types.UID, name string) (*crd } } + // override status subresource values + // shallow copy + // resetField write all version information + for _, v := range crd.Spec.Versions { + clusterScoped := crd.Spec.Scope == apiextensionsv1.ClusterScoped + statusScope := *requestScopes[v.Name] + statusScope.Subresource = "status" + statusScope.Namer = handlers.ContextBasedNaming{ + Namer: meta.NewAccessor(), + ClusterScoped: clusterScoped, + } + + subresources, err := apiextensionshelpers.GetSubresourcesForVersion(crd, v.Name) + if err != nil { + utilruntime.HandleError(err) + return nil, fmt.Errorf("the server could not properly serve the CR subresources") + } + if subresources != nil && subresources.Status != nil { + var statusResetFields = make(map[fieldpath.APIVersion]*fieldpath.Set) + for _, value := range crd.Spec.Versions { + resetField := storages[value.Name].Status.GetResetFields() + for apiVersion, set := range resetField { + statusResetFields[apiVersion] = set + } + } + statusScope, err = scopeWithFieldManager( + typeConverter, + statusScope, + statusResetFields, + "status", + ) + if err != nil { + return nil, err + } + statusScopes[v.Name] = &statusScope + } + } + ret := &crdInfo{ spec: &crd.Spec, acceptedNames: &crd.Status.AcceptedNames,