mirror of
				https://github.com/optim-enterprises-bv/kubernetes.git
				synced 2025-11-03 19:58:17 +00:00 
			
		
		
		
	make use of simple dynamic client in test
This commit is contained in:
		@@ -43,48 +43,49 @@ func TestServerUp(t *testing.T) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestNamespaceScopedCRUD(t *testing.T) {
 | 
			
		||||
	stopCh, apiExtensionClient, clientPool, err := testserver.StartDefaultServerWithClients()
 | 
			
		||||
	stopCh, apiExtensionClient, dynamicClient, err := testserver.StartDefaultServerWithClients()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
	defer close(stopCh)
 | 
			
		||||
 | 
			
		||||
	noxuDefinition := testserver.NewNoxuCustomResourceDefinition(apiextensionsv1beta1.NamespaceScoped)
 | 
			
		||||
	noxuVersionClient, err := testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, clientPool)
 | 
			
		||||
	err = testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, dynamicClient)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	ns := "not-the-default"
 | 
			
		||||
	testSimpleCRUD(t, ns, noxuDefinition, noxuVersionClient)
 | 
			
		||||
	testFieldSelector(t, ns, noxuDefinition, noxuVersionClient)
 | 
			
		||||
 | 
			
		||||
	testSimpleCRUD(t, ns, noxuDefinition, dynamicClient)
 | 
			
		||||
	testFieldSelector(t, ns, noxuDefinition, dynamicClient)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestClusterScopedCRUD(t *testing.T) {
 | 
			
		||||
	stopCh, apiExtensionClient, clientPool, err := testserver.StartDefaultServerWithClients()
 | 
			
		||||
	stopCh, apiExtensionClient, dynamicClient, err := testserver.StartDefaultServerWithClients()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
	defer close(stopCh)
 | 
			
		||||
 | 
			
		||||
	noxuDefinition := testserver.NewNoxuCustomResourceDefinition(apiextensionsv1beta1.ClusterScoped)
 | 
			
		||||
	noxuVersionClient, err := testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, clientPool)
 | 
			
		||||
	err = testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, dynamicClient)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	ns := ""
 | 
			
		||||
	testSimpleCRUD(t, ns, noxuDefinition, noxuVersionClient)
 | 
			
		||||
	testFieldSelector(t, ns, noxuDefinition, noxuVersionClient)
 | 
			
		||||
	testSimpleCRUD(t, ns, noxuDefinition, dynamicClient)
 | 
			
		||||
	testFieldSelector(t, ns, noxuDefinition, dynamicClient)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func testSimpleCRUD(t *testing.T, ns string, noxuDefinition *apiextensionsv1beta1.CustomResourceDefinition, noxuVersionClient dynamic.Interface) {
 | 
			
		||||
	noxuResourceClient := NewNamespacedCustomResourceClient(ns, noxuVersionClient, noxuDefinition)
 | 
			
		||||
func testSimpleCRUD(t *testing.T, ns string, noxuDefinition *apiextensionsv1beta1.CustomResourceDefinition, dynamicClient dynamic.DynamicInterface) {
 | 
			
		||||
	noxuResourceClient := NewNamespacedCustomResourceClient(ns, dynamicClient, noxuDefinition)
 | 
			
		||||
	initialList, err := noxuResourceClient.List(metav1.ListOptions{})
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
	if e, a := 0, len(initialList.(*unstructured.UnstructuredList).Items); e != a {
 | 
			
		||||
	if e, a := 0, len(initialList.Items); e != a {
 | 
			
		||||
		t.Errorf("expected %v, got %v", e, a)
 | 
			
		||||
	}
 | 
			
		||||
	initialListTypeMeta, err := meta.TypeAccessor(initialList)
 | 
			
		||||
@@ -157,10 +158,10 @@ func testSimpleCRUD(t *testing.T, ns string, noxuDefinition *apiextensionsv1beta
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
	if e, a := 1, len(listWithItem.(*unstructured.UnstructuredList).Items); e != a {
 | 
			
		||||
	if e, a := 1, len(listWithItem.Items); e != a {
 | 
			
		||||
		t.Errorf("expected %v, got %v", e, a)
 | 
			
		||||
	}
 | 
			
		||||
	if e, a := *createdNoxuInstance, listWithItem.(*unstructured.UnstructuredList).Items[0]; !reflect.DeepEqual(e, a) {
 | 
			
		||||
	if e, a := *createdNoxuInstance, listWithItem.Items[0]; !reflect.DeepEqual(e, a) {
 | 
			
		||||
		t.Errorf("expected %v, got %v", e, a)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
@@ -172,7 +173,7 @@ func testSimpleCRUD(t *testing.T, ns string, noxuDefinition *apiextensionsv1beta
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
	if e, a := 0, len(listWithoutItem.(*unstructured.UnstructuredList).Items); e != a {
 | 
			
		||||
	if e, a := 0, len(listWithoutItem.Items); e != a {
 | 
			
		||||
		t.Errorf("expected %v, got %v", e, a)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
@@ -200,13 +201,13 @@ func testSimpleCRUD(t *testing.T, ns string, noxuDefinition *apiextensionsv1beta
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func testFieldSelector(t *testing.T, ns string, noxuDefinition *apiextensionsv1beta1.CustomResourceDefinition, noxuVersionClient dynamic.Interface) {
 | 
			
		||||
	noxuResourceClient := NewNamespacedCustomResourceClient(ns, noxuVersionClient, noxuDefinition)
 | 
			
		||||
func testFieldSelector(t *testing.T, ns string, noxuDefinition *apiextensionsv1beta1.CustomResourceDefinition, dynamicClient dynamic.DynamicInterface) {
 | 
			
		||||
	noxuResourceClient := NewNamespacedCustomResourceClient(ns, dynamicClient, noxuDefinition)
 | 
			
		||||
	initialList, err := noxuResourceClient.List(metav1.ListOptions{})
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
	if e, a := 0, len(initialList.(*unstructured.UnstructuredList).Items); e != a {
 | 
			
		||||
	if e, a := 0, len(initialList.Items); e != a {
 | 
			
		||||
		t.Errorf("expected %v, got %v", e, a)
 | 
			
		||||
	}
 | 
			
		||||
	initialListTypeMeta, err := meta.TypeAccessor(initialList)
 | 
			
		||||
@@ -291,10 +292,10 @@ func testFieldSelector(t *testing.T, ns string, noxuDefinition *apiextensionsv1b
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
	if e, a := 1, len(listWithItem.(*unstructured.UnstructuredList).Items); e != a {
 | 
			
		||||
	if e, a := 1, len(listWithItem.Items); e != a {
 | 
			
		||||
		t.Errorf("expected %v, got %v", e, a)
 | 
			
		||||
	}
 | 
			
		||||
	if e, a := *createdNoxuInstanceFoo, listWithItem.(*unstructured.UnstructuredList).Items[0]; !reflect.DeepEqual(e, a) {
 | 
			
		||||
	if e, a := *createdNoxuInstanceFoo, listWithItem.Items[0]; !reflect.DeepEqual(e, a) {
 | 
			
		||||
		t.Errorf("expected %v, got %v", e, a)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
@@ -309,7 +310,7 @@ func testFieldSelector(t *testing.T, ns string, noxuDefinition *apiextensionsv1b
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
	if e, a := 0, len(listWithoutItem.(*unstructured.UnstructuredList).Items); e != a {
 | 
			
		||||
	if e, a := 0, len(listWithoutItem.Items); e != a {
 | 
			
		||||
		t.Errorf("expected %v, got %v", e, a)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
@@ -347,7 +348,7 @@ func TestDiscovery(t *testing.T) {
 | 
			
		||||
	group := "mygroup.example.com"
 | 
			
		||||
	version := "v1beta1"
 | 
			
		||||
 | 
			
		||||
	stopCh, apiExtensionClient, clientPool, err := testserver.StartDefaultServerWithClients()
 | 
			
		||||
	stopCh, apiExtensionClient, dynamicClient, err := testserver.StartDefaultServerWithClients()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
@@ -355,7 +356,7 @@ func TestDiscovery(t *testing.T) {
 | 
			
		||||
 | 
			
		||||
	scope := apiextensionsv1beta1.NamespaceScoped
 | 
			
		||||
	noxuDefinition := testserver.NewNoxuCustomResourceDefinition(scope)
 | 
			
		||||
	_, err = testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, clientPool)
 | 
			
		||||
	err = testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, dynamicClient)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
@@ -395,25 +396,25 @@ func TestDiscovery(t *testing.T) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestNoNamespaceReject(t *testing.T) {
 | 
			
		||||
	stopCh, apiExtensionClient, clientPool, err := testserver.StartDefaultServerWithClients()
 | 
			
		||||
	stopCh, apiExtensionClient, dynamicClient, err := testserver.StartDefaultServerWithClients()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
	defer close(stopCh)
 | 
			
		||||
 | 
			
		||||
	noxuDefinition := testserver.NewNoxuCustomResourceDefinition(apiextensionsv1beta1.NamespaceScoped)
 | 
			
		||||
	noxuVersionClient, err := testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, clientPool)
 | 
			
		||||
	err = testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, dynamicClient)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	ns := ""
 | 
			
		||||
	noxuResourceClient := NewNamespacedCustomResourceClient(ns, noxuVersionClient, noxuDefinition)
 | 
			
		||||
	noxuResourceClient := NewNamespacedCustomResourceClient(ns, dynamicClient, noxuDefinition)
 | 
			
		||||
	initialList, err := noxuResourceClient.List(metav1.ListOptions{})
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
	if e, a := 0, len(initialList.(*unstructured.UnstructuredList).Items); e != a {
 | 
			
		||||
	if e, a := 0, len(initialList.Items); e != a {
 | 
			
		||||
		t.Errorf("expected %v, got %v", e, a)
 | 
			
		||||
	}
 | 
			
		||||
	initialListTypeMeta, err := meta.TypeAccessor(initialList)
 | 
			
		||||
@@ -434,27 +435,27 @@ func TestNoNamespaceReject(t *testing.T) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestSameNameDiffNamespace(t *testing.T) {
 | 
			
		||||
	stopCh, apiExtensionClient, clientPool, err := testserver.StartDefaultServerWithClients()
 | 
			
		||||
	stopCh, apiExtensionClient, dynamicClient, err := testserver.StartDefaultServerWithClients()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
	defer close(stopCh)
 | 
			
		||||
 | 
			
		||||
	noxuDefinition := testserver.NewNoxuCustomResourceDefinition(apiextensionsv1beta1.NamespaceScoped)
 | 
			
		||||
	noxuVersionClient, err := testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, clientPool)
 | 
			
		||||
	err = testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, dynamicClient)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	ns1 := "namespace-1"
 | 
			
		||||
	testSimpleCRUD(t, ns1, noxuDefinition, noxuVersionClient)
 | 
			
		||||
	testSimpleCRUD(t, ns1, noxuDefinition, dynamicClient)
 | 
			
		||||
	ns2 := "namespace-2"
 | 
			
		||||
	testSimpleCRUD(t, ns2, noxuDefinition, noxuVersionClient)
 | 
			
		||||
	testSimpleCRUD(t, ns2, noxuDefinition, dynamicClient)
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestSelfLink(t *testing.T) {
 | 
			
		||||
	stopCh, apiExtensionClient, clientPool, err := testserver.StartDefaultServerWithClients()
 | 
			
		||||
	stopCh, apiExtensionClient, dynamicClient, err := testserver.StartDefaultServerWithClients()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
@@ -462,16 +463,13 @@ func TestSelfLink(t *testing.T) {
 | 
			
		||||
 | 
			
		||||
	// namespace scoped
 | 
			
		||||
	noxuDefinition := testserver.NewNoxuCustomResourceDefinition(apiextensionsv1beta1.NamespaceScoped)
 | 
			
		||||
	noxuVersionClient, err := testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, clientPool)
 | 
			
		||||
	err = testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, dynamicClient)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	ns := "not-the-default"
 | 
			
		||||
	noxuNamespacedResourceClient := noxuVersionClient.Resource(&metav1.APIResource{
 | 
			
		||||
		Name:       noxuDefinition.Spec.Names.Plural,
 | 
			
		||||
		Namespaced: noxuDefinition.Spec.Scope == apiextensionsv1beta1.NamespaceScoped,
 | 
			
		||||
	}, ns)
 | 
			
		||||
	noxuNamespacedResourceClient := NewNamespacedCustomResourceClient(ns, dynamicClient, noxuDefinition)
 | 
			
		||||
 | 
			
		||||
	noxuInstanceToCreate := testserver.NewNoxuInstance(ns, "foo")
 | 
			
		||||
	createdNoxuInstance, err := noxuNamespacedResourceClient.Create(noxuInstanceToCreate)
 | 
			
		||||
@@ -485,15 +483,12 @@ func TestSelfLink(t *testing.T) {
 | 
			
		||||
 | 
			
		||||
	// cluster scoped
 | 
			
		||||
	curletDefinition := testserver.NewCurletCustomResourceDefinition(apiextensionsv1beta1.ClusterScoped)
 | 
			
		||||
	curletVersionClient, err := testserver.CreateNewCustomResourceDefinition(curletDefinition, apiExtensionClient, clientPool)
 | 
			
		||||
	err = testserver.CreateNewCustomResourceDefinition(curletDefinition, apiExtensionClient, dynamicClient)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	curletResourceClient := curletVersionClient.Resource(&metav1.APIResource{
 | 
			
		||||
		Name:       curletDefinition.Spec.Names.Plural,
 | 
			
		||||
		Namespaced: curletDefinition.Spec.Scope == apiextensionsv1beta1.NamespaceScoped,
 | 
			
		||||
	}, ns)
 | 
			
		||||
	curletResourceClient := NewNamespacedCustomResourceClient(ns, dynamicClient, curletDefinition)
 | 
			
		||||
 | 
			
		||||
	curletInstanceToCreate := testserver.NewCurletInstance(ns, "foo")
 | 
			
		||||
	createdCurletInstance, err := curletResourceClient.Create(curletInstanceToCreate)
 | 
			
		||||
@@ -507,23 +502,20 @@ func TestSelfLink(t *testing.T) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestPreserveInt(t *testing.T) {
 | 
			
		||||
	stopCh, apiExtensionClient, clientPool, err := testserver.StartDefaultServerWithClients()
 | 
			
		||||
	stopCh, apiExtensionClient, dynamicClient, err := testserver.StartDefaultServerWithClients()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
	defer close(stopCh)
 | 
			
		||||
 | 
			
		||||
	noxuDefinition := testserver.NewNoxuCustomResourceDefinition(apiextensionsv1beta1.ClusterScoped)
 | 
			
		||||
	noxuVersionClient, err := testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, clientPool)
 | 
			
		||||
	err = testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, dynamicClient)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	ns := "not-the-default"
 | 
			
		||||
	noxuNamespacedResourceClient := noxuVersionClient.Resource(&metav1.APIResource{
 | 
			
		||||
		Name:       noxuDefinition.Spec.Names.Plural,
 | 
			
		||||
		Namespaced: true,
 | 
			
		||||
	}, ns)
 | 
			
		||||
	noxuNamespacedResourceClient := NewNamespacedCustomResourceClient(ns, dynamicClient, noxuDefinition)
 | 
			
		||||
 | 
			
		||||
	noxuInstanceToCreate := testserver.NewNoxuInstance(ns, "foo")
 | 
			
		||||
	createdNoxuInstance, err := noxuNamespacedResourceClient.Create(noxuInstanceToCreate)
 | 
			
		||||
@@ -552,23 +544,20 @@ func TestPreserveInt(t *testing.T) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestPatch(t *testing.T) {
 | 
			
		||||
	stopCh, apiExtensionClient, clientPool, err := testserver.StartDefaultServerWithClients()
 | 
			
		||||
	stopCh, apiExtensionClient, dynamicClient, err := testserver.StartDefaultServerWithClients()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
	defer close(stopCh)
 | 
			
		||||
 | 
			
		||||
	noxuDefinition := testserver.NewNoxuCustomResourceDefinition(apiextensionsv1beta1.ClusterScoped)
 | 
			
		||||
	noxuVersionClient, err := testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, clientPool)
 | 
			
		||||
	err = testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, dynamicClient)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	ns := "not-the-default"
 | 
			
		||||
	noxuNamespacedResourceClient := noxuVersionClient.Resource(&metav1.APIResource{
 | 
			
		||||
		Name:       noxuDefinition.Spec.Names.Plural,
 | 
			
		||||
		Namespaced: true,
 | 
			
		||||
	}, ns)
 | 
			
		||||
	noxuNamespacedResourceClient := NewNamespacedCustomResourceClient(ns, dynamicClient, noxuDefinition)
 | 
			
		||||
 | 
			
		||||
	noxuInstanceToCreate := testserver.NewNoxuInstance(ns, "foo")
 | 
			
		||||
	createdNoxuInstance, err := noxuNamespacedResourceClient.Create(noxuInstanceToCreate)
 | 
			
		||||
@@ -626,25 +615,25 @@ func TestPatch(t *testing.T) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestCrossNamespaceListWatch(t *testing.T) {
 | 
			
		||||
	stopCh, apiExtensionClient, clientPool, err := testserver.StartDefaultServerWithClients()
 | 
			
		||||
	stopCh, apiExtensionClient, dynamicClient, err := testserver.StartDefaultServerWithClients()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
	defer close(stopCh)
 | 
			
		||||
 | 
			
		||||
	noxuDefinition := testserver.NewNoxuCustomResourceDefinition(apiextensionsv1beta1.NamespaceScoped)
 | 
			
		||||
	noxuVersionClient, err := testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, clientPool)
 | 
			
		||||
	err = testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, dynamicClient)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	ns := ""
 | 
			
		||||
	noxuResourceClient := NewNamespacedCustomResourceClient(ns, noxuVersionClient, noxuDefinition)
 | 
			
		||||
	noxuResourceClient := NewNamespacedCustomResourceClient(ns, dynamicClient, noxuDefinition)
 | 
			
		||||
	initialList, err := noxuResourceClient.List(metav1.ListOptions{})
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
	if e, a := 0, len(initialList.(*unstructured.UnstructuredList).Items); e != a {
 | 
			
		||||
	if e, a := 0, len(initialList.Items); e != a {
 | 
			
		||||
		t.Errorf("expected %v, got %v", e, a)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
@@ -661,13 +650,13 @@ func TestCrossNamespaceListWatch(t *testing.T) {
 | 
			
		||||
 | 
			
		||||
	instances := make(map[string]*unstructured.Unstructured)
 | 
			
		||||
	ns1 := "namespace-1"
 | 
			
		||||
	noxuNamespacedResourceClient1 := NewNamespacedCustomResourceClient(ns1, noxuVersionClient, noxuDefinition)
 | 
			
		||||
	noxuNamespacedResourceClient1 := NewNamespacedCustomResourceClient(ns1, dynamicClient, noxuDefinition)
 | 
			
		||||
	instances[ns1] = createInstanceWithNamespaceHelper(t, ns1, "foo1", noxuNamespacedResourceClient1, noxuDefinition)
 | 
			
		||||
	noxuNamespacesWatch1, err := noxuNamespacedResourceClient1.Watch(metav1.ListOptions{ResourceVersion: initialListListMeta.GetResourceVersion()})
 | 
			
		||||
	defer noxuNamespacesWatch1.Stop()
 | 
			
		||||
 | 
			
		||||
	ns2 := "namespace-2"
 | 
			
		||||
	noxuNamespacedResourceClient2 := NewNamespacedCustomResourceClient(ns2, noxuVersionClient, noxuDefinition)
 | 
			
		||||
	noxuNamespacedResourceClient2 := NewNamespacedCustomResourceClient(ns2, dynamicClient, noxuDefinition)
 | 
			
		||||
	instances[ns2] = createInstanceWithNamespaceHelper(t, ns2, "foo2", noxuNamespacedResourceClient2, noxuDefinition)
 | 
			
		||||
	noxuNamespacesWatch2, err := noxuNamespacedResourceClient2.Watch(metav1.ListOptions{ResourceVersion: initialListListMeta.GetResourceVersion()})
 | 
			
		||||
	defer noxuNamespacesWatch2.Stop()
 | 
			
		||||
@@ -677,11 +666,11 @@ func TestCrossNamespaceListWatch(t *testing.T) {
 | 
			
		||||
		t.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if e, a := 2, len(createdList.(*unstructured.UnstructuredList).Items); e != a {
 | 
			
		||||
	if e, a := 2, len(createdList.Items); e != a {
 | 
			
		||||
		t.Errorf("expected %v, got %v", e, a)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for _, a := range createdList.(*unstructured.UnstructuredList).Items {
 | 
			
		||||
	for _, a := range createdList.Items {
 | 
			
		||||
		if e := instances[a.GetNamespace()]; !reflect.DeepEqual(e, &a) {
 | 
			
		||||
			t.Errorf("expected %v, got %v", e, a)
 | 
			
		||||
		}
 | 
			
		||||
@@ -725,7 +714,7 @@ func TestCrossNamespaceListWatch(t *testing.T) {
 | 
			
		||||
	checkNamespacesWatchHelper(t, ns2, noxuNamespacesWatch2)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func createInstanceWithNamespaceHelper(t *testing.T, ns string, name string, noxuNamespacedResourceClient dynamic.ResourceInterface, noxuDefinition *apiextensionsv1beta1.CustomResourceDefinition) *unstructured.Unstructured {
 | 
			
		||||
func createInstanceWithNamespaceHelper(t *testing.T, ns string, name string, noxuNamespacedResourceClient dynamic.DynamicResourceInterface, noxuDefinition *apiextensionsv1beta1.CustomResourceDefinition) *unstructured.Unstructured {
 | 
			
		||||
	createdInstance, err := instantiateCustomResource(t, testserver.NewNoxuInstance(ns, name), noxuNamespacedResourceClient, noxuDefinition)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Fatalf("unable to create noxu Instance:%v", err)
 | 
			
		||||
@@ -762,14 +751,14 @@ func checkNamespacesWatchHelper(t *testing.T, ns string, namespacedwatch watch.I
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestNameConflict(t *testing.T) {
 | 
			
		||||
	stopCh, apiExtensionClient, clientPool, err := testserver.StartDefaultServerWithClients()
 | 
			
		||||
	stopCh, apiExtensionClient, dynamicClient, err := testserver.StartDefaultServerWithClients()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
	defer close(stopCh)
 | 
			
		||||
 | 
			
		||||
	noxuDefinition := testserver.NewNoxuCustomResourceDefinition(apiextensionsv1beta1.NamespaceScoped)
 | 
			
		||||
	_, err = testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, clientPool)
 | 
			
		||||
	err = testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, dynamicClient)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
 
 | 
			
		||||
@@ -31,17 +31,17 @@ import (
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func TestFinalization(t *testing.T) {
 | 
			
		||||
	stopCh, apiExtensionClient, clientPool, err := testserver.StartDefaultServerWithClients()
 | 
			
		||||
	stopCh, apiExtensionClient, dynamicClient, err := testserver.StartDefaultServerWithClients()
 | 
			
		||||
	require.NoError(t, err)
 | 
			
		||||
	defer close(stopCh)
 | 
			
		||||
 | 
			
		||||
	noxuDefinition := testserver.NewNoxuCustomResourceDefinition(apiextensionsv1beta1.ClusterScoped)
 | 
			
		||||
	noxuVersionClient, err := testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, clientPool)
 | 
			
		||||
	err = testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, dynamicClient)
 | 
			
		||||
	require.NoError(t, err)
 | 
			
		||||
 | 
			
		||||
	ns := "not-the-default"
 | 
			
		||||
	name := "foo123"
 | 
			
		||||
	noxuResourceClient := NewNamespacedCustomResourceClient(ns, noxuVersionClient, noxuDefinition)
 | 
			
		||||
	noxuResourceClient := NewNamespacedCustomResourceClient(ns, dynamicClient, noxuDefinition)
 | 
			
		||||
 | 
			
		||||
	instance := testserver.NewNoxuInstance(ns, name)
 | 
			
		||||
	instance.SetFinalizers([]string{"noxu.example.com/finalizer"})
 | 
			
		||||
@@ -94,19 +94,19 @@ func TestFinalization(t *testing.T) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestFinalizationAndDeletion(t *testing.T) {
 | 
			
		||||
	stopCh, apiExtensionClient, clientPool, err := testserver.StartDefaultServerWithClients()
 | 
			
		||||
	stopCh, apiExtensionClient, dynamicClient, err := testserver.StartDefaultServerWithClients()
 | 
			
		||||
	require.NoError(t, err)
 | 
			
		||||
	defer close(stopCh)
 | 
			
		||||
 | 
			
		||||
	// Create a CRD.
 | 
			
		||||
	noxuDefinition := testserver.NewNoxuCustomResourceDefinition(apiextensionsv1beta1.ClusterScoped)
 | 
			
		||||
	noxuVersionClient, err := testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, clientPool)
 | 
			
		||||
	err = testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, dynamicClient)
 | 
			
		||||
	require.NoError(t, err)
 | 
			
		||||
 | 
			
		||||
	// Create a CR with a finalizer.
 | 
			
		||||
	ns := "not-the-default"
 | 
			
		||||
	name := "foo123"
 | 
			
		||||
	noxuResourceClient := NewNamespacedCustomResourceClient(ns, noxuVersionClient, noxuDefinition)
 | 
			
		||||
	noxuResourceClient := NewNamespacedCustomResourceClient(ns, dynamicClient, noxuDefinition)
 | 
			
		||||
 | 
			
		||||
	instance := testserver.NewNoxuInstance(ns, name)
 | 
			
		||||
	instance.SetFinalizers([]string{"noxu.example.com/finalizer"})
 | 
			
		||||
 
 | 
			
		||||
@@ -36,11 +36,12 @@ import (
 | 
			
		||||
	"k8s.io/apimachinery/pkg/api/meta"
 | 
			
		||||
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 | 
			
		||||
	"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
 | 
			
		||||
	"k8s.io/apimachinery/pkg/runtime/schema"
 | 
			
		||||
	"k8s.io/apimachinery/pkg/watch"
 | 
			
		||||
	"k8s.io/client-go/dynamic"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func instantiateCustomResource(t *testing.T, instanceToCreate *unstructured.Unstructured, client dynamic.ResourceInterface, definition *apiextensionsv1beta1.CustomResourceDefinition) (*unstructured.Unstructured, error) {
 | 
			
		||||
func instantiateCustomResource(t *testing.T, instanceToCreate *unstructured.Unstructured, client dynamic.DynamicResourceInterface, definition *apiextensionsv1beta1.CustomResourceDefinition) (*unstructured.Unstructured, error) {
 | 
			
		||||
	createdInstance, err := client.Create(instanceToCreate)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Logf("%#v", createdInstance)
 | 
			
		||||
@@ -67,29 +68,35 @@ func instantiateCustomResource(t *testing.T, instanceToCreate *unstructured.Unst
 | 
			
		||||
	return createdInstance, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func NewNamespacedCustomResourceClient(ns string, client dynamic.Interface, definition *apiextensionsv1beta1.CustomResourceDefinition) dynamic.ResourceInterface {
 | 
			
		||||
	return client.Resource(&metav1.APIResource{
 | 
			
		||||
		Name:       definition.Spec.Names.Plural,
 | 
			
		||||
		Namespaced: definition.Spec.Scope == apiextensionsv1beta1.NamespaceScoped,
 | 
			
		||||
	}, ns)
 | 
			
		||||
func NewNamespacedCustomResourceClient(ns string, client dynamic.DynamicInterface, crd *apiextensionsv1beta1.CustomResourceDefinition) dynamic.DynamicResourceInterface {
 | 
			
		||||
	gvr := schema.GroupVersionResource{Group: crd.Spec.Group, Version: crd.Spec.Version, Resource: crd.Spec.Names.Plural}
 | 
			
		||||
 | 
			
		||||
	if crd.Spec.Scope != apiextensionsv1beta1.ClusterScoped {
 | 
			
		||||
		return client.NamespacedResource(gvr, ns)
 | 
			
		||||
	}
 | 
			
		||||
	return client.ClusterResource(gvr)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func NewNamespacedCustomResourceStatusClient(ns string, client dynamic.Interface, definition *apiextensionsv1beta1.CustomResourceDefinition) dynamic.ResourceInterface {
 | 
			
		||||
	return client.Resource(&metav1.APIResource{
 | 
			
		||||
		Name:       definition.Spec.Names.Plural + "/status",
 | 
			
		||||
		Namespaced: definition.Spec.Scope == apiextensionsv1beta1.NamespaceScoped,
 | 
			
		||||
	}, ns)
 | 
			
		||||
func NewNamespacedCustomResourceStatusClient(ns string, client dynamic.DynamicInterface, crd *apiextensionsv1beta1.CustomResourceDefinition) dynamic.DynamicResourceInterface {
 | 
			
		||||
	gvr := schema.GroupVersionResource{Group: crd.Spec.Group, Version: crd.Spec.Version, Resource: crd.Spec.Names.Plural}
 | 
			
		||||
 | 
			
		||||
	if crd.Spec.Scope != apiextensionsv1beta1.ClusterScoped {
 | 
			
		||||
		return client.NamespacedSubresource(gvr, "status", ns)
 | 
			
		||||
	}
 | 
			
		||||
	return client.ClusterSubresource(gvr, "status")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func NewNamespacedCustomResourceScaleClient(ns string, client dynamic.Interface, definition *apiextensionsv1beta1.CustomResourceDefinition) dynamic.ResourceInterface {
 | 
			
		||||
	return client.Resource(&metav1.APIResource{
 | 
			
		||||
		Name:       definition.Spec.Names.Plural + "/scale",
 | 
			
		||||
		Namespaced: definition.Spec.Scope == apiextensionsv1beta1.NamespaceScoped,
 | 
			
		||||
	}, ns)
 | 
			
		||||
func NewNamespacedCustomResourceScaleClient(ns string, client dynamic.DynamicInterface, crd *apiextensionsv1beta1.CustomResourceDefinition) dynamic.DynamicResourceInterface {
 | 
			
		||||
	gvr := schema.GroupVersionResource{Group: crd.Spec.Group, Version: crd.Spec.Version, Resource: crd.Spec.Names.Plural}
 | 
			
		||||
 | 
			
		||||
	if crd.Spec.Scope != apiextensionsv1beta1.ClusterScoped {
 | 
			
		||||
		return client.NamespacedSubresource(gvr, "scale", ns)
 | 
			
		||||
	}
 | 
			
		||||
	return client.ClusterSubresource(gvr, "scale")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestMultipleResourceInstances(t *testing.T) {
 | 
			
		||||
	stopCh, apiExtensionClient, clientPool, err := testserver.StartDefaultServerWithClients()
 | 
			
		||||
	stopCh, apiExtensionClient, dynamicClient, err := testserver.StartDefaultServerWithClients()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
@@ -97,11 +104,11 @@ func TestMultipleResourceInstances(t *testing.T) {
 | 
			
		||||
 | 
			
		||||
	ns := "not-the-default"
 | 
			
		||||
	noxuDefinition := testserver.NewNoxuCustomResourceDefinition(apiextensionsv1beta1.NamespaceScoped)
 | 
			
		||||
	noxuVersionClient, err := testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, clientPool)
 | 
			
		||||
	err = testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, dynamicClient)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
	noxuNamespacedResourceClient := NewNamespacedCustomResourceClient(ns, noxuVersionClient, noxuDefinition)
 | 
			
		||||
	noxuNamespacedResourceClient := NewNamespacedCustomResourceClient(ns, dynamicClient, noxuDefinition)
 | 
			
		||||
	noxuList, err := noxuNamespacedResourceClient.List(metav1.ListOptions{})
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Fatal(err)
 | 
			
		||||
@@ -168,10 +175,10 @@ func TestMultipleResourceInstances(t *testing.T) {
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
	if e, a := len(instances), len(listWithItem.(*unstructured.UnstructuredList).Items); e != a {
 | 
			
		||||
	if e, a := len(instances), len(listWithItem.Items); e != a {
 | 
			
		||||
		t.Errorf("expected %v, got %v", e, a)
 | 
			
		||||
	}
 | 
			
		||||
	for _, a := range listWithItem.(*unstructured.UnstructuredList).Items {
 | 
			
		||||
	for _, a := range listWithItem.Items {
 | 
			
		||||
		if e := instances[a.GetName()].Instance; !reflect.DeepEqual(e, &a) {
 | 
			
		||||
			t.Errorf("expected %v, got %v", e, a)
 | 
			
		||||
		}
 | 
			
		||||
@@ -185,7 +192,7 @@ func TestMultipleResourceInstances(t *testing.T) {
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
	if e, a := 0, len(listWithoutItem.(*unstructured.UnstructuredList).Items); e != a {
 | 
			
		||||
	if e, a := 0, len(listWithoutItem.Items); e != a {
 | 
			
		||||
		t.Errorf("expected %v, got %v", e, a)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
@@ -213,7 +220,7 @@ func TestMultipleResourceInstances(t *testing.T) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestMultipleRegistration(t *testing.T) {
 | 
			
		||||
	stopCh, apiExtensionClient, clientPool, err := testserver.StartDefaultServerWithClients()
 | 
			
		||||
	stopCh, apiExtensionClient, dynamicClient, err := testserver.StartDefaultServerWithClients()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
@@ -222,11 +229,11 @@ func TestMultipleRegistration(t *testing.T) {
 | 
			
		||||
	ns := "not-the-default"
 | 
			
		||||
	sameInstanceName := "foo"
 | 
			
		||||
	noxuDefinition := testserver.NewNoxuCustomResourceDefinition(apiextensionsv1beta1.NamespaceScoped)
 | 
			
		||||
	noxuVersionClient, err := testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, clientPool)
 | 
			
		||||
	err = testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, dynamicClient)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
	noxuNamespacedResourceClient := NewNamespacedCustomResourceClient(ns, noxuVersionClient, noxuDefinition)
 | 
			
		||||
	noxuNamespacedResourceClient := NewNamespacedCustomResourceClient(ns, dynamicClient, noxuDefinition)
 | 
			
		||||
	createdNoxuInstance, err := instantiateCustomResource(t, testserver.NewNoxuInstance(ns, sameInstanceName), noxuNamespacedResourceClient, noxuDefinition)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Fatalf("unable to create noxu Instance:%v", err)
 | 
			
		||||
@@ -241,11 +248,11 @@ func TestMultipleRegistration(t *testing.T) {
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	curletDefinition := testserver.NewCurletCustomResourceDefinition(apiextensionsv1beta1.NamespaceScoped)
 | 
			
		||||
	curletVersionClient, err := testserver.CreateNewCustomResourceDefinition(curletDefinition, apiExtensionClient, clientPool)
 | 
			
		||||
	err = testserver.CreateNewCustomResourceDefinition(curletDefinition, apiExtensionClient, dynamicClient)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
	curletNamespacedResourceClient := NewNamespacedCustomResourceClient(ns, curletVersionClient, curletDefinition)
 | 
			
		||||
	curletNamespacedResourceClient := NewNamespacedCustomResourceClient(ns, dynamicClient, curletDefinition)
 | 
			
		||||
	createdCurletInstance, err := instantiateCustomResource(t, testserver.NewCurletInstance(ns, sameInstanceName), curletNamespacedResourceClient, curletDefinition)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Fatalf("unable to create noxu Instance:%v", err)
 | 
			
		||||
@@ -269,7 +276,7 @@ func TestMultipleRegistration(t *testing.T) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestDeRegistrationAndReRegistration(t *testing.T) {
 | 
			
		||||
	stopCh, apiExtensionClient, clientPool, err := testserver.StartDefaultServerWithClients()
 | 
			
		||||
	stopCh, apiExtensionClient, dynamicClient, err := testserver.StartDefaultServerWithClients()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
@@ -278,11 +285,11 @@ func TestDeRegistrationAndReRegistration(t *testing.T) {
 | 
			
		||||
	ns := "not-the-default"
 | 
			
		||||
	sameInstanceName := "foo"
 | 
			
		||||
	func() {
 | 
			
		||||
		noxuVersionClient, err := testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, clientPool)
 | 
			
		||||
		err := testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, dynamicClient)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			t.Fatal(err)
 | 
			
		||||
		}
 | 
			
		||||
		noxuNamespacedResourceClient := NewNamespacedCustomResourceClient(ns, noxuVersionClient, noxuDefinition)
 | 
			
		||||
		noxuNamespacedResourceClient := NewNamespacedCustomResourceClient(ns, dynamicClient, noxuDefinition)
 | 
			
		||||
		if _, err := instantiateCustomResource(t, testserver.NewNoxuInstance(ns, sameInstanceName), noxuNamespacedResourceClient, noxuDefinition); err != nil {
 | 
			
		||||
			t.Fatal(err)
 | 
			
		||||
		}
 | 
			
		||||
@@ -304,11 +311,11 @@ func TestDeRegistrationAndReRegistration(t *testing.T) {
 | 
			
		||||
		if _, err := testserver.GetCustomResourceDefinition(noxuDefinition, apiExtensionClient); err == nil || !errors.IsNotFound(err) {
 | 
			
		||||
			t.Fatalf("expected a NotFound error, got:%v", err)
 | 
			
		||||
		}
 | 
			
		||||
		noxuVersionClient, err := testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, clientPool)
 | 
			
		||||
		err := testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, dynamicClient)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			t.Fatal(err)
 | 
			
		||||
		}
 | 
			
		||||
		noxuNamespacedResourceClient := NewNamespacedCustomResourceClient(ns, noxuVersionClient, noxuDefinition)
 | 
			
		||||
		noxuNamespacedResourceClient := NewNamespacedCustomResourceClient(ns, dynamicClient, noxuDefinition)
 | 
			
		||||
		initialList, err := noxuNamespacedResourceClient.List(metav1.ListOptions{})
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			t.Fatal(err)
 | 
			
		||||
@@ -316,7 +323,7 @@ func TestDeRegistrationAndReRegistration(t *testing.T) {
 | 
			
		||||
		if _, err = noxuNamespacedResourceClient.Get(sameInstanceName, metav1.GetOptions{}); err == nil || !errors.IsNotFound(err) {
 | 
			
		||||
			t.Fatalf("expected a NotFound error, got:%v", err)
 | 
			
		||||
		}
 | 
			
		||||
		if e, a := 0, len(initialList.(*unstructured.UnstructuredList).Items); e != a {
 | 
			
		||||
		if e, a := 0, len(initialList.Items); e != a {
 | 
			
		||||
			t.Fatalf("expected %v, got %v", e, a)
 | 
			
		||||
		}
 | 
			
		||||
		createdNoxuInstance, err := instantiateCustomResource(t, testserver.NewNoxuInstance(ns, sameInstanceName), noxuNamespacedResourceClient, noxuDefinition)
 | 
			
		||||
@@ -334,10 +341,10 @@ func TestDeRegistrationAndReRegistration(t *testing.T) {
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			t.Fatal(err)
 | 
			
		||||
		}
 | 
			
		||||
		if e, a := 1, len(listWithItem.(*unstructured.UnstructuredList).Items); e != a {
 | 
			
		||||
		if e, a := 1, len(listWithItem.Items); e != a {
 | 
			
		||||
			t.Fatalf("expected %v, got %v", e, a)
 | 
			
		||||
		}
 | 
			
		||||
		if e, a := *createdNoxuInstance, listWithItem.(*unstructured.UnstructuredList).Items[0]; !reflect.DeepEqual(e, a) {
 | 
			
		||||
		if e, a := *createdNoxuInstance, listWithItem.Items[0]; !reflect.DeepEqual(e, a) {
 | 
			
		||||
			t.Fatalf("expected %v, got %v", e, a)
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
@@ -351,7 +358,7 @@ func TestDeRegistrationAndReRegistration(t *testing.T) {
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			t.Fatal(err)
 | 
			
		||||
		}
 | 
			
		||||
		if e, a := 0, len(listWithoutItem.(*unstructured.UnstructuredList).Items); e != a {
 | 
			
		||||
		if e, a := 0, len(listWithoutItem.Items); e != a {
 | 
			
		||||
			t.Fatalf("expected %v, got %v", e, a)
 | 
			
		||||
		}
 | 
			
		||||
	}()
 | 
			
		||||
@@ -372,28 +379,31 @@ func TestEtcdStorage(t *testing.T) {
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
	clientPool := dynamic.NewDynamicClientPool(clientConfig)
 | 
			
		||||
	dynamicClient, err := dynamic.NewForConfig(clientConfig)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	etcdPrefix := getPrefixFromConfig(t, config)
 | 
			
		||||
 | 
			
		||||
	ns1 := "another-default-is-possible"
 | 
			
		||||
	curletDefinition := testserver.NewCurletCustomResourceDefinition(apiextensionsv1beta1.ClusterScoped)
 | 
			
		||||
	curletVersionClient, err := testserver.CreateNewCustomResourceDefinition(curletDefinition, apiExtensionClient, clientPool)
 | 
			
		||||
	err = testserver.CreateNewCustomResourceDefinition(curletDefinition, apiExtensionClient, dynamicClient)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
	curletNamespacedResourceClient := NewNamespacedCustomResourceClient(ns1, curletVersionClient, curletDefinition)
 | 
			
		||||
	curletNamespacedResourceClient := NewNamespacedCustomResourceClient(ns1, dynamicClient, curletDefinition)
 | 
			
		||||
	if _, err := instantiateCustomResource(t, testserver.NewCurletInstance(ns1, "bar"), curletNamespacedResourceClient, curletDefinition); err != nil {
 | 
			
		||||
		t.Fatalf("unable to create curlet cluster scoped Instance:%v", err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	ns2 := "the-cruel-default"
 | 
			
		||||
	noxuDefinition := testserver.NewNoxuCustomResourceDefinition(apiextensionsv1beta1.NamespaceScoped)
 | 
			
		||||
	noxuVersionClient, err := testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, clientPool)
 | 
			
		||||
	err = testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, dynamicClient)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
	noxuNamespacedResourceClient := NewNamespacedCustomResourceClient(ns2, noxuVersionClient, noxuDefinition)
 | 
			
		||||
	noxuNamespacedResourceClient := NewNamespacedCustomResourceClient(ns2, dynamicClient, noxuDefinition)
 | 
			
		||||
	if _, err := instantiateCustomResource(t, testserver.NewNoxuInstance(ns2, "foo"), noxuNamespacedResourceClient, noxuDefinition); err != nil {
 | 
			
		||||
		t.Fatalf("unable to create noxu namespace scoped Instance:%v", err)
 | 
			
		||||
	}
 | 
			
		||||
 
 | 
			
		||||
@@ -93,21 +93,21 @@ func TestStatusSubresource(t *testing.T) {
 | 
			
		||||
	// enable alpha feature CustomResourceSubresources
 | 
			
		||||
	defer utilfeaturetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.CustomResourceSubresources, true)()
 | 
			
		||||
 | 
			
		||||
	stopCh, apiExtensionClient, clientPool, err := testserver.StartDefaultServerWithClients()
 | 
			
		||||
	stopCh, apiExtensionClient, dynamicClient, err := testserver.StartDefaultServerWithClients()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
	defer close(stopCh)
 | 
			
		||||
 | 
			
		||||
	noxuDefinition := NewNoxuSubresourcesCRD(apiextensionsv1beta1.NamespaceScoped)
 | 
			
		||||
	noxuVersionClient, err := testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, clientPool)
 | 
			
		||||
	err = testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, dynamicClient)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	ns := "not-the-default"
 | 
			
		||||
	noxuResourceClient := NewNamespacedCustomResourceClient(ns, noxuVersionClient, noxuDefinition)
 | 
			
		||||
	noxuStatusResourceClient := NewNamespacedCustomResourceStatusClient(ns, noxuVersionClient, noxuDefinition)
 | 
			
		||||
	noxuResourceClient := NewNamespacedCustomResourceClient(ns, dynamicClient, noxuDefinition)
 | 
			
		||||
	noxuStatusResourceClient := NewNamespacedCustomResourceStatusClient(ns, dynamicClient, noxuDefinition)
 | 
			
		||||
	_, err = instantiateCustomResource(t, NewNoxuSubresourceInstance(ns, "foo"), noxuResourceClient, noxuDefinition)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Fatalf("unable to create noxu instance: %v", err)
 | 
			
		||||
@@ -218,26 +218,29 @@ func TestScaleSubresource(t *testing.T) {
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
	clientPool := dynamic.NewDynamicClientPool(config)
 | 
			
		||||
	dynamicClient, err := dynamic.NewForConfig(config)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	noxuDefinition := NewNoxuSubresourcesCRD(apiextensionsv1beta1.NamespaceScoped)
 | 
			
		||||
 | 
			
		||||
	// set invalid json path for specReplicasPath
 | 
			
		||||
	noxuDefinition.Spec.Subresources.Scale.SpecReplicasPath = "foo,bar"
 | 
			
		||||
	_, err = testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, clientPool)
 | 
			
		||||
	err = testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, dynamicClient)
 | 
			
		||||
	if err == nil {
 | 
			
		||||
		t.Fatalf("unexpected non-error: specReplicasPath should be a valid json path under .spec")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	noxuDefinition.Spec.Subresources.Scale.SpecReplicasPath = ".spec.replicas"
 | 
			
		||||
	noxuVersionClient, err := testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, clientPool)
 | 
			
		||||
	err = testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, dynamicClient)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	ns := "not-the-default"
 | 
			
		||||
	noxuResourceClient := NewNamespacedCustomResourceClient(ns, noxuVersionClient, noxuDefinition)
 | 
			
		||||
	noxuStatusResourceClient := NewNamespacedCustomResourceStatusClient(ns, noxuVersionClient, noxuDefinition)
 | 
			
		||||
	noxuResourceClient := NewNamespacedCustomResourceClient(ns, dynamicClient, noxuDefinition)
 | 
			
		||||
	noxuStatusResourceClient := NewNamespacedCustomResourceStatusClient(ns, dynamicClient, noxuDefinition)
 | 
			
		||||
	_, err = instantiateCustomResource(t, NewNoxuSubresourceInstance(ns, "foo"), noxuResourceClient, noxuDefinition)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Fatalf("unable to create noxu instance: %v", err)
 | 
			
		||||
@@ -345,11 +348,14 @@ func TestValidationSchema(t *testing.T) {
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
	clientPool := dynamic.NewDynamicClientPool(config)
 | 
			
		||||
	dynamicClient, err := dynamic.NewForConfig(config)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// fields other than properties in root schema are not allowed
 | 
			
		||||
	noxuDefinition := newNoxuValidationCRD(apiextensionsv1beta1.NamespaceScoped)
 | 
			
		||||
	_, err = testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, clientPool)
 | 
			
		||||
	err = testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, dynamicClient)
 | 
			
		||||
	if err == nil {
 | 
			
		||||
		t.Fatalf("unexpected non-error: if subresources for custom resources are enabled, only properties can be used at the root of the schema")
 | 
			
		||||
	}
 | 
			
		||||
@@ -367,7 +373,7 @@ func TestValidationSchema(t *testing.T) {
 | 
			
		||||
			},
 | 
			
		||||
		},
 | 
			
		||||
	}
 | 
			
		||||
	_, err = testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, clientPool)
 | 
			
		||||
	err = testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, dynamicClient)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Fatalf("unable to created crd %v: %v", noxuDefinition.Name, err)
 | 
			
		||||
	}
 | 
			
		||||
@@ -377,7 +383,7 @@ func TestValidateOnlyStatus(t *testing.T) {
 | 
			
		||||
	// enable alpha feature CustomResourceSubresources
 | 
			
		||||
	defer utilfeaturetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.CustomResourceSubresources, true)()
 | 
			
		||||
 | 
			
		||||
	stopCh, apiExtensionClient, clientPool, err := testserver.StartDefaultServerWithClients()
 | 
			
		||||
	stopCh, apiExtensionClient, dynamicClient, err := testserver.StartDefaultServerWithClients()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
@@ -417,13 +423,13 @@ func TestValidateOnlyStatus(t *testing.T) {
 | 
			
		||||
		OpenAPIV3Schema: schema,
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	noxuVersionClient, err := testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, clientPool)
 | 
			
		||||
	err = testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, dynamicClient)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
	ns := "not-the-default"
 | 
			
		||||
	noxuResourceClient := NewNamespacedCustomResourceClient(ns, noxuVersionClient, noxuDefinition)
 | 
			
		||||
	noxuStatusResourceClient := NewNamespacedCustomResourceStatusClient(ns, noxuVersionClient, noxuDefinition)
 | 
			
		||||
	noxuResourceClient := NewNamespacedCustomResourceClient(ns, dynamicClient, noxuDefinition)
 | 
			
		||||
	noxuStatusResourceClient := NewNamespacedCustomResourceStatusClient(ns, dynamicClient, noxuDefinition)
 | 
			
		||||
 | 
			
		||||
	// set .spec.num = 10 and .status.num = 10
 | 
			
		||||
	noxuInstance := NewNoxuSubresourceInstance(ns, "foo")
 | 
			
		||||
@@ -506,10 +512,13 @@ func TestSubresourcesDiscovery(t *testing.T) {
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
	clientPool := dynamic.NewDynamicClientPool(config)
 | 
			
		||||
	dynamicClient, err := dynamic.NewForConfig(config)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	noxuDefinition := NewNoxuSubresourcesCRD(apiextensionsv1beta1.NamespaceScoped)
 | 
			
		||||
	_, err = testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, clientPool)
 | 
			
		||||
	err = testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, dynamicClient)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
@@ -580,21 +589,21 @@ func TestGeneration(t *testing.T) {
 | 
			
		||||
	// enable alpha feature CustomResourceSubresources
 | 
			
		||||
	defer utilfeaturetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.CustomResourceSubresources, true)()
 | 
			
		||||
 | 
			
		||||
	stopCh, apiExtensionClient, clientPool, err := testserver.StartDefaultServerWithClients()
 | 
			
		||||
	stopCh, apiExtensionClient, dynamicClient, err := testserver.StartDefaultServerWithClients()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
	defer close(stopCh)
 | 
			
		||||
 | 
			
		||||
	noxuDefinition := NewNoxuSubresourcesCRD(apiextensionsv1beta1.NamespaceScoped)
 | 
			
		||||
	noxuVersionClient, err := testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, clientPool)
 | 
			
		||||
	err = testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, dynamicClient)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	ns := "not-the-default"
 | 
			
		||||
	noxuResourceClient := NewNamespacedCustomResourceClient(ns, noxuVersionClient, noxuDefinition)
 | 
			
		||||
	noxuStatusResourceClient := NewNamespacedCustomResourceStatusClient(ns, noxuVersionClient, noxuDefinition)
 | 
			
		||||
	noxuResourceClient := NewNamespacedCustomResourceClient(ns, dynamicClient, noxuDefinition)
 | 
			
		||||
	noxuStatusResourceClient := NewNamespacedCustomResourceStatusClient(ns, dynamicClient, noxuDefinition)
 | 
			
		||||
	_, err = instantiateCustomResource(t, NewNoxuSubresourceInstance(ns, "foo"), noxuResourceClient, noxuDefinition)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Fatalf("unable to create noxu instance: %v", err)
 | 
			
		||||
@@ -664,18 +673,21 @@ func TestSubresourcePatch(t *testing.T) {
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
	clientPool := dynamic.NewDynamicClientPool(config)
 | 
			
		||||
	dynamicClient, err := dynamic.NewForConfig(config)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	noxuDefinition := NewNoxuSubresourcesCRD(apiextensionsv1beta1.NamespaceScoped)
 | 
			
		||||
	noxuVersionClient, err := testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, clientPool)
 | 
			
		||||
	err = testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, dynamicClient)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	ns := "not-the-default"
 | 
			
		||||
	noxuResourceClient := NewNamespacedCustomResourceClient(ns, noxuVersionClient, noxuDefinition)
 | 
			
		||||
	noxuStatusResourceClient := NewNamespacedCustomResourceStatusClient(ns, noxuVersionClient, noxuDefinition)
 | 
			
		||||
	noxuScaleResourceClient := NewNamespacedCustomResourceScaleClient(ns, noxuVersionClient, noxuDefinition)
 | 
			
		||||
	noxuResourceClient := NewNamespacedCustomResourceClient(ns, dynamicClient, noxuDefinition)
 | 
			
		||||
	noxuStatusResourceClient := NewNamespacedCustomResourceStatusClient(ns, dynamicClient, noxuDefinition)
 | 
			
		||||
	noxuScaleResourceClient := NewNamespacedCustomResourceScaleClient(ns, dynamicClient, noxuDefinition)
 | 
			
		||||
	_, err = instantiateCustomResource(t, NewNoxuSubresourceInstance(ns, "foo"), noxuResourceClient, noxuDefinition)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Fatalf("unable to create noxu instance: %v", err)
 | 
			
		||||
 
 | 
			
		||||
@@ -154,10 +154,10 @@ func NewCurletInstance(namespace, name string) *unstructured.Unstructured {
 | 
			
		||||
// the apiextension apiserver has installed the CRD. But it's not safe to watch
 | 
			
		||||
// the created CR. Please call CreateNewCustomResourceDefinition if you need to
 | 
			
		||||
// watch the CR.
 | 
			
		||||
func CreateNewCustomResourceDefinitionWatchUnsafe(crd *apiextensionsv1beta1.CustomResourceDefinition, apiExtensionsClient clientset.Interface, clientPool dynamic.ClientPool) (dynamic.Interface, error) {
 | 
			
		||||
	_, err := apiExtensionsClient.Apiextensions().CustomResourceDefinitions().Create(crd)
 | 
			
		||||
func CreateNewCustomResourceDefinitionWatchUnsafe(crd *apiextensionsv1beta1.CustomResourceDefinition, apiExtensionsClient clientset.Interface) error {
 | 
			
		||||
	_, err := apiExtensionsClient.ApiextensionsV1beta1().CustomResourceDefinitions().Create(crd)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// wait until the resource appears in discovery
 | 
			
		||||
@@ -173,17 +173,14 @@ func CreateNewCustomResourceDefinitionWatchUnsafe(crd *apiextensionsv1beta1.Cust
 | 
			
		||||
		}
 | 
			
		||||
		return false, nil
 | 
			
		||||
	})
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return clientPool.ClientForGroupVersionResource(schema.GroupVersionResource{Group: crd.Spec.Group, Version: crd.Spec.Version, Resource: crd.Spec.Names.Plural})
 | 
			
		||||
	return err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func CreateNewCustomResourceDefinition(crd *apiextensionsv1beta1.CustomResourceDefinition, apiExtensionsClient clientset.Interface, clientPool dynamic.ClientPool) (dynamic.Interface, error) {
 | 
			
		||||
	dynamicClient, err := CreateNewCustomResourceDefinitionWatchUnsafe(crd, apiExtensionsClient, clientPool)
 | 
			
		||||
func CreateNewCustomResourceDefinition(crd *apiextensionsv1beta1.CustomResourceDefinition, apiExtensionsClient clientset.Interface, dynamicClientSet dynamic.DynamicInterface) error {
 | 
			
		||||
	err := CreateNewCustomResourceDefinitionWatchUnsafe(crd, apiExtensionsClient)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// This is only for a test.  We need the watch cache to have a resource version that works for the test.
 | 
			
		||||
@@ -198,28 +195,33 @@ func CreateNewCustomResourceDefinition(crd *apiextensionsv1beta1.CustomResourceD
 | 
			
		||||
	// before like the created RV could be too old to watch.
 | 
			
		||||
	var primingErr error
 | 
			
		||||
	wait.PollImmediate(500*time.Millisecond, 30*time.Second, func() (bool, error) {
 | 
			
		||||
		primingErr = checkForWatchCachePrimed(crd, dynamicClient)
 | 
			
		||||
		primingErr = checkForWatchCachePrimed(crd, dynamicClientSet)
 | 
			
		||||
		if primingErr == nil {
 | 
			
		||||
			return true, nil
 | 
			
		||||
		}
 | 
			
		||||
		return false, nil
 | 
			
		||||
	})
 | 
			
		||||
	if primingErr != nil {
 | 
			
		||||
		return nil, primingErr
 | 
			
		||||
		return primingErr
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return dynamicClient, nil
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func checkForWatchCachePrimed(crd *apiextensionsv1beta1.CustomResourceDefinition, dynamicClient dynamic.Interface) error {
 | 
			
		||||
func checkForWatchCachePrimed(crd *apiextensionsv1beta1.CustomResourceDefinition, dynamicClientSet dynamic.DynamicInterface) error {
 | 
			
		||||
	ns := ""
 | 
			
		||||
	if crd.Spec.Scope != apiextensionsv1beta1.ClusterScoped {
 | 
			
		||||
		ns = "aval"
 | 
			
		||||
	}
 | 
			
		||||
	resourceClient := dynamicClient.Resource(&metav1.APIResource{
 | 
			
		||||
		Name:       crd.Spec.Names.Plural,
 | 
			
		||||
		Namespaced: crd.Spec.Scope != apiextensionsv1beta1.ClusterScoped,
 | 
			
		||||
	}, ns)
 | 
			
		||||
 | 
			
		||||
	gvr := schema.GroupVersionResource{Group: crd.Spec.Group, Version: crd.Spec.Version, Resource: crd.Spec.Names.Plural}
 | 
			
		||||
	var resourceClient dynamic.DynamicResourceInterface
 | 
			
		||||
	if crd.Spec.Scope != apiextensionsv1beta1.ClusterScoped {
 | 
			
		||||
		resourceClient = dynamicClientSet.NamespacedResource(gvr, ns)
 | 
			
		||||
	} else {
 | 
			
		||||
		resourceClient = dynamicClientSet.ClusterResource(gvr)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	initialList, err := resourceClient.List(metav1.ListOptions{})
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
 
 | 
			
		||||
@@ -139,7 +139,7 @@ func StartDefaultServer() (chan struct{}, *rest.Config, error) {
 | 
			
		||||
	return StartServer(config)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func StartDefaultServerWithClients() (chan struct{}, clientset.Interface, dynamic.ClientPool, error) {
 | 
			
		||||
func StartDefaultServerWithClients() (chan struct{}, clientset.Interface, dynamic.DynamicInterface, error) {
 | 
			
		||||
	stopCh, config, err := StartDefaultServer()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, nil, nil, err
 | 
			
		||||
@@ -151,5 +151,11 @@ func StartDefaultServerWithClients() (chan struct{}, clientset.Interface, dynami
 | 
			
		||||
		return nil, nil, nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return stopCh, apiExtensionsClient, dynamic.NewDynamicClientPool(config), nil
 | 
			
		||||
	dynamicClient, err := dynamic.NewForConfig(config)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		close(stopCh)
 | 
			
		||||
		return nil, nil, nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return stopCh, apiExtensionsClient, dynamicClient, nil
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -31,20 +31,20 @@ import (
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func TestForProperValidationErrors(t *testing.T) {
 | 
			
		||||
	stopCh, apiExtensionClient, clientPool, err := testserver.StartDefaultServerWithClients()
 | 
			
		||||
	stopCh, apiExtensionClient, dynamicClient, err := testserver.StartDefaultServerWithClients()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
	defer close(stopCh)
 | 
			
		||||
 | 
			
		||||
	noxuDefinition := testserver.NewNoxuCustomResourceDefinition(apiextensionsv1beta1.NamespaceScoped)
 | 
			
		||||
	noxuVersionClient, err := testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, clientPool)
 | 
			
		||||
	err = testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, dynamicClient)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	ns := "not-the-default"
 | 
			
		||||
	noxuResourceClient := NewNamespacedCustomResourceClient(ns, noxuVersionClient, noxuDefinition)
 | 
			
		||||
	noxuResourceClient := NewNamespacedCustomResourceClient(ns, dynamicClient, noxuDefinition)
 | 
			
		||||
 | 
			
		||||
	tests := []struct {
 | 
			
		||||
		name          string
 | 
			
		||||
@@ -169,20 +169,20 @@ func newNoxuValidationInstance(namespace, name string) *unstructured.Unstructure
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestCustomResourceValidation(t *testing.T) {
 | 
			
		||||
	stopCh, apiExtensionClient, clientPool, err := testserver.StartDefaultServerWithClients()
 | 
			
		||||
	stopCh, apiExtensionClient, dynamicClient, err := testserver.StartDefaultServerWithClients()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
	defer close(stopCh)
 | 
			
		||||
 | 
			
		||||
	noxuDefinition := newNoxuValidationCRD(apiextensionsv1beta1.NamespaceScoped)
 | 
			
		||||
	noxuVersionClient, err := testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, clientPool)
 | 
			
		||||
	err = testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, dynamicClient)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	ns := "not-the-default"
 | 
			
		||||
	noxuResourceClient := NewNamespacedCustomResourceClient(ns, noxuVersionClient, noxuDefinition)
 | 
			
		||||
	noxuResourceClient := NewNamespacedCustomResourceClient(ns, dynamicClient, noxuDefinition)
 | 
			
		||||
	_, err = instantiateCustomResource(t, newNoxuValidationInstance(ns, "foo"), noxuResourceClient, noxuDefinition)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Fatalf("unable to create noxu instance: %v", err)
 | 
			
		||||
@@ -190,20 +190,20 @@ func TestCustomResourceValidation(t *testing.T) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestCustomResourceUpdateValidation(t *testing.T) {
 | 
			
		||||
	stopCh, apiExtensionClient, clientPool, err := testserver.StartDefaultServerWithClients()
 | 
			
		||||
	stopCh, apiExtensionClient, dynamicClient, err := testserver.StartDefaultServerWithClients()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
	defer close(stopCh)
 | 
			
		||||
 | 
			
		||||
	noxuDefinition := newNoxuValidationCRD(apiextensionsv1beta1.NamespaceScoped)
 | 
			
		||||
	noxuVersionClient, err := testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, clientPool)
 | 
			
		||||
	err = testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, dynamicClient)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	ns := "not-the-default"
 | 
			
		||||
	noxuResourceClient := NewNamespacedCustomResourceClient(ns, noxuVersionClient, noxuDefinition)
 | 
			
		||||
	noxuResourceClient := NewNamespacedCustomResourceClient(ns, dynamicClient, noxuDefinition)
 | 
			
		||||
	_, err = instantiateCustomResource(t, newNoxuValidationInstance(ns, "foo"), noxuResourceClient, noxuDefinition)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Fatalf("unable to create noxu instance: %v", err)
 | 
			
		||||
@@ -233,20 +233,20 @@ func TestCustomResourceUpdateValidation(t *testing.T) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestCustomResourceValidationErrors(t *testing.T) {
 | 
			
		||||
	stopCh, apiExtensionClient, clientPool, err := testserver.StartDefaultServerWithClients()
 | 
			
		||||
	stopCh, apiExtensionClient, dynamicClient, err := testserver.StartDefaultServerWithClients()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
	defer close(stopCh)
 | 
			
		||||
 | 
			
		||||
	noxuDefinition := newNoxuValidationCRD(apiextensionsv1beta1.NamespaceScoped)
 | 
			
		||||
	noxuVersionClient, err := testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, clientPool)
 | 
			
		||||
	err = testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, dynamicClient)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	ns := "not-the-default"
 | 
			
		||||
	noxuResourceClient := NewNamespacedCustomResourceClient(ns, noxuVersionClient, noxuDefinition)
 | 
			
		||||
	noxuResourceClient := NewNamespacedCustomResourceClient(ns, dynamicClient, noxuDefinition)
 | 
			
		||||
 | 
			
		||||
	tests := []struct {
 | 
			
		||||
		name          string
 | 
			
		||||
@@ -324,7 +324,7 @@ func TestCustomResourceValidationErrors(t *testing.T) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestCRValidationOnCRDUpdate(t *testing.T) {
 | 
			
		||||
	stopCh, apiExtensionClient, clientPool, err := testserver.StartDefaultServerWithClients()
 | 
			
		||||
	stopCh, apiExtensionClient, dynamicClient, err := testserver.StartDefaultServerWithClients()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
@@ -335,12 +335,12 @@ func TestCRValidationOnCRDUpdate(t *testing.T) {
 | 
			
		||||
	// set stricter schema
 | 
			
		||||
	noxuDefinition.Spec.Validation.OpenAPIV3Schema.Required = []string{"alpha", "beta", "epsilon"}
 | 
			
		||||
 | 
			
		||||
	noxuVersionClient, err := testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, clientPool)
 | 
			
		||||
	err = testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, dynamicClient)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
	ns := "not-the-default"
 | 
			
		||||
	noxuResourceClient := NewNamespacedCustomResourceClient(ns, noxuVersionClient, noxuDefinition)
 | 
			
		||||
	noxuResourceClient := NewNamespacedCustomResourceClient(ns, dynamicClient, noxuDefinition)
 | 
			
		||||
 | 
			
		||||
	// CR is rejected
 | 
			
		||||
	_, err = instantiateCustomResource(t, newNoxuValidationInstance(ns, "foo"), noxuResourceClient, noxuDefinition)
 | 
			
		||||
@@ -378,7 +378,7 @@ func TestCRValidationOnCRDUpdate(t *testing.T) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestForbiddenFieldsInSchema(t *testing.T) {
 | 
			
		||||
	stopCh, apiExtensionClient, clientPool, err := testserver.StartDefaultServerWithClients()
 | 
			
		||||
	stopCh, apiExtensionClient, dynamicClient, err := testserver.StartDefaultServerWithClients()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
@@ -387,7 +387,7 @@ func TestForbiddenFieldsInSchema(t *testing.T) {
 | 
			
		||||
	noxuDefinition := newNoxuValidationCRD(apiextensionsv1beta1.NamespaceScoped)
 | 
			
		||||
	noxuDefinition.Spec.Validation.OpenAPIV3Schema.AdditionalProperties.Allows = false
 | 
			
		||||
 | 
			
		||||
	_, err = testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, clientPool)
 | 
			
		||||
	err = testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, dynamicClient)
 | 
			
		||||
	if err == nil {
 | 
			
		||||
		t.Fatalf("unexpected non-error: additionalProperties cannot be set to false")
 | 
			
		||||
	}
 | 
			
		||||
@@ -398,7 +398,7 @@ func TestForbiddenFieldsInSchema(t *testing.T) {
 | 
			
		||||
	}
 | 
			
		||||
	noxuDefinition.Spec.Validation.OpenAPIV3Schema.AdditionalProperties.Allows = true
 | 
			
		||||
 | 
			
		||||
	_, err = testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, clientPool)
 | 
			
		||||
	err = testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, dynamicClient)
 | 
			
		||||
	if err == nil {
 | 
			
		||||
		t.Fatalf("unexpected non-error: uniqueItems cannot be set to true")
 | 
			
		||||
	}
 | 
			
		||||
@@ -409,14 +409,14 @@ func TestForbiddenFieldsInSchema(t *testing.T) {
 | 
			
		||||
		UniqueItems: false,
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	_, err = testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, clientPool)
 | 
			
		||||
	err = testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, dynamicClient)
 | 
			
		||||
	if err == nil {
 | 
			
		||||
		t.Fatal("unexpected non-error: $ref cannot be non-empty string")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	noxuDefinition.Spec.Validation.OpenAPIV3Schema.Ref = nil
 | 
			
		||||
 | 
			
		||||
	_, err = testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, clientPool)
 | 
			
		||||
	err = testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, dynamicClient)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
 
 | 
			
		||||
@@ -48,10 +48,13 @@ func TestYAML(t *testing.T) {
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
	clientPool := dynamic.NewDynamicClientPool(config)
 | 
			
		||||
	dynamicClient, err := dynamic.NewForConfig(config)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	noxuDefinition := testserver.NewNoxuCustomResourceDefinition(apiextensionsv1beta1.ClusterScoped)
 | 
			
		||||
	_, err = testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, clientPool)
 | 
			
		||||
	err = testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, dynamicClient)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
@@ -367,10 +370,13 @@ func TestYAMLSubresource(t *testing.T) {
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
	clientPool := dynamic.NewDynamicClientPool(config)
 | 
			
		||||
	dynamicClient, err := dynamic.NewForConfig(config)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	noxuDefinition := NewNoxuSubresourcesCRD(apiextensionsv1beta1.ClusterScoped)
 | 
			
		||||
	_, err = testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, clientPool)
 | 
			
		||||
	err = testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, dynamicClient)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
 
 | 
			
		||||
@@ -26,7 +26,6 @@ go_library(
 | 
			
		||||
    importpath = "k8s.io/kubernetes/test/e2e/apimachinery",
 | 
			
		||||
    deps = [
 | 
			
		||||
        "//pkg/api/v1/pod:go_default_library",
 | 
			
		||||
        "//pkg/apis/core:go_default_library",
 | 
			
		||||
        "//pkg/apis/rbac:go_default_library",
 | 
			
		||||
        "//pkg/printers:go_default_library",
 | 
			
		||||
        "//pkg/util/version:go_default_library",
 | 
			
		||||
 
 | 
			
		||||
@@ -391,10 +391,7 @@ func TestSampleAPIServer(f *framework.Framework, image string) {
 | 
			
		||||
	if !ok {
 | 
			
		||||
		framework.Failf("could not find group version resource for dynamic client and wardle/flunders.")
 | 
			
		||||
	}
 | 
			
		||||
	clientPool := f.ClientPool
 | 
			
		||||
	dynamicClient, err := clientPool.ClientForGroupVersionResource(gvr)
 | 
			
		||||
	framework.ExpectNoError(err, "getting group version resources for dynamic client")
 | 
			
		||||
	apiResource := metav1.APIResource{Name: gvr.Resource, Namespaced: true}
 | 
			
		||||
	dynamicClient := f.DynamicClient.NamespacedResource(gvr, namespace)
 | 
			
		||||
 | 
			
		||||
	// kubectl create -f flunders-1.yaml
 | 
			
		||||
	// Request Body: {"apiVersion":"wardle.k8s.io/v1alpha1","kind":"Flunder","metadata":{"labels":{"sample-label":"true"},"name":"test-flunder","namespace":"default"}}
 | 
			
		||||
@@ -411,27 +408,23 @@ func TestSampleAPIServer(f *framework.Framework, image string) {
 | 
			
		||||
	unstruct := &unstructuredv1.Unstructured{}
 | 
			
		||||
	err = unstruct.UnmarshalJSON(jsonFlunder)
 | 
			
		||||
	framework.ExpectNoError(err, "unmarshalling test-flunder as unstructured for create using dynamic client")
 | 
			
		||||
	unstruct, err = dynamicClient.Resource(&apiResource, namespace).Create(unstruct)
 | 
			
		||||
	unstruct, err = dynamicClient.Create(unstruct)
 | 
			
		||||
	framework.ExpectNoError(err, "listing flunders using dynamic client")
 | 
			
		||||
 | 
			
		||||
	// kubectl get flunders
 | 
			
		||||
	obj, err := dynamicClient.Resource(&apiResource, namespace).List(metav1.ListOptions{})
 | 
			
		||||
	unstructuredList, err := dynamicClient.List(metav1.ListOptions{})
 | 
			
		||||
	framework.ExpectNoError(err, "listing flunders using dynamic client")
 | 
			
		||||
	unstructuredList, ok := obj.(*unstructuredv1.UnstructuredList)
 | 
			
		||||
	validateErrorWithDebugInfo(f, err, pods, "casting flunders list(%T) as unstructuredList using dynamic client", obj)
 | 
			
		||||
	if len(unstructuredList.Items) != 1 {
 | 
			
		||||
		framework.Failf("failed to get back the correct flunders list %v from the dynamic client", unstructuredList)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// kubectl delete flunder test-flunder
 | 
			
		||||
	err = dynamicClient.Resource(&apiResource, namespace).Delete(flunderName, &metav1.DeleteOptions{})
 | 
			
		||||
	err = dynamicClient.Delete(flunderName, &metav1.DeleteOptions{})
 | 
			
		||||
	validateErrorWithDebugInfo(f, err, pods, "deleting flunders(%v) using dynamic client", unstructuredList.Items)
 | 
			
		||||
 | 
			
		||||
	// kubectl get flunders
 | 
			
		||||
	obj, err = dynamicClient.Resource(&apiResource, namespace).List(metav1.ListOptions{})
 | 
			
		||||
	unstructuredList, err = dynamicClient.List(metav1.ListOptions{})
 | 
			
		||||
	framework.ExpectNoError(err, "listing flunders using dynamic client")
 | 
			
		||||
	unstructuredList, ok = obj.(*unstructuredv1.UnstructuredList)
 | 
			
		||||
	validateErrorWithDebugInfo(f, err, pods, "casting flunders list(%T) as unstructuredList using dynamic client", obj)
 | 
			
		||||
	if len(unstructuredList.Items) != 0 {
 | 
			
		||||
		framework.Failf("failed to get back the correct deleted flunders list %v from the dynamic client", unstructuredList)
 | 
			
		||||
	}
 | 
			
		||||
 
 | 
			
		||||
@@ -25,6 +25,7 @@ import (
 | 
			
		||||
	"k8s.io/apimachinery/pkg/api/meta"
 | 
			
		||||
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 | 
			
		||||
	"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
 | 
			
		||||
	"k8s.io/apimachinery/pkg/runtime/schema"
 | 
			
		||||
	"k8s.io/apimachinery/pkg/watch"
 | 
			
		||||
	"k8s.io/client-go/dynamic"
 | 
			
		||||
	"k8s.io/kubernetes/test/e2e/framework"
 | 
			
		||||
@@ -63,7 +64,7 @@ var _ = SIGDescribe("CustomResourceDefinition Watch", func() {
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			noxuDefinition := testserver.NewNoxuCustomResourceDefinition(apiextensionsv1beta1.ClusterScoped)
 | 
			
		||||
			noxuVersionClient, err := testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, f.ClientPool)
 | 
			
		||||
			err = testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, f.DynamicClient)
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				framework.Failf("failed to create CustomResourceDefinition: %v", err)
 | 
			
		||||
			}
 | 
			
		||||
@@ -76,7 +77,7 @@ var _ = SIGDescribe("CustomResourceDefinition Watch", func() {
 | 
			
		||||
			}()
 | 
			
		||||
 | 
			
		||||
			ns := ""
 | 
			
		||||
			noxuResourceClient := newNamespacedCustomResourceClient(ns, noxuVersionClient, noxuDefinition)
 | 
			
		||||
			noxuResourceClient := newNamespacedCustomResourceClient(ns, f.DynamicClient, noxuDefinition)
 | 
			
		||||
 | 
			
		||||
			watchA, err := watchCRWithName(noxuResourceClient, watchCRNameA)
 | 
			
		||||
			Expect(err).NotTo(HaveOccurred())
 | 
			
		||||
@@ -114,7 +115,7 @@ var _ = SIGDescribe("CustomResourceDefinition Watch", func() {
 | 
			
		||||
	})
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
func watchCRWithName(crdResourceClient dynamic.ResourceInterface, name string) (watch.Interface, error) {
 | 
			
		||||
func watchCRWithName(crdResourceClient dynamic.DynamicResourceInterface, name string) (watch.Interface, error) {
 | 
			
		||||
	return crdResourceClient.Watch(
 | 
			
		||||
		metav1.ListOptions{
 | 
			
		||||
			FieldSelector:  "metadata.name=" + name,
 | 
			
		||||
@@ -123,7 +124,7 @@ func watchCRWithName(crdResourceClient dynamic.ResourceInterface, name string) (
 | 
			
		||||
	)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func instantiateCustomResource(instanceToCreate *unstructured.Unstructured, client dynamic.ResourceInterface, definition *apiextensionsv1beta1.CustomResourceDefinition) (*unstructured.Unstructured, error) {
 | 
			
		||||
func instantiateCustomResource(instanceToCreate *unstructured.Unstructured, client dynamic.DynamicResourceInterface, definition *apiextensionsv1beta1.CustomResourceDefinition) (*unstructured.Unstructured, error) {
 | 
			
		||||
	createdInstance, err := client.Create(instanceToCreate)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
@@ -149,13 +150,17 @@ func instantiateCustomResource(instanceToCreate *unstructured.Unstructured, clie
 | 
			
		||||
	return createdInstance, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func deleteCustomResource(client dynamic.ResourceInterface, name string) error {
 | 
			
		||||
func deleteCustomResource(client dynamic.DynamicResourceInterface, name string) error {
 | 
			
		||||
	return client.Delete(name, &metav1.DeleteOptions{})
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func newNamespacedCustomResourceClient(ns string, client dynamic.Interface, definition *apiextensionsv1beta1.CustomResourceDefinition) dynamic.ResourceInterface {
 | 
			
		||||
	return client.Resource(&metav1.APIResource{
 | 
			
		||||
		Name:       definition.Spec.Names.Plural,
 | 
			
		||||
		Namespaced: definition.Spec.Scope == apiextensionsv1beta1.NamespaceScoped,
 | 
			
		||||
	}, ns)
 | 
			
		||||
func newNamespacedCustomResourceClient(ns string, client dynamic.DynamicInterface, crd *apiextensionsv1beta1.CustomResourceDefinition) dynamic.DynamicResourceInterface {
 | 
			
		||||
	gvr := schema.GroupVersionResource{Group: crd.Spec.Group, Version: crd.Spec.Version, Resource: crd.Spec.Names.Plural}
 | 
			
		||||
 | 
			
		||||
	if crd.Spec.Scope != apiextensionsv1beta1.ClusterScoped {
 | 
			
		||||
		return client.NamespacedResource(gvr, ns)
 | 
			
		||||
	} else {
 | 
			
		||||
		return client.ClusterResource(gvr)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -55,7 +55,7 @@ var _ = SIGDescribe("CustomResourceDefinition resources", func() {
 | 
			
		||||
			randomDefinition := testserver.NewRandomNameCustomResourceDefinition(v1beta1.ClusterScoped)
 | 
			
		||||
 | 
			
		||||
			//create CRD and waits for the resource to be recognized and available.
 | 
			
		||||
			_, err = testserver.CreateNewCustomResourceDefinition(randomDefinition, apiExtensionClient, f.ClientPool)
 | 
			
		||||
			err = testserver.CreateNewCustomResourceDefinition(randomDefinition, apiExtensionClient, f.DynamicClient)
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				framework.Failf("failed to create CustomResourceDefinition: %v", err)
 | 
			
		||||
			}
 | 
			
		||||
 
 | 
			
		||||
@@ -36,7 +36,6 @@ import (
 | 
			
		||||
	"k8s.io/apimachinery/pkg/util/wait"
 | 
			
		||||
	"k8s.io/apiserver/pkg/storage/names"
 | 
			
		||||
	clientset "k8s.io/client-go/kubernetes"
 | 
			
		||||
	api "k8s.io/kubernetes/pkg/apis/core"
 | 
			
		||||
	"k8s.io/kubernetes/test/e2e/framework"
 | 
			
		||||
	"k8s.io/kubernetes/test/e2e/framework/metrics"
 | 
			
		||||
 | 
			
		||||
@@ -918,16 +917,15 @@ var _ = SIGDescribe("Garbage collector", func() {
 | 
			
		||||
				framework.Failf("failed to delete CustomResourceDefinition: %v", err)
 | 
			
		||||
			}
 | 
			
		||||
		}()
 | 
			
		||||
		client, err := apiextensionstestserver.CreateNewCustomResourceDefinition(definition, apiExtensionClient, f.ClientPool)
 | 
			
		||||
		err = apiextensionstestserver.CreateNewCustomResourceDefinition(definition, apiExtensionClient, f.DynamicClient)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			framework.Failf("failed to create CustomResourceDefinition: %v", err)
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// Get a client for the custom resource.
 | 
			
		||||
		resourceClient := client.Resource(&metav1.APIResource{
 | 
			
		||||
			Name:       definition.Spec.Names.Plural,
 | 
			
		||||
			Namespaced: false,
 | 
			
		||||
		}, api.NamespaceNone)
 | 
			
		||||
		gvr := schema.GroupVersionResource{Group: definition.Spec.Group, Version: definition.Spec.Version, Resource: definition.Spec.Names.Plural}
 | 
			
		||||
		resourceClient := f.DynamicClient.ClusterResource(gvr)
 | 
			
		||||
 | 
			
		||||
		apiVersion := definition.Spec.Group + "/" + definition.Spec.Version
 | 
			
		||||
 | 
			
		||||
		// Create a custom owner resource.
 | 
			
		||||
@@ -1001,7 +999,7 @@ var _ = SIGDescribe("Garbage collector", func() {
 | 
			
		||||
	})
 | 
			
		||||
 | 
			
		||||
	It("should delete jobs and pods created by cronjob", func() {
 | 
			
		||||
		framework.SkipIfMissingResource(f.ClientPool, CronJobGroupVersionResource, f.Namespace.Name)
 | 
			
		||||
		framework.SkipIfMissingResource(f.DynamicClient, CronJobGroupVersionResource, f.Namespace.Name)
 | 
			
		||||
 | 
			
		||||
		By("Create the cronjob")
 | 
			
		||||
		cronJob := newCronJob("simple", "*/1 * * * ?")
 | 
			
		||||
 
 | 
			
		||||
@@ -264,7 +264,7 @@ var _ = SIGDescribe("Generated clientset", func() {
 | 
			
		||||
	f := framework.NewDefaultFramework("clientset")
 | 
			
		||||
 | 
			
		||||
	BeforeEach(func() {
 | 
			
		||||
		framework.SkipIfMissingResource(f.ClientPool, CronJobGroupVersionResource, f.Namespace.Name)
 | 
			
		||||
		framework.SkipIfMissingResource(f.DynamicClient, CronJobGroupVersionResource, f.Namespace.Name)
 | 
			
		||||
	})
 | 
			
		||||
 | 
			
		||||
	It("should create v1beta1 cronJobs, delete cronJobs, watch cronJobs", func() {
 | 
			
		||||
 
 | 
			
		||||
@@ -1081,7 +1081,7 @@ func registerMutatingWebhookForCustomResource(f *framework.Framework, context *c
 | 
			
		||||
	return func() { client.AdmissionregistrationV1beta1().MutatingWebhookConfigurations().Delete(configName, nil) }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func testCustomResourceWebhook(f *framework.Framework, crd *apiextensionsv1beta1.CustomResourceDefinition, customResourceClient dynamic.ResourceInterface) {
 | 
			
		||||
func testCustomResourceWebhook(f *framework.Framework, crd *apiextensionsv1beta1.CustomResourceDefinition, customResourceClient dynamic.DynamicResourceInterface) {
 | 
			
		||||
	By("Creating a custom resource that should be denied by the webhook")
 | 
			
		||||
	crInstance := &unstructured.Unstructured{
 | 
			
		||||
		Object: map[string]interface{}{
 | 
			
		||||
@@ -1104,7 +1104,7 @@ func testCustomResourceWebhook(f *framework.Framework, crd *apiextensionsv1beta1
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func testMutatingCustomResourceWebhook(f *framework.Framework, crd *apiextensionsv1beta1.CustomResourceDefinition, customResourceClient dynamic.ResourceInterface) {
 | 
			
		||||
func testMutatingCustomResourceWebhook(f *framework.Framework, crd *apiextensionsv1beta1.CustomResourceDefinition, customResourceClient dynamic.DynamicResourceInterface) {
 | 
			
		||||
	By("Creating a custom resource that should be mutated by the webhook")
 | 
			
		||||
	cr := &unstructured.Unstructured{
 | 
			
		||||
		Object: map[string]interface{}{
 | 
			
		||||
 
 | 
			
		||||
@@ -51,7 +51,7 @@ var _ = SIGDescribe("CronJob", func() {
 | 
			
		||||
	successCommand := []string{"/bin/true"}
 | 
			
		||||
 | 
			
		||||
	BeforeEach(func() {
 | 
			
		||||
		framework.SkipIfMissingResource(f.ClientPool, CronJobGroupVersionResourceBeta, f.Namespace.Name)
 | 
			
		||||
		framework.SkipIfMissingResource(f.DynamicClient, CronJobGroupVersionResourceBeta, f.Namespace.Name)
 | 
			
		||||
	})
 | 
			
		||||
 | 
			
		||||
	// multiple jobs running at once
 | 
			
		||||
 
 | 
			
		||||
@@ -619,7 +619,7 @@ var _ = SIGDescribe("Advanced Audit", func() {
 | 
			
		||||
			// Create and delete custom resource definition.
 | 
			
		||||
			{
 | 
			
		||||
				func() {
 | 
			
		||||
					_, err = testserver.CreateNewCustomResourceDefinition(crd, apiExtensionClient, f.ClientPool)
 | 
			
		||||
					err = testserver.CreateNewCustomResourceDefinition(crd, apiExtensionClient, f.DynamicClient)
 | 
			
		||||
					framework.ExpectNoError(err, "failed to create custom resource definition")
 | 
			
		||||
					testserver.DeleteCustomResourceDefinition(crd, apiExtensionClient)
 | 
			
		||||
				},
 | 
			
		||||
 
 | 
			
		||||
@@ -119,7 +119,6 @@ go_library(
 | 
			
		||||
        "//vendor/k8s.io/apimachinery/pkg/api/meta:go_default_library",
 | 
			
		||||
        "//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library",
 | 
			
		||||
        "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
 | 
			
		||||
        "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured:go_default_library",
 | 
			
		||||
        "//vendor/k8s.io/apimachinery/pkg/fields:go_default_library",
 | 
			
		||||
        "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library",
 | 
			
		||||
        "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library",
 | 
			
		||||
 
 | 
			
		||||
@@ -23,6 +23,7 @@ import (
 | 
			
		||||
	crdclientset "k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset"
 | 
			
		||||
	"k8s.io/apiextensions-apiserver/test/integration/testserver"
 | 
			
		||||
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 | 
			
		||||
	"k8s.io/apimachinery/pkg/runtime/schema"
 | 
			
		||||
	"k8s.io/client-go/dynamic"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
@@ -37,7 +38,7 @@ type TestCrd struct {
 | 
			
		||||
	ApiVersion         string
 | 
			
		||||
	ApiExtensionClient *crdclientset.Clientset
 | 
			
		||||
	Crd                *apiextensionsv1beta1.CustomResourceDefinition
 | 
			
		||||
	DynamicClient      dynamic.ResourceInterface
 | 
			
		||||
	DynamicClient      dynamic.DynamicResourceInterface
 | 
			
		||||
	CleanUp            CleanCrdFn
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -66,18 +67,23 @@ func CreateTestCRD(f *Framework) (*TestCrd, error) {
 | 
			
		||||
		Failf("failed to initialize apiExtensionClient: %v", err)
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	dynamicClient, err := dynamic.NewForConfig(config)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		Failf("failed to initialize dynamic client: %v", err)
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	crd := newCRDForTest(testcrd)
 | 
			
		||||
 | 
			
		||||
	//create CRD and waits for the resource to be recognized and available.
 | 
			
		||||
	dynamicClient, err := testserver.CreateNewCustomResourceDefinitionWatchUnsafe(crd, apiExtensionClient, f.ClientPool)
 | 
			
		||||
	err = testserver.CreateNewCustomResourceDefinitionWatchUnsafe(crd, apiExtensionClient)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		Failf("failed to create CustomResourceDefinition: %v", err)
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	resourceClient := dynamicClient.Resource(&metav1.APIResource{
 | 
			
		||||
		Name:       crd.Spec.Names.Plural,
 | 
			
		||||
		Namespaced: true,
 | 
			
		||||
	}, f.Namespace.Name)
 | 
			
		||||
 | 
			
		||||
	gvr := schema.GroupVersionResource{Group: crd.Spec.Group, Version: crd.Spec.Version, Resource: crd.Spec.Names.Plural}
 | 
			
		||||
	resourceClient := dynamicClient.NamespacedResource(gvr, f.Namespace.Name)
 | 
			
		||||
 | 
			
		||||
	testcrd.ApiExtensionClient = apiExtensionClient
 | 
			
		||||
	testcrd.Crd = crd
 | 
			
		||||
 
 | 
			
		||||
@@ -70,7 +70,7 @@ type Framework struct {
 | 
			
		||||
 | 
			
		||||
	InternalClientset *internalclientset.Clientset
 | 
			
		||||
	AggregatorClient  *aggregatorclient.Clientset
 | 
			
		||||
	ClientPool        dynamic.ClientPool
 | 
			
		||||
	DynamicClient     dynamic.DynamicInterface
 | 
			
		||||
 | 
			
		||||
	ScalesGetter scaleclient.ScalesGetter
 | 
			
		||||
 | 
			
		||||
@@ -167,7 +167,8 @@ func (f *Framework) BeforeEach() {
 | 
			
		||||
		Expect(err).NotTo(HaveOccurred())
 | 
			
		||||
		f.AggregatorClient, err = aggregatorclient.NewForConfig(config)
 | 
			
		||||
		Expect(err).NotTo(HaveOccurred())
 | 
			
		||||
		f.ClientPool = dynamic.NewClientPool(config, legacyscheme.Registry.RESTMapper(), dynamic.LegacyAPIPathResolverFunc)
 | 
			
		||||
		f.DynamicClient, err = dynamic.NewForConfig(config)
 | 
			
		||||
		Expect(err).NotTo(HaveOccurred())
 | 
			
		||||
 | 
			
		||||
		// create scales getter, set GroupVersion and NegotiatedSerializer to default values
 | 
			
		||||
		// as they are required when creating a REST client.
 | 
			
		||||
@@ -288,7 +289,7 @@ func (f *Framework) AfterEach() {
 | 
			
		||||
				if f.NamespaceDeletionTimeout != 0 {
 | 
			
		||||
					timeout = f.NamespaceDeletionTimeout
 | 
			
		||||
				}
 | 
			
		||||
				if err := deleteNS(f.ClientSet, f.ClientPool, ns.Name, timeout); err != nil {
 | 
			
		||||
				if err := deleteNS(f.ClientSet, f.DynamicClient, ns.Name, timeout); err != nil {
 | 
			
		||||
					if !apierrors.IsNotFound(err) {
 | 
			
		||||
						nsDeletionErrors[ns.Name] = err
 | 
			
		||||
					} else {
 | 
			
		||||
 
 | 
			
		||||
@@ -56,7 +56,6 @@ import (
 | 
			
		||||
	extensions "k8s.io/api/extensions/v1beta1"
 | 
			
		||||
	apierrs "k8s.io/apimachinery/pkg/api/errors"
 | 
			
		||||
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 | 
			
		||||
	"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
 | 
			
		||||
	"k8s.io/apimachinery/pkg/fields"
 | 
			
		||||
	"k8s.io/apimachinery/pkg/labels"
 | 
			
		||||
	"k8s.io/apimachinery/pkg/runtime"
 | 
			
		||||
@@ -508,13 +507,9 @@ func SkipUnlessServerVersionGTE(v *utilversion.Version, c discovery.ServerVersio
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func SkipIfMissingResource(clientPool dynamic.ClientPool, gvr schema.GroupVersionResource, namespace string) {
 | 
			
		||||
	dynamicClient, err := clientPool.ClientForGroupVersionResource(gvr)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		Failf("Unexpected error getting dynamic client for %v: %v", gvr.GroupVersion(), err)
 | 
			
		||||
	}
 | 
			
		||||
	apiResource := metav1.APIResource{Name: gvr.Resource, Namespaced: true}
 | 
			
		||||
	_, err = dynamicClient.Resource(&apiResource, namespace).List(metav1.ListOptions{})
 | 
			
		||||
func SkipIfMissingResource(dynamicClient dynamic.DynamicInterface, gvr schema.GroupVersionResource, namespace string) {
 | 
			
		||||
	resourceClient := dynamicClient.NamespacedResource(gvr, namespace)
 | 
			
		||||
	_, err := resourceClient.List(metav1.ListOptions{})
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		// not all resources support list, so we ignore those
 | 
			
		||||
		if apierrs.IsMethodNotSupported(err) || apierrs.IsNotFound(err) || apierrs.IsForbidden(err) {
 | 
			
		||||
@@ -1092,7 +1087,7 @@ func CheckTestingNSDeletedExcept(c clientset.Interface, skip string) error {
 | 
			
		||||
 | 
			
		||||
// deleteNS deletes the provided namespace, waits for it to be completely deleted, and then checks
 | 
			
		||||
// whether there are any pods remaining in a non-terminating state.
 | 
			
		||||
func deleteNS(c clientset.Interface, clientPool dynamic.ClientPool, namespace string, timeout time.Duration) error {
 | 
			
		||||
func deleteNS(c clientset.Interface, dynamicClient dynamic.DynamicInterface, namespace string, timeout time.Duration) error {
 | 
			
		||||
	startTime := time.Now()
 | 
			
		||||
	if err := c.CoreV1().Namespaces().Delete(namespace, nil); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
@@ -1111,7 +1106,7 @@ func deleteNS(c clientset.Interface, clientPool dynamic.ClientPool, namespace st
 | 
			
		||||
	})
 | 
			
		||||
 | 
			
		||||
	// verify there is no more remaining content in the namespace
 | 
			
		||||
	remainingContent, cerr := hasRemainingContent(c, clientPool, namespace)
 | 
			
		||||
	remainingContent, cerr := hasRemainingContent(c, dynamicClient, namespace)
 | 
			
		||||
	if cerr != nil {
 | 
			
		||||
		return cerr
 | 
			
		||||
	}
 | 
			
		||||
@@ -1236,10 +1231,10 @@ func isDynamicDiscoveryError(err error) bool {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// hasRemainingContent checks if there is remaining content in the namespace via API discovery
 | 
			
		||||
func hasRemainingContent(c clientset.Interface, clientPool dynamic.ClientPool, namespace string) (bool, error) {
 | 
			
		||||
func hasRemainingContent(c clientset.Interface, dynamicClient dynamic.DynamicInterface, namespace string) (bool, error) {
 | 
			
		||||
	// some tests generate their own framework.Client rather than the default
 | 
			
		||||
	// TODO: ensure every test call has a configured clientPool
 | 
			
		||||
	if clientPool == nil {
 | 
			
		||||
	// TODO: ensure every test call has a configured dynamicClient
 | 
			
		||||
	if dynamicClient == nil {
 | 
			
		||||
		return false, nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
@@ -1263,7 +1258,7 @@ func hasRemainingContent(c clientset.Interface, clientPool dynamic.ClientPool, n
 | 
			
		||||
	// dump how many of resource type is on the server in a log.
 | 
			
		||||
	for gvr := range groupVersionResources {
 | 
			
		||||
		// get a client for this group version...
 | 
			
		||||
		dynamicClient, err := clientPool.ClientForGroupVersionResource(gvr)
 | 
			
		||||
		dynamicClient := dynamicClient.NamespacedResource(gvr, namespace)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			// not all resource types support list, so some errors here are normal depending on the resource type.
 | 
			
		||||
			Logf("namespace: %s, unable to get client - gvr: %v, error: %v", namespace, gvr, err)
 | 
			
		||||
@@ -1271,12 +1266,11 @@ func hasRemainingContent(c clientset.Interface, clientPool dynamic.ClientPool, n
 | 
			
		||||
		}
 | 
			
		||||
		// get the api resource
 | 
			
		||||
		apiResource := metav1.APIResource{Name: gvr.Resource, Namespaced: true}
 | 
			
		||||
		// TODO: temporary hack for https://github.com/kubernetes/kubernetes/issues/31798
 | 
			
		||||
		if ignoredResources.Has(apiResource.Name) {
 | 
			
		||||
		if ignoredResources.Has(gvr.Resource) {
 | 
			
		||||
			Logf("namespace: %s, resource: %s, ignored listing per whitelist", namespace, apiResource.Name)
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
		obj, err := dynamicClient.Resource(&apiResource, namespace).List(metav1.ListOptions{})
 | 
			
		||||
		unstructuredList, err := dynamicClient.List(metav1.ListOptions{})
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			// not all resources support list, so we ignore those
 | 
			
		||||
			if apierrs.IsMethodNotSupported(err) || apierrs.IsNotFound(err) || apierrs.IsForbidden(err) {
 | 
			
		||||
@@ -1288,10 +1282,6 @@ func hasRemainingContent(c clientset.Interface, clientPool dynamic.ClientPool, n
 | 
			
		||||
			}
 | 
			
		||||
			return false, err
 | 
			
		||||
		}
 | 
			
		||||
		unstructuredList, ok := obj.(*unstructured.UnstructuredList)
 | 
			
		||||
		if !ok {
 | 
			
		||||
			return false, fmt.Errorf("namespace: %s, resource: %s, expected *unstructured.UnstructuredList, got %#v", namespace, apiResource.Name, obj)
 | 
			
		||||
		}
 | 
			
		||||
		if len(unstructuredList.Items) > 0 {
 | 
			
		||||
			Logf("namespace: %s, resource: %s, items remaining: %v", namespace, apiResource.Name, len(unstructuredList.Items))
 | 
			
		||||
			contentRemaining = true
 | 
			
		||||
 
 | 
			
		||||
@@ -199,7 +199,7 @@ var _ = SIGDescribe("Kubectl alpha client", func() {
 | 
			
		||||
		})
 | 
			
		||||
 | 
			
		||||
		It("should create a CronJob", func() {
 | 
			
		||||
			framework.SkipIfMissingResource(f.ClientPool, CronJobGroupVersionResourceAlpha, f.Namespace.Name)
 | 
			
		||||
			framework.SkipIfMissingResource(f.DynamicClient, CronJobGroupVersionResourceAlpha, f.Namespace.Name)
 | 
			
		||||
 | 
			
		||||
			schedule := "*/5 * * * ?"
 | 
			
		||||
			framework.RunKubectlOrDie("run", cjName, "--restart=OnFailure", "--generator=cronjob/v2alpha1",
 | 
			
		||||
@@ -1414,7 +1414,7 @@ metadata:
 | 
			
		||||
		})
 | 
			
		||||
 | 
			
		||||
		It("should create a CronJob", func() {
 | 
			
		||||
			framework.SkipIfMissingResource(f.ClientPool, CronJobGroupVersionResourceBeta, f.Namespace.Name)
 | 
			
		||||
			framework.SkipIfMissingResource(f.DynamicClient, CronJobGroupVersionResourceBeta, f.Namespace.Name)
 | 
			
		||||
 | 
			
		||||
			schedule := "*/5 * * * ?"
 | 
			
		||||
			framework.RunKubectlOrDie("run", cjName, "--restart=OnFailure", "--generator=cronjob/v1beta1",
 | 
			
		||||
 
 | 
			
		||||
@@ -23,6 +23,7 @@ go_test(
 | 
			
		||||
        "//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library",
 | 
			
		||||
        "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
 | 
			
		||||
        "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured:go_default_library",
 | 
			
		||||
        "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library",
 | 
			
		||||
        "//vendor/k8s.io/apimachinery/pkg/types:go_default_library",
 | 
			
		||||
        "//vendor/k8s.io/apimachinery/pkg/util/wait:go_default_library",
 | 
			
		||||
        "//vendor/k8s.io/apiserver/pkg/storage/names:go_default_library",
 | 
			
		||||
 
 | 
			
		||||
@@ -32,6 +32,7 @@ import (
 | 
			
		||||
	"k8s.io/apimachinery/pkg/api/meta"
 | 
			
		||||
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 | 
			
		||||
	"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
 | 
			
		||||
	"k8s.io/apimachinery/pkg/runtime/schema"
 | 
			
		||||
	"k8s.io/apimachinery/pkg/types"
 | 
			
		||||
	"k8s.io/apimachinery/pkg/util/wait"
 | 
			
		||||
	"k8s.io/apiserver/pkg/storage/names"
 | 
			
		||||
@@ -167,23 +168,23 @@ func link(t *testing.T, owner, dependent metav1.Object) {
 | 
			
		||||
 | 
			
		||||
func createRandomCustomResourceDefinition(
 | 
			
		||||
	t *testing.T, apiExtensionClient apiextensionsclientset.Interface,
 | 
			
		||||
	clientPool dynamic.ClientPool,
 | 
			
		||||
	dynamicClient dynamic.DynamicInterface,
 | 
			
		||||
	namespace string,
 | 
			
		||||
) (*apiextensionsv1beta1.CustomResourceDefinition, dynamic.ResourceInterface) {
 | 
			
		||||
) (*apiextensionsv1beta1.CustomResourceDefinition, dynamic.DynamicResourceInterface) {
 | 
			
		||||
	// Create a random custom resource definition and ensure it's available for
 | 
			
		||||
	// use.
 | 
			
		||||
	definition := apiextensionstestserver.NewRandomNameCustomResourceDefinition(apiextensionsv1beta1.NamespaceScoped)
 | 
			
		||||
 | 
			
		||||
	client, err := apiextensionstestserver.CreateNewCustomResourceDefinition(definition, apiExtensionClient, clientPool)
 | 
			
		||||
	err := apiextensionstestserver.CreateNewCustomResourceDefinition(definition, apiExtensionClient, dynamicClient)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Fatalf("failed to create CustomResourceDefinition: %v", err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Get a client for the custom resource.
 | 
			
		||||
	resourceClient := client.Resource(&metav1.APIResource{
 | 
			
		||||
		Name:       definition.Spec.Names.Plural,
 | 
			
		||||
		Namespaced: true,
 | 
			
		||||
	}, namespace)
 | 
			
		||||
	gvr := schema.GroupVersionResource{Group: definition.Spec.Group, Version: definition.Spec.Version, Resource: definition.Spec.Names.Plural}
 | 
			
		||||
 | 
			
		||||
	resourceClient := dynamicClient.NamespacedResource(gvr, namespace)
 | 
			
		||||
 | 
			
		||||
	return definition, resourceClient
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -192,7 +193,7 @@ type testContext struct {
 | 
			
		||||
	gc                 *garbagecollector.GarbageCollector
 | 
			
		||||
	clientSet          clientset.Interface
 | 
			
		||||
	apiExtensionClient apiextensionsclientset.Interface
 | 
			
		||||
	clientPool         dynamic.ClientPool
 | 
			
		||||
	dynamicClient      dynamic.DynamicInterface
 | 
			
		||||
	startGC            func(workers int)
 | 
			
		||||
	// syncPeriod is how often the GC started with startGC will be resynced.
 | 
			
		||||
	syncPeriod time.Duration
 | 
			
		||||
@@ -226,6 +227,10 @@ func setupWithServer(t *testing.T, result *kubeapiservertesting.TestServer, work
 | 
			
		||||
	config.ContentConfig = dynamic.ContentConfig()
 | 
			
		||||
	metaOnlyClientPool := dynamic.NewClientPool(&config, restMapper, dynamic.LegacyAPIPathResolverFunc)
 | 
			
		||||
	clientPool := dynamic.NewClientPool(&config, restMapper, dynamic.LegacyAPIPathResolverFunc)
 | 
			
		||||
	dynamicClient, err := dynamic.NewForConfig(&config)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Fatalf("failed to create dynamicClient: %v", err)
 | 
			
		||||
	}
 | 
			
		||||
	sharedInformers := informers.NewSharedInformerFactory(clientSet, 0)
 | 
			
		||||
	alwaysStarted := make(chan struct{})
 | 
			
		||||
	close(alwaysStarted)
 | 
			
		||||
@@ -262,7 +267,7 @@ func setupWithServer(t *testing.T, result *kubeapiservertesting.TestServer, work
 | 
			
		||||
		gc:                 gc,
 | 
			
		||||
		clientSet:          clientSet,
 | 
			
		||||
		apiExtensionClient: apiExtensionClient,
 | 
			
		||||
		clientPool:         clientPool,
 | 
			
		||||
		dynamicClient:      dynamicClient,
 | 
			
		||||
		startGC:            startGC,
 | 
			
		||||
		syncPeriod:         syncPeriod,
 | 
			
		||||
	}
 | 
			
		||||
@@ -797,11 +802,11 @@ func TestCustomResourceCascadingDeletion(t *testing.T) {
 | 
			
		||||
	ctx := setup(t, 5)
 | 
			
		||||
	defer ctx.tearDown()
 | 
			
		||||
 | 
			
		||||
	clientSet, apiExtensionClient, clientPool := ctx.clientSet, ctx.apiExtensionClient, ctx.clientPool
 | 
			
		||||
	clientSet, apiExtensionClient, dynamicClient := ctx.clientSet, ctx.apiExtensionClient, ctx.dynamicClient
 | 
			
		||||
 | 
			
		||||
	ns := createNamespaceOrDie("crd-cascading", clientSet, t)
 | 
			
		||||
 | 
			
		||||
	definition, resourceClient := createRandomCustomResourceDefinition(t, apiExtensionClient, clientPool, ns.Name)
 | 
			
		||||
	definition, resourceClient := createRandomCustomResourceDefinition(t, apiExtensionClient, dynamicClient, ns.Name)
 | 
			
		||||
 | 
			
		||||
	// Create a custom owner resource.
 | 
			
		||||
	owner := newCRDInstance(definition, ns.Name, names.SimpleNameGenerator.GenerateName("owner"))
 | 
			
		||||
@@ -857,13 +862,13 @@ func TestMixedRelationships(t *testing.T) {
 | 
			
		||||
	ctx := setup(t, 5)
 | 
			
		||||
	defer ctx.tearDown()
 | 
			
		||||
 | 
			
		||||
	clientSet, apiExtensionClient, clientPool := ctx.clientSet, ctx.apiExtensionClient, ctx.clientPool
 | 
			
		||||
	clientSet, apiExtensionClient, dynamicClient := ctx.clientSet, ctx.apiExtensionClient, ctx.dynamicClient
 | 
			
		||||
 | 
			
		||||
	ns := createNamespaceOrDie("crd-mixed", clientSet, t)
 | 
			
		||||
 | 
			
		||||
	configMapClient := clientSet.CoreV1().ConfigMaps(ns.Name)
 | 
			
		||||
 | 
			
		||||
	definition, resourceClient := createRandomCustomResourceDefinition(t, apiExtensionClient, clientPool, ns.Name)
 | 
			
		||||
	definition, resourceClient := createRandomCustomResourceDefinition(t, apiExtensionClient, dynamicClient, ns.Name)
 | 
			
		||||
 | 
			
		||||
	// Create a custom owner resource.
 | 
			
		||||
	customOwner, err := resourceClient.Create(newCRDInstance(definition, ns.Name, names.SimpleNameGenerator.GenerateName("owner")))
 | 
			
		||||
@@ -955,13 +960,13 @@ func TestCRDDeletionCascading(t *testing.T) {
 | 
			
		||||
	ctx := setup(t, 5)
 | 
			
		||||
	defer ctx.tearDown()
 | 
			
		||||
 | 
			
		||||
	clientSet, apiExtensionClient, clientPool := ctx.clientSet, ctx.apiExtensionClient, ctx.clientPool
 | 
			
		||||
	clientSet, apiExtensionClient, dynamicClient := ctx.clientSet, ctx.apiExtensionClient, ctx.dynamicClient
 | 
			
		||||
 | 
			
		||||
	ns := createNamespaceOrDie("crd-mixed", clientSet, t)
 | 
			
		||||
 | 
			
		||||
	configMapClient := clientSet.CoreV1().ConfigMaps(ns.Name)
 | 
			
		||||
 | 
			
		||||
	definition, resourceClient := createRandomCustomResourceDefinition(t, apiExtensionClient, clientPool, ns.Name)
 | 
			
		||||
	definition, resourceClient := createRandomCustomResourceDefinition(t, apiExtensionClient, dynamicClient, ns.Name)
 | 
			
		||||
 | 
			
		||||
	// Create a custom owner resource.
 | 
			
		||||
	owner, err := resourceClient.Create(newCRDInstance(definition, ns.Name, names.SimpleNameGenerator.GenerateName("owner")))
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user