Skip to content

Commit 65544c9

Browse files
authored
Merge pull request kubernetes#91957 from cmluciano/cml/ingclassadmissionv1
ingress: Update IngressClass feature and admission controller for v1
2 parents bef57a7 + 92506a9 commit 65544c9

File tree

4 files changed

+29
-50
lines changed

4 files changed

+29
-50
lines changed

pkg/features/kube_features.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -568,6 +568,7 @@ const (
568568

569569
// owner: @robscott
570570
// beta: v1.18
571+
// ga: v1.19
571572
//
572573
// Enables DefaultIngressClass admission controller.
573574
DefaultIngressClass featuregate.Feature = "DefaultIngressClass"
@@ -678,7 +679,7 @@ var defaultKubernetesFeatureGates = map[featuregate.Feature]featuregate.FeatureS
678679
ServiceTopology: {Default: false, PreRelease: featuregate.Alpha},
679680
ServiceAppProtocol: {Default: true, PreRelease: featuregate.Beta},
680681
ImmutableEphemeralVolumes: {Default: true, PreRelease: featuregate.Beta},
681-
DefaultIngressClass: {Default: true, PreRelease: featuregate.Beta},
682+
DefaultIngressClass: {Default: true, PreRelease: featuregate.GA, LockToDefault: true}, // remove in 1.20
682683
HugePageStorageMediumSize: {Default: false, PreRelease: featuregate.Alpha},
683684
ExternalPolicyForExternalIP: {Default: true, PreRelease: featuregate.GA}, // remove in 1.20
684685
AnyVolumeDataSource: {Default: false, PreRelease: featuregate.Alpha},

plugin/pkg/admission/defaultingressclass/BUILD

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,14 @@ go_library(
77
visibility = ["//visibility:public"],
88
deps = [
99
"//pkg/apis/networking:go_default_library",
10-
"//pkg/features:go_default_library",
10+
"//staging/src/k8s.io/api/networking/v1:go_default_library",
1111
"//staging/src/k8s.io/api/networking/v1beta1:go_default_library",
1212
"//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library",
1313
"//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library",
1414
"//staging/src/k8s.io/apiserver/pkg/admission:go_default_library",
1515
"//staging/src/k8s.io/apiserver/pkg/admission/initializer:go_default_library",
1616
"//staging/src/k8s.io/client-go/informers:go_default_library",
17-
"//staging/src/k8s.io/client-go/listers/networking/v1beta1:go_default_library",
18-
"//staging/src/k8s.io/component-base/featuregate:go_default_library",
17+
"//staging/src/k8s.io/client-go/listers/networking/v1:go_default_library",
1918
"//vendor/k8s.io/klog/v2:go_default_library",
2019
],
2120
)
@@ -28,6 +27,7 @@ go_test(
2827
"//pkg/apis/core:go_default_library",
2928
"//pkg/apis/networking:go_default_library",
3029
"//pkg/controller:go_default_library",
30+
"//staging/src/k8s.io/api/networking/v1:go_default_library",
3131
"//staging/src/k8s.io/api/networking/v1beta1:go_default_library",
3232
"//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library",
3333
"//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",

plugin/pkg/admission/defaultingressclass/admission.go

Lines changed: 7 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -21,17 +21,16 @@ import (
2121
"fmt"
2222
"io"
2323

24+
networkingv1 "k8s.io/api/networking/v1"
2425
networkingv1beta1 "k8s.io/api/networking/v1beta1"
2526
"k8s.io/apimachinery/pkg/api/errors"
2627
"k8s.io/apimachinery/pkg/labels"
2728
"k8s.io/apiserver/pkg/admission"
2829
genericadmissioninitializer "k8s.io/apiserver/pkg/admission/initializer"
2930
"k8s.io/client-go/informers"
30-
networkingv1beta1listers "k8s.io/client-go/listers/networking/v1beta1"
31-
"k8s.io/component-base/featuregate"
31+
networkingv1listers "k8s.io/client-go/listers/networking/v1"
3232
"k8s.io/klog/v2"
3333
"k8s.io/kubernetes/pkg/apis/networking"
34-
"k8s.io/kubernetes/pkg/features"
3534
)
3635

3736
const (
@@ -50,10 +49,7 @@ func Register(plugins *admission.Plugins) {
5049
// classDefaulterPlugin holds state for and implements the admission plugin.
5150
type classDefaulterPlugin struct {
5251
*admission.Handler
53-
lister networkingv1beta1listers.IngressClassLister
54-
55-
inspectedFeatures bool
56-
defaultIngressClassEnabled bool
52+
lister networkingv1listers.IngressClassLister
5753
}
5854

5955
var _ admission.Interface = &classDefaulterPlugin{}
@@ -67,31 +63,16 @@ func newPlugin() *classDefaulterPlugin {
6763
}
6864
}
6965

70-
// InspectFeatureGates allows setting bools without taking a dep on a global variable
71-
func (a *classDefaulterPlugin) InspectFeatureGates(featureGates featuregate.FeatureGate) {
72-
a.defaultIngressClassEnabled = featureGates.Enabled(features.DefaultIngressClass)
73-
a.inspectedFeatures = true
74-
}
75-
7666
// SetExternalKubeInformerFactory sets a lister and readyFunc for this
7767
// classDefaulterPlugin using the provided SharedInformerFactory.
7868
func (a *classDefaulterPlugin) SetExternalKubeInformerFactory(f informers.SharedInformerFactory) {
79-
if !a.defaultIngressClassEnabled {
80-
return
81-
}
82-
informer := f.Networking().V1beta1().IngressClasses()
69+
informer := f.Networking().V1().IngressClasses()
8370
a.lister = informer.Lister()
8471
a.SetReadyFunc(informer.Informer().HasSynced)
8572
}
8673

8774
// ValidateInitialization ensures lister is set.
8875
func (a *classDefaulterPlugin) ValidateInitialization() error {
89-
if !a.inspectedFeatures {
90-
return fmt.Errorf("InspectFeatureGates was not called")
91-
}
92-
if !a.defaultIngressClassEnabled {
93-
return nil
94-
}
9576
if a.lister == nil {
9677
return fmt.Errorf("missing lister")
9778
}
@@ -101,10 +82,7 @@ func (a *classDefaulterPlugin) ValidateInitialization() error {
10182
// Admit sets the default value of a Ingress's class if the user did not specify
10283
// a class.
10384
func (a *classDefaulterPlugin) Admit(ctx context.Context, attr admission.Attributes, o admission.ObjectInterfaces) error {
104-
if !a.defaultIngressClassEnabled {
105-
return nil
106-
}
107-
if attr.GetResource().GroupResource() != networkingv1beta1.Resource("ingresses") {
85+
if attr.GetResource().GroupResource() != networkingv1.Resource("ingresses") {
10886
return nil
10987
}
11088

@@ -147,13 +125,13 @@ func (a *classDefaulterPlugin) Admit(ctx context.Context, attr admission.Attribu
147125
}
148126

149127
// getDefaultClass returns the default IngressClass from the store, or nil.
150-
func getDefaultClass(lister networkingv1beta1listers.IngressClassLister) (*networkingv1beta1.IngressClass, error) {
128+
func getDefaultClass(lister networkingv1listers.IngressClassLister) (*networkingv1.IngressClass, error) {
151129
list, err := lister.List(labels.Everything())
152130
if err != nil {
153131
return nil, err
154132
}
155133

156-
defaultClasses := []*networkingv1beta1.IngressClass{}
134+
defaultClasses := []*networkingv1.IngressClass{}
157135
for _, class := range list {
158136
if class.Annotations[networkingv1beta1.AnnotationIsDefaultIngressClass] == "true" {
159137
defaultClasses = append(defaultClasses, class)

plugin/pkg/admission/defaultingressclass/admission_test.go

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import (
2222
"reflect"
2323
"testing"
2424

25+
networkingv1 "k8s.io/api/networking/v1"
2526
networkingv1beta1 "k8s.io/api/networking/v1beta1"
2627
"k8s.io/apimachinery/pkg/api/errors"
2728
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@@ -35,7 +36,7 @@ import (
3536
)
3637

3738
func TestAdmission(t *testing.T) {
38-
defaultClass1 := &networkingv1beta1.IngressClass{
39+
defaultClass1 := &networkingv1.IngressClass{
3940
TypeMeta: metav1.TypeMeta{
4041
Kind: "IngressClass",
4142
},
@@ -46,7 +47,7 @@ func TestAdmission(t *testing.T) {
4647
},
4748
},
4849
}
49-
defaultClass2 := &networkingv1beta1.IngressClass{
50+
defaultClass2 := &networkingv1.IngressClass{
5051
ObjectMeta: metav1.ObjectMeta{
5152
Name: "default2",
5253
Annotations: map[string]string{
@@ -55,7 +56,7 @@ func TestAdmission(t *testing.T) {
5556
},
5657
}
5758
// Class that has explicit default = false
58-
classWithFalseDefault := &networkingv1beta1.IngressClass{
59+
classWithFalseDefault := &networkingv1.IngressClass{
5960
TypeMeta: metav1.TypeMeta{
6061
Kind: "IngressClass",
6162
},
@@ -67,7 +68,7 @@ func TestAdmission(t *testing.T) {
6768
},
6869
}
6970
// Class with missing default annotation (=non-default)
70-
classWithNoDefault := &networkingv1beta1.IngressClass{
71+
classWithNoDefault := &networkingv1.IngressClass{
7172
TypeMeta: metav1.TypeMeta{
7273
Kind: "IngressClass",
7374
},
@@ -76,7 +77,7 @@ func TestAdmission(t *testing.T) {
7677
},
7778
}
7879
// Class with empty default annotation (=non-default)
79-
classWithEmptyDefault := &networkingv1beta1.IngressClass{
80+
classWithEmptyDefault := &networkingv1.IngressClass{
8081
TypeMeta: metav1.TypeMeta{
8182
Kind: "IngressClass",
8283
},
@@ -90,63 +91,63 @@ func TestAdmission(t *testing.T) {
9091

9192
testCases := []struct {
9293
name string
93-
classes []*networkingv1beta1.IngressClass
94+
classes []*networkingv1.IngressClass
9495
classField *string
9596
classAnnotation *string
9697
expectedClass *string
9798
expectedError error
9899
}{
99100
{
100101
name: "no default, no modification of Ingress",
101-
classes: []*networkingv1beta1.IngressClass{classWithFalseDefault, classWithNoDefault, classWithEmptyDefault},
102+
classes: []*networkingv1.IngressClass{classWithFalseDefault, classWithNoDefault, classWithEmptyDefault},
102103
classField: nil,
103104
classAnnotation: nil,
104105
expectedClass: nil,
105106
expectedError: nil,
106107
},
107108
{
108109
name: "one default, modify Ingress with class=nil",
109-
classes: []*networkingv1beta1.IngressClass{defaultClass1, classWithFalseDefault, classWithNoDefault, classWithEmptyDefault},
110+
classes: []*networkingv1.IngressClass{defaultClass1, classWithFalseDefault, classWithNoDefault, classWithEmptyDefault},
110111
classField: nil,
111112
classAnnotation: nil,
112113
expectedClass: utilpointer.StringPtr(defaultClass1.Name),
113114
expectedError: nil,
114115
},
115116
{
116117
name: "one default, no modification of Ingress with class field=''",
117-
classes: []*networkingv1beta1.IngressClass{defaultClass1, classWithFalseDefault, classWithNoDefault, classWithEmptyDefault},
118+
classes: []*networkingv1.IngressClass{defaultClass1, classWithFalseDefault, classWithNoDefault, classWithEmptyDefault},
118119
classField: utilpointer.StringPtr(""),
119120
classAnnotation: nil,
120121
expectedClass: utilpointer.StringPtr(""),
121122
expectedError: nil,
122123
},
123124
{
124125
name: "one default, no modification of Ingress with class field='foo'",
125-
classes: []*networkingv1beta1.IngressClass{defaultClass1, classWithFalseDefault, classWithNoDefault, classWithEmptyDefault},
126+
classes: []*networkingv1.IngressClass{defaultClass1, classWithFalseDefault, classWithNoDefault, classWithEmptyDefault},
126127
classField: utilpointer.StringPtr("foo"),
127128
classAnnotation: nil,
128129
expectedClass: utilpointer.StringPtr("foo"),
129130
expectedError: nil,
130131
},
131132
{
132133
name: "one default, no modification of Ingress with class annotation='foo'",
133-
classes: []*networkingv1beta1.IngressClass{defaultClass1, classWithFalseDefault, classWithNoDefault, classWithEmptyDefault},
134+
classes: []*networkingv1.IngressClass{defaultClass1, classWithFalseDefault, classWithNoDefault, classWithEmptyDefault},
134135
classField: nil,
135136
classAnnotation: utilpointer.StringPtr("foo"),
136137
expectedClass: nil,
137138
expectedError: nil,
138139
},
139140
{
140141
name: "two defaults, error with Ingress with class field=nil",
141-
classes: []*networkingv1beta1.IngressClass{defaultClass1, defaultClass2, classWithFalseDefault, classWithNoDefault, classWithEmptyDefault},
142+
classes: []*networkingv1.IngressClass{defaultClass1, defaultClass2, classWithFalseDefault, classWithNoDefault, classWithEmptyDefault},
142143
classField: nil,
143144
classAnnotation: nil,
144145
expectedClass: nil,
145-
expectedError: errors.NewForbidden(networkingv1beta1.Resource("ingresses"), "testing", errors.NewInternalError(fmt.Errorf("2 default IngressClasses were found, only 1 allowed"))),
146+
expectedError: errors.NewForbidden(networkingv1.Resource("ingresses"), "testing", errors.NewInternalError(fmt.Errorf("2 default IngressClasses were found, only 1 allowed"))),
146147
},
147148
{
148149
name: "two defaults, no modification with Ingress with class field=''",
149-
classes: []*networkingv1beta1.IngressClass{defaultClass1, defaultClass2, classWithFalseDefault, classWithNoDefault, classWithEmptyDefault},
150+
classes: []*networkingv1.IngressClass{defaultClass1, defaultClass2, classWithFalseDefault, classWithNoDefault, classWithEmptyDefault},
150151
classField: utilpointer.StringPtr(""),
151152
classAnnotation: nil,
152153
expectedClass: utilpointer.StringPtr(""),
@@ -157,11 +158,10 @@ func TestAdmission(t *testing.T) {
157158
for _, testCase := range testCases {
158159
t.Run(testCase.name, func(t *testing.T) {
159160
ctrl := newPlugin()
160-
ctrl.defaultIngressClassEnabled = true
161161
informerFactory := informers.NewSharedInformerFactory(nil, controller.NoResyncPeriodFunc())
162162
ctrl.SetExternalKubeInformerFactory(informerFactory)
163163
for _, c := range testCase.classes {
164-
informerFactory.Networking().V1beta1().IngressClasses().Informer().GetStore().Add(c)
164+
informerFactory.Networking().V1().IngressClasses().Informer().GetStore().Add(c)
165165
}
166166

167167
ingress := &networking.Ingress{ObjectMeta: metav1.ObjectMeta{Name: "testing", Namespace: "testing"}}
@@ -178,7 +178,7 @@ func TestAdmission(t *testing.T) {
178178
api.Kind("Ingress").WithVersion("version"),
179179
ingress.Namespace,
180180
ingress.Name,
181-
networkingv1beta1.Resource("ingresses").WithVersion("version"),
181+
networkingv1.Resource("ingresses").WithVersion("version"),
182182
"", // subresource
183183
admission.Create,
184184
&metav1.CreateOptions{},

0 commit comments

Comments
 (0)