@@ -36,6 +36,7 @@ import (
36
36
utilfeature "k8s.io/apiserver/pkg/util/feature"
37
37
utilversion "k8s.io/apiserver/pkg/util/version"
38
38
"k8s.io/component-base/featuregate"
39
+ baseversion "k8s.io/component-base/version"
39
40
"k8s.io/sample-apiserver/pkg/admission/plugin/banflunder"
40
41
"k8s.io/sample-apiserver/pkg/admission/wardleinitializer"
41
42
"k8s.io/sample-apiserver/pkg/apis/wardle/v1alpha1"
@@ -59,14 +60,18 @@ type WardleServerOptions struct {
59
60
AlternateDNS []string
60
61
}
61
62
62
- func wardleEmulationVersionToKubeEmulationVersion (ver * version.Version ) * version.Version {
63
+ func WardleVersionToKubeVersion (ver * version.Version ) * version.Version {
63
64
if ver .Major () != 1 {
64
65
return nil
65
66
}
66
67
kubeVer := utilversion .DefaultKubeEffectiveVersion ().BinaryVersion ()
67
- // "1.1" maps to kubeVer
68
- offset := int (ver .Minor ()) - 1
69
- return kubeVer .OffsetMinor (offset )
68
+ // "1.2" maps to kubeVer
69
+ offset := int (ver .Minor ()) - 2
70
+ mappedVer := kubeVer .OffsetMinor (offset )
71
+ if mappedVer .GreaterThan (kubeVer ) {
72
+ return kubeVer
73
+ }
74
+ return mappedVer
70
75
}
71
76
72
77
// NewWardleServerOptions returns a new WardleServerOptions
@@ -112,19 +117,44 @@ func NewCommandStartWardleServer(ctx context.Context, defaults *WardleServerOpti
112
117
flags := cmd .Flags ()
113
118
o .RecommendedOptions .AddFlags (flags )
114
119
115
- wardleEffectiveVersion := utilversion .NewEffectiveVersion ("1.2" )
116
- wardleFeatureGate := utilfeature .DefaultFeatureGate .CopyKnownFeatures ()
120
+ // The following lines demonstrate how to configure version compatibility and feature gates
121
+ // for the "Wardle" component, as an example of KEP-4330.
122
+
123
+ // Create an effective version object for the "Wardle" component.
124
+ // This initializes the binary version, the emulation version and the minimum compatibility version.
125
+ //
126
+ // Note:
127
+ // - The binary version represents the actual version of the running source code.
128
+ // - The emulation version is the version whose capabilities are being emulated by the binary.
129
+ // - The minimum compatibility version specifies the minimum version that the component remains compatible with.
130
+ //
131
+ // Refer to KEP-4330 for more details: https://github.com/kubernetes/enhancements/blob/master/keps/sig-architecture/4330-compatibility-versions
132
+ defaultWardleVersion := "1.2"
133
+ // Register the "Wardle" component with the global component registry,
134
+ // associating it with its effective version and feature gate configuration.
135
+ // Will skip if the component has been registered, like in the integration test.
136
+ _ , wardleFeatureGate := utilversion .DefaultComponentGlobalsRegistry .ComponentGlobalsOrRegister (
137
+ apiserver .WardleComponentName , utilversion .NewEffectiveVersion (defaultWardleVersion ),
138
+ featuregate .NewVersionedFeatureGate (version .MustParse (defaultWardleVersion )))
139
+
140
+ // Add versioned feature specifications for the "BanFlunder" feature.
141
+ // These specifications, together with the effective version, determine if the feature is enabled.
117
142
utilruntime .Must (wardleFeatureGate .AddVersioned (map [featuregate.Feature ]featuregate.VersionedSpecs {
118
143
"BanFlunder" : {
119
- {Version : version .MustParse ("1.2" ), Default : true , PreRelease : featuregate .GA },
120
- {Version : version .MustParse ("1.1" ), Default : false , PreRelease : featuregate .Beta },
144
+ {Version : version .MustParse ("1.2" ), Default : true , PreRelease : featuregate .GA , LockToDefault : true },
145
+ {Version : version .MustParse ("1.1" ), Default : true , PreRelease : featuregate .Beta },
121
146
{Version : version .MustParse ("1.0" ), Default : false , PreRelease : featuregate .Alpha },
122
147
},
123
148
}))
124
- utilruntime .Must (utilversion .DefaultComponentGlobalsRegistry .Register (apiserver .WardleComponentName , wardleEffectiveVersion , wardleFeatureGate ))
125
- _ , _ = utilversion .DefaultComponentGlobalsRegistry .ComponentGlobalsOrRegister (
126
- utilversion .DefaultKubeComponent , utilversion .DefaultKubeEffectiveVersion (), utilfeature .DefaultMutableFeatureGate )
127
- utilruntime .Must (utilversion .DefaultComponentGlobalsRegistry .SetEmulationVersionMapping (apiserver .WardleComponentName , utilversion .DefaultKubeComponent , wardleEmulationVersionToKubeEmulationVersion ))
149
+
150
+ // Register the default kube component if not already present in the global registry.
151
+ _ , _ = utilversion .DefaultComponentGlobalsRegistry .ComponentGlobalsOrRegister (utilversion .DefaultKubeComponent ,
152
+ utilversion .NewEffectiveVersion (baseversion .DefaultKubeBinaryVersion ), utilfeature .DefaultMutableFeatureGate )
153
+
154
+ // Set the emulation version mapping from the "Wardle" component to the kube component.
155
+ // This ensures that the emulation version of the latter is determined by the emulation version of the former.
156
+ utilruntime .Must (utilversion .DefaultComponentGlobalsRegistry .SetEmulationVersionMapping (apiserver .WardleComponentName , utilversion .DefaultKubeComponent , WardleVersionToKubeVersion ))
157
+
128
158
utilversion .DefaultComponentGlobalsRegistry .AddFlags (flags )
129
159
130
160
return cmd
@@ -177,7 +207,7 @@ func (o *WardleServerOptions) Config() (*apiserver.Config, error) {
177
207
serverConfig .OpenAPIV3Config .Info .Title = "Wardle"
178
208
serverConfig .OpenAPIV3Config .Info .Version = "0.1"
179
209
180
- serverConfig .FeatureGate = utilversion .DefaultComponentGlobalsRegistry .FeatureGateFor (apiserver . WardleComponentName )
210
+ serverConfig .FeatureGate = utilversion .DefaultComponentGlobalsRegistry .FeatureGateFor (utilversion . DefaultKubeComponent )
181
211
serverConfig .EffectiveVersion = utilversion .DefaultComponentGlobalsRegistry .EffectiveVersionFor (apiserver .WardleComponentName )
182
212
183
213
if err := o .RecommendedOptions .ApplyTo (serverConfig ); err != nil {
0 commit comments