diff --git a/pkg/registry/pod/etcd/etcd_test.go b/pkg/registry/pod/etcd/etcd_test.go index e1a8141c98f..3b6781e5c3e 100644 --- a/pkg/registry/pod/etcd/etcd_test.go +++ b/pkg/registry/pod/etcd/etcd_test.go @@ -24,6 +24,7 @@ import ( "github.com/GoogleCloudPlatform/kubernetes/pkg/api" "github.com/GoogleCloudPlatform/kubernetes/pkg/api/errors" + etcderrors "github.com/GoogleCloudPlatform/kubernetes/pkg/api/errors/etcd" "github.com/GoogleCloudPlatform/kubernetes/pkg/api/latest" "github.com/GoogleCloudPlatform/kubernetes/pkg/api/rest/resttest" "github.com/GoogleCloudPlatform/kubernetes/pkg/apiserver" @@ -846,6 +847,41 @@ func TestEtcdCreate(t *testing.T) { } } +// Ensure that when scheduler creates a binding for a pod that has already been deleted +// by the API server, API server returns not-found error. +func TestEtcdCreateBindingNoPod(t *testing.T) { + registry, bindingRegistry, _, fakeClient, _ := newStorage(t) + ctx := api.NewDefaultContext() + fakeClient.TestIndex = true + + key, _ := registry.store.KeyFunc(ctx, "foo") + fakeClient.Data[key] = tools.EtcdResponseWithError{ + R: &etcd.Response{ + Node: nil, + }, + E: tools.EtcdErrorNotFound, + } + // Assume that a pod has undergone the following: + // - Create (apiserver) + // - Schedule (scheduler) + // - Delete (apiserver) + _, err := bindingRegistry.Create(ctx, &api.Binding{PodID: "foo", Host: "machine", ObjectMeta: api.ObjectMeta{Namespace: api.NamespaceDefault}}) + if err == nil { + t.Fatalf("Expected not-found-error but got nothing") + } + if !errors.IsNotFound(etcderrors.InterpretGetError(err, "Pod", "foo")) { + t.Fatalf("Unexpected error returned: %#v", err) + } + + _, err = registry.Get(ctx, "foo") + if err == nil { + t.Fatalf("Expected not-found-error but got nothing") + } + if !errors.IsNotFound(etcderrors.InterpretGetError(err, "Pod", "foo")) { + t.Fatalf("Unexpected error: %v", err) + } +} + func TestEtcdCreateFailsWithoutNamespace(t *testing.T) { registry, _, _, fakeClient, _ := newStorage(t) fakeClient.TestIndex = true