@@ -20,6 +20,8 @@ import (
20
20
"strings"
21
21
"testing"
22
22
23
+ etcd "github.com/coreos/etcd/client"
24
+ "golang.org/x/net/context"
23
25
"k8s.io/kubernetes/pkg/api"
24
26
"k8s.io/kubernetes/pkg/api/errors"
25
27
etcderrors "k8s.io/kubernetes/pkg/api/errors/etcd"
@@ -30,6 +32,7 @@ import (
30
32
"k8s.io/kubernetes/pkg/registry/registrytest"
31
33
"k8s.io/kubernetes/pkg/runtime"
32
34
"k8s.io/kubernetes/pkg/securitycontext"
35
+ "k8s.io/kubernetes/pkg/storage"
33
36
"k8s.io/kubernetes/pkg/storage/etcd/etcdtest"
34
37
etcdtesting "k8s.io/kubernetes/pkg/storage/etcd/testing"
35
38
"k8s.io/kubernetes/pkg/util"
@@ -130,6 +133,70 @@ func TestDelete(t *testing.T) {
130
133
test .TestDeleteGraceful (scheduledPod , 30 )
131
134
}
132
135
136
+ type FailDeletionStorage struct {
137
+ storage.Interface
138
+ Called * bool
139
+ }
140
+
141
+ func (f FailDeletionStorage ) Delete (ctx context.Context , key string , out runtime.Object ) error {
142
+ * f .Called = true
143
+ return etcd.Error {Code : etcd .ErrorCodeKeyNotFound }
144
+ }
145
+
146
+ func newFailDeleteStorage (t * testing.T , called * bool ) (* REST , * etcdtesting.EtcdTestServer ) {
147
+ etcdStorage , server := registrytest .NewEtcdStorage (t , "" )
148
+ failDeleteStorage := FailDeletionStorage {etcdStorage , called }
149
+ restOptions := generic.RESTOptions {failDeleteStorage , generic .UndecoratedStorage , 3 }
150
+ storage := NewStorage (restOptions , nil , nil )
151
+ return storage .Pod , server
152
+ }
153
+
154
+ func TestIgnoreDeleteNotFound (t * testing.T ) {
155
+ pod := validNewPod ()
156
+ testContext := api .WithNamespace (api .NewContext (), api .NamespaceDefault )
157
+ called := false
158
+ registry , server := newFailDeleteStorage (t , & called )
159
+ defer server .Terminate (t )
160
+
161
+ // should fail if pod A is not created yet.
162
+ _ , err := registry .Delete (testContext , pod .Name , nil )
163
+ if ! errors .IsNotFound (err ) {
164
+ t .Errorf ("Unexpected error: %v" , err )
165
+ }
166
+
167
+ // create pod
168
+ _ , err = registry .Create (testContext , pod )
169
+ if err != nil {
170
+ t .Errorf ("Unexpected error: %v" , err )
171
+ }
172
+
173
+ // delete object with grace period 0, storage will return NotFound, but the
174
+ // registry shouldn't get any error since we ignore the NotFound error.
175
+ zero := int64 (0 )
176
+ opt := & api.DeleteOptions {GracePeriodSeconds : & zero }
177
+ obj , err := registry .Delete (testContext , pod .Name , opt )
178
+ if err != nil {
179
+ t .Fatalf ("Unexpected error: %v" , err )
180
+ }
181
+
182
+ if ! called {
183
+ t .Fatalf ("expect the overriding Delete method to be called" )
184
+ }
185
+ deletedPod , ok := obj .(* api.Pod )
186
+ if ! ok {
187
+ t .Fatalf ("expect a pod is returned" )
188
+ }
189
+ if deletedPod .DeletionTimestamp == nil {
190
+ t .Errorf ("expect the DeletionTimestamp to be set" )
191
+ }
192
+ if deletedPod .DeletionGracePeriodSeconds == nil {
193
+ t .Fatalf ("expect the DeletionGracePeriodSeconds to be set" )
194
+ }
195
+ if * deletedPod .DeletionGracePeriodSeconds != 0 {
196
+ t .Errorf ("expect the DeletionGracePeriodSeconds to be 0, got %d" , * deletedPod .DeletionTimestamp )
197
+ }
198
+ }
199
+
133
200
func TestCreateSetsFields (t * testing.T ) {
134
201
storage , _ , _ , server := newStorage (t )
135
202
defer server .Terminate (t )
0 commit comments