From cc64faf209a709093713e2231f40469afe903678 Mon Sep 17 00:00:00 2001 From: vefimova Date: Mon, 8 Aug 2016 13:34:36 +0000 Subject: [PATCH] Added printing of clarification for `object creation` request in case of object is in the process of graceful deletion --- pkg/registry/generic/registry/store.go | 14 ++++++++++ pkg/registry/generic/registry/store_test.go | 30 +++++++++++++++++++++ 2 files changed, 44 insertions(+) diff --git a/pkg/registry/generic/registry/store.go b/pkg/registry/generic/registry/store.go index 9cf3872d8c3..4235848c4c2 100644 --- a/pkg/registry/generic/registry/store.go +++ b/pkg/registry/generic/registry/store.go @@ -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 { diff --git a/pkg/registry/generic/registry/store_test.go b/pkg/registry/generic/registry/store_test.go index 871a20ad51c..bc5cac32424 100644 --- a/pkg/registry/generic/registry/store_test.go +++ b/pkg/registry/generic/registry/store_test.go @@ -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 {