Merge pull request #104699 from vincepri/generate-name-error

Object creation with generateName should return AlreadyExists instead of a Timeout

Kubernetes-commit: 85b11ad24e996e2db4aa00a99e16f066544b22b0
This commit is contained in:
Kubernetes Publisher 2021-09-07 17:41:20 -07:00
commit 3db239988e
4 changed files with 21 additions and 9 deletions

4
go.mod
View File

@ -46,7 +46,7 @@ require (
gopkg.in/natefinch/lumberjack.v2 v2.0.0 gopkg.in/natefinch/lumberjack.v2 v2.0.0
gopkg.in/square/go-jose.v2 v2.2.2 gopkg.in/square/go-jose.v2 v2.2.2
k8s.io/api v0.0.0-20210902155257-9cb86d9d6125 k8s.io/api v0.0.0-20210902155257-9cb86d9d6125
k8s.io/apimachinery v0.0.0-20210825040238-74be3b88bedb k8s.io/apimachinery v0.0.0-20210908004120-60a8f1cddb43
k8s.io/client-go v0.0.0-20210901080746-a31b18a6ac98 k8s.io/client-go v0.0.0-20210901080746-a31b18a6ac98
k8s.io/component-base v0.0.0-20210901040900-bed685b9e6f5 k8s.io/component-base v0.0.0-20210901040900-bed685b9e6f5
k8s.io/klog/v2 v2.9.0 k8s.io/klog/v2 v2.9.0
@ -59,7 +59,7 @@ require (
replace ( replace (
k8s.io/api => k8s.io/api v0.0.0-20210902155257-9cb86d9d6125 k8s.io/api => k8s.io/api v0.0.0-20210902155257-9cb86d9d6125
k8s.io/apimachinery => k8s.io/apimachinery v0.0.0-20210825040238-74be3b88bedb k8s.io/apimachinery => k8s.io/apimachinery v0.0.0-20210908004120-60a8f1cddb43
k8s.io/client-go => k8s.io/client-go v0.0.0-20210901080746-a31b18a6ac98 k8s.io/client-go => k8s.io/client-go v0.0.0-20210901080746-a31b18a6ac98
k8s.io/component-base => k8s.io/component-base v0.0.0-20210901040900-bed685b9e6f5 k8s.io/component-base => k8s.io/component-base v0.0.0-20210901040900-bed685b9e6f5
) )

4
go.sum
View File

@ -941,8 +941,8 @@ honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9
honnef.co/go/tools v0.0.1-2020.1.4/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-20210902155257-9cb86d9d6125 h1:CVD/hrllBKo7OM5ovOPzsMCM4tZgcEERxOhtg3XXek0= k8s.io/api v0.0.0-20210902155257-9cb86d9d6125 h1:CVD/hrllBKo7OM5ovOPzsMCM4tZgcEERxOhtg3XXek0=
k8s.io/api v0.0.0-20210902155257-9cb86d9d6125/go.mod h1:draCg0WF1Lr137sTJ2xg26MplnLcv5PRyIJaP89ntfc= k8s.io/api v0.0.0-20210902155257-9cb86d9d6125/go.mod h1:draCg0WF1Lr137sTJ2xg26MplnLcv5PRyIJaP89ntfc=
k8s.io/apimachinery v0.0.0-20210825040238-74be3b88bedb h1:x865eFVcQlSLu6gCJ4NbCbKGqwgejXJ4yyaZuENYzcQ= k8s.io/apimachinery v0.0.0-20210908004120-60a8f1cddb43 h1:v3mXtS8ouLmj1Rza/k6tbHzBZCUqNpo2eL4ub0d+o/g=
k8s.io/apimachinery v0.0.0-20210825040238-74be3b88bedb/go.mod h1:YwXrbrp8hgDAA01lpP9HPMC6PS55tjfs3EAatyMMfeM= k8s.io/apimachinery v0.0.0-20210908004120-60a8f1cddb43/go.mod h1:YwXrbrp8hgDAA01lpP9HPMC6PS55tjfs3EAatyMMfeM=
k8s.io/client-go v0.0.0-20210901080746-a31b18a6ac98 h1:1LPKIcr86ISGq5rqn83aw+Mjj/U4beT7FeXS6phRKbA= k8s.io/client-go v0.0.0-20210901080746-a31b18a6ac98 h1:1LPKIcr86ISGq5rqn83aw+Mjj/U4beT7FeXS6phRKbA=
k8s.io/client-go v0.0.0-20210901080746-a31b18a6ac98/go.mod h1:LoKqAR7bihkfO2dEj4ExEfomATALXYAb4dj5K9ZVaT8= k8s.io/client-go v0.0.0-20210901080746-a31b18a6ac98/go.mod h1:LoKqAR7bihkfO2dEj4ExEfomATALXYAb4dj5K9ZVaT8=
k8s.io/component-base v0.0.0-20210901040900-bed685b9e6f5 h1:qdnAC/+ttUxQ4Xhsk+zTX7UAdmCB2NZThIenpzu3lgU= k8s.io/component-base v0.0.0-20210901040900-bed685b9e6f5 h1:qdnAC/+ttUxQ4Xhsk+zTX7UAdmCB2NZThIenpzu3lgU=

View File

@ -404,7 +404,7 @@ func (e *Store) Create(ctx context.Context, obj runtime.Object, createValidation
out := e.NewFunc() out := e.NewFunc()
if err := e.Storage.Create(ctx, key, obj, out, ttl, dryrun.IsDryRun(options.DryRun)); err != nil { if err := e.Storage.Create(ctx, key, obj, out, ttl, dryrun.IsDryRun(options.DryRun)); err != nil {
err = storeerr.InterpretCreateError(err, qualifiedResource, name) err = storeerr.InterpretCreateError(err, qualifiedResource, name)
err = rest.CheckGeneratedNameError(e.CreateStrategy, err, obj) err = rest.CheckGeneratedNameError(ctx, e.CreateStrategy, err, obj)
if !apierrors.IsAlreadyExists(err) { if !apierrors.IsAlreadyExists(err) {
return nil, err return nil, err
} }
@ -659,7 +659,7 @@ func (e *Store) Update(ctx context.Context, name string, objInfo rest.UpdatedObj
} }
if creating { if creating {
err = storeerr.InterpretCreateError(err, qualifiedResource, name) err = storeerr.InterpretCreateError(err, qualifiedResource, name)
err = rest.CheckGeneratedNameError(e.CreateStrategy, err, creatingObj) err = rest.CheckGeneratedNameError(ctx, e.CreateStrategy, err, creatingObj)
} else { } else {
err = storeerr.InterpretUpdateError(err, qualifiedResource, name) err = storeerr.InterpretUpdateError(err, qualifiedResource, name)
} }

View File

@ -28,6 +28,7 @@ import (
"k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apimachinery/pkg/runtime/schema"
"k8s.io/apimachinery/pkg/util/validation/field" "k8s.io/apimachinery/pkg/util/validation/field"
"k8s.io/apiserver/pkg/admission" "k8s.io/apiserver/pkg/admission"
genericapirequest "k8s.io/apiserver/pkg/endpoints/request"
"k8s.io/apiserver/pkg/features" "k8s.io/apiserver/pkg/features"
"k8s.io/apiserver/pkg/storage/names" "k8s.io/apiserver/pkg/storage/names"
utilfeature "k8s.io/apiserver/pkg/util/feature" utilfeature "k8s.io/apiserver/pkg/util/feature"
@ -109,6 +110,7 @@ func BeforeCreate(strategy RESTCreateStrategy, ctx context.Context, obj runtime.
objectMeta.SetDeletionGracePeriodSeconds(nil) objectMeta.SetDeletionGracePeriodSeconds(nil)
strategy.PrepareForCreate(ctx, obj) strategy.PrepareForCreate(ctx, obj)
FillObjectMetaSystemFields(objectMeta) FillObjectMetaSystemFields(objectMeta)
if len(objectMeta.GetGenerateName()) > 0 && len(objectMeta.GetName()) == 0 { if len(objectMeta.GetGenerateName()) > 0 && len(objectMeta.GetName()) == 0 {
objectMeta.SetName(strategy.GenerateName(objectMeta.GetGenerateName())) objectMeta.SetName(strategy.GenerateName(objectMeta.GetGenerateName()))
} }
@ -145,21 +147,31 @@ func BeforeCreate(strategy RESTCreateStrategy, ctx context.Context, obj runtime.
// CheckGeneratedNameError checks whether an error that occurred creating a resource is due // CheckGeneratedNameError checks whether an error that occurred creating a resource is due
// to generation being unable to pick a valid name. // to generation being unable to pick a valid name.
func CheckGeneratedNameError(strategy RESTCreateStrategy, err error, obj runtime.Object) error { func CheckGeneratedNameError(ctx context.Context, strategy RESTCreateStrategy, err error, obj runtime.Object) error {
if !errors.IsAlreadyExists(err) { if !errors.IsAlreadyExists(err) {
return err return err
} }
objectMeta, kind, kerr := objectMetaAndKind(strategy, obj) objectMeta, gvk, kerr := objectMetaAndKind(strategy, obj)
if kerr != nil { if kerr != nil {
return kerr return kerr
} }
if len(objectMeta.GetGenerateName()) == 0 { if len(objectMeta.GetGenerateName()) == 0 {
// If we don't have a generated name, return the original error (AlreadyExists).
// When we're here, the user picked a name that is causing a conflict.
return err return err
} }
return errors.NewServerTimeoutForKind(kind.GroupKind(), "POST", 0) // Get the group resource information from the context, if populated.
gr := schema.GroupResource{}
if requestInfo, found := genericapirequest.RequestInfoFrom(ctx); found {
gr = schema.GroupResource{Group: gvk.Group, Resource: requestInfo.Resource}
}
// If we have a name and generated name, the server picked a name
// that already exists.
return errors.NewGenerateNameConflict(gr, objectMeta.GetName(), 1)
} }
// objectMetaAndKind retrieves kind and ObjectMeta from a runtime object, or returns an error. // objectMetaAndKind retrieves kind and ObjectMeta from a runtime object, or returns an error.