Chore: Check version compatibilty when installing a plugin (#92200)
This commit is contained in:
+29
-13
@@ -1,6 +1,8 @@
|
||||
package repo
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"slices"
|
||||
"strings"
|
||||
|
||||
"github.com/grafana/grafana/pkg/plugins/log"
|
||||
@@ -19,19 +21,24 @@ type VersionData struct {
|
||||
// returns error if the supplied version does not exist.
|
||||
// returns error if supplied version exists but is not supported.
|
||||
// NOTE: It expects plugin.Versions to be sorted so the newest version is first.
|
||||
func SelectSystemCompatibleVersion(log log.PrettyLogger, versions []Version, pluginID, version string, compatOpts SystemCompatOpts) (VersionData, error) {
|
||||
func SelectSystemCompatibleVersion(log log.PrettyLogger, versions []Version, pluginID, version string, compatOpts CompatOpts) (VersionData, error) {
|
||||
version = normalizeVersion(version)
|
||||
|
||||
var ver Version
|
||||
latestForArch, exists := latestSupportedVersion(versions, compatOpts)
|
||||
sysCompatOpts, exists := compatOpts.System()
|
||||
if !exists {
|
||||
return VersionData{}, ErrArcNotFound(pluginID, compatOpts.OSAndArch())
|
||||
return VersionData{}, errors.New("no system compatibility requirements set")
|
||||
}
|
||||
|
||||
var ver Version
|
||||
latestForArch, err := latestSupportedVersion(pluginID, versions, compatOpts)
|
||||
if err != nil {
|
||||
return VersionData{}, err
|
||||
}
|
||||
|
||||
if version == "" {
|
||||
return VersionData{
|
||||
Version: latestForArch.Version,
|
||||
Checksum: checksum(latestForArch, compatOpts),
|
||||
Checksum: checksum(latestForArch, sysCompatOpts),
|
||||
Arch: latestForArch.Arch,
|
||||
URL: latestForArch.URL,
|
||||
}, nil
|
||||
@@ -46,18 +53,18 @@ func SelectSystemCompatibleVersion(log log.PrettyLogger, versions []Version, plu
|
||||
if len(ver.Version) == 0 {
|
||||
log.Debugf("Requested plugin version %s v%s not found but potential fallback version '%s' was found",
|
||||
pluginID, version, latestForArch.Version)
|
||||
return VersionData{}, ErrVersionNotFound(pluginID, version, compatOpts.OSAndArch())
|
||||
return VersionData{}, ErrVersionNotFound(pluginID, version, sysCompatOpts.OSAndArch())
|
||||
}
|
||||
|
||||
if !supportsCurrentArch(ver, compatOpts) {
|
||||
if !supportsCurrentArch(ver, sysCompatOpts) {
|
||||
log.Debugf("Requested plugin version %s v%s is not supported on your system but potential fallback version '%s' was found",
|
||||
pluginID, version, latestForArch.Version)
|
||||
return VersionData{}, ErrVersionUnsupported(pluginID, version, compatOpts.OSAndArch())
|
||||
return VersionData{}, ErrVersionUnsupported(pluginID, version, sysCompatOpts.OSAndArch())
|
||||
}
|
||||
|
||||
return VersionData{
|
||||
Version: ver.Version,
|
||||
Checksum: checksum(ver, compatOpts),
|
||||
Checksum: checksum(ver, sysCompatOpts),
|
||||
Arch: ver.Arch,
|
||||
URL: ver.URL,
|
||||
}, nil
|
||||
@@ -86,13 +93,22 @@ func supportsCurrentArch(version Version, compatOpts SystemCompatOpts) bool {
|
||||
return false
|
||||
}
|
||||
|
||||
func latestSupportedVersion(versions []Version, compatOpts SystemCompatOpts) (Version, bool) {
|
||||
func latestSupportedVersion(pluginID string, versions []Version, compatOpts CompatOpts) (Version, error) {
|
||||
// First check if the version are compatible with the current Grafana version
|
||||
versions = slices.DeleteFunc(versions, func(v Version) bool {
|
||||
return v.IsCompatible != nil && !*v.IsCompatible
|
||||
})
|
||||
if len(versions) == 0 {
|
||||
return Version{}, ErrNoCompatibleVersions(pluginID, compatOpts.grafanaVersion)
|
||||
}
|
||||
|
||||
// Then check if the version are compatible with the current system
|
||||
for _, v := range versions {
|
||||
if supportsCurrentArch(v, compatOpts) {
|
||||
return v, true
|
||||
if supportsCurrentArch(v, compatOpts.system) {
|
||||
return v, nil
|
||||
}
|
||||
}
|
||||
return Version{}, false
|
||||
return Version{}, ErrArcNotFound(pluginID, compatOpts.system.OSAndArch())
|
||||
}
|
||||
|
||||
func normalizeVersion(version string) string {
|
||||
|
||||
Reference in New Issue
Block a user