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  }