forked from gardener/gardener
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathfeaturegates.go
331 lines (316 loc) · 34 KB
/
featuregates.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
// SPDX-FileCopyrightText: 2024 SAP SE or an SAP affiliate company and Gardener contributors
//
// SPDX-License-Identifier: Apache-2.0
package features
import (
"fmt"
"k8s.io/apimachinery/pkg/util/validation/field"
versionutils "github.com/gardener/gardener/pkg/utils/version"
)
// featureGateVersionRanges contains the version ranges for all Kubernetes feature gates.
// Extracted from https://raw.githubusercontent.com/kubernetes/kubernetes/release-${version}/pkg/features/kube_features.go.
// To maintain this list for each new Kubernetes version:
// - Run hack/compare-k8s-feature-gates.sh <old-version> <new-version> (e.g. 'hack/compare-k8s-feature-gates.sh 1.26 1.27').
// It will present 3 lists of feature gates: those added and those removed in <new-version> compared to <old-version> and
// feature gates that got locked to default in `<new-version>`.
// - Add all added feature gates to the map with <new-version> as AddedInVersion and no RemovedInVersion.
// - For any removed feature gates, add <new-version> as RemovedInVersion to the already existing feature gate in the map.
// - For feature gates locked to default, add `<new-version>` as LockedToDefaultInVersion to the already existing feature gate in the map.
var featureGateVersionRanges = map[string]*FeatureGateVersionRange{
// These are special feature gates to toggle all alpha or beta feature gates on and off.
// They were introduced in version 1.17 (although they are absent from the corresponding kube_features.go file).
"AllAlpha": {VersionRange: versionutils.VersionRange{AddedInVersion: "1.17"}},
"AllBeta": {VersionRange: versionutils.VersionRange{AddedInVersion: "1.17"}},
"AdmissionWebhookMatchConditions": {Default: true, LockedToDefaultInVersion: "1.30", VersionRange: versionutils.VersionRange{AddedInVersion: "1.27"}},
"AllowDNSOnlyNodeCSR": {VersionRange: versionutils.VersionRange{AddedInVersion: "1.31"}},
"AllowInsecureKubeletCertificateSigningRequests": {VersionRange: versionutils.VersionRange{AddedInVersion: "1.31"}},
"AllowServiceLBStatusOnNonLB": {VersionRange: versionutils.VersionRange{AddedInVersion: "1.29"}},
"APIListChunking": {Default: true, LockedToDefaultInVersion: "1.29"},
"APIPriorityAndFairness": {Default: true, LockedToDefaultInVersion: "1.29", VersionRange: versionutils.VersionRange{RemovedInVersion: "1.31"}},
"APIResponseCompression": {},
"APISelfSubjectReview": {Default: true, LockedToDefaultInVersion: "1.28", VersionRange: versionutils.VersionRange{AddedInVersion: "1.26", RemovedInVersion: "1.30"}},
"APIServerIdentity": {},
"APIServerTracing": {},
"APIServingWithRoutine": {VersionRange: versionutils.VersionRange{AddedInVersion: "1.30"}},
"AdvancedAuditing": {Default: true, LockedToDefaultInVersion: "1.27", VersionRange: versionutils.VersionRange{RemovedInVersion: "1.28"}},
"AggregatedDiscoveryEndpoint": {Default: true, LockedToDefaultInVersion: "1.30", VersionRange: versionutils.VersionRange{AddedInVersion: "1.26"}},
"AnonymousAuthConfigurableEndpoints": {VersionRange: versionutils.VersionRange{AddedInVersion: "1.31"}},
"AnyVolumeDataSource": {},
"AppArmor": {Default: true, LockedToDefaultInVersion: "1.31"},
"AppArmorFields": {Default: true, LockedToDefaultInVersion: "1.31", VersionRange: versionutils.VersionRange{AddedInVersion: "1.30"}},
"AuthorizeNodeWithSelectors": {VersionRange: versionutils.VersionRange{AddedInVersion: "1.31"}},
"AuthorizeWithSelectors": {VersionRange: versionutils.VersionRange{AddedInVersion: "1.31"}},
"CloudControllerManagerWebhook": {VersionRange: versionutils.VersionRange{AddedInVersion: "1.27"}},
"CloudDualStackNodeIPs": {Default: true, LockedToDefaultInVersion: "1.30", VersionRange: versionutils.VersionRange{AddedInVersion: "1.27"}},
"ClusterTrustBundle": {VersionRange: versionutils.VersionRange{AddedInVersion: "1.27"}},
"ClusterTrustBundleProjection": {VersionRange: versionutils.VersionRange{AddedInVersion: "1.29"}},
"ComponentSLIs": {VersionRange: versionutils.VersionRange{AddedInVersion: "1.26"}},
"ConcurrentWatchObjectDecode": {VersionRange: versionutils.VersionRange{AddedInVersion: "1.31"}},
"ContainerCheckpoint": {},
"ContextualLogging": {Default: true, LockedToDefaultInVersion: "1.30"},
"ControllerManagerLeaderMigration": {Default: true, LockedToDefaultInVersion: "1.24", VersionRange: versionutils.VersionRange{RemovedInVersion: "1.27"}}, // Missing from docu?
"ConsistentHTTPGetHandlers": {Default: true, LockedToDefaultInVersion: "1.30", VersionRange: versionutils.VersionRange{AddedInVersion: "1.26", RemovedInVersion: "1.31"}},
"ConsistentListFromCache": {VersionRange: versionutils.VersionRange{AddedInVersion: "1.28"}},
"CoordinatedLeaderElection": {VersionRange: versionutils.VersionRange{AddedInVersion: "1.31"}},
"CPUManager": {Default: true, LockedToDefaultInVersion: "1.26"},
"CPUManagerPolicyAlphaOptions": {},
"CPUManagerPolicyBetaOptions": {},
"CPUManagerPolicyOptions": {},
"CRDValidationRatcheting": {VersionRange: versionutils.VersionRange{AddedInVersion: "1.28"}},
"CronJobsScheduledAnnotation": {VersionRange: versionutils.VersionRange{AddedInVersion: "1.28"}},
"CronJobTimeZone": {Default: true, LockedToDefaultInVersion: "1.27", VersionRange: versionutils.VersionRange{RemovedInVersion: "1.29"}},
"CrossNamespaceVolumeDataSource": {VersionRange: versionutils.VersionRange{AddedInVersion: "1.26"}},
"CSIInlineVolume": {Default: true, LockedToDefaultInVersion: "1.25", VersionRange: versionutils.VersionRange{RemovedInVersion: "1.27"}},
"CSIMigration": {Default: true, LockedToDefaultInVersion: "1.25", VersionRange: versionutils.VersionRange{RemovedInVersion: "1.27"}},
"CSIMigrationAWS": {Default: true, LockedToDefaultInVersion: "1.25", VersionRange: versionutils.VersionRange{RemovedInVersion: "1.27"}},
"CSIMigrationAzureDisk": {Default: true, LockedToDefaultInVersion: "1.25", VersionRange: versionutils.VersionRange{RemovedInVersion: "1.27"}},
"CSIMigrationAzureFile": {Default: true, LockedToDefaultInVersion: "1.27", VersionRange: versionutils.VersionRange{RemovedInVersion: "1.30"}},
"CSIMigrationGCE": {Default: true, LockedToDefaultInVersion: "1.25", VersionRange: versionutils.VersionRange{RemovedInVersion: "1.28"}},
"CSIMigrationOpenStack": {Default: true, LockedToDefaultInVersion: "1.24", VersionRange: versionutils.VersionRange{RemovedInVersion: "1.26"}},
"CSIMigrationPortworx": {},
"CSIMigrationRBD": {VersionRange: versionutils.VersionRange{RemovedInVersion: "1.31"}},
"CSIMigrationvSphere": {Default: true, LockedToDefaultInVersion: "1.27", VersionRange: versionutils.VersionRange{RemovedInVersion: "1.29"}},
"CSINodeExpandSecret": {Default: true, LockedToDefaultInVersion: "1.29", VersionRange: versionutils.VersionRange{RemovedInVersion: "1.31"}},
"CSIStorageCapacity": {Default: true, LockedToDefaultInVersion: "1.24", VersionRange: versionutils.VersionRange{RemovedInVersion: "1.28"}},
"CSIVolumeHealth": {},
"CSRDuration": {Default: true, LockedToDefaultInVersion: "1.24", VersionRange: versionutils.VersionRange{RemovedInVersion: "1.26"}},
"CustomCPUCFSQuotaPeriod": {},
"CustomResourceFieldSelectors": {VersionRange: versionutils.VersionRange{AddedInVersion: "1.30"}},
"CustomResourceValidationExpressions": {Default: true, LockedToDefaultInVersion: "1.29", VersionRange: versionutils.VersionRange{RemovedInVersion: "1.31"}},
"DaemonSetUpdateSurge": {Default: true, LockedToDefaultInVersion: "1.25", VersionRange: versionutils.VersionRange{RemovedInVersion: "1.27"}}, // Missing from docu?
"DefaultHostNetworkHostPortsInPodTemplates": {VersionRange: versionutils.VersionRange{AddedInVersion: "1.28", RemovedInVersion: "1.31"}},
"DefaultPodTopologySpread": {Default: true, LockedToDefaultInVersion: "1.24", VersionRange: versionutils.VersionRange{RemovedInVersion: "1.26"}},
"DelegateFSGroupToCSIDriver": {Default: true, LockedToDefaultInVersion: "1.26", VersionRange: versionutils.VersionRange{RemovedInVersion: "1.28"}},
"DevicePluginCDIDevices": {Default: true, LockedToDefaultInVersion: "1.31", VersionRange: versionutils.VersionRange{AddedInVersion: "1.28"}},
"DevicePlugins": {Default: true, LockedToDefaultInVersion: "1.26", VersionRange: versionutils.VersionRange{RemovedInVersion: "1.28"}},
"DisableAcceleratorUsageMetrics": {Default: true, LockedToDefaultInVersion: "1.25", VersionRange: versionutils.VersionRange{RemovedInVersion: "1.28"}},
"DisableAllocatorDualWrite": {VersionRange: versionutils.VersionRange{AddedInVersion: "1.31"}},
"DisableCloudProviders": {Default: true, LockedToDefaultInVersion: "1.31"},
"DisableKubeletCloudCredentialProviders": {Default: true, LockedToDefaultInVersion: "1.31"},
"DisableNodeKubeProxyVersion": {VersionRange: versionutils.VersionRange{AddedInVersion: "1.29"}},
"DownwardAPIHugePages": {Default: true, LockedToDefaultInVersion: "1.27", VersionRange: versionutils.VersionRange{RemovedInVersion: "1.29"}},
"DRAControlPlaneController": {VersionRange: versionutils.VersionRange{AddedInVersion: "1.31"}},
"DryRun": {Default: true, LockedToDefaultInVersion: "1.26", VersionRange: versionutils.VersionRange{RemovedInVersion: "1.28"}},
"DynamicKubeletConfig": {VersionRange: versionutils.VersionRange{RemovedInVersion: "1.26"}},
"DynamicResourceAllocation": {VersionRange: versionutils.VersionRange{AddedInVersion: "1.26"}},
"EfficientWatchResumption": {Default: true, LockedToDefaultInVersion: "1.24"},
"ElasticIndexedJob": {Default: true, LockedToDefaultInVersion: "1.31", VersionRange: versionutils.VersionRange{AddedInVersion: "1.27"}},
"EndpointSliceTerminatingCondition": {Default: true, LockedToDefaultInVersion: "1.26", VersionRange: versionutils.VersionRange{RemovedInVersion: "1.28"}},
"EphemeralContainers": {Default: true, LockedToDefaultInVersion: "1.25", VersionRange: versionutils.VersionRange{RemovedInVersion: "1.27"}},
"EventedPLEG": {VersionRange: versionutils.VersionRange{AddedInVersion: "1.26"}},
"ExecProbeTimeout": {},
"ExpandCSIVolumes": {Default: true, VersionRange: versionutils.VersionRange{RemovedInVersion: "1.27"}},
"ExpandedDNSConfig": {Default: true, LockedToDefaultInVersion: "1.28", VersionRange: versionutils.VersionRange{RemovedInVersion: "1.30"}},
"ExpandInUsePersistentVolumes": {Default: true, VersionRange: versionutils.VersionRange{RemovedInVersion: "1.27"}},
"ExpandPersistentVolumes": {Default: true, VersionRange: versionutils.VersionRange{RemovedInVersion: "1.27"}},
"ExperimentalHostUserNamespaceDefaulting": {Default: false, LockedToDefaultInVersion: "1.28", VersionRange: versionutils.VersionRange{RemovedInVersion: "1.30"}},
"GRPCContainerProbe": {Default: true, LockedToDefaultInVersion: "1.27", VersionRange: versionutils.VersionRange{RemovedInVersion: "1.29"}},
"GracefulNodeShutdown": {},
"GracefulNodeShutdownBasedOnPodPriority": {},
"HonorPVReclaimPolicy": {},
"HPAContainerMetrics": {Default: true, LockedToDefaultInVersion: "1.30"},
"HPAScaleToZero": {},
"IPv6DualStack": {Default: true, LockedToDefaultInVersion: "1.23", VersionRange: versionutils.VersionRange{RemovedInVersion: "1.27"}},
"IPTablesOwnershipCleanup": {Default: true, LockedToDefaultInVersion: "1.28", VersionRange: versionutils.VersionRange{RemovedInVersion: "1.30"}},
"IdentifyPodOS": {Default: true, LockedToDefaultInVersion: "1.25", VersionRange: versionutils.VersionRange{RemovedInVersion: "1.27"}},
"ImageMaximumGCAge": {VersionRange: versionutils.VersionRange{AddedInVersion: "1.29"}},
"ImageVolume": {VersionRange: versionutils.VersionRange{AddedInVersion: "1.31"}},
"InPlacePodVerticalScaling": {VersionRange: versionutils.VersionRange{AddedInVersion: "1.27"}},
"InTreePluginAWSUnregister": {VersionRange: versionutils.VersionRange{RemovedInVersion: "1.31"}},
"InTreePluginAzureDiskUnregister": {VersionRange: versionutils.VersionRange{RemovedInVersion: "1.31"}},
"InTreePluginAzureFileUnregister": {VersionRange: versionutils.VersionRange{RemovedInVersion: "1.31"}},
"InTreePluginGCEUnregister": {VersionRange: versionutils.VersionRange{RemovedInVersion: "1.31"}},
"InTreePluginOpenStackUnregister": {VersionRange: versionutils.VersionRange{RemovedInVersion: "1.31"}},
"InTreePluginPortworxUnregister": {},
"InTreePluginRBDUnregister": {VersionRange: versionutils.VersionRange{RemovedInVersion: "1.31"}},
"InTreePluginvSphereUnregister": {VersionRange: versionutils.VersionRange{RemovedInVersion: "1.31"}},
"IndexedJob": {Default: true, LockedToDefaultInVersion: "1.24", VersionRange: versionutils.VersionRange{RemovedInVersion: "1.26"}},
"InformerResourceVersion": {VersionRange: versionutils.VersionRange{AddedInVersion: "1.30"}},
"JobBackoffLimitPerIndex": {VersionRange: versionutils.VersionRange{AddedInVersion: "1.28"}},
"JobManagedBy": {VersionRange: versionutils.VersionRange{AddedInVersion: "1.30"}},
"JobMutableNodeSchedulingDirectives": {Default: true, LockedToDefaultInVersion: "1.27", VersionRange: versionutils.VersionRange{RemovedInVersion: "1.29"}},
"JobPodFailurePolicy": {Default: true, LockedToDefaultInVersion: "1.31"},
"JobPodReplacementPolicy": {VersionRange: versionutils.VersionRange{AddedInVersion: "1.28"}},
"JobReadyPods": {Default: true, LockedToDefaultInVersion: "1.29", VersionRange: versionutils.VersionRange{RemovedInVersion: "1.31"}},
"JobSuccessPolicy": {VersionRange: versionutils.VersionRange{AddedInVersion: "1.30"}},
"JobTrackingWithFinalizers": {Default: true, LockedToDefaultInVersion: "1.26", VersionRange: versionutils.VersionRange{RemovedInVersion: "1.29"}},
"KMSv1": {VersionRange: versionutils.VersionRange{AddedInVersion: "1.28"}},
"KMSv2": {Default: true, LockedToDefaultInVersion: "1.29"},
"KMSv2KDF": {Default: true, LockedToDefaultInVersion: "1.29", VersionRange: versionutils.VersionRange{AddedInVersion: "1.28"}},
"KubeletCgroupDriverFromCRI": {VersionRange: versionutils.VersionRange{AddedInVersion: "1.28"}},
"KubeletCredentialProviders": {Default: true, LockedToDefaultInVersion: "1.26", VersionRange: versionutils.VersionRange{RemovedInVersion: "1.28"}},
"KubeletInUserNamespace": {},
"KubeletPodResources": {Default: true, LockedToDefaultInVersion: "1.28", VersionRange: versionutils.VersionRange{RemovedInVersion: "1.30"}},
"KubeletPodResourcesDynamicResources": {VersionRange: versionutils.VersionRange{AddedInVersion: "1.27"}},
"KubeletPodResourcesGet": {VersionRange: versionutils.VersionRange{AddedInVersion: "1.27"}},
"KubeletPodResourcesGetAllocatable": {Default: true, LockedToDefaultInVersion: "1.28", VersionRange: versionutils.VersionRange{RemovedInVersion: "1.30"}},
"KubeletSeparateDiskGC": {VersionRange: versionutils.VersionRange{AddedInVersion: "1.29"}},
"KubeletTracing": {},
"KubeProxyDrainingTerminatingNodes": {Default: true, LockedToDefaultInVersion: "1.31", VersionRange: versionutils.VersionRange{AddedInVersion: "1.28"}},
"LegacyServiceAccountTokenCleanUp": {Default: true, LockedToDefaultInVersion: "1.30", VersionRange: versionutils.VersionRange{AddedInVersion: "1.28"}},
"LegacyServiceAccountTokenNoAutoGeneration": {Default: true, LockedToDefaultInVersion: "1.27", VersionRange: versionutils.VersionRange{RemovedInVersion: "1.29"}},
"LegacyServiceAccountTokenTracking": {Default: true, LockedToDefaultInVersion: "1.28", VersionRange: versionutils.VersionRange{AddedInVersion: "1.26", RemovedInVersion: "1.30"}},
"LoadBalancerIPMode": {VersionRange: versionutils.VersionRange{AddedInVersion: "1.29"}},
"LocalStorageCapacityIsolation": {Default: true, LockedToDefaultInVersion: "1.25", VersionRange: versionutils.VersionRange{RemovedInVersion: "1.27"}},
"LocalStorageCapacityIsolationFSQuotaMonitoring": {},
"LogarithmicScaleDown": {Default: true, LockedToDefaultInVersion: "1.31"},
"MatchLabelKeysInPodAffinity": {VersionRange: versionutils.VersionRange{AddedInVersion: "1.29"}},
"MatchLabelKeysInPodTopologySpread": {},
"MaxUnavailableStatefulSet": {},
"MemoryManager": {},
"MemoryQoS": {},
"MinDomainsInPodTopologySpread": {Default: true, LockedToDefaultInVersion: "1.30"},
"MinimizeIPTablesRestore": {Default: true, LockedToDefaultInVersion: "1.28", VersionRange: versionutils.VersionRange{AddedInVersion: "1.26", RemovedInVersion: "1.30"}},
"MixedProtocolLBService": {Default: true, LockedToDefaultInVersion: "1.26", VersionRange: versionutils.VersionRange{RemovedInVersion: "1.28"}},
"MultiCIDRRangeAllocator": {VersionRange: versionutils.VersionRange{RemovedInVersion: "1.29"}},
"MultiCIDRServiceAllocator": {VersionRange: versionutils.VersionRange{AddedInVersion: "1.27"}},
"MutatingAdmissionPolicy": {VersionRange: versionutils.VersionRange{AddedInVersion: "1.30"}},
"NetworkPolicyEndPort": {Default: true, LockedToDefaultInVersion: "1.25", VersionRange: versionutils.VersionRange{RemovedInVersion: "1.27"}},
"NetworkPolicyStatus": {VersionRange: versionutils.VersionRange{RemovedInVersion: "1.28"}},
"NewVolumeManagerReconstruction": {Default: true, LockedToDefaultInVersion: "1.30", VersionRange: versionutils.VersionRange{AddedInVersion: "1.27"}},
"NFTablesProxyMode": {VersionRange: versionutils.VersionRange{AddedInVersion: "1.29"}},
"NodeInclusionPolicyInPodTopologySpread": {},
"NodeLogQuery": {VersionRange: versionutils.VersionRange{AddedInVersion: "1.27"}},
"NodeOutOfServiceVolumeDetach": {Default: true, LockedToDefaultInVersion: "1.28"},
"NodeSwap": {},
"NonPreemptingPriority": {Default: true, LockedToDefaultInVersion: "1.24", VersionRange: versionutils.VersionRange{RemovedInVersion: "1.26"}},
"OpenAPIEnums": {},
"OpenAPIV3": {Default: true, LockedToDefaultInVersion: "1.27", VersionRange: versionutils.VersionRange{RemovedInVersion: "1.29"}},
"PDBUnhealthyPodEvictionPolicy": {Default: true, LockedToDefaultInVersion: "1.31", VersionRange: versionutils.VersionRange{AddedInVersion: "1.26"}},
"PersistentVolumeLastPhaseTransitionTime": {Default: true, LockedToDefaultInVersion: "1.31", VersionRange: versionutils.VersionRange{AddedInVersion: "1.28"}},
"PodAffinityNamespaceSelector": {Default: true, LockedToDefaultInVersion: "1.24", VersionRange: versionutils.VersionRange{RemovedInVersion: "1.26"}},
"PodAndContainerStatsFromCRI": {},
"PodDeletionCost": {},
"PodDisruptionConditions": {Default: true, LockedToDefaultInVersion: "1.31"},
"PodHasNetworkCondition": {VersionRange: versionutils.VersionRange{RemovedInVersion: "1.28"}},
"PodHostIPs": {Default: true, LockedToDefaultInVersion: "1.30", VersionRange: versionutils.VersionRange{AddedInVersion: "1.28"}},
"PodIndexLabel": {VersionRange: versionutils.VersionRange{AddedInVersion: "1.28"}},
"PodLifecycleSleepAction": {VersionRange: versionutils.VersionRange{AddedInVersion: "1.29"}},
"PodOverhead": {Default: true, LockedToDefaultInVersion: "1.24", VersionRange: versionutils.VersionRange{RemovedInVersion: "1.26"}},
"PodReadyToStartContainersCondition": {VersionRange: versionutils.VersionRange{AddedInVersion: "1.28"}},
"PodSchedulingReadiness": {Default: true, LockedToDefaultInVersion: "1.30", VersionRange: versionutils.VersionRange{AddedInVersion: "1.26"}},
"PodSecurity": {Default: true, LockedToDefaultInVersion: "1.25", VersionRange: versionutils.VersionRange{RemovedInVersion: "1.28"}},
"PortForwardWebsockets": {VersionRange: versionutils.VersionRange{AddedInVersion: "1.30"}},
"PreferNominatedNode": {Default: true, LockedToDefaultInVersion: "1.24", VersionRange: versionutils.VersionRange{RemovedInVersion: "1.26"}}, // Missing from docu?
"ProbeTerminationGracePeriod": {Default: true, LockedToDefaultInVersion: "1.28", VersionRange: versionutils.VersionRange{RemovedInVersion: "1.29"}},
"ProcMountType": {},
"ProxyTerminatingEndpoints": {Default: true, LockedToDefaultInVersion: "1.28", VersionRange: versionutils.VersionRange{RemovedInVersion: "1.30"}},
"QOSReserved": {},
"ReadWriteOncePod": {Default: true, LockedToDefaultInVersion: "1.29", VersionRange: versionutils.VersionRange{RemovedInVersion: "1.31"}},
"RecoverVolumeExpansionFailure": {},
"RecursiveReadOnlyMounts": {VersionRange: versionutils.VersionRange{AddedInVersion: "1.30"}},
"RelaxedEnvironmentVariableValidation": {VersionRange: versionutils.VersionRange{AddedInVersion: "1.30"}},
"ReloadKubeletServerCertificateFile": {VersionRange: versionutils.VersionRange{AddedInVersion: "1.31"}},
"RemainingItemCount": {Default: true, LockedToDefaultInVersion: "1.29"},
"RemoveSelfLink": {Default: true, LockedToDefaultInVersion: "1.24", VersionRange: versionutils.VersionRange{RemovedInVersion: "1.30"}},
"ResilientWatchCacheInitialization": {VersionRange: versionutils.VersionRange{AddedInVersion: "1.31"}},
"ResourceHealthStatus": {VersionRange: versionutils.VersionRange{AddedInVersion: "1.31"}},
"RetroactiveDefaultStorageClass": {Default: true, LockedToDefaultInVersion: "1.28", VersionRange: versionutils.VersionRange{RemovedInVersion: "1.29"}},
"RetryGenerateName": {VersionRange: versionutils.VersionRange{AddedInVersion: "1.30"}},
"RotateKubeletServerCertificate": {},
"RuntimeClassInImageCriApi": {VersionRange: versionutils.VersionRange{AddedInVersion: "1.29"}},
"SchedulerQueueingHints": {VersionRange: versionutils.VersionRange{AddedInVersion: "1.28"}},
"SeccompDefault": {Default: true, LockedToDefaultInVersion: "1.27", VersionRange: versionutils.VersionRange{RemovedInVersion: "1.29"}},
"SecurityContextDeny": {VersionRange: versionutils.VersionRange{AddedInVersion: "1.27", RemovedInVersion: "1.30"}},
"SELinuxMount": {VersionRange: versionutils.VersionRange{AddedInVersion: "1.30"}},
"SELinuxMountReadWriteOncePod": {Default: true, LockedToDefaultInVersion: "1.29"},
"SeparateCacheWatchRPC": {VersionRange: versionutils.VersionRange{AddedInVersion: "1.28"}},
"SeparateTaintEvictionController": {VersionRange: versionutils.VersionRange{AddedInVersion: "1.29"}},
"ServerSideApply": {Default: true, LockedToDefaultInVersion: "1.26"},
"ServerSideFieldValidation": {Default: true, LockedToDefaultInVersion: "1.27"},
"ServiceAccountTokenJTI": {VersionRange: versionutils.VersionRange{AddedInVersion: "1.29"}},
"ServiceAccountTokenNodeBinding": {VersionRange: versionutils.VersionRange{AddedInVersion: "1.29"}},
"ServiceAccountTokenNodeBindingValidation": {VersionRange: versionutils.VersionRange{AddedInVersion: "1.29"}},
"ServiceAccountTokenPodNodeInfo": {VersionRange: versionutils.VersionRange{AddedInVersion: "1.29"}},
"ServiceInternalTrafficPolicy": {Default: true, LockedToDefaultInVersion: "1.26", VersionRange: versionutils.VersionRange{RemovedInVersion: "1.28"}},
"ServiceIPStaticSubrange": {Default: true, LockedToDefaultInVersion: "1.26", VersionRange: versionutils.VersionRange{RemovedInVersion: "1.28"}},
"ServiceLBNodePortControl": {Default: true, LockedToDefaultInVersion: "1.24", VersionRange: versionutils.VersionRange{RemovedInVersion: "1.26"}},
"ServiceLoadBalancerClass": {Default: true, LockedToDefaultInVersion: "1.24", VersionRange: versionutils.VersionRange{RemovedInVersion: "1.26"}},
"ServiceNodePortStaticSubrange": {Default: true, LockedToDefaultInVersion: "1.29", VersionRange: versionutils.VersionRange{AddedInVersion: "1.27", RemovedInVersion: "1.31"}},
"ServiceTrafficDistribution": {VersionRange: versionutils.VersionRange{AddedInVersion: "1.30"}},
"SidecarContainers": {VersionRange: versionutils.VersionRange{AddedInVersion: "1.28"}},
"SizeMemoryBackedVolumes": {},
"SkipReadOnlyValidationGCE": {VersionRange: versionutils.VersionRange{AddedInVersion: "1.28", RemovedInVersion: "1.31"}},
"StableLoadBalancerNodeSet": {Default: true, LockedToDefaultInVersion: "1.30", VersionRange: versionutils.VersionRange{AddedInVersion: "1.27"}},
"StatefulSetAutoDeletePVC": {},
"StatefulSetMinReadySeconds": {Default: true, LockedToDefaultInVersion: "1.25", VersionRange: versionutils.VersionRange{RemovedInVersion: "1.27"}},
"StatefulSetStartOrdinal": {Default: true, LockedToDefaultInVersion: "1.31", VersionRange: versionutils.VersionRange{AddedInVersion: "1.26"}},
"StorageNamespaceIndex": {VersionRange: versionutils.VersionRange{AddedInVersion: "1.30"}},
"StorageVersionAPI": {},
"StorageVersionHash": {},
"StorageVersionMigrator": {VersionRange: versionutils.VersionRange{AddedInVersion: "1.30"}},
"StrictCostEnforcementForVAP": {VersionRange: versionutils.VersionRange{AddedInVersion: "1.30"}},
"StrictCostEnforcementForWebhooks": {VersionRange: versionutils.VersionRange{AddedInVersion: "1.30"}},
"StructuredAuthenticationConfiguration": {VersionRange: versionutils.VersionRange{AddedInVersion: "1.29"}},
"StructuredAuthorizationConfiguration": {VersionRange: versionutils.VersionRange{AddedInVersion: "1.29"}},
"SupplementalGroupsPolicy": {VersionRange: versionutils.VersionRange{AddedInVersion: "1.31"}},
"SuspendJob": {Default: true, LockedToDefaultInVersion: "1.24", VersionRange: versionutils.VersionRange{RemovedInVersion: "1.26"}},
"TopologyAwareHints": {},
"TopologyManager": {Default: true, LockedToDefaultInVersion: "1.27", VersionRange: versionutils.VersionRange{RemovedInVersion: "1.29"}},
"TopologyManagerPolicyAlphaOptions": {VersionRange: versionutils.VersionRange{AddedInVersion: "1.26"}},
"TopologyManagerPolicyBetaOptions": {VersionRange: versionutils.VersionRange{AddedInVersion: "1.26"}},
"TopologyManagerPolicyOptions": {VersionRange: versionutils.VersionRange{AddedInVersion: "1.26"}},
"TranslateStreamCloseWebsocketRequests": {VersionRange: versionutils.VersionRange{AddedInVersion: "1.29"}},
"UnauthenticatedHTTP2DOSMitigation": {},
"UnknownVersionInteroperabilityProxy": {VersionRange: versionutils.VersionRange{AddedInVersion: "1.28"}},
"UserNamespacesPodSecurityStandards": {VersionRange: versionutils.VersionRange{AddedInVersion: "1.29"}},
"UserNamespacesStatelessPodsSupport": {VersionRange: versionutils.VersionRange{RemovedInVersion: "1.28"}},
"UserNamespacesSupport": {VersionRange: versionutils.VersionRange{AddedInVersion: "1.28"}},
"ValidatingAdmissionPolicy": {Default: true, LockedToDefaultInVersion: "1.30", VersionRange: versionutils.VersionRange{AddedInVersion: "1.26"}},
"VolumeAttributesClass": {VersionRange: versionutils.VersionRange{AddedInVersion: "1.29"}},
"VolumeCapacityPriority": {},
"WatchBookmark": {Default: true, LockedToDefaultInVersion: "1.17"},
"WatchCacheInitializationPostStartHook": {VersionRange: versionutils.VersionRange{AddedInVersion: "1.31"}},
"WatchFromStorageWithoutResourceVersion": {VersionRange: versionutils.VersionRange{AddedInVersion: "1.27"}},
"WatchList": {VersionRange: versionutils.VersionRange{AddedInVersion: "1.27"}},
"WatchListClient": {VersionRange: versionutils.VersionRange{AddedInVersion: "1.30"}},
"WinDSR": {},
"WinOverlay": {},
"WindowsHostNetwork": {VersionRange: versionutils.VersionRange{AddedInVersion: "1.26"}},
"WindowsHostProcessContainers": {Default: true, LockedToDefaultInVersion: "1.26", VersionRange: versionutils.VersionRange{RemovedInVersion: "1.28"}},
"ZeroLimitedNominalConcurrencyShares": {Default: true, LockedToDefaultInVersion: "1.30", VersionRange: versionutils.VersionRange{AddedInVersion: "1.29"}},
}
// IsFeatureGateSupported returns true if the given feature gate is supported for the given Kubernetes version.
// A feature gate is only supported if it's a known feature gate and its version range contains the given Kubernetes version.
func IsFeatureGateSupported(featureGate, version string) (bool, error) {
vr := featureGateVersionRanges[featureGate]
if vr == nil {
return false, fmt.Errorf("unknown feature gate %s", featureGate)
}
return vr.Contains(version)
}
// FeatureGateVersionRange represents a version range of type [AddedInVersion, RemovedInVersion).
type FeatureGateVersionRange struct {
Default bool
LockedToDefaultInVersion string
versionutils.VersionRange
}
func isFeatureLockedToDefault(featureGate, version string) (bool, error) {
var constraint string
vr := featureGateVersionRanges[featureGate]
if vr.LockedToDefaultInVersion != "" {
constraint = ">= " + vr.LockedToDefaultInVersion
return versionutils.CheckVersionMeetsConstraint(version, constraint)
}
return false, nil
}
// ValidateFeatureGates validates the given Kubernetes feature gates against the given Kubernetes version.
func ValidateFeatureGates(featureGates map[string]bool, version string, fldPath *field.Path) field.ErrorList {
allErrs := field.ErrorList{}
for featureGate := range featureGates {
supported, err := IsFeatureGateSupported(featureGate, version)
if err != nil {
allErrs = append(allErrs, field.Invalid(fldPath.Child(featureGate), featureGate, err.Error()))
} else if !supported {
allErrs = append(allErrs, field.Forbidden(fldPath.Child(featureGate), "not supported in Kubernetes version "+version))
} else {
isLockedToDefault, err := isFeatureLockedToDefault(featureGate, version)
if err != nil {
allErrs = append(allErrs, field.Invalid(fldPath.Child(featureGate), featureGate, err.Error()))
} else if isLockedToDefault && featureGates[featureGate] != featureGateVersionRanges[featureGate].Default {
allErrs = append(allErrs, field.Forbidden(fldPath.Child(featureGate), fmt.Sprintf("cannot set feature gate to %v, feature is locked to %v", featureGates[featureGate], featureGateVersionRanges[featureGate].Default)))
}
}
}
return allErrs
}