ingress: promote CRUD API tests for v1 to conformance

Signed-off-by: Christopher M. Luciano <cmluciano@us.ibm.com>
This commit is contained in:
Christopher M. Luciano 2020-06-10 13:59:38 -04:00
parent 13f1d956ea
commit ca2b5b7605
No known key found for this signature in database
GPG Key ID: 5148DBB31F2843F1
3 changed files with 83 additions and 47 deletions

View File

@ -1561,6 +1561,27 @@
DNS configuration MUST be configured in the Pod. DNS configuration MUST be configured in the Pod.
release: v1.17 release: v1.17
file: test/e2e/network/dns.go 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 - testname: Networking, intra pod http
codename: '[sig-network] Networking Granular Checks: Pods should function for intra-pod codename: '[sig-network] Networking Granular Checks: Pods should function for intra-pod
communication: http [NodeConformance] [Conformance]' communication: http [NodeConformance] [Conformance]'

View File

@ -28,13 +28,13 @@ import (
compute "google.golang.org/api/compute/v1" compute "google.golang.org/api/compute/v1"
v1 "k8s.io/api/core/v1" v1 "k8s.io/api/core/v1"
networkingv1 "k8s.io/api/networking/v1"
networkingv1beta1 "k8s.io/api/networking/v1beta1" networkingv1beta1 "k8s.io/api/networking/v1beta1"
rbacv1 "k8s.io/api/rbac/v1" rbacv1 "k8s.io/api/rbac/v1"
apierrors "k8s.io/apimachinery/pkg/api/errors" apierrors "k8s.io/apimachinery/pkg/api/errors"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apimachinery/pkg/runtime/schema"
types "k8s.io/apimachinery/pkg/types" types "k8s.io/apimachinery/pkg/types"
"k8s.io/apimachinery/pkg/util/intstr"
"k8s.io/apimachinery/pkg/util/uuid" "k8s.io/apimachinery/pkg/util/uuid"
"k8s.io/apimachinery/pkg/util/wait" "k8s.io/apimachinery/pkg/util/wait"
"k8s.io/apimachinery/pkg/watch" "k8s.io/apimachinery/pkg/watch"
@ -947,42 +947,52 @@ var _ = SIGDescribe("Ingress API", func() {
Testname: Ingress API Testname: Ingress API
Description: Description:
The networking.k8s.io API group MUST exist in the /apis discovery document. 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 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/v1beta1 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 resource must support create, get, list, watch, update, patch, delete, and deletecollection.
The ingresses/status resource must support update and patch 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 // Setup
ns := f.Namespace.Name ns := f.Namespace.Name
ingVersion := "v1beta1" ingVersion := "v1"
ingClient := f.ClientSet.NetworkingV1beta1().Ingresses(ns) 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", ObjectMeta: metav1.ObjectMeta{GenerateName: "e2e-example-ing",
Labels: map[string]string{ Labels: map[string]string{
"special-label": f.UniqueName, "special-label": f.UniqueName,
}}, }},
Spec: networkingv1beta1.IngressSpec{ Spec: networkingv1.IngressSpec{
Backend: &networkingv1beta1.IngressBackend{ DefaultBackend: &defaultBackend,
ServiceName: "default-backend", Rules: []networkingv1.IngressRule{
ServicePort: intstr.FromInt(8080),
},
Rules: []networkingv1beta1.IngressRule{
{ {
Host: "foo.bar.com", Host: "foo.bar.com",
IngressRuleValue: networkingv1beta1.IngressRuleValue{ IngressRuleValue: networkingv1.IngressRuleValue{
HTTP: &networkingv1beta1.HTTPIngressRuleValue{ HTTP: &networkingv1.HTTPIngressRuleValue{
Paths: []networkingv1beta1.HTTPIngressPath{{ Paths: []networkingv1.HTTPIngressPath{{
Path: "/", Path: "/",
PathType: &prefixPathType, PathType: &prefixPathType,
Backend: networkingv1beta1.IngressBackend{ Backend: networkingv1.IngressBackend{
ServiceName: "test-backend", Service: &networkingv1.IngressServiceBackend{
ServicePort: intstr.FromInt(8080), 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 // Discovery
ginkgo.By("getting /apis") ginkgo.By("getting /apis")
@ -1028,7 +1038,7 @@ var _ = SIGDescribe("Ingress API", func() {
ginkgo.By("getting /apis/networking.k8s.io" + ingVersion) 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) framework.ExpectNoError(err)
foundIngress := false foundIngress := false
for _, resource := range resources.APIResources { for _, resource := range resources.APIResources {
@ -1065,7 +1075,7 @@ var _ = SIGDescribe("Ingress API", func() {
framework.ExpectNoError(err) framework.ExpectNoError(err)
// Test cluster-wide list and watch // Test cluster-wide list and watch
clusterIngClient := f.ClientSet.NetworkingV1beta1().Ingresses("") clusterIngClient := f.ClientSet.NetworkingV1().Ingresses("")
ginkgo.By("cluster-wide listing") ginkgo.By("cluster-wide listing")
clusterIngs, err := clusterIngClient.List(context.TODO(), metav1.ListOptions{LabelSelector: "special-label=" + f.UniqueName}) clusterIngs, err := clusterIngClient.List(context.TODO(), metav1.ListOptions{LabelSelector: "special-label=" + f.UniqueName})
framework.ExpectNoError(err) framework.ExpectNoError(err)
@ -1094,7 +1104,7 @@ var _ = SIGDescribe("Ingress API", func() {
case evt, ok := <-ingWatch.ResultChan(): case evt, ok := <-ingWatch.ResultChan():
framework.ExpectEqual(ok, true, "watch channel should not close") framework.ExpectEqual(ok, true, "watch channel should not close")
framework.ExpectEqual(evt.Type, watch.Modified) 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)) framework.ExpectEqual(isIngress, true, fmt.Sprintf("expected Ingress, got %T", evt.Object))
if watchedIngress.Annotations["patched"] == "true" { if watchedIngress.Annotations["patched"] == "true" {
framework.Logf("saw patched and updated annotations") framework.Logf("saw patched and updated annotations")

View File

@ -22,11 +22,12 @@ import (
"strings" "strings"
"time" "time"
networkingv1 "k8s.io/api/networking/v1"
networkingv1beta1 "k8s.io/api/networking/v1beta1" networkingv1beta1 "k8s.io/api/networking/v1beta1"
apierrors "k8s.io/apimachinery/pkg/api/errors" apierrors "k8s.io/apimachinery/pkg/api/errors"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
types "k8s.io/apimachinery/pkg/types" types "k8s.io/apimachinery/pkg/types"
"k8s.io/apimachinery/pkg/util/intstr"
"k8s.io/apimachinery/pkg/util/wait" "k8s.io/apimachinery/pkg/util/wait"
"k8s.io/apimachinery/pkg/watch" "k8s.io/apimachinery/pkg/watch"
clientset "k8s.io/client-go/kubernetes" 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" expectedErr := "2 default IngressClasses were found, only 1 allowed"
var lastErr error var lastErr error
if err := wait.Poll(time.Second, time.Minute, func() (bool, 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) _, err := createBasicIngress(cs, f.Namespace.Name)
if err == nil { if err == nil {
return false, 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) { func createIngressClass(cs clientset.Interface, name string, isDefault bool, uniqueName string) (*networkingv1.IngressClass, error) {
ingressClass := &networkingv1beta1.IngressClass{ ingressClass := &networkingv1.IngressClass{
ObjectMeta: metav1.ObjectMeta{ ObjectMeta: metav1.ObjectMeta{
Name: name, Name: name,
Labels: map[string]string{ Labels: map[string]string{
@ -106,7 +107,7 @@ func createIngressClass(cs clientset.Interface, name string, isDefault bool, uni
"special-label": "generic", "special-label": "generic",
}, },
}, },
Spec: networkingv1beta1.IngressClassSpec{ Spec: networkingv1.IngressClassSpec{
Controller: "example.com/controller", 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"} 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) { func createBasicIngress(cs clientset.Interface, namespace string) (*networkingv1.Ingress, error) {
return cs.NetworkingV1beta1().Ingresses(namespace).Create(context.TODO(), &networkingv1beta1.Ingress{ return cs.NetworkingV1().Ingresses(namespace).Create(context.TODO(), &networkingv1.Ingress{
ObjectMeta: metav1.ObjectMeta{ ObjectMeta: metav1.ObjectMeta{
Name: "ingress1", Name: "ingress1",
}, },
Spec: networkingv1beta1.IngressSpec{ Spec: networkingv1.IngressSpec{
Backend: &networkingv1beta1.IngressBackend{ DefaultBackend: &networkingv1.IngressBackend{
ServiceName: "default-backend", Service: &networkingv1.IngressServiceBackend{
ServicePort: intstr.FromInt(80), Name: "defaultbackend",
Port: networkingv1.ServiceBackendPort{
Number: 80,
},
},
}, },
}, },
}, metav1.CreateOptions{}) }, metav1.CreateOptions{})
} }
func deleteIngressClass(cs clientset.Interface, name string) { 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) framework.ExpectNoError(err)
} }
@ -148,15 +153,15 @@ var _ = SIGDescribe("IngressClass API", func() {
Testname: IngressClass API Testname: IngressClass API
Description: Description:
- The networking.k8s.io API group MUST exist in the /apis discovery document. - 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 networking.k8s.io/v1 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 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. - 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 // Setup
icClient := f.ClientSet.NetworkingV1beta1().IngressClasses() icClient := f.ClientSet.NetworkingV1().IngressClasses()
icVersion := "v1beta1" icVersion := "v1"
// Discovery // Discovery
ginkgo.By("getting /apis") ginkgo.By("getting /apis")
@ -165,7 +170,7 @@ var _ = SIGDescribe("IngressClass API", func() {
framework.ExpectNoError(err) framework.ExpectNoError(err)
found := false found := false
for _, group := range discoveryGroups.Groups { for _, group := range discoveryGroups.Groups {
if group.Name == networkingv1beta1.GroupName { if group.Name == networkingv1.GroupName {
for _, version := range group.Versions { for _, version := range group.Versions {
if version.Version == icVersion { if version.Version == icVersion {
found = true found = true
@ -193,7 +198,7 @@ var _ = SIGDescribe("IngressClass API", func() {
ginkgo.By("getting /apis/networking.k8s.io" + icVersion) 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) framework.ExpectNoError(err)
foundIC := false foundIC := false
for _, resource := range resources.APIResources { for _, resource := range resources.APIResources {
@ -248,7 +253,7 @@ var _ = SIGDescribe("IngressClass API", func() {
case evt, ok := <-icWatch.ResultChan(): case evt, ok := <-icWatch.ResultChan():
framework.ExpectEqual(ok, true, "watch channel should not close") framework.ExpectEqual(ok, true, "watch channel should not close")
framework.ExpectEqual(evt.Type, watch.Modified) 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)) framework.ExpectEqual(isIngress, true, fmt.Sprintf("expected Ingress, got %T", evt.Object))
if watchedIngress.Annotations["patched"] == "true" { if watchedIngress.Annotations["patched"] == "true" {
framework.Logf("saw patched and updated annotations") framework.Logf("saw patched and updated annotations")