From 98288f65ccb5e7d25c41fbb1a3b2bd1145ef7779 Mon Sep 17 00:00:00 2001 From: Martin Schuppert Date: Tue, 13 May 2025 10:32:25 +0200 Subject: [PATCH] wip --- bindata/operator/operator.yaml | 6 +++ cmd/operator/main.go | 17 ++++-- config/manager/manager.yaml | 6 +++ controllers/operator/openstack_controller.go | 54 ++++++++++++++------ main.go | 13 ++++- 5 files changed, 75 insertions(+), 21 deletions(-) diff --git a/bindata/operator/operator.yaml b/bindata/operator/operator.yaml index 29db0bf36..752af0264 100644 --- a/bindata/operator/operator.yaml +++ b/bindata/operator/operator.yaml @@ -76,6 +76,12 @@ spec: env: - name: OPENSTACK_RELEASE_VERSION value: '{{ .OpenstackReleaseVersion }}' + - name: LEASE_DURATION + value: '{{ .OperatorLeaseDuration }}' + - name: RENEW_DEADLINE + value: '{{ .OperatorRenewDeadline }}' + - name: RETRY_PERIOD + value: '{{ .OperatorRetryPeriod }}' {{ range $envName, $envValue := .OpenStackServiceRelatedImages }} - name: {{ $envName }} value: {{ $envValue }} diff --git a/cmd/operator/main.go b/cmd/operator/main.go index e10af1893..2177816b7 100644 --- a/cmd/operator/main.go +++ b/cmd/operator/main.go @@ -42,7 +42,8 @@ import ( metricsserver "sigs.k8s.io/controller-runtime/pkg/metrics/server" - operatorv1beta1 "github.com/openstack-k8s-operators/openstack-operator/apis/operator/v1beta1" + "github.com/openstack-k8s-operators/lib-common/modules/common/operator" + operatorv1 "github.com/openstack-k8s-operators/openstack-operator/apis/operator/v1beta1" operatorcontrollers "github.com/openstack-k8s-operators/openstack-operator/controllers/operator" ) @@ -53,7 +54,7 @@ var ( func init() { utilruntime.Must(clientgoscheme.AddToScheme(scheme)) - utilruntime.Must(operatorv1beta1.AddToScheme(scheme)) + utilruntime.Must(operatorv1.AddToScheme(scheme)) } func main() { @@ -87,7 +88,7 @@ func main() { c.NextProtos = []string{"http/1.1"} } - mgr, err := ctrl.NewManager(ctrl.GetConfigOrDie(), ctrl.Options{ + options := ctrl.Options{ Scheme: scheme, Metrics: metricsserver.Options{ BindAddress: metricsAddr, @@ -111,7 +112,15 @@ func main() { // if you are doing or is intended to do any operation such as perform cleanups // after the manager stops then its usage might be unsafe. // LeaderElectionReleaseOnCancel: true, - }) + } + + err = operator.SetManagerOptions(&options, setupLog) + if err != nil { + setupLog.Error(err, "unable to set manager options") + os.Exit(1) + } + + mgr, err := ctrl.NewManager(ctrl.GetConfigOrDie(), options) if err != nil { setupLog.Error(err, "unable to start manager") os.Exit(1) diff --git a/config/manager/manager.yaml b/config/manager/manager.yaml index bf0fcbc5b..17bdf953c 100644 --- a/config/manager/manager.yaml +++ b/config/manager/manager.yaml @@ -44,6 +44,12 @@ spec: env: - name: OPENSTACK_RELEASE_VERSION value: '{{ .OpenstackReleaseVersion }}' + - name: LEASE_DURATION + value: "137" + - name: RENEW_DEADLINE + value: "107" + - name: RETRY_PERIOD + value: "26" envCustomImage: replace_me #NOTE: this is used via the Makefile to inject a custom template loop that kustomize won't allow image: '{{ .OperatorImage }}' name: manager diff --git a/controllers/operator/openstack_controller.go b/controllers/operator/openstack_controller.go index 8b4d0319d..149f80b32 100644 --- a/controllers/operator/openstack_controller.go +++ b/controllers/operator/openstack_controller.go @@ -71,6 +71,9 @@ var ( operatorImage string kubeRbacProxyImage string openstackReleaseVersion string + operatorLeaseDuration string + operatorRenewDeadline string + operatorRetryPeriod string ) // SetupEnv - @@ -78,28 +81,46 @@ func SetupEnv() { envRelatedOperatorImages = make(map[string]*string) envRelatedOpenStackServiceImages = make(map[string]*string) for _, name := range os.Environ() { - envArr := strings.Split(name, "=") + envArr := strings.SplitN(name, "=", 2) + if len(envArr) != 2 { // Handle cases where the environment variable doesn't have a value + continue + } + key := envArr[0] + value := envArr[1] - if strings.HasSuffix(envArr[0], "_OPERATOR_MANAGER_IMAGE_URL") { - operatorName := strings.TrimPrefix(envArr[0], "RELATED_IMAGE_") + switch { + case strings.HasSuffix(key, "_OPERATOR_MANAGER_IMAGE_URL"): + operatorName := strings.TrimPrefix(key, "RELATED_IMAGE_") operatorName = strings.TrimSuffix(operatorName, "_OPERATOR_MANAGER_IMAGE_URL") operatorName = strings.ToLower(operatorName) operatorName = strings.ReplaceAll(operatorName, "_", "-") - // rabbitmq-cluster is a special case with an alternate deployment template if operatorName == "rabbitmq-cluster" { - rabbitmqImage = envArr[1] + rabbitmqImage = value } else { - envRelatedOperatorImages[operatorName] = &envArr[1] + envRelatedOperatorImages[operatorName] = &value } - log.Log.Info("Found operator related image", "operator", operatorName, "image", envArr[1]) - } else if strings.HasPrefix(envArr[0], "RELATED_IMAGE_") { - envRelatedOpenStackServiceImages[envArr[0]] = &envArr[1] - } else if envArr[0] == "KUBE_RBAC_PROXY" { - kubeRbacProxyImage = envArr[1] - } else if envArr[0] == "OPERATOR_IMAGE_URL" { - operatorImage = envArr[1] - } else if envArr[0] == "OPENSTACK_RELEASE_VERSION" { - openstackReleaseVersion = envArr[1] + log.Log.Info("Found operator related image", "operator", operatorName, "image", value) + + case strings.HasPrefix(key, "RELATED_IMAGE_"): + envRelatedOpenStackServiceImages[key] = &value + + case key == "KUBE_RBAC_PROXY": + kubeRbacProxyImage = value + + case key == "OPERATOR_IMAGE_URL": + operatorImage = value + + case key == "OPENSTACK_RELEASE_VERSION": + openstackReleaseVersion = value + + case key == "LEASE_DURATION": + operatorLeaseDuration = value + + case key == "RENEW_DEADLINE": + operatorRenewDeadline = value + + case key == "RETRY_PERIOD": + operatorRetryPeriod = value } } } @@ -455,6 +476,9 @@ func (r *OpenStackReconciler) applyOperator(ctx context.Context, instance *opera data.Data["KubeRbacProxyImage"] = kubeRbacProxyImage data.Data["OpenstackReleaseVersion"] = openstackReleaseVersion data.Data["OpenStackServiceRelatedImages"] = envRelatedOpenStackServiceImages + data.Data["OperatorLeaseDuration"] = operatorLeaseDuration + data.Data["OperatorRenewDeadline"] = operatorRenewDeadline + data.Data["OperatorRetryPeriod"] = operatorRetryPeriod return r.renderAndApply(ctx, instance, data, "operator", true) } diff --git a/main.go b/main.go index e8aea7385..396777271 100644 --- a/main.go +++ b/main.go @@ -83,6 +83,7 @@ import ( machineconfig "github.com/openshift/api/machineconfiguration/v1" ocp_image "github.com/openshift/api/operator/v1alpha1" + "github.com/openstack-k8s-operators/lib-common/modules/common/operator" clientcontrollers "github.com/openstack-k8s-operators/openstack-operator/controllers/client" corecontrollers "github.com/openstack-k8s-operators/openstack-operator/controllers/core" dataplanecontrollers "github.com/openstack-k8s-operators/openstack-operator/controllers/dataplane" @@ -165,7 +166,7 @@ func main() { c.NextProtos = []string{"http/1.1"} } - mgr, err := ctrl.NewManager(ctrl.GetConfigOrDie(), ctrl.Options{ + options := ctrl.Options{ Scheme: scheme, Metrics: metricsserver.Options{ BindAddress: metricsAddr, @@ -189,7 +190,15 @@ func main() { // if you are doing or is intended to do any operation such as perform cleanups // after the manager stops then its usage might be unsafe. // LeaderElectionReleaseOnCancel: true, - }) + } + + err = operator.SetManagerOptions(&options, setupLog) + if err != nil { + setupLog.Error(err, "unable to set manager options") + os.Exit(1) + } + + mgr, err := ctrl.NewManager(ctrl.GetConfigOrDie(), options) if err != nil { setupLog.Error(err, "unable to start manager") os.Exit(1)