mirror of
https://github.com/ceph/ceph-csi.git
synced 2024-12-30 00:40:21 +00:00
78 lines
2.4 KiB
Go
78 lines
2.4 KiB
Go
|
/*
|
||
|
Copyright 2023 The Kubernetes Authors.
|
||
|
|
||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||
|
you may not use this file except in compliance with the License.
|
||
|
You may obtain a copy of the License at
|
||
|
|
||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||
|
|
||
|
Unless required by applicable law or agreed to in writing, software
|
||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||
|
See the License for the specific language governing permissions and
|
||
|
limitations under the License.
|
||
|
*/
|
||
|
|
||
|
package version
|
||
|
|
||
|
import (
|
||
|
"fmt"
|
||
|
"sync/atomic"
|
||
|
|
||
|
utilversion "k8s.io/apimachinery/pkg/util/version"
|
||
|
)
|
||
|
|
||
|
var dynamicGitVersion atomic.Value
|
||
|
|
||
|
func init() {
|
||
|
// initialize to static gitVersion
|
||
|
dynamicGitVersion.Store(gitVersion)
|
||
|
}
|
||
|
|
||
|
// SetDynamicVersion overrides the version returned as the GitVersion from Get().
|
||
|
// The specified version must be non-empty, a valid semantic version, and must
|
||
|
// match the major/minor/patch version of the default gitVersion.
|
||
|
func SetDynamicVersion(dynamicVersion string) error {
|
||
|
if err := ValidateDynamicVersion(dynamicVersion); err != nil {
|
||
|
return err
|
||
|
}
|
||
|
dynamicGitVersion.Store(dynamicVersion)
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
// ValidateDynamicVersion ensures the given version is non-empty, a valid semantic version,
|
||
|
// and matched the major/minor/patch version of the default gitVersion.
|
||
|
func ValidateDynamicVersion(dynamicVersion string) error {
|
||
|
return validateDynamicVersion(dynamicVersion, gitVersion)
|
||
|
}
|
||
|
|
||
|
func validateDynamicVersion(dynamicVersion, defaultVersion string) error {
|
||
|
if len(dynamicVersion) == 0 {
|
||
|
return fmt.Errorf("version must not be empty")
|
||
|
}
|
||
|
if dynamicVersion == defaultVersion {
|
||
|
// allow no-op
|
||
|
return nil
|
||
|
}
|
||
|
vRuntime, err := utilversion.ParseSemantic(dynamicVersion)
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
// must match major/minor/patch of default version
|
||
|
var vDefault *utilversion.Version
|
||
|
if defaultVersion == "v0.0.0-master+$Format:%H$" {
|
||
|
// special-case the placeholder value which doesn't parse as a semantic version
|
||
|
vDefault, err = utilversion.ParseSemantic("v0.0.0-master")
|
||
|
} else {
|
||
|
vDefault, err = utilversion.ParseSemantic(defaultVersion)
|
||
|
}
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
if vRuntime.Major() != vDefault.Major() || vRuntime.Minor() != vDefault.Minor() || vRuntime.Patch() != vDefault.Patch() {
|
||
|
return fmt.Errorf("version %q must match major/minor/patch of default version %q", dynamicVersion, defaultVersion)
|
||
|
}
|
||
|
return nil
|
||
|
}
|