github.com/esnet/gdg@v0.6.1-0.20240412190737-6b6eba9c14d8/internal/tools/version_check.go (about) 1 package tools 2 3 import ( 4 "fmt" 5 "golang.org/x/mod/semver" 6 "log/slog" 7 ) 8 9 const ( 10 VersionKey = "Version" 11 ) 12 13 type VersionRange struct { 14 MinVersion string 15 MaxVersion string 16 } 17 18 // Validate ensures that all version number start with a v, in order to be parsed correctly 19 func (v VersionRange) Validate() bool { 20 if v.MaxVersion != "" && v.MaxVersion[0] != 'v' { 21 return false 22 } 23 if v.MinVersion != "" && v.MinVersion[0] != 'v' { 24 return false 25 } 26 27 return true 28 29 } 30 31 // InRange returns true if the current grafana version in within all of the ranges 32 // specified. Falls if it is not. 33 func InRange(ranges []VersionRange, api GetVersion) bool { 34 versionCheck := api.GetServerInfo() 35 currentVersion := fmt.Sprintf("v%s", versionCheck[VersionKey].(string)) 36 valid := true 37 for _, entry := range ranges { 38 if !entry.Validate() { 39 slog.Info("range is not valid") 40 valid = false 41 break 42 } 43 44 // if currentVersion < minVersion || currentVersion > maxVersion 45 if semver.Compare(currentVersion, entry.MinVersion) == -1 /* greater or equal */ || 46 semver.Compare(currentVersion, entry.MaxVersion) == 1 { 47 slog.Info("Range is valid", 48 slog.String("version", currentVersion), 49 slog.String("min", entry.MinVersion), slog.String("max", entry.MaxVersion)) 50 valid = false 51 break 52 } 53 } 54 return valid 55 } 56 57 type GetVersion interface { 58 GetServerInfo() map[string]interface{} 59 } 60 61 func ValidateMinimumVersion(minVersion string, api GetVersion) bool { 62 if minVersion[0] != 'v' { 63 slog.Error("Version check failed, minVersion must start with a 'v'") 64 return false 65 66 } 67 versionCheck := api.GetServerInfo() 68 currentVersion := fmt.Sprintf("v%s", versionCheck[VersionKey].(string)) 69 70 return semver.Compare(currentVersion, minVersion) != -1 71 }