Add support for addons to filter based on kOps/k8s versions

This is hard to add later, for compatibility reasons.
This commit is contained in:
justinsb 2021-12-29 09:30:20 -05:00
parent 8e34e4d101
commit 9840a27f52
4 changed files with 49 additions and 5 deletions

View File

@ -25,6 +25,7 @@ go_library(
importpath = "k8s.io/kops/pkg/apis/kops",
visibility = ["//visibility:public"],
deps = [
"//:go_default_library",
"//pkg/apis/kops/util:go_default_library",
"//upup/pkg/fi/utils:go_default_library",
"//util/pkg/architectures:go_default_library",

View File

@ -24,6 +24,7 @@ import (
"github.com/blang/semver/v4"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/klog/v2"
kopsbase "k8s.io/kops"
"k8s.io/kops/pkg/apis/kops/util"
"k8s.io/kops/util/pkg/architectures"
"k8s.io/kops/util/pkg/vfs"
@ -94,6 +95,12 @@ type PackageVersionSpec struct {
// Version is the version of the package.
Version string `json:"version"`
// KubernetesVersion specifies that this package only applies to a semver range of kubernetes version
KubernetesVersion string `json:"kubernetesVersion,omitempty"`
// KopsVersion specifies that this package only applies to a semver range of kOps version
KopsVersion string `json:"kopsVersion,omitempty"`
}
// ResolveChannel maps a channel to an absolute URL (possibly a VFS URL)
@ -365,7 +372,7 @@ func (c *Channel) HasUpstreamImagePrefix(image string) bool {
}
// GetPackageVersion returns the version for the package, or an error if could not be found.
func (c *Channel) GetPackageVersion(name string) (*util.Version, error) {
func (c *Channel) GetPackageVersion(name string, kubernetesVersion *semver.Version) (*util.Version, error) {
var matches []*PackageVersionSpec
for i := range c.Spec.Packages {
@ -374,6 +381,37 @@ func (c *Channel) GetPackageVersion(name string) (*util.Version, error) {
continue
}
if pkg.KubernetesVersion != "" {
versionRange, err := semver.ParseRange(pkg.KubernetesVersion)
if err != nil {
klog.Warningf("cannot parse KubernetesVersion=%q", pkg.KubernetesVersion)
continue
}
if !versionRange(*kubernetesVersion) {
klog.V(2).Infof("Kubernetes version %q does not match range: %s", kubernetesVersion, pkg.KubernetesVersion)
continue
}
}
if pkg.KopsVersion != "" {
kopsVersion, err := util.ParseVersion(kopsbase.KOPS_RELEASE_VERSION)
if err != nil {
return nil, fmt.Errorf("parsing kops version %q: %w", kopsbase.KOPS_RELEASE_VERSION, err)
}
versionRange, err := semver.ParseRange(pkg.KopsVersion)
if err != nil {
klog.Warningf("cannot parse KopsVersion=%q", pkg.KopsVersion)
continue
}
if !kopsVersion.IsInRange(versionRange) {
klog.V(2).Infof("kOps version %q does not match range: %s", kopsVersion, pkg.KopsVersion)
continue
}
}
matches = append(matches, pkg)
}

View File

@ -135,3 +135,8 @@ func ParseVersion(s string) (*Version, error) {
func (v *Version) String() string {
return v.v.String()
}
// IsInRange checks if we are in the provided semver range
func (v *Version) IsInRange(semverRange semver.Range) bool {
return semverRange(v.v)
}

View File

@ -125,7 +125,7 @@ func CreateAddons(channel *kops.Channel, kubernetesVersion *semver.Version, clus
{
operatorKey := "operator.networking.addons.kope.io"
operatorVersion, err := channel.GetPackageVersion(operatorKey)
operatorVersion, err := channel.GetPackageVersion(operatorKey, kubernetesVersion)
if err != nil {
return nil, err
}
@ -148,7 +148,7 @@ func CreateAddons(channel *kops.Channel, kubernetesVersion *semver.Version, clus
{
key := "networking.addons.kope.io"
version, err := channel.GetPackageVersion(key)
version, err := channel.GetPackageVersion(key, kubernetesVersion)
if err != nil {
return nil, err
}
@ -172,7 +172,7 @@ func CreateAddons(channel *kops.Channel, kubernetesVersion *semver.Version, clus
{
operatorKey := "operator.coredns.addons.x-k8s.io"
operatorVersion, err := channel.GetPackageVersion(operatorKey)
operatorVersion, err := channel.GetPackageVersion(operatorKey, kubernetesVersion)
if err != nil {
return nil, err
}
@ -195,7 +195,7 @@ func CreateAddons(channel *kops.Channel, kubernetesVersion *semver.Version, clus
{
key := "coredns"
version, err := channel.GetPackageVersion(key)
version, err := channel.GetPackageVersion(key, kubernetesVersion)
if err != nil {
return nil, err
}