diff --git a/go.mod b/go.mod index bbdfc7796..bd081c316 100644 --- a/go.mod +++ b/go.mod @@ -42,9 +42,9 @@ require ( google.golang.org/protobuf v1.28.1 gopkg.in/natefinch/lumberjack.v2 v2.0.0 gopkg.in/square/go-jose.v2 v2.6.0 - k8s.io/api v0.0.0-20230316002315-c80582ebe125 + k8s.io/api v0.0.0-20230316181320-bad7d34a01c9 k8s.io/apimachinery v0.0.0-20230315054728-8d1258da8f38 - k8s.io/client-go v0.0.0-20230316040718-4666344cbcd7 + k8s.io/client-go v0.0.0-20230317001143-1517ffb8d37c k8s.io/component-base v0.0.0-20230315065615-6b9bb8ecc3d0 k8s.io/klog/v2 v2.90.1 k8s.io/kms v0.0.0-20230315071547-f5c193c64781 @@ -124,9 +124,9 @@ require ( ) replace ( - k8s.io/api => k8s.io/api v0.0.0-20230316002315-c80582ebe125 + k8s.io/api => k8s.io/api v0.0.0-20230316181320-bad7d34a01c9 k8s.io/apimachinery => k8s.io/apimachinery v0.0.0-20230315054728-8d1258da8f38 - k8s.io/client-go => k8s.io/client-go v0.0.0-20230316040718-4666344cbcd7 + k8s.io/client-go => k8s.io/client-go v0.0.0-20230317001143-1517ffb8d37c k8s.io/component-base => k8s.io/component-base v0.0.0-20230315065615-6b9bb8ecc3d0 k8s.io/kms => k8s.io/kms v0.0.0-20230315071547-f5c193c64781 ) diff --git a/go.sum b/go.sum index 6db25dd94..a833884ff 100644 --- a/go.sum +++ b/go.sum @@ -878,12 +878,12 @@ honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -k8s.io/api v0.0.0-20230316002315-c80582ebe125 h1:sNLUUpJNxIYmttU1YQIm4nhSD2jK3wOkSQVsqhlFh2A= -k8s.io/api v0.0.0-20230316002315-c80582ebe125/go.mod h1:aZ6MBt4NMLXSxkSKFkoDaP4hTutnZIvH5dCSpOis9g4= +k8s.io/api v0.0.0-20230316181320-bad7d34a01c9 h1:RX71Fts5hM4MOPrwU2mAILmdHSQipOntTKs8SVRvZNA= +k8s.io/api v0.0.0-20230316181320-bad7d34a01c9/go.mod h1:aZ6MBt4NMLXSxkSKFkoDaP4hTutnZIvH5dCSpOis9g4= k8s.io/apimachinery v0.0.0-20230315054728-8d1258da8f38 h1:n1qDRCTPAXwyXYg7eSpWDO9FdW79lwAQ9dAr1vETpn4= k8s.io/apimachinery v0.0.0-20230315054728-8d1258da8f38/go.mod h1:5ikh59fK3AJ287GUvpUsryoMFtH9zj/ARfWCo3AyXTM= -k8s.io/client-go v0.0.0-20230316040718-4666344cbcd7 h1:94RqmF9IE9dqxNjr6CRIlO+lVabE46SzrOptrmHAiCc= -k8s.io/client-go v0.0.0-20230316040718-4666344cbcd7/go.mod h1:L61adAiamj+NzecNEOyWV9fYq4VVrOCcn2enXFUiJL8= +k8s.io/client-go v0.0.0-20230317001143-1517ffb8d37c h1:29TaJLdOV+6YadAIsdLLH5ImjgMWTuEm3a/COrgIGoI= +k8s.io/client-go v0.0.0-20230317001143-1517ffb8d37c/go.mod h1:+yf0C0ynOsv3GhBRexl/5CJzyS/uxZJ1Gtn6N5GuVmc= k8s.io/component-base v0.0.0-20230315065615-6b9bb8ecc3d0 h1:IjneP02MOB07PIP9+PQjKrOIZEZ5T7umR+GIZkU4h0U= k8s.io/component-base v0.0.0-20230315065615-6b9bb8ecc3d0/go.mod h1:kTuptveA6tUMLMKnaq4AbIAAk7IcdhwkbljAV3JZRpM= k8s.io/klog/v2 v2.90.1 h1:m4bYOKall2MmOiRaR1J+We67Do7vm9KiQVlT96lnHUw= diff --git a/pkg/endpoints/handlers/create.go b/pkg/endpoints/handlers/create.go index 71f4990a0..78c1d2f52 100644 --- a/pkg/endpoints/handlers/create.go +++ b/pkg/endpoints/handlers/create.go @@ -162,8 +162,13 @@ func createHandler(r rest.NamedCreater, scope *RequestScope, admit admission.Int userInfo, _ := request.UserFrom(ctx) if objectMeta, err := meta.Accessor(obj); err == nil { - // Wipe fields which cannot take user-provided values - rest.WipeObjectMetaSystemFields(objectMeta) + preserveObjectMetaSystemFields := false + if c, ok := r.(rest.SubresourceObjectMetaPreserver); ok && len(scope.Subresource) > 0 { + preserveObjectMetaSystemFields = c.PreserveRequestObjectMetaSystemFieldsOnSubresourceCreate() + } + if !preserveObjectMetaSystemFields { + rest.WipeObjectMetaSystemFields(objectMeta) + } // ensure namespace on the object is correct, or error if a conflicting namespace was set in the object if err := rest.EnsureObjectNamespaceMatchesRequestNamespace(rest.ExpectedNamespaceForResource(namespace, scope.Resource), objectMeta); err != nil { diff --git a/pkg/registry/rest/rest.go b/pkg/registry/rest/rest.go index b8d47ff4f..78b6ea8b0 100644 --- a/pkg/registry/rest/rest.go +++ b/pkg/registry/rest/rest.go @@ -209,6 +209,13 @@ type NamedCreater interface { Create(ctx context.Context, name string, obj runtime.Object, createValidation ValidateObjectFunc, options *metav1.CreateOptions) (runtime.Object, error) } +// SubresourceObjectMetaPreserver adds configuration options to a Creater for subresources. +type SubresourceObjectMetaPreserver interface { + // PreserveRequestObjectMetaSystemFieldsOnSubresourceCreate indicates that a + // handler should preserve fields of ObjectMeta that are managed by the system. + PreserveRequestObjectMetaSystemFieldsOnSubresourceCreate() bool +} + // UpdatedObjectInfo provides information about an updated object to an Updater. // It requires access to the old object in order to return the newly updated object. type UpdatedObjectInfo interface {