From 8ab8d05cc40c391f8ac650f50f23500666bfc943 Mon Sep 17 00:00:00 2001 From: David Eads Date: Tue, 1 Mar 2022 11:51:16 -0500 Subject: [PATCH] add resource enablement check for e2e tests of beta APIs --- .../src/k8s.io/client-go/discovery/helper.go | 21 ++++++++++++++ test/e2e/apimachinery/discovery.go | 29 +++++++++++++++++++ 2 files changed, 50 insertions(+) diff --git a/staging/src/k8s.io/client-go/discovery/helper.go b/staging/src/k8s.io/client-go/discovery/helper.go index 3bfe514e823..e79f073b03a 100644 --- a/staging/src/k8s.io/client-go/discovery/helper.go +++ b/staging/src/k8s.io/client-go/discovery/helper.go @@ -19,12 +19,33 @@ package discovery import ( "fmt" + apierrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apimachinery/pkg/util/sets" apimachineryversion "k8s.io/apimachinery/pkg/version" ) +// IsResourceEnabled queries the server to determine if the resource specified is present on the server. +// This is particularly helpful when writing a controller or an e2e test that requires a particular resource to function. +func IsResourceEnabled(client DiscoveryInterface, resourceToCheck schema.GroupVersionResource) (bool, error) { + // this is a single request. The ServerResourcesForGroupVersion handles the core v1 group as legacy. + resourceList, err := client.ServerResourcesForGroupVersion(resourceToCheck.GroupVersion().String()) + if apierrors.IsNotFound(err) { // if the discovery endpoint isn't present, then the resource isn't present. + return false, nil + } + if err != nil { + return false, err + } + for _, actualResource := range resourceList.APIResources { + if actualResource.Name == resourceToCheck.Resource { + return true, nil + } + } + + return false, nil +} + // MatchesServerVersion queries the server to compares the build version // (git hash) of the client with the server's build version. It returns an error // if it failed to contact the server or if the versions are not an exact match. diff --git a/test/e2e/apimachinery/discovery.go b/test/e2e/apimachinery/discovery.go index 0fd96491571..04103aeeb5f 100644 --- a/test/e2e/apimachinery/discovery.go +++ b/test/e2e/apimachinery/discovery.go @@ -21,8 +21,10 @@ import ( "strings" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime/schema" utilversion "k8s.io/apimachinery/pkg/util/version" "k8s.io/apiserver/pkg/endpoints/discovery" + clientdiscovery "k8s.io/client-go/discovery" "k8s.io/kubernetes/test/e2e/framework" e2eskipper "k8s.io/kubernetes/test/e2e/framework/skipper" "k8s.io/kubernetes/test/utils/crd" @@ -45,6 +47,33 @@ var _ = SIGDescribe("Discovery", func() { setupServerCert(namespaceName, serviceName) }) + ginkgo.It("should accurately determine present and missing resources", func() { + // checks that legacy api group resources function + ok, err := clientdiscovery.IsResourceEnabled(f.ClientSet.Discovery(), schema.GroupVersionResource{Group: "", Version: "v1", Resource: "namespaces"}) + framework.ExpectNoError(err) + if !ok { + framework.Failf("namespace.v1 should always be present") + } + // checks that non-legacy api group resources function + ok, err = clientdiscovery.IsResourceEnabled(f.ClientSet.Discovery(), schema.GroupVersionResource{Group: "apps", Version: "v1", Resource: "deployments"}) + framework.ExpectNoError(err) + if !ok { + framework.Failf("deployments.v1.apps should always be present") + } + // checks that nonsense resources in existing api groups function + ok, err = clientdiscovery.IsResourceEnabled(f.ClientSet.Discovery(), schema.GroupVersionResource{Group: "apps", Version: "v1", Resource: "please-dont-ever-create-this"}) + framework.ExpectNoError(err) + if ok { + framework.Failf("please-dont-ever-create-this.v1.apps should never be present") + } + // checks that resources resources in nonsense api groups function + ok, err = clientdiscovery.IsResourceEnabled(f.ClientSet.Discovery(), schema.GroupVersionResource{Group: "not-these-apps", Version: "v1", Resource: "deployments"}) + framework.ExpectNoError(err) + if ok { + framework.Failf("deployments.v1.not-these-apps should never be present") + } + }) + ginkgo.It("Custom resource should have storage version hash", func() { testcrd, err := crd.CreateTestCRD(f) if err != nil {