mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-25 20:53:33 +00:00
ingress: promote CRUD API tests for v1 to conformance
Signed-off-by: Christopher M. Luciano <cmluciano@us.ibm.com>
This commit is contained in:
parent
13f1d956ea
commit
ca2b5b7605
21
test/conformance/testdata/conformance.yaml
vendored
21
test/conformance/testdata/conformance.yaml
vendored
@ -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]'
|
||||||
|
@ -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")
|
||||||
|
@ -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")
|
||||||
|
Loading…
Reference in New Issue
Block a user