diff --git a/staging/src/k8s.io/kube-apiextensions-server/test/integration/basic_test.go b/staging/src/k8s.io/kube-apiextensions-server/test/integration/basic_test.go index 9e14fca18d9..659bd4ee717 100644 --- a/staging/src/k8s.io/kube-apiextensions-server/test/integration/basic_test.go +++ b/staging/src/k8s.io/kube-apiextensions-server/test/integration/basic_test.go @@ -18,6 +18,7 @@ package integration import ( "reflect" + "sort" "testing" "time" @@ -25,6 +26,8 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "k8s.io/apimachinery/pkg/watch" + "k8s.io/client-go/dynamic" + apiextensionsv1alpha1 "k8s.io/kube-apiextensions-server/pkg/apis/apiextensions/v1alpha1" "k8s.io/kube-apiextensions-server/test/integration/testserver" ) @@ -36,22 +39,43 @@ func TestServerUp(t *testing.T) { defer close(stopCh) } -func TestSimpleCRUD(t *testing.T) { +func TestNamespaceScopedCRUD(t *testing.T) { stopCh, apiExtensionClient, clientPool, err := testserver.StartDefaultServer() if err != nil { t.Fatal(err) } defer close(stopCh) - noxuDefinition := testserver.NewNoxuCustomResourceDefinition() + noxuDefinition := testserver.NewNoxuCustomResourceDefinition(apiextensionsv1alpha1.NamespaceScoped) noxuVersionClient, err := testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, clientPool) if err != nil { t.Fatal(err) } ns := "not-the-default" - noxuNamespacedResourceClient := NewNamespacedCustomResourceClient(ns, noxuVersionClient, noxuDefinition) - initialList, err := noxuNamespacedResourceClient.List(metav1.ListOptions{}) + testSimpleCRUD(t, ns, noxuDefinition, noxuVersionClient) +} + +func TestClusterScopedCRUD(t *testing.T) { + stopCh, apiExtensionClient, clientPool, err := testserver.StartDefaultServer() + if err != nil { + t.Fatal(err) + } + defer close(stopCh) + + noxuDefinition := testserver.NewNoxuCustomResourceDefinition(apiextensionsv1alpha1.ClusterScoped) + noxuVersionClient, err := testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, clientPool) + if err != nil { + t.Fatal(err) + } + + ns := "" + testSimpleCRUD(t, ns, noxuDefinition, noxuVersionClient) +} + +func testSimpleCRUD(t *testing.T, ns string, noxuDefinition *apiextensionsv1alpha1.CustomResourceDefinition, noxuVersionClient *dynamic.Client) { + noxuResourceClient := NewNamespacedCustomResourceClient(ns, noxuVersionClient, noxuDefinition) + initialList, err := noxuResourceClient.List(metav1.ListOptions{}) if err != nil { t.Fatal(err) } @@ -73,19 +97,19 @@ func TestSimpleCRUD(t *testing.T) { if err != nil { t.Fatal(err) } - noxuNamespacedWatch, err := noxuNamespacedResourceClient.Watch(metav1.ListOptions{ResourceVersion: initialListListMeta.GetResourceVersion()}) + noxuWatch, err := noxuResourceClient.Watch(metav1.ListOptions{ResourceVersion: initialListListMeta.GetResourceVersion()}) if err != nil { t.Fatal(err) } - defer noxuNamespacedWatch.Stop() + defer noxuWatch.Stop() - createdNoxuInstance, err := instantiateCustomResource(t, testserver.NewNoxuInstance(ns, "foo"), noxuNamespacedResourceClient, noxuDefinition) + createdNoxuInstance, err := instantiateCustomResource(t, testserver.NewNoxuInstance(ns, "foo"), noxuResourceClient, noxuDefinition) if err != nil { t.Fatalf("unable to create noxu Instance:%v", err) } select { - case watchEvent := <-noxuNamespacedWatch.ResultChan(): + case watchEvent := <-noxuWatch.ResultChan(): if e, a := watch.Added, watchEvent.Type; e != a { t.Errorf("expected %v, got %v", e, a) break @@ -98,6 +122,9 @@ func TestSimpleCRUD(t *testing.T) { if len(createdObjectMeta.GetUID()) == 0 { t.Errorf("missing uuid: %#v", watchEvent.Object) } + if e, a := ns, createdObjectMeta.GetNamespace(); e != a { + t.Errorf("expected %v, got %v", e, a) + } createdTypeMeta, err := meta.TypeAccessor(watchEvent.Object) if err != nil { t.Fatal(err) @@ -113,7 +140,7 @@ func TestSimpleCRUD(t *testing.T) { t.Errorf("missing watch event") } - gottenNoxuInstance, err := noxuNamespacedResourceClient.Get("foo") + gottenNoxuInstance, err := noxuResourceClient.Get("foo") if err != nil { t.Fatal(err) } @@ -121,7 +148,7 @@ func TestSimpleCRUD(t *testing.T) { t.Errorf("expected %v, got %v", e, a) } - listWithItem, err := noxuNamespacedResourceClient.List(metav1.ListOptions{}) + listWithItem, err := noxuResourceClient.List(metav1.ListOptions{}) if err != nil { t.Fatal(err) } @@ -132,11 +159,11 @@ func TestSimpleCRUD(t *testing.T) { t.Errorf("expected %v, got %v", e, a) } - if err := noxuNamespacedResourceClient.Delete("foo", nil); err != nil { + if err := noxuResourceClient.Delete("foo", nil); err != nil { t.Fatal(err) } - listWithoutItem, err := noxuNamespacedResourceClient.List(metav1.ListOptions{}) + listWithoutItem, err := noxuResourceClient.List(metav1.ListOptions{}) if err != nil { t.Fatal(err) } @@ -145,7 +172,7 @@ func TestSimpleCRUD(t *testing.T) { } select { - case watchEvent := <-noxuNamespacedWatch.ResultChan(): + case watchEvent := <-noxuWatch.ResultChan(): if e, a := watch.Deleted, watchEvent.Type; e != a { t.Errorf("expected %v, got %v", e, a) break @@ -168,6 +195,112 @@ func TestSimpleCRUD(t *testing.T) { } } +func TestDiscovery(t *testing.T) { + group := "mygroup.example.com" + version := "v1alpha1" + + stopCh, apiExtensionClient, clientPool, err := testserver.StartDefaultServer() + if err != nil { + t.Fatal(err) + } + defer close(stopCh) + + scope := apiextensionsv1alpha1.NamespaceScoped + noxuDefinition := testserver.NewNoxuCustomResourceDefinition(scope) + _, err = testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, clientPool) + if err != nil { + t.Fatal(err) + } + + // check whether it shows up in discovery properly + resources, err := apiExtensionClient.Discovery().ServerResourcesForGroupVersion(group + "/" + version) + if err != nil { + t.Fatal(err) + } + + if len(resources.APIResources) != 1 { + t.Fatalf("Expected exactly the resource \"noxus\" in group version %v/%v via discovery, got: %v", group, version, resources.APIResources) + } + + r := resources.APIResources[0] + if r.Name != "noxus" { + t.Fatalf("Expected exactly the resource \"noxus\" in group version %v/%v via discovery, got: %v", group, version, r.Name) + } + if r.Kind != "WishIHadChosenNoxu" { + t.Fatalf("Expected exactly the kind \"WishIHadChosenNoxu\" in group version %v/%v via discovery, got: %v", group, version, r.Kind) + } + + s := []string{"foo", "bar", "abc", "def"} + if !reflect.DeepEqual(r.ShortNames, s) { + t.Fatalf("Expected exactly the shortnames `foo, bar, abc, def` in group version %v/%v via discovery, got: %v", group, version, r.ShortNames) + } + + sort.Strings(r.Verbs) + expectedVerbs := []string{"create", "delete", "deletecollection", "get", "list", "patch", "update", "watch"} + if !reflect.DeepEqual([]string(r.Verbs), expectedVerbs) { + t.Fatalf("Unexpected verbs for resource \"noxus\" in group version %v/%v via discovery: expected=%v got=%v", group, version, expectedVerbs, r.Verbs) + } +} + +func TestNoNamespaceReject(t *testing.T) { + stopCh, apiExtensionClient, clientPool, err := testserver.StartDefaultServer() + if err != nil { + t.Fatal(err) + } + defer close(stopCh) + + noxuDefinition := testserver.NewNoxuCustomResourceDefinition(apiextensionsv1alpha1.NamespaceScoped) + noxuVersionClient, err := testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, clientPool) + if err != nil { + t.Fatal(err) + } + + ns := "" + noxuResourceClient := NewNamespacedCustomResourceClient(ns, noxuVersionClient, noxuDefinition) + initialList, err := noxuResourceClient.List(metav1.ListOptions{}) + if err != nil { + t.Fatal(err) + } + if e, a := 0, len(initialList.(*unstructured.UnstructuredList).Items); e != a { + t.Errorf("expected %v, got %v", e, a) + } + initialListTypeMeta, err := meta.TypeAccessor(initialList) + if err != nil { + t.Fatal(err) + } + if e, a := noxuDefinition.Spec.Group+"/"+noxuDefinition.Spec.Version, initialListTypeMeta.GetAPIVersion(); e != a { + t.Errorf("expected %v, got %v", e, a) + } + if e, a := noxuDefinition.Spec.Names.ListKind, initialListTypeMeta.GetKind(); e != a { + t.Errorf("expected %v, got %v", e, a) + } + + createdNoxuInstance, err := instantiateCustomResource(t, testserver.NewNoxuInstance(ns, "foo"), noxuResourceClient, noxuDefinition) + if err == nil { + t.Fatalf("unexpected non-error: an empty namespace may not be set during creation while creating noxu instance: %v ", createdNoxuInstance) + } +} + +func TestSameNameDiffNamespace(t *testing.T) { + stopCh, apiExtensionClient, clientPool, err := testserver.StartDefaultServer() + if err != nil { + t.Fatal(err) + } + defer close(stopCh) + + noxuDefinition := testserver.NewNoxuCustomResourceDefinition(apiextensionsv1alpha1.NamespaceScoped) + noxuVersionClient, err := testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, clientPool) + if err != nil { + t.Fatal(err) + } + + ns1 := "namespace-1" + testSimpleCRUD(t, ns1, noxuDefinition, noxuVersionClient) + ns2 := "namespace-2" + testSimpleCRUD(t, ns2, noxuDefinition, noxuVersionClient) + +} + func TestSelfLink(t *testing.T) { stopCh, apiExtensionClient, clientPool, err := testserver.StartDefaultServer() if err != nil { @@ -175,7 +308,7 @@ func TestSelfLink(t *testing.T) { } defer close(stopCh) - noxuDefinition := testserver.NewNoxuCustomResourceDefinition() + noxuDefinition := testserver.NewNoxuCustomResourceDefinition(apiextensionsv1alpha1.NamespaceScoped) noxuVersionClient, err := testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, clientPool) if err != nil { t.Fatal(err) diff --git a/staging/src/k8s.io/kube-apiextensions-server/test/integration/registration_test.go b/staging/src/k8s.io/kube-apiextensions-server/test/integration/registration_test.go index 81ee179b578..36f22f2d359 100644 --- a/staging/src/k8s.io/kube-apiextensions-server/test/integration/registration_test.go +++ b/staging/src/k8s.io/kube-apiextensions-server/test/integration/registration_test.go @@ -73,7 +73,7 @@ func TestMultipleResourceInstances(t *testing.T) { defer close(stopCh) ns := "not-the-default" - noxuDefinition := testserver.NewNoxuCustomResourceDefinition() + noxuDefinition := testserver.NewNoxuCustomResourceDefinition(apiextensionsv1alpha1.NamespaceScoped) noxuVersionClient, err := testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, clientPool) if err != nil { t.Fatal(err) @@ -198,7 +198,7 @@ func TestMultipleRegistration(t *testing.T) { ns := "not-the-default" sameInstanceName := "foo" - noxuDefinition := testserver.NewNoxuCustomResourceDefinition() + noxuDefinition := testserver.NewNoxuCustomResourceDefinition(apiextensionsv1alpha1.NamespaceScoped) noxuVersionClient, err := testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, clientPool) if err != nil { t.Fatal(err) @@ -251,7 +251,7 @@ func TestDeRegistrationAndReRegistration(t *testing.T) { t.Fatal(err) } defer close(stopCh) - noxuDefinition := testserver.NewNoxuCustomResourceDefinition() + noxuDefinition := testserver.NewNoxuCustomResourceDefinition(apiextensionsv1alpha1.NamespaceScoped) ns := "not-the-default" sameInstanceName := "foo" func() { diff --git a/staging/src/k8s.io/kube-apiextensions-server/test/integration/testserver/resources.go b/staging/src/k8s.io/kube-apiextensions-server/test/integration/testserver/resources.go index 84b3bb7f679..aa003915266 100644 --- a/staging/src/k8s.io/kube-apiextensions-server/test/integration/testserver/resources.go +++ b/staging/src/k8s.io/kube-apiextensions-server/test/integration/testserver/resources.go @@ -29,19 +29,20 @@ import ( "k8s.io/kube-apiextensions-server/pkg/client/clientset/clientset" ) -func NewNoxuCustomResourceDefinition() *apiextensionsv1alpha1.CustomResourceDefinition { +func NewNoxuCustomResourceDefinition(scope apiextensionsv1alpha1.ResourceScope) *apiextensionsv1alpha1.CustomResourceDefinition { return &apiextensionsv1alpha1.CustomResourceDefinition{ ObjectMeta: metav1.ObjectMeta{Name: "noxus.mygroup.example.com"}, Spec: apiextensionsv1alpha1.CustomResourceDefinitionSpec{ Group: "mygroup.example.com", Version: "v1alpha1", Names: apiextensionsv1alpha1.CustomResourceDefinitionNames{ - Plural: "noxus", - Singular: "nonenglishnoxu", - Kind: "WishIHadChosenNoxu", - ListKind: "NoxuItemList", + Plural: "noxus", + Singular: "nonenglishnoxu", + Kind: "WishIHadChosenNoxu", + ShortNames: []string{"foo", "bar", "abc", "def"}, + ListKind: "NoxuItemList", }, - Scope: apiextensionsv1alpha1.NamespaceScoped, + Scope: scope, }, } }