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:
commit
3db239988e
4
go.mod
4
go.mod
|
|
@ -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
4
go.sum
|
|
@ -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=
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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.
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue