mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-25 12:43:23 +00:00
ingressclass
This commit is contained in:
parent
89aaf7c02d
commit
60b18fbf9d
@ -20,6 +20,7 @@ import (
|
|||||||
"context"
|
"context"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
|
"sort"
|
||||||
|
|
||||||
networkingv1 "k8s.io/api/networking/v1"
|
networkingv1 "k8s.io/api/networking/v1"
|
||||||
networkingv1beta1 "k8s.io/api/networking/v1beta1"
|
networkingv1beta1 "k8s.io/api/networking/v1beta1"
|
||||||
@ -141,10 +142,14 @@ func getDefaultClass(lister networkingv1listers.IngressClassLister) (*networking
|
|||||||
if len(defaultClasses) == 0 {
|
if len(defaultClasses) == 0 {
|
||||||
return nil, nil
|
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 {
|
if len(defaultClasses) > 1 {
|
||||||
klog.V(3).Infof("%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 nil, errors.NewInternalError(fmt.Errorf("%d default IngressClasses were found, only 1 allowed", len(defaultClasses)))
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return defaultClasses[0], nil
|
return defaultClasses[0], nil
|
||||||
|
@ -18,13 +18,12 @@ package defaultingressclass
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"fmt"
|
|
||||||
"reflect"
|
"reflect"
|
||||||
"testing"
|
"testing"
|
||||||
|
"time"
|
||||||
|
|
||||||
networkingv1 "k8s.io/api/networking/v1"
|
networkingv1 "k8s.io/api/networking/v1"
|
||||||
networkingv1beta1 "k8s.io/api/networking/v1beta1"
|
networkingv1beta1 "k8s.io/api/networking/v1beta1"
|
||||||
"k8s.io/apimachinery/pkg/api/errors"
|
|
||||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
"k8s.io/apiserver/pkg/admission"
|
"k8s.io/apiserver/pkg/admission"
|
||||||
admissiontesting "k8s.io/apiserver/pkg/admission/testing"
|
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 {
|
testCases := []struct {
|
||||||
name string
|
name string
|
||||||
classes []*networkingv1.IngressClass
|
classes []*networkingv1.IngressClass
|
||||||
@ -138,12 +162,12 @@ func TestAdmission(t *testing.T) {
|
|||||||
expectedError: nil,
|
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},
|
classes: []*networkingv1.IngressClass{defaultClass1, defaultClass2, classWithFalseDefault, classWithNoDefault, classWithEmptyDefault},
|
||||||
classField: nil,
|
classField: nil,
|
||||||
classAnnotation: nil,
|
classAnnotation: nil,
|
||||||
expectedClass: nil,
|
expectedClass: utilpointer.StringPtr(defaultClass1.Name),
|
||||||
expectedError: errors.NewForbidden(networkingv1.Resource("ingresses"), "testing", errors.NewInternalError(fmt.Errorf("2 default IngressClasses were found, only 1 allowed"))),
|
expectedError: nil,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "two defaults, no modification with Ingress with class field=''",
|
name: "two defaults, no modification with Ingress with class field=''",
|
||||||
@ -153,6 +177,14 @@ func TestAdmission(t *testing.T) {
|
|||||||
expectedClass: utilpointer.StringPtr(""),
|
expectedClass: utilpointer.StringPtr(""),
|
||||||
expectedError: nil,
|
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 {
|
for _, testCase := range testCases {
|
||||||
|
Loading…
Reference in New Issue
Block a user