From 9840a27f52adf37bb9a2588900515f304bb1accf Mon Sep 17 00:00:00 2001 From: justinsb Date: Wed, 29 Dec 2021 09:30:20 -0500 Subject: [PATCH] Add support for addons to filter based on kOps/k8s versions This is hard to add later, for compatibility reasons. --- pkg/apis/kops/BUILD.bazel | 1 + pkg/apis/kops/channel.go | 40 ++++++++++++++++++++++++++++- pkg/apis/kops/util/versions.go | 5 ++++ pkg/wellknownoperators/operators.go | 8 +++--- 4 files changed, 49 insertions(+), 5 deletions(-) diff --git a/pkg/apis/kops/BUILD.bazel b/pkg/apis/kops/BUILD.bazel index 0f02bd84f2..7ed713bcc7 100644 --- a/pkg/apis/kops/BUILD.bazel +++ b/pkg/apis/kops/BUILD.bazel @@ -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", diff --git a/pkg/apis/kops/channel.go b/pkg/apis/kops/channel.go index 4f20321ee6..db3caf926d 100644 --- a/pkg/apis/kops/channel.go +++ b/pkg/apis/kops/channel.go @@ -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) } diff --git a/pkg/apis/kops/util/versions.go b/pkg/apis/kops/util/versions.go index f1888a6167..314ddc8f70 100644 --- a/pkg/apis/kops/util/versions.go +++ b/pkg/apis/kops/util/versions.go @@ -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) +} diff --git a/pkg/wellknownoperators/operators.go b/pkg/wellknownoperators/operators.go index 4e0de03fc1..22bdbad4f3 100644 --- a/pkg/wellknownoperators/operators.go +++ b/pkg/wellknownoperators/operators.go @@ -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 }