From ca2b5b76052bfa01c38707ffb72340eb36cd4511 Mon Sep 17 00:00:00 2001 From: "Christopher M. Luciano" Date: Wed, 10 Jun 2020 13:59:38 -0400 Subject: [PATCH] ingress: promote CRUD API tests for v1 to conformance Signed-off-by: Christopher M. Luciano --- test/conformance/testdata/conformance.yaml | 21 ++++++++ test/e2e/network/ingress.go | 60 +++++++++++++--------- test/e2e/network/ingressclass.go | 49 ++++++++++-------- 3 files changed, 83 insertions(+), 47 deletions(-) diff --git a/test/conformance/testdata/conformance.yaml b/test/conformance/testdata/conformance.yaml index 2f060dc9cd0..d18a5f3eb27 100755 --- a/test/conformance/testdata/conformance.yaml +++ b/test/conformance/testdata/conformance.yaml @@ -1561,6 +1561,27 @@ DNS configuration MUST be configured in the Pod. release: v1.17 file: test/e2e/network/dns.go +- testname: Ingress API + codename: '[sig-network] Ingress API should support creating Ingress API operations + [Conformance]' + description: ' The networking.k8s.io API group MUST exist in the /apis discovery + document. The networking.k8s.io/v1 API group/version MUST exist in the /apis/networking.k8s.io + discovery document. The ingresses resources MUST exist in the /apis/networking.k8s.io/v1 + discovery document. The ingresses resource must support create, get, list, watch, + update, patch, delete, and deletecollection. The ingresses/status resource must + support update and patch' + release: v1.19 + file: test/e2e/network/ingress.go +- testname: IngressClass API + codename: '[sig-network] IngressClass API should support creating IngressClass + API operations [Conformance]' + description: ' - The networking.k8s.io API group MUST exist in the /apis discovery + document. - The networking.k8s.io/v1 API group/version MUST exist in the /apis/networking.k8s.io + discovery document. - The ingressclasses resource MUST exist in the /apis/networking.k8s.io/v1 + discovery document. - The ingressclass resource must support create, get, list, + watch, update, patch, delete, and deletecollection.' + release: v1.19 + file: test/e2e/network/ingressclass.go - testname: Networking, intra pod http codename: '[sig-network] Networking Granular Checks: Pods should function for intra-pod communication: http [NodeConformance] [Conformance]' diff --git a/test/e2e/network/ingress.go b/test/e2e/network/ingress.go index 17c916f894c..f1bce918e8f 100644 --- a/test/e2e/network/ingress.go +++ b/test/e2e/network/ingress.go @@ -28,13 +28,13 @@ import ( compute "google.golang.org/api/compute/v1" v1 "k8s.io/api/core/v1" + networkingv1 "k8s.io/api/networking/v1" networkingv1beta1 "k8s.io/api/networking/v1beta1" rbacv1 "k8s.io/api/rbac/v1" apierrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime/schema" types "k8s.io/apimachinery/pkg/types" - "k8s.io/apimachinery/pkg/util/intstr" "k8s.io/apimachinery/pkg/util/uuid" "k8s.io/apimachinery/pkg/util/wait" "k8s.io/apimachinery/pkg/watch" @@ -947,42 +947,52 @@ var _ = SIGDescribe("Ingress API", func() { Testname: Ingress API Description: The networking.k8s.io API group MUST exist in the /apis discovery document. - The networking.k8s.io/v1beta1 API group/version MUST exist in the /apis/networking.k8s.io discovery document. - The ingresses resources MUST exist in the /apis/networking.k8s.io/v1beta1 discovery document. + The networking.k8s.io/v1 API group/version MUST exist in the /apis/networking.k8s.io discovery document. + The ingresses resources MUST exist in the /apis/networking.k8s.io/v1 discovery document. The ingresses resource must support create, get, list, watch, update, patch, delete, and deletecollection. The ingresses/status resource must support update and patch - */ - ginkgo.It("should support creating Ingress API operations", func() { + framework.ConformanceIt("should support creating Ingress API operations", func() { // Setup ns := f.Namespace.Name - ingVersion := "v1beta1" - ingClient := f.ClientSet.NetworkingV1beta1().Ingresses(ns) + ingVersion := "v1" + ingClient := f.ClientSet.NetworkingV1().Ingresses(ns) - prefixPathType := networkingv1beta1.PathTypePrefix + prefixPathType := networkingv1.PathTypePrefix + serviceBackend := &networkingv1.IngressServiceBackend{ + Name: "default-backend", + Port: networkingv1.ServiceBackendPort{ + Name: "", + Number: 8080, + }, + } + defaultBackend := networkingv1.IngressBackend{ + Service: serviceBackend, + } - ingTemplate := &networkingv1beta1.Ingress{ + ingTemplate := &networkingv1.Ingress{ ObjectMeta: metav1.ObjectMeta{GenerateName: "e2e-example-ing", Labels: map[string]string{ "special-label": f.UniqueName, }}, - Spec: networkingv1beta1.IngressSpec{ - Backend: &networkingv1beta1.IngressBackend{ - ServiceName: "default-backend", - ServicePort: intstr.FromInt(8080), - }, - Rules: []networkingv1beta1.IngressRule{ + Spec: networkingv1.IngressSpec{ + DefaultBackend: &defaultBackend, + Rules: []networkingv1.IngressRule{ { Host: "foo.bar.com", - IngressRuleValue: networkingv1beta1.IngressRuleValue{ - HTTP: &networkingv1beta1.HTTPIngressRuleValue{ - Paths: []networkingv1beta1.HTTPIngressPath{{ + IngressRuleValue: networkingv1.IngressRuleValue{ + HTTP: &networkingv1.HTTPIngressRuleValue{ + Paths: []networkingv1.HTTPIngressPath{{ Path: "/", PathType: &prefixPathType, - Backend: networkingv1beta1.IngressBackend{ - ServiceName: "test-backend", - ServicePort: intstr.FromInt(8080), + Backend: networkingv1.IngressBackend{ + Service: &networkingv1.IngressServiceBackend{ + Name: "test-backend", + Port: networkingv1.ServiceBackendPort{ + Number: 8080, + }, + }, }, }}, }, @@ -990,7 +1000,7 @@ var _ = SIGDescribe("Ingress API", func() { }, }, }, - Status: networkingv1beta1.IngressStatus{LoadBalancer: v1.LoadBalancerStatus{}}, + Status: networkingv1.IngressStatus{LoadBalancer: v1.LoadBalancerStatus{}}, } // Discovery ginkgo.By("getting /apis") @@ -1028,7 +1038,7 @@ var _ = SIGDescribe("Ingress API", func() { ginkgo.By("getting /apis/networking.k8s.io" + ingVersion) { - resources, err := f.ClientSet.Discovery().ServerResourcesForGroupVersion(networkingv1beta1.SchemeGroupVersion.String()) + resources, err := f.ClientSet.Discovery().ServerResourcesForGroupVersion(networkingv1.SchemeGroupVersion.String()) framework.ExpectNoError(err) foundIngress := false for _, resource := range resources.APIResources { @@ -1065,7 +1075,7 @@ var _ = SIGDescribe("Ingress API", func() { framework.ExpectNoError(err) // Test cluster-wide list and watch - clusterIngClient := f.ClientSet.NetworkingV1beta1().Ingresses("") + clusterIngClient := f.ClientSet.NetworkingV1().Ingresses("") ginkgo.By("cluster-wide listing") clusterIngs, err := clusterIngClient.List(context.TODO(), metav1.ListOptions{LabelSelector: "special-label=" + f.UniqueName}) framework.ExpectNoError(err) @@ -1094,7 +1104,7 @@ var _ = SIGDescribe("Ingress API", func() { case evt, ok := <-ingWatch.ResultChan(): framework.ExpectEqual(ok, true, "watch channel should not close") framework.ExpectEqual(evt.Type, watch.Modified) - watchedIngress, isIngress := evt.Object.(*networkingv1beta1.Ingress) + watchedIngress, isIngress := evt.Object.(*networkingv1.Ingress) framework.ExpectEqual(isIngress, true, fmt.Sprintf("expected Ingress, got %T", evt.Object)) if watchedIngress.Annotations["patched"] == "true" { framework.Logf("saw patched and updated annotations") diff --git a/test/e2e/network/ingressclass.go b/test/e2e/network/ingressclass.go index 0eb04ff8e3c..421699ba7d6 100644 --- a/test/e2e/network/ingressclass.go +++ b/test/e2e/network/ingressclass.go @@ -22,11 +22,12 @@ import ( "strings" "time" + networkingv1 "k8s.io/api/networking/v1" networkingv1beta1 "k8s.io/api/networking/v1beta1" apierrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" types "k8s.io/apimachinery/pkg/types" - "k8s.io/apimachinery/pkg/util/intstr" + "k8s.io/apimachinery/pkg/util/wait" "k8s.io/apimachinery/pkg/watch" clientset "k8s.io/client-go/kubernetes" @@ -83,7 +84,7 @@ var _ = SIGDescribe("IngressClass [Feature:Ingress]", func() { expectedErr := "2 default IngressClasses were found, only 1 allowed" var lastErr error if err := wait.Poll(time.Second, time.Minute, func() (bool, error) { - defer cs.NetworkingV1beta1().Ingresses(f.Namespace.Name).Delete(context.TODO(), "ingress1", metav1.DeleteOptions{}) + defer cs.NetworkingV1().Ingresses(f.Namespace.Name).Delete(context.TODO(), "ingress1", metav1.DeleteOptions{}) _, err := createBasicIngress(cs, f.Namespace.Name) if err == nil { return false, nil @@ -97,8 +98,8 @@ var _ = SIGDescribe("IngressClass [Feature:Ingress]", func() { }) -func createIngressClass(cs clientset.Interface, name string, isDefault bool, uniqueName string) (*networkingv1beta1.IngressClass, error) { - ingressClass := &networkingv1beta1.IngressClass{ +func createIngressClass(cs clientset.Interface, name string, isDefault bool, uniqueName string) (*networkingv1.IngressClass, error) { + ingressClass := &networkingv1.IngressClass{ ObjectMeta: metav1.ObjectMeta{ Name: name, Labels: map[string]string{ @@ -106,7 +107,7 @@ func createIngressClass(cs clientset.Interface, name string, isDefault bool, uni "special-label": "generic", }, }, - Spec: networkingv1beta1.IngressClassSpec{ + Spec: networkingv1.IngressClassSpec{ Controller: "example.com/controller", }, } @@ -115,25 +116,29 @@ func createIngressClass(cs clientset.Interface, name string, isDefault bool, uni ingressClass.Annotations = map[string]string{networkingv1beta1.AnnotationIsDefaultIngressClass: "true"} } - return cs.NetworkingV1beta1().IngressClasses().Create(context.TODO(), ingressClass, metav1.CreateOptions{}) + return cs.NetworkingV1().IngressClasses().Create(context.TODO(), ingressClass, metav1.CreateOptions{}) } -func createBasicIngress(cs clientset.Interface, namespace string) (*networkingv1beta1.Ingress, error) { - return cs.NetworkingV1beta1().Ingresses(namespace).Create(context.TODO(), &networkingv1beta1.Ingress{ +func createBasicIngress(cs clientset.Interface, namespace string) (*networkingv1.Ingress, error) { + return cs.NetworkingV1().Ingresses(namespace).Create(context.TODO(), &networkingv1.Ingress{ ObjectMeta: metav1.ObjectMeta{ Name: "ingress1", }, - Spec: networkingv1beta1.IngressSpec{ - Backend: &networkingv1beta1.IngressBackend{ - ServiceName: "default-backend", - ServicePort: intstr.FromInt(80), + Spec: networkingv1.IngressSpec{ + DefaultBackend: &networkingv1.IngressBackend{ + Service: &networkingv1.IngressServiceBackend{ + Name: "defaultbackend", + Port: networkingv1.ServiceBackendPort{ + Number: 80, + }, + }, }, }, }, metav1.CreateOptions{}) } func deleteIngressClass(cs clientset.Interface, name string) { - err := cs.NetworkingV1beta1().IngressClasses().Delete(context.TODO(), name, metav1.DeleteOptions{}) + err := cs.NetworkingV1().IngressClasses().Delete(context.TODO(), name, metav1.DeleteOptions{}) framework.ExpectNoError(err) } @@ -148,15 +153,15 @@ var _ = SIGDescribe("IngressClass API", func() { Testname: IngressClass API Description: - The networking.k8s.io API group MUST exist in the /apis discovery document. - - The networking.k8s.io/v1beta1 API group/version MUST exist in the /apis/networking.k8s.io discovery document. - - The IngressClasses resources MUST exist in the /apis/networking.k8s.io/v1beta1 discovery document. - - The IngressClass resource must support create, get, list, watch, update, patch, delete, and deletecollection. + - The networking.k8s.io/v1 API group/version MUST exist in the /apis/networking.k8s.io discovery document. + - The ingressclasses resource MUST exist in the /apis/networking.k8s.io/v1 discovery document. + - The ingressclass resource must support create, get, list, watch, update, patch, delete, and deletecollection. */ - ginkgo.It(" should support creating IngressClass API operations", func() { + framework.ConformanceIt(" should support creating IngressClass API operations", func() { // Setup - icClient := f.ClientSet.NetworkingV1beta1().IngressClasses() - icVersion := "v1beta1" + icClient := f.ClientSet.NetworkingV1().IngressClasses() + icVersion := "v1" // Discovery ginkgo.By("getting /apis") @@ -165,7 +170,7 @@ var _ = SIGDescribe("IngressClass API", func() { framework.ExpectNoError(err) found := false for _, group := range discoveryGroups.Groups { - if group.Name == networkingv1beta1.GroupName { + if group.Name == networkingv1.GroupName { for _, version := range group.Versions { if version.Version == icVersion { found = true @@ -193,7 +198,7 @@ var _ = SIGDescribe("IngressClass API", func() { ginkgo.By("getting /apis/networking.k8s.io" + icVersion) { - resources, err := f.ClientSet.Discovery().ServerResourcesForGroupVersion(networkingv1beta1.SchemeGroupVersion.String()) + resources, err := f.ClientSet.Discovery().ServerResourcesForGroupVersion(networkingv1.SchemeGroupVersion.String()) framework.ExpectNoError(err) foundIC := false for _, resource := range resources.APIResources { @@ -248,7 +253,7 @@ var _ = SIGDescribe("IngressClass API", func() { case evt, ok := <-icWatch.ResultChan(): framework.ExpectEqual(ok, true, "watch channel should not close") framework.ExpectEqual(evt.Type, watch.Modified) - watchedIngress, isIngress := evt.Object.(*networkingv1beta1.IngressClass) + watchedIngress, isIngress := evt.Object.(*networkingv1.IngressClass) framework.ExpectEqual(isIngress, true, fmt.Sprintf("expected Ingress, got %T", evt.Object)) if watchedIngress.Annotations["patched"] == "true" { framework.Logf("saw patched and updated annotations")