mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-08-02 16:29:21 +00:00
Merge pull request #45721 from nikhita/kubeapiserver-int-test
Automatic merge from submit-queue (batch tested with PRs 45771, 45721) Add integration tests for kube-apiextensions-server **What this PR does / why we need it**: Add the following integration tests for `kube-apiextensions-server`: - [x] test namespace scoped resources - [x] test cluster scoped resources - [x] test discovery - [x] test no namespace rejects - [x] test same name, different namespace **Which issue this PR fixes** *(optional, in `fixes #<issue number>(, fixes #<issue_number>, ...)` format, will close that issue when PR gets merged)*: for #45511 **Special notes for your reviewer**: **Release note**: ``` NONE ``` @sttts @deads2k
This commit is contained in:
commit
63ec1b29ae
@ -18,6 +18,7 @@ package integration
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"reflect"
|
"reflect"
|
||||||
|
"sort"
|
||||||
"testing"
|
"testing"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
@ -25,6 +26,8 @@ import (
|
|||||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
|
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
|
||||||
"k8s.io/apimachinery/pkg/watch"
|
"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"
|
"k8s.io/kube-apiextensions-server/test/integration/testserver"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -36,22 +39,43 @@ func TestServerUp(t *testing.T) {
|
|||||||
defer close(stopCh)
|
defer close(stopCh)
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestSimpleCRUD(t *testing.T) {
|
func TestNamespaceScopedCRUD(t *testing.T) {
|
||||||
stopCh, apiExtensionClient, clientPool, err := testserver.StartDefaultServer()
|
stopCh, apiExtensionClient, clientPool, err := testserver.StartDefaultServer()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
defer close(stopCh)
|
defer close(stopCh)
|
||||||
|
|
||||||
noxuDefinition := testserver.NewNoxuCustomResourceDefinition()
|
noxuDefinition := testserver.NewNoxuCustomResourceDefinition(apiextensionsv1alpha1.NamespaceScoped)
|
||||||
noxuVersionClient, err := testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, clientPool)
|
noxuVersionClient, err := testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, clientPool)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
ns := "not-the-default"
|
ns := "not-the-default"
|
||||||
noxuNamespacedResourceClient := NewNamespacedCustomResourceClient(ns, noxuVersionClient, noxuDefinition)
|
testSimpleCRUD(t, ns, noxuDefinition, noxuVersionClient)
|
||||||
initialList, err := noxuNamespacedResourceClient.List(metav1.ListOptions{})
|
}
|
||||||
|
|
||||||
|
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 {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
@ -73,19 +97,19 @@ func TestSimpleCRUD(t *testing.T) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
noxuNamespacedWatch, err := noxuNamespacedResourceClient.Watch(metav1.ListOptions{ResourceVersion: initialListListMeta.GetResourceVersion()})
|
noxuWatch, err := noxuResourceClient.Watch(metav1.ListOptions{ResourceVersion: initialListListMeta.GetResourceVersion()})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
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 {
|
if err != nil {
|
||||||
t.Fatalf("unable to create noxu Instance:%v", err)
|
t.Fatalf("unable to create noxu Instance:%v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
select {
|
select {
|
||||||
case watchEvent := <-noxuNamespacedWatch.ResultChan():
|
case watchEvent := <-noxuWatch.ResultChan():
|
||||||
if e, a := watch.Added, watchEvent.Type; e != a {
|
if e, a := watch.Added, watchEvent.Type; e != a {
|
||||||
t.Errorf("expected %v, got %v", e, a)
|
t.Errorf("expected %v, got %v", e, a)
|
||||||
break
|
break
|
||||||
@ -98,6 +122,9 @@ func TestSimpleCRUD(t *testing.T) {
|
|||||||
if len(createdObjectMeta.GetUID()) == 0 {
|
if len(createdObjectMeta.GetUID()) == 0 {
|
||||||
t.Errorf("missing uuid: %#v", watchEvent.Object)
|
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)
|
createdTypeMeta, err := meta.TypeAccessor(watchEvent.Object)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
@ -113,7 +140,7 @@ func TestSimpleCRUD(t *testing.T) {
|
|||||||
t.Errorf("missing watch event")
|
t.Errorf("missing watch event")
|
||||||
}
|
}
|
||||||
|
|
||||||
gottenNoxuInstance, err := noxuNamespacedResourceClient.Get("foo")
|
gottenNoxuInstance, err := noxuResourceClient.Get("foo")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
@ -121,7 +148,7 @@ func TestSimpleCRUD(t *testing.T) {
|
|||||||
t.Errorf("expected %v, got %v", e, a)
|
t.Errorf("expected %v, got %v", e, a)
|
||||||
}
|
}
|
||||||
|
|
||||||
listWithItem, err := noxuNamespacedResourceClient.List(metav1.ListOptions{})
|
listWithItem, err := noxuResourceClient.List(metav1.ListOptions{})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
@ -132,11 +159,11 @@ func TestSimpleCRUD(t *testing.T) {
|
|||||||
t.Errorf("expected %v, got %v", e, a)
|
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)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
listWithoutItem, err := noxuNamespacedResourceClient.List(metav1.ListOptions{})
|
listWithoutItem, err := noxuResourceClient.List(metav1.ListOptions{})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
@ -145,7 +172,7 @@ func TestSimpleCRUD(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
select {
|
select {
|
||||||
case watchEvent := <-noxuNamespacedWatch.ResultChan():
|
case watchEvent := <-noxuWatch.ResultChan():
|
||||||
if e, a := watch.Deleted, watchEvent.Type; e != a {
|
if e, a := watch.Deleted, watchEvent.Type; e != a {
|
||||||
t.Errorf("expected %v, got %v", e, a)
|
t.Errorf("expected %v, got %v", e, a)
|
||||||
break
|
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) {
|
func TestSelfLink(t *testing.T) {
|
||||||
stopCh, apiExtensionClient, clientPool, err := testserver.StartDefaultServer()
|
stopCh, apiExtensionClient, clientPool, err := testserver.StartDefaultServer()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -175,7 +308,7 @@ func TestSelfLink(t *testing.T) {
|
|||||||
}
|
}
|
||||||
defer close(stopCh)
|
defer close(stopCh)
|
||||||
|
|
||||||
noxuDefinition := testserver.NewNoxuCustomResourceDefinition()
|
noxuDefinition := testserver.NewNoxuCustomResourceDefinition(apiextensionsv1alpha1.NamespaceScoped)
|
||||||
noxuVersionClient, err := testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, clientPool)
|
noxuVersionClient, err := testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, clientPool)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
|
@ -73,7 +73,7 @@ func TestMultipleResourceInstances(t *testing.T) {
|
|||||||
defer close(stopCh)
|
defer close(stopCh)
|
||||||
|
|
||||||
ns := "not-the-default"
|
ns := "not-the-default"
|
||||||
noxuDefinition := testserver.NewNoxuCustomResourceDefinition()
|
noxuDefinition := testserver.NewNoxuCustomResourceDefinition(apiextensionsv1alpha1.NamespaceScoped)
|
||||||
noxuVersionClient, err := testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, clientPool)
|
noxuVersionClient, err := testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, clientPool)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
@ -198,7 +198,7 @@ func TestMultipleRegistration(t *testing.T) {
|
|||||||
|
|
||||||
ns := "not-the-default"
|
ns := "not-the-default"
|
||||||
sameInstanceName := "foo"
|
sameInstanceName := "foo"
|
||||||
noxuDefinition := testserver.NewNoxuCustomResourceDefinition()
|
noxuDefinition := testserver.NewNoxuCustomResourceDefinition(apiextensionsv1alpha1.NamespaceScoped)
|
||||||
noxuVersionClient, err := testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, clientPool)
|
noxuVersionClient, err := testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, clientPool)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
@ -251,7 +251,7 @@ func TestDeRegistrationAndReRegistration(t *testing.T) {
|
|||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
defer close(stopCh)
|
defer close(stopCh)
|
||||||
noxuDefinition := testserver.NewNoxuCustomResourceDefinition()
|
noxuDefinition := testserver.NewNoxuCustomResourceDefinition(apiextensionsv1alpha1.NamespaceScoped)
|
||||||
ns := "not-the-default"
|
ns := "not-the-default"
|
||||||
sameInstanceName := "foo"
|
sameInstanceName := "foo"
|
||||||
func() {
|
func() {
|
||||||
|
@ -29,7 +29,7 @@ import (
|
|||||||
"k8s.io/kube-apiextensions-server/pkg/client/clientset/clientset"
|
"k8s.io/kube-apiextensions-server/pkg/client/clientset/clientset"
|
||||||
)
|
)
|
||||||
|
|
||||||
func NewNoxuCustomResourceDefinition() *apiextensionsv1alpha1.CustomResourceDefinition {
|
func NewNoxuCustomResourceDefinition(scope apiextensionsv1alpha1.ResourceScope) *apiextensionsv1alpha1.CustomResourceDefinition {
|
||||||
return &apiextensionsv1alpha1.CustomResourceDefinition{
|
return &apiextensionsv1alpha1.CustomResourceDefinition{
|
||||||
ObjectMeta: metav1.ObjectMeta{Name: "noxus.mygroup.example.com"},
|
ObjectMeta: metav1.ObjectMeta{Name: "noxus.mygroup.example.com"},
|
||||||
Spec: apiextensionsv1alpha1.CustomResourceDefinitionSpec{
|
Spec: apiextensionsv1alpha1.CustomResourceDefinitionSpec{
|
||||||
@ -39,9 +39,10 @@ func NewNoxuCustomResourceDefinition() *apiextensionsv1alpha1.CustomResourceDefi
|
|||||||
Plural: "noxus",
|
Plural: "noxus",
|
||||||
Singular: "nonenglishnoxu",
|
Singular: "nonenglishnoxu",
|
||||||
Kind: "WishIHadChosenNoxu",
|
Kind: "WishIHadChosenNoxu",
|
||||||
|
ShortNames: []string{"foo", "bar", "abc", "def"},
|
||||||
ListKind: "NoxuItemList",
|
ListKind: "NoxuItemList",
|
||||||
},
|
},
|
||||||
Scope: apiextensionsv1alpha1.NamespaceScoped,
|
Scope: scope,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user