mirror of
				https://github.com/k3s-io/kubernetes.git
				synced 2025-11-04 07:49:35 +00:00 
			
		
		
		
	Test cascading delete without client-side reaper does not GET
This commit is contained in:
		@@ -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
 | 
			
		||||
 
 | 
			
		||||
@@ -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"},
 | 
			
		||||
				},
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user