diff --git a/pkg/kubectl/cmd/delete_test.go b/pkg/kubectl/cmd/delete_test.go index 748fb961737..016785afc63 100644 --- a/pkg/kubectl/cmd/delete_test.go +++ b/pkg/kubectl/cmd/delete_test.go @@ -39,6 +39,7 @@ import ( var unstructuredSerializer = dynamic.ContentConfig().NegotiatedSerializer func TestDeleteObjectByTuple(t *testing.T) { + initTestErrorHandler(t) _, _, rc := testData() f, tf, codec, _ := cmdtesting.NewAPIFactory() @@ -48,8 +49,15 @@ func TestDeleteObjectByTuple(t *testing.T) { NegotiatedSerializer: unstructuredSerializer, Client: fake.CreateHTTPClient(func(req *http.Request) (*http.Response, error) { switch p, m := req.URL.Path, req.Method; { + + // replication controller with cascade off case p == "/namespaces/test/replicationcontrollers/redis-master-controller" && m == "DELETE": return &http.Response{StatusCode: 200, Header: defaultHeader(), Body: objBody(codec, &rc.Items[0])}, nil + + // secret with cascade on, but no client-side reaper + case p == "/namespaces/test/secrets/mysecret" && m == "DELETE": + return &http.Response{StatusCode: 200, Header: defaultHeader(), Body: objBody(codec, &rc.Items[0])}, nil + default: // Ensures no GET is performed when deleting by name t.Fatalf("unexpected request: %#v\n%#v", req.URL, req) @@ -58,20 +66,31 @@ func TestDeleteObjectByTuple(t *testing.T) { }), } tf.Namespace = "test" - buf, errBuf := bytes.NewBuffer([]byte{}), bytes.NewBuffer([]byte{}) + buf, errBuf := bytes.NewBuffer([]byte{}), bytes.NewBuffer([]byte{}) cmd := NewCmdDelete(f, buf, errBuf) cmd.Flags().Set("namespace", "test") cmd.Flags().Set("cascade", "false") cmd.Flags().Set("output", "name") cmd.Run(cmd, []string{"replicationcontrollers/redis-master-controller"}) - if buf.String() != "replicationcontroller/redis-master-controller\n" { t.Errorf("unexpected output: %s", buf.String()) } + + // Test cascading delete of object without client-side reaper doesn't make GET requests + buf, errBuf = bytes.NewBuffer([]byte{}), bytes.NewBuffer([]byte{}) + cmd = NewCmdDelete(f, buf, errBuf) + cmd.Flags().Set("namespace", "test") + cmd.Flags().Set("output", "name") + cmd.Run(cmd, []string{"secrets/mysecret"}) + if buf.String() != "secret/mysecret\n" { + t.Errorf("unexpected output: %s", buf.String()) + } } func TestDeleteNamedObject(t *testing.T) { + initTestErrorHandler(t) + initTestErrorHandler(t) _, _, rc := testData() f, tf, codec, _ := cmdtesting.NewAPIFactory() @@ -81,8 +100,15 @@ func TestDeleteNamedObject(t *testing.T) { NegotiatedSerializer: unstructuredSerializer, Client: fake.CreateHTTPClient(func(req *http.Request) (*http.Response, error) { switch p, m := req.URL.Path, req.Method; { + + // replication controller with cascade off case p == "/namespaces/test/replicationcontrollers/redis-master-controller" && m == "DELETE": return &http.Response{StatusCode: 200, Header: defaultHeader(), Body: objBody(codec, &rc.Items[0])}, nil + + // secret with cascade on, but no client-side reaper + case p == "/namespaces/test/secrets/mysecret" && m == "DELETE": + return &http.Response{StatusCode: 200, Header: defaultHeader(), Body: objBody(codec, &rc.Items[0])}, nil + default: // Ensures no GET is performed when deleting by name t.Fatalf("unexpected request: %#v\n%#v", req.URL, req) @@ -91,20 +117,31 @@ func TestDeleteNamedObject(t *testing.T) { }), } tf.Namespace = "test" - buf, errBuf := bytes.NewBuffer([]byte{}), bytes.NewBuffer([]byte{}) + buf, errBuf := bytes.NewBuffer([]byte{}), bytes.NewBuffer([]byte{}) cmd := NewCmdDelete(f, buf, errBuf) cmd.Flags().Set("namespace", "test") cmd.Flags().Set("cascade", "false") cmd.Flags().Set("output", "name") cmd.Run(cmd, []string{"replicationcontrollers", "redis-master-controller"}) - if buf.String() != "replicationcontroller/redis-master-controller\n" { t.Errorf("unexpected output: %s", buf.String()) } + + // Test cascading delete of object without client-side reaper doesn't make GET requests + buf, errBuf = bytes.NewBuffer([]byte{}), bytes.NewBuffer([]byte{}) + cmd = NewCmdDelete(f, buf, errBuf) + cmd.Flags().Set("namespace", "test") + cmd.Flags().Set("cascade", "false") + cmd.Flags().Set("output", "name") + cmd.Run(cmd, []string{"secrets", "mysecret"}) + if buf.String() != "secret/mysecret\n" { + t.Errorf("unexpected output: %s", buf.String()) + } } func TestDeleteObject(t *testing.T) { + initTestErrorHandler(t) _, _, rc := testData() f, tf, codec, _ := cmdtesting.NewAPIFactory() @@ -161,6 +198,7 @@ func (f *fakeReaperFactory) Reaper(mapping *meta.RESTMapping) (kubectl.Reaper, e } func TestDeleteObjectGraceZero(t *testing.T) { + initTestErrorHandler(t) pods, _, _ := testData() objectDeletionWaitInterval = time.Millisecond @@ -214,6 +252,7 @@ func TestDeleteObjectGraceZero(t *testing.T) { } func TestDeleteObjectNotFound(t *testing.T) { + initTestErrorHandler(t) f, tf, _, _ := cmdtesting.NewAPIFactory() tf.Printer = &testPrinter{} tf.UnstructuredClient = &fake.RESTClient{ @@ -251,6 +290,7 @@ func TestDeleteObjectNotFound(t *testing.T) { } func TestDeleteObjectIgnoreNotFound(t *testing.T) { + initTestErrorHandler(t) f, tf, _, _ := cmdtesting.NewAPIFactory() tf.Printer = &testPrinter{} tf.UnstructuredClient = &fake.RESTClient{ @@ -282,6 +322,7 @@ func TestDeleteObjectIgnoreNotFound(t *testing.T) { } func TestDeleteAllNotFound(t *testing.T) { + initTestErrorHandler(t) _, svc, _ := testData() // Add an item to the list which will result in a 404 on delete svc.Items = append(svc.Items, api.Service{ObjectMeta: metav1.ObjectMeta{Name: "foo"}}) @@ -330,6 +371,7 @@ func TestDeleteAllNotFound(t *testing.T) { } func TestDeleteAllIgnoreNotFound(t *testing.T) { + initTestErrorHandler(t) _, svc, _ := testData() f, tf, codec, _ := cmdtesting.NewAPIFactory() @@ -371,6 +413,7 @@ func TestDeleteAllIgnoreNotFound(t *testing.T) { } func TestDeleteMultipleObject(t *testing.T) { + initTestErrorHandler(t) _, svc, rc := testData() f, tf, codec, _ := cmdtesting.NewAPIFactory() @@ -406,6 +449,7 @@ func TestDeleteMultipleObject(t *testing.T) { } func TestDeleteMultipleObjectContinueOnMissing(t *testing.T) { + initTestErrorHandler(t) _, svc, _ := testData() f, tf, codec, _ := cmdtesting.NewAPIFactory() @@ -451,6 +495,7 @@ func TestDeleteMultipleObjectContinueOnMissing(t *testing.T) { } func TestDeleteMultipleResourcesWithTheSameName(t *testing.T) { + initTestErrorHandler(t) _, svc, rc := testData() f, tf, codec, _ := cmdtesting.NewAPIFactory() tf.Printer = &testPrinter{} @@ -488,6 +533,7 @@ func TestDeleteMultipleResourcesWithTheSameName(t *testing.T) { } func TestDeleteDirectory(t *testing.T) { + initTestErrorHandler(t) _, _, rc := testData() f, tf, codec, _ := cmdtesting.NewAPIFactory() @@ -520,6 +566,7 @@ func TestDeleteDirectory(t *testing.T) { } func TestDeleteMultipleSelector(t *testing.T) { + initTestErrorHandler(t) pods, svc, _ := testData() f, tf, codec, _ := cmdtesting.NewAPIFactory() @@ -564,6 +611,7 @@ func TestDeleteMultipleSelector(t *testing.T) { } func TestResourceErrors(t *testing.T) { + initTestErrorHandler(t) testCases := map[string]struct { args []string errFn func(error) bool diff --git a/pkg/kubectl/cmd/testing/fake.go b/pkg/kubectl/cmd/testing/fake.go index 58e2088ac4d..320a5d5e4ff 100644 --- a/pkg/kubectl/cmd/testing/fake.go +++ b/pkg/kubectl/cmd/testing/fake.go @@ -662,6 +662,8 @@ func testDynamicResources() []*discovery.APIGroupResources { {Name: "replicationcontrollers", Namespaced: true, Kind: "ReplicationController"}, {Name: "componentstatuses", Namespaced: false, Kind: "ComponentStatus"}, {Name: "nodes", Namespaced: false, Kind: "Node"}, + {Name: "secrets", Namespaced: true, Kind: "Secret"}, + {Name: "configmaps", Namespaced: true, Kind: "ConfigMap"}, {Name: "type", Namespaced: false, Kind: "Type"}, {Name: "namespacedtype", Namespaced: true, Kind: "NamespacedType"}, },