Skip to content

Commit 8906223

Browse files
authored
Merge pull request kubernetes#130347 from Jefftree/remove-v2beta1-agg-discovery
Add a deprecated feature gate to stop serving apidiscovery.k8s.io/v2beta1
2 parents fd0a348 + 95d3d4a commit 8906223

File tree

11 files changed

+55
-112
lines changed

11 files changed

+55
-112
lines changed

pkg/features/versioned_kube_features.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -213,6 +213,11 @@ var defaultVersionedKubernetesFeatureGates = map[featuregate.Feature]featuregate
213213
{Version: version.MustParse("1.32"), Default: false, PreRelease: featuregate.Alpha},
214214
},
215215

216+
genericfeatures.AggregatedDiscoveryRemoveBetaType: {
217+
{Version: version.MustParse("1.0"), Default: false, PreRelease: featuregate.GA},
218+
{Version: version.MustParse("1.33"), Default: true, PreRelease: featuregate.Deprecated},
219+
},
220+
216221
genericfeatures.AllowParsingUserUIDFromCertAuth: {
217222
{Version: version.MustParse("1.33"), Default: true, PreRelease: featuregate.Beta},
218223
},

staging/src/k8s.io/apiserver/pkg/endpoints/discovery/aggregated/handler.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ import (
2929
"k8s.io/apimachinery/pkg/runtime/serializer"
3030
"k8s.io/apimachinery/pkg/version"
3131
apidiscoveryv2conversion "k8s.io/apiserver/pkg/apis/apidiscovery/v2"
32+
genericfeatures "k8s.io/apiserver/pkg/features"
3233

3334
"k8s.io/apiserver/pkg/endpoints/handlers/responsewriters"
3435

@@ -40,6 +41,7 @@ import (
4041
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
4142
"k8s.io/apimachinery/pkg/runtime"
4243
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
44+
utilfeature "k8s.io/apiserver/pkg/util/feature"
4345
"k8s.io/klog/v2"
4446
)
4547

@@ -538,6 +540,14 @@ func (rdm *resourceDiscoveryManager) serveHTTP(resp http.ResponseWriter, req *ht
538540
resp.WriteHeader(http.StatusInternalServerError)
539541
return
540542
}
543+
544+
if mediaType.Convert.GroupVersion() == apidiscoveryv2beta1.SchemeGroupVersion &&
545+
utilfeature.DefaultFeatureGate.Enabled(genericfeatures.AggregatedDiscoveryRemoveBetaType) {
546+
klog.Errorf("aggregated discovery version v2beta1 is removed. Please update to use v2")
547+
resp.WriteHeader(http.StatusNotFound)
548+
return
549+
}
550+
541551
targetGV = mediaType.Convert.GroupVersion()
542552

543553
if len(etag) > 0 {

staging/src/k8s.io/apiserver/pkg/endpoints/discovery/aggregated/handler_test.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,9 @@ import (
4343
"k8s.io/apimachinery/pkg/version"
4444
apidiscoveryv2conversion "k8s.io/apiserver/pkg/apis/apidiscovery/v2"
4545
discoveryendpoint "k8s.io/apiserver/pkg/endpoints/discovery/aggregated"
46+
genericfeatures "k8s.io/apiserver/pkg/features"
47+
utilfeature "k8s.io/apiserver/pkg/util/feature"
48+
featuregatetesting "k8s.io/component-base/featuregate/testing"
4649
)
4750

4851
var scheme = runtime.NewScheme()
@@ -187,6 +190,7 @@ func TestBasicResponseProtobuf(t *testing.T) {
187190

188191
// V2Beta1 should still be served
189192
func TestV2Beta1SkewSupport(t *testing.T) {
193+
featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, genericfeatures.AggregatedDiscoveryRemoveBetaType, false)
190194
manager := discoveryendpoint.NewResourceManager("apis")
191195

192196
apis := fuzzAPIGroups(1, 3, 10)

staging/src/k8s.io/apiserver/pkg/endpoints/discovery/aggregated/negotiation.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,9 @@ package aggregated
1818

1919
import (
2020
"k8s.io/apimachinery/pkg/runtime/schema"
21+
22+
genericfeatures "k8s.io/apiserver/pkg/features"
23+
utilfeature "k8s.io/apiserver/pkg/util/feature"
2124
)
2225

2326
// Interface is from "k8s.io/apiserver/pkg/endpoints/handlers/negotiation"
@@ -37,6 +40,9 @@ func (discoveryEndpointRestrictions) AllowsStreamSchema(s string) bool { return
3740
// IsAggregatedDiscoveryGVK checks if a provided GVK is the GVK for serving aggregated discovery.
3841
func IsAggregatedDiscoveryGVK(gvk *schema.GroupVersionKind) bool {
3942
if gvk != nil {
43+
if utilfeature.DefaultFeatureGate.Enabled(genericfeatures.AggregatedDiscoveryRemoveBetaType) {
44+
return gvk.Group == "apidiscovery.k8s.io" && gvk.Version == "v2" && gvk.Kind == "APIGroupDiscoveryList"
45+
}
4046
return gvk.Group == "apidiscovery.k8s.io" && (gvk.Version == "v2beta1" || gvk.Version == "v2") && gvk.Kind == "APIGroupDiscoveryList"
4147
}
4248
return false

staging/src/k8s.io/apiserver/pkg/endpoints/discovery/aggregated/wrapper_test.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,9 @@ import (
2424
"testing"
2525

2626
"github.com/stretchr/testify/assert"
27+
genericfeatures "k8s.io/apiserver/pkg/features"
28+
utilfeature "k8s.io/apiserver/pkg/util/feature"
29+
featuregatetesting "k8s.io/component-base/featuregate/testing"
2730
)
2831

2932
const discoveryPath = "/apis"
@@ -103,6 +106,9 @@ func TestAggregationEnabled(t *testing.T) {
103106
}
104107

105108
for _, tc := range testCases {
109+
if tc.accept == aggregatedV2Beta1JSONAccept || tc.accept == aggregatedV2Beta1ProtoAccept {
110+
featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, genericfeatures.AggregatedDiscoveryRemoveBetaType, false)
111+
}
106112
body := fetchPath(wrapped, discoveryPath, tc.accept)
107113
assert.Equal(t, tc.expected, body)
108114
}

staging/src/k8s.io/apiserver/pkg/features/kube_features.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,13 @@ const (
3434
// of code conflicts because changes are more likely to be scattered
3535
// across the file.
3636

37+
// owner: @jefftree
38+
//
39+
// Remove the v2beta1 apidiscovery.k8s.io/v2beta1 group version. Aggregated
40+
// discovery implements its own handlers and follows a different lifecycle than
41+
// traditional k8s resources.
42+
AggregatedDiscoveryRemoveBetaType featuregate.Feature = "AggregatedDiscoveryRemoveBetaType"
43+
3744
// owner: @modulitos
3845
//
3946
// Allow user.DefaultInfo.UID to be set from x509 cert during cert auth.
@@ -250,6 +257,11 @@ func init() {
250257
// Entries are alphabetized and separated from each other with blank lines to avoid sweeping gofmt changes
251258
// when adding or removing one entry.
252259
var defaultVersionedKubernetesFeatureGates = map[featuregate.Feature]featuregate.VersionedSpecs{
260+
AggregatedDiscoveryRemoveBetaType: {
261+
{Version: version.MustParse("1.0"), Default: false, PreRelease: featuregate.GA},
262+
{Version: version.MustParse("1.33"), Default: true, PreRelease: featuregate.Deprecated},
263+
},
264+
253265
AllowParsingUserUIDFromCertAuth: {
254266
{Version: version.MustParse("1.33"), Default: true, PreRelease: featuregate.Beta},
255267
},

staging/src/k8s.io/client-go/discovery/aggregated_discovery.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,7 @@ func convertAPISubresource(parent metav1.APIResource, in apidiscovery.APISubreso
156156
return result, nil
157157
}
158158

159-
// Please note the functions below will be removed in v1.33. They facilitate conversion
159+
// Please note the functions below will be removed in v1.35. They facilitate conversion
160160
// between the deprecated type apidiscoveryv2beta1.APIGroupDiscoveryList.
161161

162162
// SplitGroupsAndResourcesV2Beta1 transforms "aggregated" discovery top-level structure into

staging/src/k8s.io/client-go/discovery/cached/memory/memcache_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1425,7 +1425,7 @@ func TestMemCacheAggregatedServerGroups(t *testing.T) {
14251425
return
14261426
}
14271427
// Content-type is "aggregated" discovery format.
1428-
w.Header().Set("Content-Type", discovery.AcceptV2Beta1)
1428+
w.Header().Set("Content-Type", discovery.AcceptV2)
14291429
w.WriteHeader(http.StatusOK)
14301430
w.Write(output)
14311431
}))

test/compatibility_lifecycle/reference/versioned_feature_list.yaml

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,16 @@
11
# This file is generated by compatibility_lifecycle tool.
22
# Do not edit manually. Run hack/update-featuregates.sh to regenerate.
33

4+
- name: AggregatedDiscoveryRemoveBetaType
5+
versionedSpecs:
6+
- default: false
7+
lockToDefault: false
8+
preRelease: GA
9+
version: "1.0"
10+
- default: true
11+
lockToDefault: false
12+
preRelease: Deprecated
13+
version: "1.33"
414
- name: AllowDNSOnlyNodeCSR
515
versionedSpecs:
616
- default: true

test/integration/apiserver/discovery/discovery_test.go

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -388,7 +388,6 @@ func TestCRD(t *testing.T) {
388388
applyCRD(makeCRDSpec(stableGroup, "Foo", false, []string{"v1", "v1alpha1", "v1beta1", "v2"})),
389389
waitForGroupVersionsV1([]metav1.GroupVersion{stableV1, stableV1alpha1, stableV1beta1, stableV2}),
390390
waitForGroupVersionsV2([]metav1.GroupVersion{stableV1, stableV1alpha1, stableV1beta1, stableV2}),
391-
waitForGroupVersionsV2Beta1([]metav1.GroupVersion{stableV1, stableV1alpha1, stableV1beta1, stableV2}),
392391
},
393392
},
394393
{
@@ -398,7 +397,6 @@ func TestCRD(t *testing.T) {
398397
applyCRD(makeCRDSpec(stableGroup, "Foo", false, []string{"v1", "v1alpha1", "v1beta1", "v2"})),
399398
waitForGroupVersionsV1([]metav1.GroupVersion{stableV1, stableV1alpha1, stableV1beta1, stableV2}),
400399
waitForGroupVersionsV2([]metav1.GroupVersion{stableV1, stableV1alpha1, stableV1beta1, stableV2}),
401-
waitForGroupVersionsV2Beta1([]metav1.GroupVersion{stableV1, stableV1alpha1, stableV1beta1, stableV2}),
402400
deleteObject{
403401
GroupVersionResource: metav1.GroupVersionResource(apiextensionsv1.SchemeGroupVersion.WithResource("customresourcedefinitions")),
404402
Name: "foos.stable.example.com",
@@ -466,7 +464,6 @@ func TestCRD(t *testing.T) {
466464
// Wait for GV to appear in both discovery documents
467465
waitForGroupVersionsV1([]metav1.GroupVersion{stableV2, stableV1alpha1}),
468466
waitForGroupVersionsV2([]metav1.GroupVersion{stableV2, stableV1alpha1}),
469-
waitForGroupVersionsV2Beta1([]metav1.GroupVersion{stableV2, stableV1alpha1}),
470467

471468
applyAPIService(
472469
apiregistrationv1.APIServiceSpec{
@@ -485,13 +482,11 @@ func TestCRD(t *testing.T) {
485482
// We should now have stable v1 available
486483
waitForGroupVersionsV1([]metav1.GroupVersion{stableV1}),
487484
waitForGroupVersionsV2([]metav1.GroupVersion{stableV1}),
488-
waitForGroupVersionsV2Beta1([]metav1.GroupVersion{stableV1}),
489485

490486
// The CRD group-versions not served by the aggregated
491487
// apiservice should still be availablee
492488
waitForGroupVersionsV1([]metav1.GroupVersion{stableV2, stableV1alpha1}),
493489
waitForGroupVersionsV2([]metav1.GroupVersion{stableV2, stableV1alpha1}),
494-
waitForGroupVersionsV2Beta1([]metav1.GroupVersion{stableV2, stableV1alpha1}),
495490

496491
// Remove API service. Show we have switched to CRD
497492
deleteObject{
@@ -502,11 +497,9 @@ func TestCRD(t *testing.T) {
502497
// Show that we still have stable v1 since it is in the CRD
503498
waitForGroupVersionsV1([]metav1.GroupVersion{stableV2, stableV1alpha1}),
504499
waitForGroupVersionsV2([]metav1.GroupVersion{stableV2, stableV1alpha1}),
505-
waitForGroupVersionsV2Beta1([]metav1.GroupVersion{stableV2, stableV1alpha1}),
506500

507501
waitForAbsentGroupVersionsV1([]metav1.GroupVersion{stableV1}),
508502
waitForAbsentGroupVersionsV2([]metav1.GroupVersion{stableV1}),
509-
waitForAbsentGroupVersionsV2Beta1([]metav1.GroupVersion{stableV1}),
510503
},
511504
},
512505
{

0 commit comments

Comments
 (0)