constellation/internal/versionsapi/cliinfo.go
Moritz Sanft 46f5b1734e
cli: show available cli upgrades on upgrade check command (#1394)
* cli: upgrade check show cli upgrades

* only check compatibility for valid upgrades

* use semver.Sort

* extend unit tests

* add unit test for new compatible cli versions

* adapt to feedback

* fix rebase

* rework output

* minor -> major

Co-authored-by: Otto Bittner <cobittner@posteo.net>

* minor -> major

Co-authored-by: Otto Bittner <cobittner@posteo.net>

* dynamic major version

Co-authored-by: Otto Bittner <cobittner@posteo.net>

* remove currentK8sVer argument

* bazel gen & tidy

* bazel update

---------

Co-authored-by: Otto Bittner <cobittner@posteo.net>
2023-04-03 14:31:17 +02:00

96 lines
2.5 KiB
Go

/*
Copyright (c) Edgeless Systems GmbH
SPDX-License-Identifier: AGPL-3.0-only
*/
package versionsapi
import (
"errors"
"fmt"
"net/url"
"path"
"github.com/edgelesssys/constellation/v2/internal/constants"
"golang.org/x/mod/semver"
)
// CLIInfo contains information about a specific CLI version (i.e. it's compatibility with Kubernetes versions).
type CLIInfo struct {
// Ref is the reference name of the CLI.
Ref string `json:"ref,omitempty"`
// Stream is the stream name of the CLI.
Stream string `json:"stream,omitempty"`
// Version is the version of the CLI.
Version string `json:"version,omitempty"`
// Kubernetes contains all compatible Kubernetes versions.
Kubernetes []string `json:"kubernetes,omitempty"`
}
// JSONPath returns the S3 JSON path for this object.
func (c CLIInfo) JSONPath() string {
return path.Join(
constants.CDNAPIPrefix,
"ref", c.Ref,
"stream", c.Stream,
c.Version,
"cli",
"info.json",
)
}
// URL returns the URL to the JSON file for this object.
func (c CLIInfo) URL() (string, error) {
url, err := url.Parse(constants.CDNRepositoryURL)
if err != nil {
return "", fmt.Errorf("parsing CDN URL: %w", err)
}
url.Path = c.JSONPath()
return url.String(), nil
}
// ValidateRequest validates the request parameters of the list.
// The Kubernetes slice must be empty.
func (c CLIInfo) ValidateRequest() error {
var retErr error
if err := ValidateRef(c.Ref); err != nil {
retErr = errors.Join(retErr, err)
}
if err := ValidateStream(c.Ref, c.Stream); err != nil {
retErr = errors.Join(retErr, err)
}
if !semver.IsValid(c.Version) {
retErr = errors.Join(retErr, fmt.Errorf("version %q is not a valid semver", c.Version))
}
if len(c.Kubernetes) != 0 {
retErr = errors.Join(retErr, errors.New("Kubernetes slice must be empty for request"))
}
return retErr
}
// Validate checks if the CLI info is valid.
func (c CLIInfo) Validate() error {
var retErr error
if err := ValidateRef(c.Ref); err != nil {
retErr = errors.Join(retErr, err)
}
if err := ValidateStream(c.Ref, c.Stream); err != nil {
retErr = errors.Join(retErr, err)
}
if !semver.IsValid(c.Version) {
retErr = errors.Join(retErr, fmt.Errorf("version %q is not a valid semver", c.Version))
}
if len(c.Kubernetes) == 0 {
retErr = errors.Join(retErr, errors.New("Kubernetes slice must not be empty"))
}
for _, k := range c.Kubernetes {
if !semver.IsValid(k) {
retErr = errors.Join(retErr, fmt.Errorf("Kubernetes version %q is not a valid semver", k))
}
}
return retErr
}