mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-24 04:06:03 +00:00
Merge pull request #28120 from vefimova/fix_22986-2
Automatic merge from submit-queue Added printing of clarification for `object creation` request in case of object is in the process of graceful deletion ## **Output example:** ### # kubectl create -f ./pod.yaml `pod "test-pod" created` ### # kubectl create -f ./pod.yaml `Error from server: error when creating "../simplePod.yaml": pods "test-pod" already exists` ### # kubectl delete pods/test-pod `pod "test-pod" deleted` ### # kubectl create -f ./pod.yaml `Error from server: error when creating "../simplePod.yaml": object is being deleted: pods "test-pod" already exists`
This commit is contained in:
commit
3cd6311efb
@ -227,6 +227,20 @@ func (e *Store) Create(ctx api.Context, obj runtime.Object) (runtime.Object, err
|
||||
if err := e.Storage.Create(ctx, key, obj, out, ttl); err != nil {
|
||||
err = storeerr.InterpretCreateError(err, e.QualifiedResource, name)
|
||||
err = rest.CheckGeneratedNameError(e.CreateStrategy, err, obj)
|
||||
if !kubeerr.IsAlreadyExists(err) {
|
||||
return nil, err
|
||||
}
|
||||
if errGet := e.Storage.Get(ctx, key, out, false); errGet != nil {
|
||||
return nil, err
|
||||
}
|
||||
accessor, errGetAcc := meta.Accessor(out)
|
||||
if errGetAcc != nil {
|
||||
return nil, err
|
||||
}
|
||||
if accessor.GetDeletionTimestamp() != nil {
|
||||
msg := &err.(*kubeerr.StatusError).ErrStatus.Message
|
||||
*msg = fmt.Sprintf("object is being deleted: %s", *msg)
|
||||
}
|
||||
return nil, err
|
||||
}
|
||||
if e.AfterCreate != nil {
|
||||
|
@ -34,6 +34,7 @@ import (
|
||||
"k8s.io/kubernetes/pkg/fields"
|
||||
"k8s.io/kubernetes/pkg/labels"
|
||||
"k8s.io/kubernetes/pkg/registry/generic"
|
||||
"k8s.io/kubernetes/pkg/registry/pod"
|
||||
"k8s.io/kubernetes/pkg/runtime"
|
||||
"k8s.io/kubernetes/pkg/selection"
|
||||
"k8s.io/kubernetes/pkg/storage"
|
||||
@ -45,6 +46,7 @@ import (
|
||||
"k8s.io/kubernetes/pkg/util/sets"
|
||||
"k8s.io/kubernetes/pkg/util/validation/field"
|
||||
"k8s.io/kubernetes/pkg/util/wait"
|
||||
"strings"
|
||||
)
|
||||
|
||||
type testOrphanDeleteStrategy struct {
|
||||
@ -261,6 +263,7 @@ func TestStoreListResourceVersion(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestStoreCreate(t *testing.T) {
|
||||
gracefulPeriod := int64(50)
|
||||
podA := &api.Pod{
|
||||
ObjectMeta: api.ObjectMeta{Name: "foo", Namespace: "test"},
|
||||
Spec: api.PodSpec{NodeName: "machine"},
|
||||
@ -273,6 +276,8 @@ func TestStoreCreate(t *testing.T) {
|
||||
testContext := api.WithNamespace(api.NewContext(), "test")
|
||||
destroyFunc, registry := NewTestGenericStoreRegistry(t)
|
||||
defer destroyFunc()
|
||||
// re-define delete strategy to have graceful delete capability
|
||||
registry.DeleteStrategy = pod.Strategy
|
||||
|
||||
// create the object
|
||||
objA, err := registry.Create(testContext, podA)
|
||||
@ -296,6 +301,31 @@ func TestStoreCreate(t *testing.T) {
|
||||
if !errors.IsAlreadyExists(err) {
|
||||
t.Errorf("Unexpected error: %v", err)
|
||||
}
|
||||
|
||||
// verify graceful delete capability is defined
|
||||
_, ok := registry.DeleteStrategy.(rest.RESTGracefulDeleteStrategy)
|
||||
if !ok {
|
||||
t.Fatalf("No graceful capability set.")
|
||||
}
|
||||
|
||||
// now delete pod with graceful period set
|
||||
delOpts := &api.DeleteOptions{GracePeriodSeconds: &gracefulPeriod}
|
||||
_, err = registry.Delete(testContext, podA.Name, delOpts)
|
||||
if err != nil {
|
||||
t.Fatalf("Failed to delete pod gracefully. Unexpected error: %v", err)
|
||||
}
|
||||
|
||||
// try to create before graceful deletion period is over
|
||||
_, err = registry.Create(testContext, podA)
|
||||
if err == nil || !errors.IsAlreadyExists(err) {
|
||||
t.Fatalf("Expected 'already exists' error from storage, but got %v", err)
|
||||
}
|
||||
|
||||
// check the 'alredy exists' msg was edited
|
||||
msg := &err.(*errors.StatusError).ErrStatus.Message
|
||||
if !strings.Contains(*msg, "object is being deleted:") {
|
||||
t.Errorf("Unexpected error without the 'object is being deleted:' in message: %v", err)
|
||||
}
|
||||
}
|
||||
|
||||
func updateAndVerify(t *testing.T, ctx api.Context, registry *Store, pod *api.Pod) bool {
|
||||
|
Loading…
Reference in New Issue
Block a user