Skip to content

Commit cf28c04

Browse files
committed
Expand emulated version range to n-3 with 1.31 floor
1 parent 4e8477b commit cf28c04

File tree

4 files changed

+105
-20
lines changed

4 files changed

+105
-20
lines changed

staging/src/k8s.io/apiserver/pkg/server/options/server_run_options_test.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,8 @@ import (
3434
func TestServerRunOptionsValidate(t *testing.T) {
3535
testRegistry := featuregate.NewComponentGlobalsRegistry()
3636
featureGate := utilfeature.DefaultFeatureGate.DeepCopy()
37-
effectiveVersion := utilversion.NewEffectiveVersion("1.30")
38-
effectiveVersion.SetEmulationVersion(version.MajorMinor(1, 32))
37+
effectiveVersion := utilversion.NewEffectiveVersion("1.35")
38+
effectiveVersion.SetEmulationVersion(version.MajorMinor(1, 31))
3939
testComponent := "test"
4040
utilruntime.Must(testRegistry.Register(testComponent, effectiveVersion, featureGate))
4141

@@ -197,7 +197,7 @@ func TestServerRunOptionsValidate(t *testing.T) {
197197
ComponentName: testComponent,
198198
ComponentGlobalsRegistry: testRegistry,
199199
},
200-
expectErr: "emulation version 1.32 is not between [1.29, 1.30.0]",
200+
expectErr: "emulation version 1.31 is not between [1.32, 1.35.0]",
201201
},
202202
{
203203
name: "Test when ServerRunOptions is valid",

staging/src/k8s.io/component-base/featuregate/registry_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ func TestVersionFlagOptions(t *testing.T) {
118118
func TestVersionFlagOptionsWithMapping(t *testing.T) {
119119
r := testRegistry(t)
120120
utilruntime.Must(r.SetEmulationVersionMapping(testComponent, DefaultKubeComponent,
121-
func(from *version.Version) *version.Version { return from.OffsetMinor(3) }))
121+
func(from *version.Version) *version.Version { return version.MajorMinor(1, from.Minor()+23) }))
122122
emuVers := strings.Join(r.unsafeVersionFlagOptions(true), "\n")
123123
expectedEmuVers := "test=2.8..2.8 (default=2.8)"
124124
if emuVers != expectedEmuVers {

staging/src/k8s.io/component-base/version/version.go

Lines changed: 18 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@ import (
2525
apimachineryversion "k8s.io/apimachinery/pkg/version"
2626
)
2727

28+
var minimumKubeEmulationVersion *version.Version = version.MajorMinor(1, 31)
29+
2830
type EffectiveVersion interface {
2931
BinaryVersion() *version.Version
3032
EmulationVersion() *version.Version
@@ -121,8 +123,11 @@ func (m *effectiveVersion) Set(binaryVersion, emulationVersion, minCompatibility
121123

122124
func (m *effectiveVersion) SetEmulationVersion(emulationVersion *version.Version) {
123125
m.emulationVersion.Store(majorMinor(emulationVersion))
126+
// set the default minCompatibilityVersion to be emulationVersion - 1
127+
m.minCompatibilityVersion.Store(majorMinor(emulationVersion.SubtractMinor(1)))
124128
}
125129

130+
// SetMinCompatibilityVersion should be called after SetEmulationVersion
126131
func (m *effectiveVersion) SetMinCompatibilityVersion(minCompatibilityVersion *version.Version) {
127132
m.minCompatibilityVersion.Store(majorMinor(minCompatibilityVersion))
128133
}
@@ -134,15 +139,15 @@ func (m *effectiveVersion) Validate() []error {
134139
emulationVersion := m.emulationVersion.Load()
135140
minCompatibilityVersion := m.minCompatibilityVersion.Load()
136141

137-
// emulationVersion can only be 1.{binaryMinor-1}...1.{binaryMinor}.
142+
// emulationVersion can only be 1.{binaryMinor-3}...1.{binaryMinor}
138143
maxEmuVer := binaryVersion
139-
minEmuVer := binaryVersion.SubtractMinor(1)
144+
minEmuVer := binaryVersion.SubtractMinor(3)
140145
if emulationVersion.GreaterThan(maxEmuVer) || emulationVersion.LessThan(minEmuVer) {
141146
errs = append(errs, fmt.Errorf("emulation version %s is not between [%s, %s]", emulationVersion.String(), minEmuVer.String(), maxEmuVer.String()))
142147
}
143-
// minCompatibilityVersion can only be 1.{binaryMinor-1} for alpha.
144-
maxCompVer := binaryVersion.SubtractMinor(1)
145-
minCompVer := binaryVersion.SubtractMinor(1)
148+
// minCompatibilityVersion can only be 1.{binaryMinor-3} to 1.{binaryMinor}
149+
maxCompVer := emulationVersion
150+
minCompVer := binaryVersion.SubtractMinor(4)
146151
if minCompatibilityVersion.GreaterThan(maxCompVer) || minCompatibilityVersion.LessThan(minCompVer) {
147152
errs = append(errs, fmt.Errorf("minCompatibilityVersion version %s is not between [%s, %s]", minCompatibilityVersion.String(), minCompVer.String(), maxCompVer.String()))
148153
}
@@ -187,13 +192,15 @@ func DefaultKubeEffectiveVersion() MutableEffectiveVersion {
187192
return newEffectiveVersion(binaryVersion, false)
188193
}
189194

190-
// ValidateKubeEffectiveVersion validates the EmulationVersion is equal to the binary version at 1.31 for kube components.
191-
// emulationVersion is introduced in 1.31, so it is only allowed to be equal to the binary version at 1.31.
195+
// ValidateKubeEffectiveVersion validates the EmulationVersion is at least 1.31 and MinCompatibilityVersion
196+
// is at least 1.30 for kube components.
192197
func ValidateKubeEffectiveVersion(effectiveVersion EffectiveVersion) error {
193-
binaryVersion := version.MajorMinor(effectiveVersion.BinaryVersion().Major(), effectiveVersion.BinaryVersion().Minor())
194-
if binaryVersion.EqualTo(version.MajorMinor(1, 31)) && !effectiveVersion.EmulationVersion().EqualTo(binaryVersion) {
195-
return fmt.Errorf("emulation version needs to be equal to binary version(%s) in compatibility-version alpha, got %s",
196-
binaryVersion.String(), effectiveVersion.EmulationVersion().String())
198+
if !effectiveVersion.EmulationVersion().AtLeast(minimumKubeEmulationVersion) {
199+
return fmt.Errorf("emulation version needs to be greater or equal to 1.31, got %s", effectiveVersion.EmulationVersion().String())
200+
}
201+
if !effectiveVersion.MinCompatibilityVersion().AtLeast(minimumKubeEmulationVersion.SubtractMinor(1)) {
202+
return fmt.Errorf("minCompatibilityVersion version needs to be greater or equal to 1.30, got %s", effectiveVersion.MinCompatibilityVersion().String())
197203
}
204+
198205
return nil
199206
}

staging/src/k8s.io/component-base/version/version_test.go

Lines changed: 83 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -43,9 +43,22 @@ func TestValidate(t *testing.T) {
4343
minCompatibilityVersion: "v1.31.0",
4444
},
4545
{
46-
name: "emulation version two minor lower than binary not ok",
46+
name: "emulation version two minor lower than binary ok",
4747
binaryVersion: "v1.33.2",
4848
emulationVersion: "v1.31.0",
49+
minCompatibilityVersion: "v1.31.0",
50+
expectErrors: false,
51+
},
52+
{
53+
name: "emulation version three minor lower than binary ok",
54+
binaryVersion: "v1.35.0",
55+
emulationVersion: "v1.32.0",
56+
minCompatibilityVersion: "v1.32.0",
57+
},
58+
{
59+
name: "emulation version four minor lower than binary not ok",
60+
binaryVersion: "v1.36.0",
61+
emulationVersion: "v1.32.0",
4962
minCompatibilityVersion: "v1.32.0",
5063
expectErrors: true,
5164
},
@@ -64,18 +77,25 @@ func TestValidate(t *testing.T) {
6477
expectErrors: true,
6578
},
6679
{
67-
name: "compatibility version same as binary not ok",
80+
name: "compatibility version same as binary ok",
6881
binaryVersion: "v1.32.2",
6982
emulationVersion: "v1.32.0",
7083
minCompatibilityVersion: "v1.32.0",
71-
expectErrors: true,
84+
expectErrors: false,
7285
},
7386
{
74-
name: "compatibility version two minor lower than binary not ok",
87+
name: "compatibility version two minor lower than binary ok",
7588
binaryVersion: "v1.32.2",
7689
emulationVersion: "v1.32.0",
7790
minCompatibilityVersion: "v1.30.0",
78-
expectErrors: true,
91+
expectErrors: false,
92+
},
93+
{
94+
name: "compatibility version three minor lower than binary ok",
95+
binaryVersion: "v1.34.2",
96+
emulationVersion: "v1.33.0",
97+
minCompatibilityVersion: "v1.31.0",
98+
expectErrors: false,
7999
},
80100
{
81101
name: "compatibility version one minor higher than binary not ok",
@@ -84,6 +104,13 @@ func TestValidate(t *testing.T) {
84104
minCompatibilityVersion: "v1.33.0",
85105
expectErrors: true,
86106
},
107+
{
108+
name: "emulation version lower than compatibility version not ok",
109+
binaryVersion: "v1.34.2",
110+
emulationVersion: "v1.32.0",
111+
minCompatibilityVersion: "v1.33.0",
112+
expectErrors: true,
113+
},
87114
}
88115

89116
for _, test := range tests {
@@ -105,3 +132,54 @@ func TestValidate(t *testing.T) {
105132
})
106133
}
107134
}
135+
136+
func TestValidateKubeEffectiveVersion(t *testing.T) {
137+
tests := []struct {
138+
name string
139+
emulationVersion string
140+
minCompatibilityVersion string
141+
expectErr bool
142+
}{
143+
{
144+
name: "valid versions",
145+
emulationVersion: "v1.31.0",
146+
minCompatibilityVersion: "v1.31.0",
147+
expectErr: false,
148+
},
149+
{
150+
name: "emulationVersion too low",
151+
emulationVersion: "v1.30.0",
152+
minCompatibilityVersion: "v1.31.0",
153+
expectErr: true,
154+
},
155+
{
156+
name: "minCompatibilityVersion too low",
157+
emulationVersion: "v1.31.0",
158+
minCompatibilityVersion: "v1.29.0",
159+
expectErr: true,
160+
},
161+
{
162+
name: "both versions too low",
163+
emulationVersion: "v1.30.0",
164+
minCompatibilityVersion: "v1.30.0",
165+
expectErr: true,
166+
},
167+
}
168+
169+
for _, test := range tests {
170+
t.Run(test.name, func(t *testing.T) {
171+
172+
effective := NewEffectiveVersion("1.32")
173+
effective.SetEmulationVersion(version.MustParseGeneric(test.emulationVersion))
174+
effective.SetMinCompatibilityVersion(version.MustParseGeneric(test.minCompatibilityVersion))
175+
176+
err := ValidateKubeEffectiveVersion(effective)
177+
if test.expectErr && err == nil {
178+
t.Error("expected error, but got nil")
179+
}
180+
if !test.expectErr && err != nil {
181+
t.Errorf("unexpected error: %v", err)
182+
}
183+
})
184+
}
185+
}

0 commit comments

Comments
 (0)