From fc428d763ee7cf00bfe143c619e040fc7a4b5c2a Mon Sep 17 00:00:00 2001 From: Jake Sanders Date: Mon, 26 Jul 2021 22:30:41 +0100 Subject: [PATCH] Fix e2e tests on Kube 1.16 by removing last references to NetworkingV1 Signed-off-by: Jake Sanders --- pkg/internal/ingress/ingress.go | 42 ++++++++++++------- pkg/internal/ingress/v1.go | 4 ++ pkg/internal/ingress/v1beta1.go | 8 ++++ pkg/issuer/acme/http/ingress.go | 6 +-- .../suite/conformance/certificates/tests.go | 8 ++-- .../suite/issuers/acme/certificate/http01.go | 8 ++-- test/e2e/util/util.go | 10 +++-- 7 files changed, 57 insertions(+), 29 deletions(-) diff --git a/pkg/internal/ingress/ingress.go b/pkg/internal/ingress/ingress.go index 0cf32c9d9..65977815e 100644 --- a/pkg/internal/ingress/ingress.go +++ b/pkg/internal/ingress/ingress.go @@ -53,6 +53,7 @@ type InternalIngressInterface interface { Create(ctx context.Context, ingress *networkingv1.Ingress, opts metav1.CreateOptions) (*networkingv1.Ingress, error) Update(ctx context.Context, ingress *networkingv1.Ingress, opts metav1.UpdateOptions) (*networkingv1.Ingress, error) Delete(ctx context.Context, name string, opts metav1.DeleteOptions) error + Get(ctx context.Context, name string, opts metav1.GetOptions) (*networkingv1.Ingress, error) } // InternalIngressLister mimics a client-go networking/v1/IngressLister. @@ -107,28 +108,41 @@ func NewCreateUpdater(ctx *controller.Context) (InternalIngressCreateUpdater, er func hasVersion(d discovery.DiscoveryInterface, GroupVersion string) bool { // check whether the GroupVersion is already known knownVersions := knownAPIVersionCache.Load().(map[string]bool) - if knownVersions[GroupVersion] == true { - return true + knownVersion, found := knownVersions[GroupVersion] + if found { + return knownVersion } resourceList, err := d.ServerResourcesForGroupVersion(GroupVersion) if err != nil { return false } - if len(resourceList.APIResources) > 0 { - // Now we know the APIServer supports this GroupVersion, store the result atomically - // in the knownVersions cache. Lock, get the latest copy, atomically update. - cacheLock.Lock() - defer cacheLock.Unlock() - oldCache := knownAPIVersionCache.Load().(map[string]bool) - newCache := make(map[string]bool) - for k, v := range oldCache { - newCache[k] = v + for _, r := range resourceList.APIResources { + if r.Kind == "Ingress" { + // Now we know the APIServer supports this GroupVersion, store the result atomically + // in the knownVersions cache. Lock, get the latest copy, atomically update. + cacheLock.Lock() + oldCache := knownAPIVersionCache.Load().(map[string]bool) + newCache := make(map[string]bool) + for k, v := range oldCache { + newCache[k] = v + } + newCache[GroupVersion] = true + knownAPIVersionCache.Store(newCache) + cacheLock.Unlock() + return true } - newCache[GroupVersion] = true - knownAPIVersionCache.Store(newCache) - return true } + // no networking error and no Ingresses found in networking.k8s.io/, cache negative result + cacheLock.Lock() + oldCache := knownAPIVersionCache.Load().(map[string]bool) + newCache := make(map[string]bool) + for k, v := range oldCache { + newCache[k] = v + } + newCache[GroupVersion] = false + knownAPIVersionCache.Store(newCache) + cacheLock.Unlock() return false } diff --git a/pkg/internal/ingress/v1.go b/pkg/internal/ingress/v1.go index 803e1bb40..c86bb1453 100644 --- a/pkg/internal/ingress/v1.go +++ b/pkg/internal/ingress/v1.go @@ -66,6 +66,10 @@ type v1Interface struct { ns string } +func (v1 *v1Interface) Get(ctx context.Context, name string, opts metav1.GetOptions) (*networkingv1.Ingress, error) { + return v1.client.NetworkingV1().Ingresses(v1.ns).Get(ctx, name, opts) +} + func (v1 *v1Interface) Create(ctx context.Context, ingress *networkingv1.Ingress, opts metav1.CreateOptions) (*networkingv1.Ingress, error) { return v1.client.NetworkingV1().Ingresses(v1.ns).Create(ctx, ingress, opts) } diff --git a/pkg/internal/ingress/v1beta1.go b/pkg/internal/ingress/v1beta1.go index 0922a5dc6..59296509f 100644 --- a/pkg/internal/ingress/v1beta1.go +++ b/pkg/internal/ingress/v1beta1.go @@ -133,6 +133,14 @@ type v1beta1Interface struct { ns string } +func (v *v1beta1Interface) Get(ctx context.Context, name string, opts metav1.GetOptions) (*networkingv1.Ingress, error) { + ing, err := v.client.NetworkingV1beta1().Ingresses(v.ns).Get(ctx, name, opts) + if err != nil { + return nil, err + } + return convertV1Beta1ToV1(ing) +} + func (v *v1beta1Interface) Create(ctx context.Context, ingress *networkingv1.Ingress, opts metav1.CreateOptions) (*networkingv1.Ingress, error) { ing, err := convertV1ToV1Beta1(ingress) if err != nil { diff --git a/pkg/issuer/acme/http/ingress.go b/pkg/issuer/acme/http/ingress.go index d5898c3c4..942b44168 100644 --- a/pkg/issuer/acme/http/ingress.go +++ b/pkg/issuer/acme/http/ingress.go @@ -284,7 +284,7 @@ func (s *Solver) cleanupIngresses(ctx context.Context, ch *cmacme.Challenge) err log := logf.WithRelatedResource(log, ingress).V(logf.DebugLevel) log.V(logf.DebugLevel).Info("deleting ingress resource") - err := s.Client.NetworkingV1().Ingresses(ingress.Namespace).Delete(ctx, ingress.Name, metav1.DeleteOptions{}) + err := s.ingressCreateUpdater.Ingresses(ingress.Namespace).Delete(ctx, ingress.Name, metav1.DeleteOptions{}) if err != nil { log.V(logf.WarnLevel).Info("failed to delete ingress resource", "error", err) errs = append(errs, err) @@ -296,7 +296,7 @@ func (s *Solver) cleanupIngresses(ctx context.Context, ch *cmacme.Challenge) err } // otherwise, we need to remove any cert-manager added rules from the ingress resource - ing, err := s.Client.NetworkingV1().Ingresses(ch.Namespace).Get(ctx, existingIngressName, metav1.GetOptions{}) + ing, err := s.ingressCreateUpdater.Ingresses(ch.Namespace).Get(ctx, existingIngressName, metav1.GetOptions{}) if k8sErrors.IsNotFound(err) { log.Error(err, "named ingress resource not found, skipping cleanup") return nil @@ -339,7 +339,7 @@ func (s *Solver) cleanupIngresses(ctx context.Context, ch *cmacme.Challenge) err ing.Spec.Rules = ingRules - _, err = s.Client.NetworkingV1().Ingresses(ing.Namespace).Update(ctx, ing, metav1.UpdateOptions{}) + _, err = s.ingressCreateUpdater.Ingresses(ing.Namespace).Update(ctx, ing, metav1.UpdateOptions{}) if err != nil { return err } diff --git a/test/e2e/suite/conformance/certificates/tests.go b/test/e2e/suite/conformance/certificates/tests.go index 533f4ca61..7f93ab00d 100644 --- a/test/e2e/suite/conformance/certificates/tests.go +++ b/test/e2e/suite/conformance/certificates/tests.go @@ -645,7 +645,7 @@ func (s *Suite) Define() { s.it(f, "should issue a certificate for a single distinct DNS Name defined by an ingress with annotations", func(issuerRef cmmeta.ObjectReference) { var certName string switch { - case e2eutil.HasAPIVersion(f.KubeClientSet.Discovery(), networkingv1.SchemeGroupVersion.String()): + case e2eutil.HasIngresses(f.KubeClientSet.Discovery(), networkingv1.SchemeGroupVersion.String()): ingClient := f.KubeClientSet.NetworkingV1().Ingresses(f.Namespace.Name) name := "testcert-ingress" @@ -659,7 +659,7 @@ func (s *Suite) Define() { }, e2eutil.RandomSubdomain(s.DomainSuffix)), metav1.CreateOptions{}) Expect(err).NotTo(HaveOccurred()) certName = ingress.Spec.TLS[0].SecretName - case e2eutil.HasAPIVersion(f.KubeClientSet.Discovery(), networkingv1beta1.SchemeGroupVersion.String()): + case e2eutil.HasIngresses(f.KubeClientSet.Discovery(), networkingv1beta1.SchemeGroupVersion.String()): ingClient := f.KubeClientSet.NetworkingV1beta1().Ingresses(f.Namespace.Name) name := "testcert-ingress" secretName := "testcert-ingress-tls" @@ -697,7 +697,7 @@ func (s *Suite) Define() { renewBefore := time.Hour * 111 switch { - case e2eutil.HasAPIVersion(f.KubeClientSet.Discovery(), networkingv1.SchemeGroupVersion.String()): + case e2eutil.HasIngresses(f.KubeClientSet.Discovery(), networkingv1.SchemeGroupVersion.String()): ingClient := f.KubeClientSet.NetworkingV1().Ingresses(f.Namespace.Name) name := "testcert-ingress" @@ -715,7 +715,7 @@ func (s *Suite) Define() { Expect(err).NotTo(HaveOccurred()) certName = ingress.Spec.TLS[0].SecretName - case e2eutil.HasAPIVersion(f.KubeClientSet.Discovery(), networkingv1beta1.SchemeGroupVersion.String()): + case e2eutil.HasIngresses(f.KubeClientSet.Discovery(), networkingv1beta1.SchemeGroupVersion.String()): ingClient := f.KubeClientSet.NetworkingV1beta1().Ingresses(f.Namespace.Name) name := "testcert-ingress" diff --git a/test/e2e/suite/issuers/acme/certificate/http01.go b/test/e2e/suite/issuers/acme/certificate/http01.go index 94a1f949a..d61553320 100644 --- a/test/e2e/suite/issuers/acme/certificate/http01.go +++ b/test/e2e/suite/issuers/acme/certificate/http01.go @@ -229,14 +229,14 @@ var _ = framework.CertManagerDescribe("ACME Certificate (HTTP01)", func() { It("should obtain a signed certificate with a single CN from the ACME server when putting an annotation on an ingress resource", func() { switch { - case util.HasAPIVersion(f.KubeClientSet.Discovery(), networkingv1.SchemeGroupVersion.String()): + case util.HasIngresses(f.KubeClientSet.Discovery(), networkingv1.SchemeGroupVersion.String()): ingClient := f.KubeClientSet.NetworkingV1().Ingresses(f.Namespace.Name) By("Creating an Ingress with the issuer name annotation set") _, err := ingClient.Create(context.TODO(), util.NewIngress(certificateSecretName, certificateSecretName, map[string]string{ "cert-manager.io/issuer": issuerName, }, acmeIngressDomain), metav1.CreateOptions{}) Expect(err).NotTo(HaveOccurred()) - case util.HasAPIVersion(f.KubeClientSet.Discovery(), networkingv1beta1.SchemeGroupVersion.String()): + case util.HasIngresses(f.KubeClientSet.Discovery(), networkingv1beta1.SchemeGroupVersion.String()): ingClient := f.KubeClientSet.NetworkingV1beta1().Ingresses(f.Namespace.Name) By("Creating an Ingress with the issuer name annotation set") _, err := ingClient.Create(context.TODO(), util.NewV1Beta1Ingress(certificateSecretName, certificateSecretName, map[string]string{ @@ -302,7 +302,7 @@ var _ = framework.CertManagerDescribe("ACME Certificate (HTTP01)", func() { // using the TLS secret that we just got from the self-sign switch { - case util.HasAPIVersion(f.KubeClientSet.Discovery(), networkingv1.SchemeGroupVersion.String()): + case util.HasIngresses(f.KubeClientSet.Discovery(), networkingv1.SchemeGroupVersion.String()): ingress := f.KubeClientSet.NetworkingV1().Ingresses(f.Namespace.Name) _, err = ingress.Create(context.TODO(), &networkingv1.Ingress{ ObjectMeta: metav1.ObjectMeta{ @@ -345,7 +345,7 @@ var _ = framework.CertManagerDescribe("ACME Certificate (HTTP01)", func() { }, }, metav1.CreateOptions{}) Expect(err).NotTo(HaveOccurred()) - case util.HasAPIVersion(f.KubeClientSet.Discovery(), networkingv1beta1.SchemeGroupVersion.String()): + case util.HasIngresses(f.KubeClientSet.Discovery(), networkingv1beta1.SchemeGroupVersion.String()): ingress := f.KubeClientSet.NetworkingV1beta1().Ingresses(f.Namespace.Name) _, err = ingress.Create(context.TODO(), &networkingv1beta1.Ingress{ ObjectMeta: metav1.ObjectMeta{ diff --git a/test/e2e/util/util.go b/test/e2e/util/util.go index 707759543..b423abb94 100644 --- a/test/e2e/util/util.go +++ b/test/e2e/util/util.go @@ -574,15 +574,17 @@ func ptrPort(port int32) *gwapiv1alpha1.PortNumber { return &p } -// HasAPIVersion lets you know if an API exists in the discovery API +// HasIngresses lets you know if an API exists in the discovery API // calling this function always performs a request to the API server. -func HasAPIVersion(d discovery.DiscoveryInterface, GroupVersion string) bool { +func HasIngresses(d discovery.DiscoveryInterface, GroupVersion string) bool { resourceList, err := d.ServerResourcesForGroupVersion(GroupVersion) if err != nil { return false } - if len(resourceList.APIResources) > 0 { - return true + for _, r := range resourceList.APIResources { + if r.Kind == "Ingress" { + return true + } } return false }