From 60b18fbf9dd8edd9ebf264d9bfdca59c64e3bc2e Mon Sep 17 00:00:00 2001 From: kidddddddddddddddddddddd <1062602710@qq.com> Date: Wed, 6 Jul 2022 14:11:32 +0800 Subject: [PATCH] ingressclass --- .../network/defaultingressclass/admission.go | 11 +++-- .../defaultingressclass/admission_test.go | 42 ++++++++++++++++--- 2 files changed, 45 insertions(+), 8 deletions(-) diff --git a/plugin/pkg/admission/network/defaultingressclass/admission.go b/plugin/pkg/admission/network/defaultingressclass/admission.go index 7118ab275c4..7feb37ae76b 100644 --- a/plugin/pkg/admission/network/defaultingressclass/admission.go +++ b/plugin/pkg/admission/network/defaultingressclass/admission.go @@ -20,6 +20,7 @@ import ( "context" "fmt" "io" + "sort" networkingv1 "k8s.io/api/networking/v1" networkingv1beta1 "k8s.io/api/networking/v1beta1" @@ -141,10 +142,14 @@ func getDefaultClass(lister networkingv1listers.IngressClassLister) (*networking if len(defaultClasses) == 0 { return nil, nil } - + sort.Slice(defaultClasses, func(i, j int) bool { + if defaultClasses[i].CreationTimestamp.UnixNano() == defaultClasses[j].CreationTimestamp.UnixNano() { + return defaultClasses[i].Name < defaultClasses[j].Name + } + return defaultClasses[i].CreationTimestamp.UnixNano() > defaultClasses[j].CreationTimestamp.UnixNano() + }) if len(defaultClasses) > 1 { - klog.V(3).Infof("%d default IngressClasses were found, only 1 allowed", len(defaultClasses)) - return nil, errors.NewInternalError(fmt.Errorf("%d default IngressClasses were found, only 1 allowed", len(defaultClasses))) + klog.V(4).Infof("%d default IngressClasses were found, choosing the newest: %s", len(defaultClasses), defaultClasses[0].Name) } return defaultClasses[0], nil diff --git a/plugin/pkg/admission/network/defaultingressclass/admission_test.go b/plugin/pkg/admission/network/defaultingressclass/admission_test.go index 7d97b75fa0b..119faef6bbd 100644 --- a/plugin/pkg/admission/network/defaultingressclass/admission_test.go +++ b/plugin/pkg/admission/network/defaultingressclass/admission_test.go @@ -18,13 +18,12 @@ package defaultingressclass import ( "context" - "fmt" "reflect" "testing" + "time" networkingv1 "k8s.io/api/networking/v1" networkingv1beta1 "k8s.io/api/networking/v1beta1" - "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apiserver/pkg/admission" admissiontesting "k8s.io/apiserver/pkg/admission/testing" @@ -89,6 +88,31 @@ func TestAdmission(t *testing.T) { }, } + defaultClassWithCreateTime1 := &networkingv1.IngressClass{ + TypeMeta: metav1.TypeMeta{ + Kind: "IngressClass", + }, + ObjectMeta: metav1.ObjectMeta{ + Name: "default1", + CreationTimestamp: metav1.NewTime(time.Date(2022, time.Month(1), 1, 0, 0, 0, 1, time.UTC)), + Annotations: map[string]string{ + networkingv1.AnnotationIsDefaultIngressClass: "true", + }, + }, + } + defaultClassWithCreateTime2 := &networkingv1.IngressClass{ + TypeMeta: metav1.TypeMeta{ + Kind: "IngressClass", + }, + ObjectMeta: metav1.ObjectMeta{ + Name: "default2", + CreationTimestamp: metav1.NewTime(time.Date(2022, time.Month(1), 1, 0, 0, 0, 0, time.UTC)), + Annotations: map[string]string{ + networkingv1.AnnotationIsDefaultIngressClass: "true", + }, + }, + } + testCases := []struct { name string classes []*networkingv1.IngressClass @@ -138,12 +162,12 @@ func TestAdmission(t *testing.T) { expectedError: nil, }, { - name: "two defaults, error with Ingress with class field=nil", + name: "two defaults with the same creation time, choose the one with the lower name", classes: []*networkingv1.IngressClass{defaultClass1, defaultClass2, classWithFalseDefault, classWithNoDefault, classWithEmptyDefault}, classField: nil, classAnnotation: nil, - expectedClass: nil, - expectedError: errors.NewForbidden(networkingv1.Resource("ingresses"), "testing", errors.NewInternalError(fmt.Errorf("2 default IngressClasses were found, only 1 allowed"))), + expectedClass: utilpointer.StringPtr(defaultClass1.Name), + expectedError: nil, }, { name: "two defaults, no modification with Ingress with class field=''", @@ -153,6 +177,14 @@ func TestAdmission(t *testing.T) { expectedClass: utilpointer.StringPtr(""), expectedError: nil, }, + { + name: "two defaults, choose the one with the newer creation time", + classes: []*networkingv1.IngressClass{defaultClassWithCreateTime1, defaultClassWithCreateTime2, classWithFalseDefault, classWithNoDefault, classWithEmptyDefault}, + classField: nil, + classAnnotation: nil, + expectedClass: utilpointer.StringPtr(defaultClassWithCreateTime1.Name), + expectedError: nil, + }, } for _, testCase := range testCases {