From 9a27f72f58d9ea1cc699e33ae45ca8b64379041c Mon Sep 17 00:00:00 2001 From: Federico Paolinelli Date: Thu, 23 Jan 2025 14:32:54 +0100 Subject: [PATCH] Make the min version CNO supports frr-k8s parametric Openshift only behavior: at some point the operator will have to signal Openshift's Cluster Network Operator to install frr-k8s. This is to make the minimum version supporting it parametric. Signed-off-by: Federico Paolinelli --- controllers/metallb_controller.go | 2 +- pkg/openshift/openshift.go | 9 +++++---- pkg/openshift/openshift_test.go | 4 +++- pkg/params/params.go | 9 +++++++++ 4 files changed, 18 insertions(+), 6 deletions(-) diff --git a/controllers/metallb_controller.go b/controllers/metallb_controller.go index 12bbce75c..89e05014a 100644 --- a/controllers/metallb_controller.go +++ b/controllers/metallb_controller.go @@ -174,7 +174,7 @@ func (r *MetalLBReconciler) syncMetalLBResources(ctx context.Context, config *me bgpType := params.BGPType(config, r.EnvConfig) if r.EnvConfig.MustDeployFRRK8sFromCNO && r.EnvConfig.IsOpenshift && (bgpType == metallbv1beta1.FRRK8sExternalMode) { - supportsFRRK8s, err := openshift.SupportsFRRK8s(ctx, r.Client) + supportsFRRK8s, err := openshift.SupportsFRRK8s(ctx, r.Client, r.EnvConfig) if err != nil { return err } diff --git a/pkg/openshift/openshift.go b/pkg/openshift/openshift.go index 14aba1d5f..ffd73c338 100644 --- a/pkg/openshift/openshift.go +++ b/pkg/openshift/openshift.go @@ -5,6 +5,7 @@ import ( "slices" "github.com/Masterminds/semver/v3" + "github.com/metallb/metallb-operator/pkg/params" openshiftconfigv1 "github.com/openshift/api/config/v1" openshiftapiv1 "github.com/openshift/api/operator/v1" "github.com/pkg/errors" @@ -12,27 +13,27 @@ import ( "sigs.k8s.io/controller-runtime/pkg/client" ) -func SupportsFRRK8s(ctx context.Context, cli client.Client) (bool, error) { +func SupportsFRRK8s(ctx context.Context, cli client.Client, envConfig params.EnvConfig) (bool, error) { cno := &openshiftconfigv1.ClusterOperator{} err := cli.Get(ctx, types.NamespacedName{Name: "network"}, cno) if err != nil { return false, errors.Wrapf(err, "get openshift network operator failed") } - supports, err := cnoSupportsFRRK8s(cno) + supports, err := cnoSupportsFRRK8s(cno, envConfig) if err != nil { return false, err } return supports, nil } -func cnoSupportsFRRK8s(cno *openshiftconfigv1.ClusterOperator) (bool, error) { +func cnoSupportsFRRK8s(cno *openshiftconfigv1.ClusterOperator, envConfig params.EnvConfig) (bool, error) { for _, v := range cno.Status.Versions { if v.Name == "operator" { v, err := semver.NewVersion(v.Version) if err != nil { return false, errors.Wrapf(err, "failed to parse semver for network operator") } - validVersion, _ := semver.NewVersion("4.17.0-0") + validVersion, _ := semver.NewVersion(envConfig.CNOMinFRRK8sVersion) valid := !v.LessThan(validVersion) return valid, nil } diff --git a/pkg/openshift/openshift_test.go b/pkg/openshift/openshift_test.go index 550eafa7d..bfe3ad96a 100644 --- a/pkg/openshift/openshift_test.go +++ b/pkg/openshift/openshift_test.go @@ -3,6 +3,7 @@ package openshift import ( "testing" + "github.com/metallb/metallb-operator/pkg/params" openshiftconfigv1 "github.com/openshift/api/config/v1" ) @@ -103,7 +104,8 @@ func TestCnoSupportsFRRK8s(t *testing.T) { for _, test := range tests { t.Run(test.name, func(t *testing.T) { - supports, err := cnoSupportsFRRK8s(test.cno) + envConfig := params.EnvConfig{CNOMinFRRK8sVersion: "4.17.0-0"} + supports, err := cnoSupportsFRRK8s(test.cno, envConfig) if test.shouldErr && err == nil { t.Fatalf("expected error, got nil") } diff --git a/pkg/params/params.go b/pkg/params/params.go index 8c1f85b3e..cf70a9e9d 100644 --- a/pkg/params/params.go +++ b/pkg/params/params.go @@ -7,6 +7,7 @@ import ( "strconv" "strings" + "github.com/Masterminds/semver" "github.com/metallb/metallb-operator/api/v1beta1" ) @@ -36,6 +37,7 @@ type EnvConfig struct { FRRImage ImageInfo FRRK8sImage ImageInfo KubeRBacImage ImageInfo + CNOMinFRRK8sVersion string MLBindPort int FRRMetricsPort int SecureFRRMetricsPort int @@ -133,6 +135,7 @@ func FromEnvironment(isOpenshift bool) (EnvConfig, error) { // Ignoring the error, if not set we'll consume the image from the chart res.FRRK8sImage, _ = imageFromEnv("FRRK8S_IMAGE") + res.CNOMinFRRK8sVersion = os.Getenv("CNO_MIN_FRRK8S_VERSION") err = validate(res) if err != nil { @@ -152,6 +155,12 @@ func validate(config EnvConfig) error { if config.SecureFRRMetricsPort != 0 && !config.DeployServiceMonitors { return fmt.Errorf("secureFRRMetricsPort is available only if service monitors are enabled") } + if config.CNOMinFRRK8sVersion != "" { + _, err := semver.NewVersion(config.CNOMinFRRK8sVersion) + if err != nil { + return fmt.Errorf("invalid cno min frrk8s supported version: %w", err) + } + } return nil }