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:
Kubernetes Submit Queue 2016-09-02 20:09:49 -07:00 committed by GitHub
commit 3cd6311efb
2 changed files with 44 additions and 0 deletions

View File

@ -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 {

View File

@ -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 {