config: allow k8s version MAJOR.MINOR for v2.6 (#1222)

To adhere to our compatibility goal of not breaking
old configs, the kubernetes patch version is automatically
extended for configs in the transistional version v2.6.
This commit is contained in:
Otto Bittner 2023-02-20 10:50:55 +01:00 committed by GitHub
parent b6b353c53e
commit c0a62a52d1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 43 additions and 4 deletions

View File

@ -70,7 +70,7 @@ type Config struct {
StateDiskSizeGB int `yaml:"stateDiskSizeGB" validate:"min=0"` StateDiskSizeGB int `yaml:"stateDiskSizeGB" validate:"min=0"`
// description: | // description: |
// Kubernetes version to be installed into the cluster. // Kubernetes version to be installed into the cluster.
KubernetesVersion string `yaml:"kubernetesVersion" validate:"supported_k8s_version"` KubernetesVersion string `yaml:"kubernetesVersion" validate:"required,supported_k8s_version"`
// description: | // description: |
// Microservice version to be installed into the cluster. Setting this value is optional until v2.7. Defaults to the version of the CLI. // Microservice version to be installed into the cluster. Setting this value is optional until v2.7. Defaults to the version of the CLI.
MicroserviceVersion string `yaml:"microserviceVersion" validate:"omitempty,version_compatibility"` MicroserviceVersion string `yaml:"microserviceVersion" validate:"omitempty,version_compatibility"`
@ -543,7 +543,7 @@ func (c *Config) Validate(force bool) error {
} }
// register custom validator with label supported_k8s_version to validate version based on available versionConfigs. // register custom validator with label supported_k8s_version to validate version based on available versionConfigs.
if err := validate.RegisterValidation("supported_k8s_version", validateK8sVersion); err != nil { if err := validate.RegisterValidation("supported_k8s_version", c.validateK8sVersion); err != nil {
return err return err
} }

View File

@ -273,6 +273,26 @@ func TestValidate(t *testing.T) {
return cnf return cnf
}(), }(),
}, },
// TODO: v2.7: remove this test as it should start breaking after v2.6 is released.
"k8s vMAJOR.MINOR is valid in v2.7": {
cnf: func() *Config {
cnf := Default()
cnf.KubernetesVersion = "v1.25"
return cnf
}(),
wantErr: true,
wantErrCount: defaultErrCount,
},
// TODO: v2.7: remove this test as it should start breaking after v2.6 is released.
"k8s MAJOR.MINOR is valid in v2.7": {
cnf: func() *Config {
cnf := Default()
cnf.KubernetesVersion = "1.25"
return cnf
}(),
wantErr: true,
wantErrCount: defaultErrCount,
},
} }
for name, tc := range testCases { for name, tc := range testCases {

View File

@ -311,8 +311,27 @@ func getPlaceholderEntries(m Measurements) []uint32 {
return placeholders return placeholders
} }
func validateK8sVersion(fl validator.FieldLevel) bool { func (c *Config) validateK8sVersion(fl validator.FieldLevel) bool {
return versions.IsSupportedK8sVersion(compatibility.EnsurePrefixV(fl.Field().String())) // TODO: v2.7: do not create extendedVersion variable and directly validate field from fl.
// This patch is for compatibility with configs from v2.5 only. Configs specifying k8s
// the version as MAJOR.MINOR automatically get extended with the respective patch version.
configVersion := compatibility.EnsurePrefixV(fl.Field().String())
if !semver.IsValid(configVersion) {
return false
}
var extendedVersion string
switch semver.MajorMinor(configVersion) {
case semver.MajorMinor(string(versions.V1_24)):
extendedVersion = string(versions.V1_24)
case semver.MajorMinor(string(versions.V1_25)):
extendedVersion = string(versions.V1_25)
case semver.MajorMinor(string(versions.V1_26)):
extendedVersion = string(versions.V1_26)
default:
return false
}
c.KubernetesVersion = extendedVersion
return versions.IsSupportedK8sVersion(extendedVersion)
} }
func registerVersionCompatibilityError(ut ut.Translator) error { func registerVersionCompatibilityError(ut ut.Translator) error {