From abbf6ac80f8302d85408076a94fb718a5becd4f3 Mon Sep 17 00:00:00 2001 From: Martin Schuppert Date: Tue, 15 Apr 2025 13:59:58 +0200 Subject: [PATCH 1/3] bump to golang 1.23 * bump in go.mod (base and api) * bump go-toolset in Dockerfile * bump golang version and custom_iamge in github jobs ('.github/workflows') * Bump the golangci-lint version in the .pre-commit-config.yaml to v2.4.0 * Bump build_root_image in .ci-operator.yaml to ci-build-root-golang-1.23-sdk-1.31 Jira: OSPRH-12935 Signed-off-by: Martin Schuppert --- .ci-operator.yaml | 2 +- .github/workflows/build-openstack-operator.yaml | 2 +- .github/workflows/docs.yaml | 2 +- .github/workflows/force-bump-pr-manual.yaml | 1 + .github/workflows/force-bump-pr-scheduled.yaml | 1 + .github/workflows/kustom.yaml | 2 +- .golangci.yaml | 8 +++++++- .pre-commit-config.yaml | 2 +- Dockerfile | 2 +- Makefile | 5 +++-- apis/go.mod | 2 +- go.mod | 2 +- zuul.d/jobs.yaml | 4 ++-- 13 files changed, 22 insertions(+), 13 deletions(-) diff --git a/.ci-operator.yaml b/.ci-operator.yaml index 810dbb5117..6282e189b7 100644 --- a/.ci-operator.yaml +++ b/.ci-operator.yaml @@ -1,4 +1,4 @@ build_root_image: name: tools namespace: openstack-k8s-operators - tag: ci-build-root-golang-1.21-sdk-1.31 + tag: ci-build-root-golang-1.23-sdk-1.31 diff --git a/.github/workflows/build-openstack-operator.yaml b/.github/workflows/build-openstack-operator.yaml index 4a3547af07..fddc6f6b55 100644 --- a/.github/workflows/build-openstack-operator.yaml +++ b/.github/workflows/build-openstack-operator.yaml @@ -15,7 +15,7 @@ jobs: uses: openstack-k8s-operators/openstack-k8s-operators-ci/.github/workflows/reusable-build-operator.yaml@main with: operator_name: openstack - go_version: 1.21.x + go_version: 1.23.x operator_sdk_version: 1.31.0 bundle_dockerfile: ./bundle.Dockerfile secrets: diff --git a/.github/workflows/docs.yaml b/.github/workflows/docs.yaml index 9462c13b41..1474b6bee6 100644 --- a/.github/workflows/docs.yaml +++ b/.github/workflows/docs.yaml @@ -21,7 +21,7 @@ jobs: - name: Install Go uses: actions/setup-go@v3 with: - go-version: 1.21.x + go-version: 1.23.x - uses: actions/checkout@v4 with: # this fetches all branches. Needed because we need gh-pages branch for deploy to work diff --git a/.github/workflows/force-bump-pr-manual.yaml b/.github/workflows/force-bump-pr-manual.yaml index 746c31e8bd..c5f2580183 100644 --- a/.github/workflows/force-bump-pr-manual.yaml +++ b/.github/workflows/force-bump-pr-manual.yaml @@ -9,5 +9,6 @@ jobs: with: operator_name: openstack branch_name: ${{ github.ref_name }} + custom_image: quay.io/openstack-k8s-operators/openstack-k8s-operators-ci-build-tools:golang-1.23 secrets: FORCE_BUMP_PULL_REQUEST_PAT: ${{ secrets.FORCE_BUMP_PULL_REQUEST_PAT }} diff --git a/.github/workflows/force-bump-pr-scheduled.yaml b/.github/workflows/force-bump-pr-scheduled.yaml index e41db04912..45b7801adc 100644 --- a/.github/workflows/force-bump-pr-scheduled.yaml +++ b/.github/workflows/force-bump-pr-scheduled.yaml @@ -10,5 +10,6 @@ jobs: uses: openstack-k8s-operators/openstack-k8s-operators-ci/.github/workflows/force-bump-branches.yaml@main with: operator_name: openstack + custom_image: quay.io/openstack-k8s-operators/openstack-k8s-operators-ci-build-tools:golang-1.23 secrets: FORCE_BUMP_PULL_REQUEST_PAT: ${{ secrets.FORCE_BUMP_PULL_REQUEST_PAT }} diff --git a/.github/workflows/kustom.yaml b/.github/workflows/kustom.yaml index d753673239..0c47b78531 100644 --- a/.github/workflows/kustom.yaml +++ b/.github/workflows/kustom.yaml @@ -16,7 +16,7 @@ jobs: - name: Install Go uses: actions/setup-go@v3 with: - go-version: 1.21.x + go-version: 1.23.x - uses: actions/checkout@v4 with: # this fetches all branches. Needed because we need gh-pages branch for deploy to work diff --git a/.golangci.yaml b/.golangci.yaml index 937a37eacc..26142afbc2 100644 --- a/.golangci.yaml +++ b/.golangci.yaml @@ -1,3 +1,5 @@ +version: 2 + linters: # Enable specific linter # https://golangci-lint.run/usage/linters/#enabled-by-default @@ -5,7 +7,11 @@ linters: - errorlint - revive - ginkgolinter - - gofmt - govet + +formatters: + enable: + - gofmt + run: timeout: 5m diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index e75528744a..7ffb008a35 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -70,7 +70,7 @@ repos: entry: bashate --error . --ignore=E006,E040,E011,E020,E012 - repo: https://github.com/golangci/golangci-lint - rev: v1.59.1 + rev: v2.4.0 hooks: - id: golangci-lint-full args: ["-v"] diff --git a/Dockerfile b/Dockerfile index 368c1615ed..99e2e9e985 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -ARG GOLANG_BUILDER=registry.access.redhat.com/ubi9/go-toolset:1.21 +ARG GOLANG_BUILDER=registry.access.redhat.com/ubi9/go-toolset:1.23 ARG OPERATOR_BASE_IMAGE=registry.access.redhat.com/ubi9/ubi-minimal:latest # Build the manager binary FROM $GOLANG_BUILDER AS builder diff --git a/Makefile b/Makefile index ae872ab9cf..989e9ea551 100644 --- a/Makefile +++ b/Makefile @@ -186,9 +186,10 @@ tidy: ## Run go mod tidy on every mod file in the repo go mod tidy cd ./apis && go mod tidy +GOLANGCI_LINT_VERSION ?= v2.4.0 .PHONY: golangci-lint golangci-lint: - test -s $(LOCALBIN)/golangci-lint || curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s v1.59.1 + test -s $(LOCALBIN)/golangci-lint || curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s $(GOLANGCI_LINT_VERSION) $(LOCALBIN)/golangci-lint run --fix MAX_PROCS := 5 @@ -312,7 +313,7 @@ KUSTOMIZE_VERSION ?= v5.5.0 #(dprince: bumped to aquire new features like --load CONTROLLER_TOOLS_VERSION ?= v0.14.0 CRD_MARKDOWN_VERSION ?= v0.0.3 KUTTL_VERSION ?= 0.17.0 -GOTOOLCHAIN_VERSION ?= go1.21.0 +GOTOOLCHAIN_VERSION ?= go1.23.0 OC_VERSION ?= 4.16.0 KUSTOMIZE_INSTALL_SCRIPT ?= "https://raw.githubusercontent.com/kubernetes-sigs/kustomize/master/hack/install_kustomize.sh" diff --git a/apis/go.mod b/apis/go.mod index d1e84af6b1..7019b57c2e 100644 --- a/apis/go.mod +++ b/apis/go.mod @@ -1,6 +1,6 @@ module github.com/openstack-k8s-operators/openstack-operator/apis -go 1.21 +go 1.23 require ( github.com/cert-manager/cert-manager v1.14.7 diff --git a/go.mod b/go.mod index e2f01b87bb..38e52d7992 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module github.com/openstack-k8s-operators/openstack-operator -go 1.21 +go 1.23 require ( github.com/cert-manager/cert-manager v1.14.7 diff --git a/zuul.d/jobs.yaml b/zuul.d/jobs.yaml index 8d31ace4cb..2750ff2bbf 100644 --- a/zuul.d/jobs.yaml +++ b/zuul.d/jobs.yaml @@ -32,8 +32,8 @@ parent: podified-multinode-edpm-deployment-crc-3comp dependencies: ["openstack-k8s-operators-content-provider"] vars: - cifmw_operator_build_golang_ct: "docker.io/library/golang:1.21" - cifmw_operator_build_golang_alt_ct: "quay.rdoproject.org/openstack-k8s-operators/golang:1.21" + cifmw_operator_build_golang_ct: "docker.io/library/golang:1.23" + cifmw_operator_build_golang_alt_ct: "quay.rdoproject.org/openstack-k8s-operators/golang:1.23" cifmw_tempest_tempestconf_config: # NOTE(alee) these tests will fail with barbican in the mix # while cinder/nova is not configured to talk to barbican From 7dccab9e8f206ef5ff14f86a3c21ccb3954cbb3a Mon Sep 17 00:00:00 2001 From: Martin Schuppert Date: Wed, 16 Apr 2025 08:04:04 +0200 Subject: [PATCH 2/3] fix golangci reported issuers Signed-off-by: Martin Schuppert --- cmd/operator/main.go | 1 + .../client/openstackclient_controller.go | 18 +++++++----- .../core/openstackcontrolplane_controller.go | 7 +++-- .../core/openstackversion_controller.go | 6 ++-- ...openstackdataplanedeployment_controller.go | 11 +++---- .../openstackdataplanenodeset_controller.go | 12 ++++---- controllers/operator/openstack_controller.go | 29 ++++++++++--------- main.go | 1 + pkg/dataplane/baremetal.go | 5 ++-- pkg/dataplane/deployment.go | 8 ++--- pkg/dataplane/inventory.go | 2 +- pkg/dataplane/ipam.go | 4 +-- pkg/dataplane/service.go | 6 ++-- pkg/dataplane/util/ansible_execution.go | 13 +++++++-- pkg/dataplane/util/ansibleee.go | 6 ++-- pkg/dataplane/util/datasource.go | 4 +-- pkg/dataplane/util/image_registry.go | 2 +- pkg/dataplane/util/version.go | 2 +- pkg/openstack/barbican.go | 1 + pkg/openstack/ca.go | 2 +- pkg/openstack/common.go | 26 +++++++++-------- pkg/openstack/dataplane.go | 1 + pkg/openstack/galera.go | 4 +-- pkg/openstack/instanceha.go | 5 +++- pkg/openstack/ironic.go | 2 +- pkg/openstack/memcached.go | 2 +- pkg/openstack/nova.go | 12 ++++---- pkg/openstack/openstackclient.go | 2 +- pkg/openstack/ovn.go | 8 +++-- pkg/openstack/rabbitmq.go | 4 +-- pkg/openstack/redis.go | 2 +- pkg/openstack/telemetry.go | 10 +++---- pkg/openstack/test.go | 17 +++++++---- pkg/openstack/version.go | 4 +-- pkg/openstackclient/funcs.go | 1 + pkg/operator/bindata/apply.go | 1 + pkg/operator/bindata/render.go | 2 +- pkg/operator/override.go | 4 +++ .../openstackoperator_controller_test.go | 2 +- .../openstackversion_controller_test.go | 2 +- tests/functional/ctlplane/suite_test.go | 4 ++- ...enstackdataplanenodeset_controller_test.go | 8 ++--- ...enstackdataplaneservice_controller_test.go | 4 +-- 43 files changed, 156 insertions(+), 111 deletions(-) diff --git a/cmd/operator/main.go b/cmd/operator/main.go index a3e0bed883..23cce6b471 100644 --- a/cmd/operator/main.go +++ b/cmd/operator/main.go @@ -14,6 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ +// Package main provides the entry point for the OpenStack operator package main import ( diff --git a/controllers/client/openstackclient_controller.go b/controllers/client/openstackclient_controller.go index e6fd7bcfef..dca574aa12 100644 --- a/controllers/client/openstackclient_controller.go +++ b/controllers/client/openstackclient_controller.go @@ -11,6 +11,7 @@ See the License for the specific language governing permissions and limitations under the License. */ +// Package client contains the OpenStackClient controller implementation package client import ( @@ -87,7 +88,7 @@ func (r *OpenStackClientReconciler) Reconcile(ctx context.Context, req ctrl.Requ Log := r.GetLogger(ctx) instance := &clientv1.OpenStackClient{} - err := r.Client.Get(context.TODO(), req.NamespacedName, instance) + err := r.Get(context.TODO(), req.NamespacedName, instance) if err != nil { if k8s_errors.IsNotFound(err) { Log.Info("OpenStackClient CR not found") @@ -271,7 +272,8 @@ func (r *OpenStackClientReconciler) Reconcile(ctx context.Context, req ctrl.Requ condition.TLSInputReadyCondition, condition.RequestedReason, condition.SeverityInfo, - fmt.Sprintf(condition.TLSInputReadyWaitingMessage, instance.Spec.CaBundleSecretName))) + condition.TLSInputReadyWaitingMessage, + instance.Spec.CaBundleSecretName)) return ctrl.Result{}, nil } instance.Status.Conditions.Set(condition.FalseCondition( @@ -320,7 +322,7 @@ func (r *OpenStackClientReconciler) Reconcile(ctx context.Context, req ctrl.Requ podSpecHashName := "podSpec" op, err := controllerutil.CreateOrPatch(ctx, r.Client, osclient, func() error { - isPodUpdate := !osclient.ObjectMeta.CreationTimestamp.IsZero() + isPodUpdate := !osclient.CreationTimestamp.IsZero() currentPodSpecHash := instance.Status.Hash[podSpecHashName] if !isPodUpdate || currentPodSpecHash != podSpecHash { osclient.Spec = spec @@ -348,14 +350,14 @@ func (r *OpenStackClientReconciler) Reconcile(ctx context.Context, req ctrl.Requ // openstackclient pod if err := r.Delete(ctx, osclient); err != nil && !k8s_errors.IsNotFound(err) { // Error deleting the object - return ctrl.Result{}, fmt.Errorf("Error deleting OpenStackClient pod %s: %w", osclient.Name, err) + return ctrl.Result{}, fmt.Errorf("error deleting OpenStackClient pod %s: %w", osclient.Name, err) } Log.Info(fmt.Sprintf("OpenStackClient pod deleted due to change %s", err.Error())) return ctrl.Result{Requeue: true}, nil } - return ctrl.Result{}, fmt.Errorf("Failed to create or update pod %s: %w", osclient.Name, err) + return ctrl.Result{}, fmt.Errorf("failed to create or update pod %s: %w", osclient.Name, err) } if err != nil { @@ -383,9 +385,9 @@ func (r *OpenStackClientReconciler) Reconcile(ctx context.Context, req ctrl.Requ terminatingDuration := time.Since(osclient.DeletionTimestamp.Time) if terminatingDuration > time.Minute*3 { // Force delete only truly stuck pods - err := r.Client.Delete(ctx, osclient, client.GracePeriodSeconds(0)) + err := r.Delete(ctx, osclient, client.GracePeriodSeconds(0)) if err != nil { - return ctrl.Result{}, fmt.Errorf("Failed to force delete pod: %w", err) + return ctrl.Result{}, fmt.Errorf("failed to force delete pod: %w", err) } } } @@ -480,7 +482,7 @@ func (r *OpenStackClientReconciler) SetupWithManager( listOpts := []client.ListOption{ client.InNamespace(o.GetNamespace()), } - if err := r.Client.List(ctx, openstackclients, listOpts...); err != nil { + if err := r.List(ctx, openstackclients, listOpts...); err != nil { Log.Error(err, "Unable to retrieve OpenstackClient CRs %v") return nil } diff --git a/controllers/core/openstackcontrolplane_controller.go b/controllers/core/openstackcontrolplane_controller.go index fd11b90c2a..2d05917726 100644 --- a/controllers/core/openstackcontrolplane_controller.go +++ b/controllers/core/openstackcontrolplane_controller.go @@ -13,6 +13,8 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ + +// Package core contains the OpenStackControlPlane controller implementation package core import ( @@ -32,7 +34,6 @@ import ( ironicv1 "github.com/openstack-k8s-operators/ironic-operator/api/v1beta1" keystonev1 "github.com/openstack-k8s-operators/keystone-operator/api/v1beta1" condition "github.com/openstack-k8s-operators/lib-common/modules/common/condition" - "github.com/openstack-k8s-operators/lib-common/modules/common/helper" common_helper "github.com/openstack-k8s-operators/lib-common/modules/common/helper" corev1 "k8s.io/api/core/v1" @@ -131,7 +132,7 @@ func (r *OpenStackControlPlaneReconciler) Reconcile(ctx context.Context, req ctr Log := r.GetLogger(ctx) // Fetch the OpenStackControlPlane instance instance := &corev1beta1.OpenStackControlPlane{} - err := r.Client.Get(ctx, req.NamespacedName, instance) + err := r.Get(ctx, req.NamespacedName, instance) if err != nil { if k8s_errors.IsNotFound(err) { // Request object not found, could have been deleted after reconcile request. @@ -777,7 +778,7 @@ func (r *OpenStackControlPlaneReconciler) findObjectsForSrc(ctx context.Context, // Verify the referenced topology exists func (r *OpenStackControlPlaneReconciler) checkTopologyRef( ctx context.Context, - h *helper.Helper, + h *common_helper.Helper, topologyRef *topologyv1.TopoRef, namespace string, ) error { diff --git a/controllers/core/openstackversion_controller.go b/controllers/core/openstackversion_controller.go index 85c7e9b36c..ae7d16082c 100644 --- a/controllers/core/openstackversion_controller.go +++ b/controllers/core/openstackversion_controller.go @@ -93,7 +93,7 @@ func (r *OpenStackVersionReconciler) Reconcile(ctx context.Context, req ctrl.Req Log.Info("Reconciling OpenStackVersion") // Fetch the instance instance := &corev1beta1.OpenStackVersion{} - err := r.Client.Get(ctx, req.NamespacedName, instance) + err := r.Get(ctx, req.NamespacedName, instance) if err != nil { if k8s_errors.IsNotFound(err) { // Request object not found, could have been deleted after reconcile request. @@ -228,7 +228,7 @@ func (r *OpenStackVersionReconciler) Reconcile(ctx context.Context, req ctrl.Req // lookup the current Controlplane object controlPlane := &corev1beta1.OpenStackControlPlane{} - err = r.Client.Get(ctx, client.ObjectKey{ + err = r.Get(ctx, client.ObjectKey{ Namespace: instance.Namespace, Name: instance.Name, }, controlPlane) @@ -414,7 +414,7 @@ func (r *OpenStackVersionReconciler) SetupWithManager(mgr ctrl.Manager) error { listOpts := []client.ListOption{ client.InNamespace(o.GetNamespace()), } - if err := r.Client.List(ctx, versionList, listOpts...); err != nil { + if err := r.List(ctx, versionList, listOpts...); err != nil { Log.Error(err, "Unable to retrieve OpenStackVersion") return nil } diff --git a/controllers/dataplane/openstackdataplanedeployment_controller.go b/controllers/dataplane/openstackdataplanedeployment_controller.go index d24ae28781..be5301ae48 100644 --- a/controllers/dataplane/openstackdataplanedeployment_controller.go +++ b/controllers/dataplane/openstackdataplanedeployment_controller.go @@ -14,6 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ +// Package dataplane contains the OpenStackDataPlaneDeployment controller implementation package dataplane import ( @@ -82,7 +83,7 @@ func (r *OpenStackDataPlaneDeploymentReconciler) Reconcile(ctx context.Context, } // Fetch the OpenStackDataPlaneDeployment instance instance := &dataplanev1.OpenStackDataPlaneDeployment{} - err := r.Client.Get(ctx, req.NamespacedName, instance) + err := r.Get(ctx, req.NamespacedName, instance) if err != nil { if k8s_errors.IsNotFound(err) { // Request object not found, could have been deleted after reconcile request. @@ -343,7 +344,7 @@ func (r *OpenStackDataPlaneDeploymentReconciler) Reconcile(ctx context.Context, severity, condition.DeploymentReadyErrorMessage, deploymentErrMsg) - return ctrl.Result{}, fmt.Errorf(deploymentErrMsg) + return ctrl.Result{}, fmt.Errorf("%s", deploymentErrMsg) } if shouldRequeue { @@ -365,7 +366,7 @@ func (r *OpenStackDataPlaneDeploymentReconciler) Reconcile(ctx context.Context, return ctrl.Result{}, nil } -// GetService +// GetService retrieves a service for the OpenStackDataPlaneDeployment func (r *OpenStackDataPlaneDeploymentReconciler) GetService( ctx context.Context, helper *helper.Helper, @@ -456,7 +457,7 @@ func (r *OpenStackDataPlaneDeploymentReconciler) SetupWithManager(mgr ctrl.Manag listOpts := []client.ListOption{ client.InNamespace(obj.GetNamespace()), } - if err := r.Client.List(context.Background(), deployments, listOpts...); err != nil { + if err := r.List(context.Background(), deployments, listOpts...); err != nil { Log.Error(err, "Unable to retrieve deployments %w") return nil } @@ -504,7 +505,7 @@ func (r *OpenStackDataPlaneDeploymentReconciler) listNodeSets(ctx context.Contex // Fetch the OpenStackDataPlaneNodeSet instance nodeSetInstance := &dataplanev1.OpenStackDataPlaneNodeSet{} - err := r.Client.Get( + err := r.Get( ctx, types.NamespacedName{ Namespace: instance.GetNamespace(), diff --git a/controllers/dataplane/openstackdataplanenodeset_controller.go b/controllers/dataplane/openstackdataplanenodeset_controller.go index 450e1639d5..58f49fea80 100644 --- a/controllers/dataplane/openstackdataplanenodeset_controller.go +++ b/controllers/dataplane/openstackdataplanenodeset_controller.go @@ -145,7 +145,7 @@ func (r *OpenStackDataPlaneNodeSetReconciler) Reconcile(ctx context.Context, req // Fetch the OpenStackDataPlaneNodeSet instance instance := &dataplanev1.OpenStackDataPlaneNodeSet{} - err := r.Client.Get(ctx, req.NamespacedName, instance) + err := r.Get(ctx, req.NamespacedName, instance) if err != nil { if k8s_errors.IsNotFound(err) { // Request object not found, could have been deleted after reconcile request. @@ -282,7 +282,7 @@ func (r *OpenStackDataPlaneNodeSetReconciler) Reconcile(ctx context.Context, req condition.InputReadyCondition, condition.RequestedReason, condition.SeverityError, - err.Error()) + "%s", err.Error()) return result, err } else if (result != ctrl.Result{}) { instance.Status.Conditions.MarkFalse( @@ -461,7 +461,7 @@ func (r *OpenStackDataPlaneNodeSetReconciler) Reconcile(ctx context.Context, req } instance.Status.Conditions.MarkFalse(condition.DeploymentReadyCondition, condition.ErrorReason, condition.SeverityError, - deployErrorMsg) + "%s", deployErrorMsg) } return ctrl.Result{}, err @@ -511,7 +511,7 @@ func checkDeployment(ctx context.Context, helper *helper.Helper, instance.Status.DeploymentStatuses[deployment.Name] = deploymentConditions deploymentCondition := deploymentConditions.Get(dataplanev1.NodeSetDeploymentReadyCondition) if condition.IsError(deploymentCondition) { - err = fmt.Errorf(deploymentCondition.Message) + err = fmt.Errorf("%s", deploymentCondition.Message) isDeploymentFailed = true failedDeploymentName = deployment.Name break @@ -677,7 +677,7 @@ func (r *OpenStackDataPlaneNodeSetReconciler) machineConfigWatcherFn( listOpts := []client.ListOption{ client.InNamespace(obj.GetNamespace()), } - if err := r.Client.List(ctx, nodeSets, listOpts...); err != nil { + if err := r.List(ctx, nodeSets, listOpts...); err != nil { Log.Error(err, "Unable to retrieve OpenStackDataPlaneNodeSetList") return nil } @@ -739,7 +739,7 @@ func (r *OpenStackDataPlaneNodeSetReconciler) genericWatcherFn( listOpts := []client.ListOption{ client.InNamespace(obj.GetNamespace()), } - if err := r.Client.List(ctx, nodeSets, listOpts...); err != nil { + if err := r.List(ctx, nodeSets, listOpts...); err != nil { Log.Error(err, "Unable to retrieve OpenStackDataPlaneNodeSetList") return nil } diff --git a/controllers/operator/openstack_controller.go b/controllers/operator/openstack_controller.go index 998b2c1d8e..fff4c2a5cd 100644 --- a/controllers/operator/openstack_controller.go +++ b/controllers/operator/openstack_controller.go @@ -14,6 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ +// Package operator contains the OpenStack operator controller implementation package operator import ( @@ -133,12 +134,12 @@ func (r *OpenStackReconciler) Reconcile(ctx context.Context, req ctrl.Request) ( // Fetch the OpenStack instance instanceList := &operatorv1beta1.OpenStackList{} - err := r.Client.List(ctx, instanceList, &client.ListOptions{}) + err := r.List(ctx, instanceList, &client.ListOptions{}) if err != nil { return ctrl.Result{}, errors.Wrap(err, "failed listing all OpenStack instances") } instance := &operatorv1beta1.OpenStack{} - err = r.Client.Get(ctx, req.NamespacedName, instance) + err = r.Get(ctx, req.NamespacedName, instance) if err != nil { if apierrors.IsNotFound(err) { // Request object not found, could have been deleted after reconcile req. @@ -229,7 +230,7 @@ func (r *OpenStackReconciler) Reconcile(ctx context.Context, req ctrl.Request) ( } if instanceList.Items[0].Name != req.Name { Log.Info("Ignoring OpenStack.operator.openstack.org because one already exists and does not match existing name") - err = r.Client.Delete(ctx, instance, &client.DeleteOptions{}) + err = r.Delete(ctx, instance, &client.DeleteOptions{}) if err != nil { instance.Status.Conditions.Set(condition.FalseCondition( operatorv1beta1.OpenStackOperatorReadyCondition, @@ -363,7 +364,7 @@ func (r *OpenStackReconciler) reconcileDelete(ctx context.Context, instance *ope func (r *OpenStackReconciler) countDeployments(ctx context.Context, instance *operatorv1beta1.OpenStack) (int, []string, error) { deployments := &appsv1.DeploymentList{} pending := []string{} - err := r.Client.List(ctx, deployments, &client.ListOptions{Namespace: instance.Namespace}) + err := r.List(ctx, deployments, &client.ListOptions{Namespace: instance.Namespace}) if err != nil { return 0, pending, err } @@ -409,7 +410,7 @@ func (r *OpenStackReconciler) checkServiceEndpoints(ctx context.Context, instanc Log := r.GetLogger(ctx) endpointSliceList := &discoveryv1.EndpointSliceList{} - err := r.Client.List(ctx, endpointSliceList, &client.ListOptions{Namespace: instance.Namespace}) + err := r.List(ctx, endpointSliceList, &client.ListOptions{Namespace: instance.Namespace}) if err != nil { if apierrors.IsNotFound(err) { Log.Info("Webhook endpoint not found. Requeuing...") @@ -755,14 +756,14 @@ func (r *OpenStackReconciler) cleanupObsoleteResources(ctx context.Context, inst csvList := &uns.UnstructuredList{} csvList.SetGroupVersionKind(csvGVR.GroupVersion().WithKind("ClusterServiceVersion")) - err := r.Client.List(ctx, csvList, &client.ListOptions{Namespace: instance.Namespace}) + err := r.List(ctx, csvList, &client.ListOptions{Namespace: instance.Namespace}) if err != nil { return err } for _, csv := range csvList.Items { Log.Info("Found CSV", "name", csv.GetName()) if isServiceOperatorResource(csv.GetName()) { - err = r.Client.Delete(ctx, &csv) + err = r.Delete(ctx, &csv) if err != nil { if apierrors.IsNotFound(err) { Log.Info("CSV not found on delete. Continuing...", "name", csv.GetName()) @@ -776,14 +777,14 @@ func (r *OpenStackReconciler) cleanupObsoleteResources(ctx context.Context, inst subscriptionList := &uns.UnstructuredList{} subscriptionList.SetGroupVersionKind(subscriptionGVR.GroupVersion().WithKind("Subscription")) - err = r.Client.List(ctx, subscriptionList, &client.ListOptions{Namespace: instance.Namespace}) + err = r.List(ctx, subscriptionList, &client.ListOptions{Namespace: instance.Namespace}) if err != nil { return err } for _, subscription := range subscriptionList.Items { Log.Info("Found Subscription", "name", subscription.GetName()) if isServiceOperatorResource(subscription.GetName()) { - err = r.Client.Delete(ctx, &subscription) + err = r.Delete(ctx, &subscription) if err != nil { if apierrors.IsNotFound(err) { Log.Info("Subscription not found on delete. Continuing...", "name", subscription.GetName()) @@ -800,7 +801,7 @@ func (r *OpenStackReconciler) cleanupObsoleteResources(ctx context.Context, inst installPlanList := &uns.UnstructuredList{} installPlanList.SetGroupVersionKind(installPlanGVR.GroupVersion().WithKind("InstallPlan")) - err = r.Client.List(ctx, installPlanList, &client.ListOptions{Namespace: instance.Namespace}) + err = r.List(ctx, installPlanList, &client.ListOptions{Namespace: instance.Namespace}) if err != nil { return err } @@ -814,7 +815,7 @@ func (r *OpenStackReconciler) cleanupObsoleteResources(ctx context.Context, inst if found { // just checking for the first one should be sufficient if isServiceOperatorResource(csvNames[0].(string)) { - err = r.Client.Delete(ctx, &installPlan) + err = r.Delete(ctx, &installPlan) if err != nil { if apierrors.IsNotFound(err) { Log.Info("Installplane not found on delete. Continuing...", "name", installPlan.GetName()) @@ -848,7 +849,7 @@ func (r *OpenStackReconciler) postCleanupObsoleteResources(ctx context.Context, // 4) installPlan from old service operators removed operatorList := &uns.UnstructuredList{} operatorList.SetGroupVersionKind(operatorGVR.GroupVersion().WithKind("Operator")) - err := r.Client.List(ctx, operatorList, &client.ListOptions{Namespace: instance.Namespace}) + err := r.List(ctx, operatorList, &client.ListOptions{Namespace: instance.Namespace}) if err != nil { return err } @@ -894,7 +895,7 @@ func (r *OpenStackReconciler) postCleanupObsoleteResources(ctx context.Context, // references from CRD's should be removed before this function is called // but this is a safeguard as we do not want to delete them if refData["kind"].(string) != "CustomResourceDefinition" { - err = r.Client.Delete(ctx, &obj) + err = r.Delete(ctx, &obj) if err != nil { if apierrors.IsNotFound(err) { Log.Info("Object not found on delete. Continuing...", "name", obj.GetName()) @@ -908,7 +909,7 @@ func (r *OpenStackReconciler) postCleanupObsoleteResources(ctx context.Context, return fmt.Errorf("Requeuing/Found references for operator name: %s, refs: %v", operator.GetName(), refs) } // no refs found so we should be able to successfully delete the operator - err = r.Client.Delete(ctx, &operator) + err = r.Delete(ctx, &operator) if err != nil { return err } diff --git a/main.go b/main.go index 97b4c08081..dd98b44330 100644 --- a/main.go +++ b/main.go @@ -14,6 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ +// Package main provides the entry point for the OpenStack operator package main import ( diff --git a/pkg/dataplane/baremetal.go b/pkg/dataplane/baremetal.go index 68b63bc4dc..8ac9905239 100644 --- a/pkg/dataplane/baremetal.go +++ b/pkg/dataplane/baremetal.go @@ -14,6 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ +// Package deployment provides functionality for OpenStack dataplane baremetal deployment operations package deployment import ( @@ -29,13 +30,13 @@ import ( condition "github.com/openstack-k8s-operators/lib-common/modules/common/condition" "github.com/openstack-k8s-operators/lib-common/modules/common/helper" "github.com/openstack-k8s-operators/lib-common/modules/common/labels" - "github.com/openstack-k8s-operators/lib-common/modules/common/util" utils "github.com/openstack-k8s-operators/lib-common/modules/common/util" baremetalv1 "github.com/openstack-k8s-operators/openstack-baremetal-operator/api/v1beta1" openstackv1 "github.com/openstack-k8s-operators/openstack-operator/apis/core/v1beta1" dataplanev1 "github.com/openstack-k8s-operators/openstack-operator/apis/dataplane/v1beta1" ) +// ProvisionResult represents the result of a baremetal provisioning operation type ProvisionResult struct { IsProvisioned bool BmhRefHash string @@ -141,7 +142,7 @@ func DeployBaremetalSet( } func getBMHRefHash(bmSet *baremetalv1.OpenStackBaremetalSet) (string, error) { - bmhRefHash, err := util.ObjectHash(bmSet.Status.BaremetalHosts) + bmhRefHash, err := utils.ObjectHash(bmSet.Status.BaremetalHosts) if err != nil { return "", err } diff --git a/pkg/dataplane/deployment.go b/pkg/dataplane/deployment.go index bd11edcdd6..b4062c9118 100644 --- a/pkg/dataplane/deployment.go +++ b/pkg/dataplane/deployment.go @@ -207,7 +207,7 @@ func (d *Deployer) ConditionalDeploy( readyCondition, condition.RequestedReason, condition.SeverityInfo, - readyWaitingMessage)) + "%s", readyWaitingMessage)) } @@ -234,7 +234,7 @@ func (d *Deployer) ConditionalDeploy( log.Info(fmt.Sprintf("Condition %s ready", readyCondition)) nsConditions.Set(condition.TrueCondition( readyCondition, - readyMessage)) + "%s", readyMessage)) } else if ansibleJob.Status.Failed > *ansibleJob.Spec.BackoffLimit { errorMsg := fmt.Sprintf("execution.name %s execution.namespace %s failed pods: %d", ansibleJob.Name, ansibleJob.Namespace, ansibleJob.Status.Failed) for _, condition := range ansibleJob.Status.Conditions { @@ -246,7 +246,7 @@ func (d *Deployer) ConditionalDeploy( errorMsg = fmt.Sprintf("backoff limit reached for execution.name %s execution.namespace %s execution.condition.message: %s", ansibleJob.Name, ansibleJob.Namespace, ansibleCondition.Message) } log.Info(fmt.Sprintf("Condition %s error", readyCondition)) - err = fmt.Errorf(errorMsg) + err = fmt.Errorf("%s", errorMsg) nsConditions.Set(condition.FalseCondition( readyCondition, condition.Reason(ansibleCondition.Reason), @@ -259,7 +259,7 @@ func (d *Deployer) ConditionalDeploy( readyCondition, condition.RequestedReason, condition.SeverityInfo, - readyWaitingMessage)) + "%s", readyWaitingMessage)) } } d.Status.NodeSetConditions[d.NodeSet.Name] = nsConditions diff --git a/pkg/dataplane/inventory.go b/pkg/dataplane/inventory.go index e201a36e78..fd2f144420 100644 --- a/pkg/dataplane/inventory.go +++ b/pkg/dataplane/inventory.go @@ -223,7 +223,7 @@ func GenerateNodeSetInventory(ctx context.Context, helper *helper.Helper, "openstackdataplanenodeset": instance.Name, "inventory": "true", } - for key, val := range instance.ObjectMeta.Labels { + for key, val := range instance.Labels { labels[key] = val } template := []utils.Template{ diff --git a/pkg/dataplane/ipam.go b/pkg/dataplane/ipam.go index 1a847e0e50..6489927076 100644 --- a/pkg/dataplane/ipam.go +++ b/pkg/dataplane/ipam.go @@ -87,7 +87,7 @@ func checkDNSService(ctx context.Context, helper *helper.Helper, return nil } -// createNetServiceNetMap Creates a map of net and ServiceNet +// BuildNetServiceNetMap creates a map of net and ServiceNet func BuildNetServiceNetMap(netconfig infranetworkv1.NetConfig) map[string]string { serviceNetMap := make(map[string]string) for _, net := range netconfig.Spec.Networks { @@ -196,7 +196,7 @@ func EnsureDNSData(ctx context.Context, helper *helper.Helper, instance.Status.Conditions.MarkFalse( dataplanev1.NodeSetDNSDataReadyCondition, condition.ErrorReason, condition.SeverityError, - err.Error()) + "%s", err.Error()) return dnsDetails, err } if dnsDetails.ClusterAddresses == nil { diff --git a/pkg/dataplane/service.go b/pkg/dataplane/service.go index d7fc56d734..cb80cd6808 100644 --- a/pkg/dataplane/service.go +++ b/pkg/dataplane/service.go @@ -78,7 +78,9 @@ func EnsureServices(ctx context.Context, helper *helper.Helper, instance *datapl servicesPath, found := os.LookupEnv("OPERATOR_SERVICES") if !found { servicesPath = "config/services" - os.Setenv("OPERATOR_SERVICES", servicesPath) + if err := os.Setenv("OPERATOR_SERVICES", servicesPath); err != nil { + return fmt.Errorf("failed to set OPERATOR_SERVICES environment variable: %w", err) + } util.LogForObject( helper, "OPERATOR_SERVICES not set in env when reconciling ", instance, "defaulting to ", servicesPath) @@ -150,7 +152,7 @@ func EnsureServices(ctx context.Context, helper *helper.Helper, instance *datapl return nil } -// Dedupe services to deploy +// DedupeServices deduplicates services to deploy. // Multiple Services of same ServiceType/ServiceName in a nodeset // Global Services in multiple NodeSets for a deployment func DedupeServices(ctx context.Context, helper *helper.Helper, diff --git a/pkg/dataplane/util/ansible_execution.go b/pkg/dataplane/util/ansible_execution.go index f667deb1b4..ff74131041 100644 --- a/pkg/dataplane/util/ansible_execution.go +++ b/pkg/dataplane/util/ansible_execution.go @@ -14,7 +14,8 @@ See the License for the specific language governing permissions and limitations under the License. */ -package util +// Package util provides utility functions for OpenStack dataplane operations +package util //nolint:revive // util is an acceptable package name in this context import ( "context" @@ -198,6 +199,7 @@ func GetAnsibleExecutionNameAndLabels(service *dataplanev1.OpenStackDataPlaneSer return executionName, labels } +// BuildAeeJobSpec builds the job specification for Ansible Execution Environment func (a *EEJob) BuildAeeJobSpec( aeeSpec *dataplanev1.AnsibleEESpec, deployment *dataplanev1.OpenStackDataPlaneDeployment, @@ -228,6 +230,7 @@ func (a *EEJob) BuildAeeJobSpec( a.DetermineAeeImage(aeeSpec) } +// FormatAEECmdLineArguments formats command line arguments for Ansible Execution Environment func (a *EEJob) FormatAEECmdLineArguments(aeeSpec *dataplanev1.AnsibleEESpec) { var cmdLineArguments strings.Builder @@ -246,6 +249,7 @@ func (a *EEJob) FormatAEECmdLineArguments(aeeSpec *dataplanev1.AnsibleEESpec) { } } +// FormatAEEExtraVars formats extra variables for Ansible Execution Environment func (a *EEJob) FormatAEEExtraVars( aeeSpec *dataplanev1.AnsibleEESpec, service *dataplanev1.OpenStackDataPlaneService, @@ -278,6 +282,7 @@ func (a *EEJob) FormatAEEExtraVars( } } +// DetermineAeeImage determines the appropriate image for Ansible Execution Environment func (a *EEJob) DetermineAeeImage(aeeSpec *dataplanev1.AnsibleEESpec) { if len(aeeSpec.OpenStackAnsibleEERunnerImage) > 0 { a.Image = aeeSpec.OpenStackAnsibleEERunnerImage @@ -286,7 +291,8 @@ func (a *EEJob) DetermineAeeImage(aeeSpec *dataplanev1.AnsibleEESpec) { } } -// SetAeeSshMounts - Using the information provided from the NodeSet, Service and AnsibleEE Spec. We determine the required +// SetAeeSSHMounts determines the required SSH key mounts for the Ansible Execution Job. +// Using the information provided from the NodeSet, Service and AnsibleEE Spec, it determines the required // ssh key mounts that are required for the Ansible Execution Job. This function takes a pointer to the storage.VolMounts // struct and updates them as per the required ssh key related mounts. func SetAeeSSHMounts( @@ -328,6 +334,7 @@ func SetAeeSSHMounts( } } +// SetAeeInvMounts sets up inventory mounts for Ansible Execution Environment func SetAeeInvMounts( nodeSet client.Object, service *dataplanev1.OpenStackDataPlaneService, @@ -364,6 +371,7 @@ func SetAeeInvMounts( } } +// CreateVolume creates a volume configuration for Ansible Execution Environment mounts func CreateVolume(ansibleEEMounts *storage.VolMounts, volumeName string, volumeMountPath string, secretName string, keyToPathKey string) { volume := storage.Volume{ Name: volumeName, @@ -383,6 +391,7 @@ func CreateVolume(ansibleEEMounts *storage.VolMounts, volumeName string, volumeM ansibleEEMounts.Volumes = append(ansibleEEMounts.Volumes, volume) } +// CreateVolumeMount creates a volume mount configuration for Ansible Execution Environment func CreateVolumeMount(ansibleEEMounts *storage.VolMounts, volumeMountName string, volumeMountPath string, volumeMountSubPath string) { volumeMount := corev1.VolumeMount{ Name: volumeMountName, diff --git a/pkg/dataplane/util/ansibleee.go b/pkg/dataplane/util/ansibleee.go index acc1be9786..1cf79eb8e5 100644 --- a/pkg/dataplane/util/ansibleee.go +++ b/pkg/dataplane/util/ansibleee.go @@ -1,4 +1,4 @@ -package util +package util //nolint:revive // util is an acceptable package name in this context import ( "encoding/json" @@ -95,7 +95,7 @@ func (a *EEJob) JobForOpenStackAnsibleEE(h *helper.Helper) (*batchv1.Job, error) // ansible runner identifier // if the flag is set we use resource name as an argument // https://ansible-runner.readthedocs.io/en/stable/intro/#artifactdir - if !(util.StringInSlice("-i", args) || util.StringInSlice("--ident", args)) { + if !util.StringInSlice("-i", args) && !util.StringInSlice("--ident", args) { identifier := a.Name args = append(args, []string{"-i", identifier}...) } @@ -111,7 +111,7 @@ func (a *EEJob) JobForOpenStackAnsibleEE(h *helper.Helper) (*batchv1.Job, error) }}, } - if a.NodeSelector != nil && len(a.NodeSelector) > 0 { + if len(a.NodeSelector) > 0 { podSpec.NodeSelector = a.NodeSelector } diff --git a/pkg/dataplane/util/datasource.go b/pkg/dataplane/util/datasource.go index 402c0f31e2..3c8bdc263c 100644 --- a/pkg/dataplane/util/datasource.go +++ b/pkg/dataplane/util/datasource.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package util +package util //nolint:revive // util is an acceptable package name in this context import ( "context" @@ -27,7 +27,7 @@ import ( "k8s.io/apimachinery/pkg/types" ) -// GetDataSourceCmSecrets gets the ConfigMaps and Secrets from a DataSource +// GetDataSourceCmSecret gets the ConfigMaps and Secrets from a DataSource func GetDataSourceCmSecret(ctx context.Context, helper *helper.Helper, namespace string, dataSource dataplanev1.DataSource) (*v1.ConfigMap, *v1.Secret, error) { var configMap *v1.ConfigMap diff --git a/pkg/dataplane/util/image_registry.go b/pkg/dataplane/util/image_registry.go index 3413eff4c4..f22be79d02 100644 --- a/pkg/dataplane/util/image_registry.go +++ b/pkg/dataplane/util/image_registry.go @@ -1,4 +1,4 @@ -package util +package util //nolint:revive // util is an acceptable package name in this context import ( "context" diff --git a/pkg/dataplane/util/version.go b/pkg/dataplane/util/version.go index b02f72e0fe..0a4782faee 100644 --- a/pkg/dataplane/util/version.go +++ b/pkg/dataplane/util/version.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package util +package util //nolint:revive // util is an acceptable package name in this context import ( "context" diff --git a/pkg/openstack/barbican.go b/pkg/openstack/barbican.go index 4ecac0e4ab..e7040feda7 100644 --- a/pkg/openstack/barbican.go +++ b/pkg/openstack/barbican.go @@ -1,3 +1,4 @@ +// Package openstack provides OpenStack service reconciliation and management functionality package openstack import ( diff --git a/pkg/openstack/ca.go b/pkg/openstack/ca.go index d92b452aed..41ba594ea6 100644 --- a/pkg/openstack/ca.go +++ b/pkg/openstack/ca.go @@ -718,7 +718,7 @@ func getCAFromSecret( func getOperatorCABundle(caFile string) ([]byte, error) { contents, err := os.ReadFile(caFile) if err != nil { - return nil, fmt.Errorf("File reading error %w", err) + return nil, fmt.Errorf("file reading error %w", err) } return contents, nil diff --git a/pkg/openstack/common.go b/pkg/openstack/common.go index 87c21f768d..376c7f6b59 100644 --- a/pkg/openstack/common.go +++ b/pkg/openstack/common.go @@ -38,7 +38,6 @@ import ( corev1 "github.com/openstack-k8s-operators/openstack-operator/apis/core/v1beta1" // corev1 "k8s.io/api/core/v1" - corev1beta1 "github.com/openstack-k8s-operators/openstack-operator/apis/core/v1beta1" ovnv1 "github.com/openstack-k8s-operators/ovn-operator/api/v1beta1" placementv1 "github.com/openstack-k8s-operators/placement-operator/api/v1beta1" swiftv1 "github.com/openstack-k8s-operators/swift-operator/api/v1beta1" @@ -114,7 +113,7 @@ func AddServiceOpenStackOperatorLabel(svcOverride service.RoutedOverrideSpec, va return svcOverride } -// Endpoints +// Endpoints represents service endpoint details and TLS CA configuration type Endpoints struct { EndpointDetails map[service.Endpoint]EndpointDetail tls.Ca @@ -180,7 +179,7 @@ func GetRoutesListWithLabel( } if err := h.GetClient().List(ctx, routeList, listOpts...); err != nil { - err = fmt.Errorf("Error listing routes for %s: %w", labelSelectorMap, err) + err = fmt.Errorf("error listing routes for %s: %w", labelSelectorMap, err) return nil, err } @@ -239,7 +238,7 @@ func EnsureEndpointConfig( switch ed.Type { case service.EndpointPublic: // If the service has the create ingress annotation and its a default ClusterIP service -> create route - ed.Route.Create = svc.ObjectMeta.Annotations[service.AnnotationIngressCreateKey] == "true" && + ed.Route.Create = svc.Annotations[service.AnnotationIngressCreateKey] == "true" && svc.Spec.Type == k8s_corev1.ServiceTypeClusterIP if ingressOverride.Route != nil { @@ -293,7 +292,7 @@ func EnsureEndpointConfig( // a LoadBalancer (MetalLB) for the public endpoints. if !ed.Route.Create && (tlsConfig.API.Public.SecretName != nil && *tlsConfig.API.Public.SecretName != "") { ed.Service.TLS.SecretName = tlsConfig.API.Public.SecretName - _, err := ed.Service.TLS.GenericService.ValidateCertSecret(ctx, helper, instance.GetNamespace()) + _, err := ed.Service.TLS.ValidateCertSecret(ctx, helper, instance.GetNamespace()) if err != nil { if k8s_errors.IsNotFound(err) { return endpoints, ctrl.Result{RequeueAfter: time.Duration(10) * time.Second}, nil @@ -451,7 +450,7 @@ func (ed *EndpointDetail) ensureRoute( owner := metav1.GetControllerOf(&r.ObjectMeta) // Delete the route if the service was changed not to expose a route - if svc.ObjectMeta.Annotations[service.AnnotationIngressCreateKey] == "false" && + if svc.Annotations[service.AnnotationIngressCreateKey] == "false" && r.Spec.To.Name == ed.Name && owner != nil && owner.UID == instance.GetUID() { // Delete any other owner refs from ref list to not block deletion until owners are gone @@ -461,7 +460,7 @@ func (ed *EndpointDetail) ensureRoute( if ed.Service.TLS.Enabled { err = DeleteCertificate(ctx, helper, instance.Namespace, ed.Route.TLS.CertName) if err != nil && !k8s_errors.IsNotFound(err) { - err = fmt.Errorf("Error deleting route certificate %s: %w", ed.Route.TLS.CertName, err) + err = fmt.Errorf("error deleting route certificate %s: %w", ed.Route.TLS.CertName, err) return ctrl.Result{}, err } } @@ -469,7 +468,7 @@ func (ed *EndpointDetail) ensureRoute( // Delete route err := helper.GetClient().Delete(ctx, &r) if err != nil && !k8s_errors.IsNotFound(err) { - err = fmt.Errorf("Error deleting route %s: %w", r.Name, err) + err = fmt.Errorf("error deleting route %s: %w", r.Name, err) return ctrl.Result{}, err } @@ -495,7 +494,7 @@ func (ed *EndpointDetail) ensureRoute( ed.Service.OverrideSpec.EmbeddedLabelsAnnotations = &service.EmbeddedLabelsAnnotations{} } - if labelVal, ok := ed.Service.OverrideSpec.EmbeddedLabelsAnnotations.Labels[ooAppSelector]; ok { + if labelVal, ok := ed.Service.OverrideSpec.Labels[ooAppSelector]; ok { ed.Labels = map[string]string{ooAppSelector: labelVal} } @@ -532,7 +531,7 @@ func (ed *EndpointDetail) CreateRoute( // initialize the route with any custom provided route override // per default use the service name as targetPortName if we don't have the annotation. targetPortName := ed.Service.Spec.Name - if name, ok := ed.Service.Spec.ObjectMeta.Annotations[service.AnnotationIngressTargetPortNameKey]; ok && name != "" { + if name, ok := ed.Service.Spec.Annotations[service.AnnotationIngressTargetPortNameKey]; ok && name != "" { targetPortName = name } enptRoute, err := route.NewRoute( @@ -717,7 +716,7 @@ func (e *Endpoints) GetEndptCertSecret(endpt service.Endpoint) *string { return endptTLSSecret } -// Set up any defaults used by service operator defaulting logic +// SetupServiceOperatorDefaults sets up any defaults used by service operator defaulting logic func SetupServiceOperatorDefaults() { // Acquire environmental defaults and initialize service operators that // require each respective default @@ -780,6 +779,7 @@ func SetupServiceOperatorDefaults() { barbicanv1.SetupDefaults() } +// GetIssuerCertSecret retrieves the certificate secret from the issuer func GetIssuerCertSecret( ctx context.Context, helper *helper.Helper, @@ -820,6 +820,7 @@ func serviceExists(route string, services *k8s_corev1.ServiceList) bool { return false } +// DeleteCertificate deletes a certificate from the specified namespace func DeleteCertificate( ctx context.Context, helper *helper.Helper, @@ -840,9 +841,10 @@ func DeleteCertificate( return cert.Delete(ctx, helper) } +// DeleteCertsAndRoutes deletes certificates and routes for the OpenStack control plane func DeleteCertsAndRoutes( ctx context.Context, - instance *corev1beta1.OpenStackControlPlane, + instance *corev1.OpenStackControlPlane, helper *helper.Helper, ) (ctrl.Result, error) { diff --git a/pkg/openstack/dataplane.go b/pkg/openstack/dataplane.go index c5ed1d9c81..9a195b11f5 100644 --- a/pkg/openstack/dataplane.go +++ b/pkg/openstack/dataplane.go @@ -24,6 +24,7 @@ func GetDataplaneNodesets(ctx context.Context, instance *corev1beta1.OpenStackCo return dataplaneNodesets, nil } +// DataplaneNodesetsDeployedVersionIsSet checks if deployed version is set for all dataplane nodesets func DataplaneNodesetsDeployedVersionIsSet(dataplaneNodesets *dataplanev1.OpenStackDataPlaneNodeSetList) bool { for _, nodeset := range dataplaneNodesets.Items { // FIXME: DeployedVersion on the DataplaneNodeset should be a string pointer to match how Controlplane implements this diff --git a/pkg/openstack/galera.go b/pkg/openstack/galera.go index 63edb23ea9..962c33873c 100644 --- a/pkg/openstack/galera.go +++ b/pkg/openstack/galera.go @@ -148,7 +148,7 @@ func ReconcileGaleras( return ctrlResult, nil } - spec.TLS.Ca.CaBundleSecretName = instance.Status.TLS.CaBundleSecretName + spec.TLS.CaBundleSecretName = instance.Status.TLS.CaBundleSecretName spec.TLS.SecretName = ptr.To(certSecret.Name) status, err := reconcileGalera(ctx, instance, version, helper, name, &spec) @@ -174,7 +174,7 @@ func ReconcileGaleras( corev1beta1.OpenStackControlPlaneMariaDBReadyErrorMessage, errors)) - return ctrl.Result{}, fmt.Errorf(errors) + return ctrl.Result{}, fmt.Errorf("%s", errors) } else if len(inprogress) > 0 { log.Info("Galera in progress") diff --git a/pkg/openstack/instanceha.go b/pkg/openstack/instanceha.go index 6ee3ab2f79..56027831ab 100644 --- a/pkg/openstack/instanceha.go +++ b/pkg/openstack/instanceha.go @@ -13,10 +13,13 @@ import ( ) const ( + // InstanceHaConfigMap is the name of the ConfigMap used for instance HA configuration InstanceHaConfigMap = "infra-instanceha-config" - InstanceHaImageKey = "instanceha-image" + // InstanceHaImageKey is the key used for the instance HA image in the ConfigMap + InstanceHaImageKey = "instanceha-image" ) +// ReconcileInstanceHa reconciles the instance HA configuration for the OpenStack control plane func ReconcileInstanceHa(ctx context.Context, instance *corev1beta1.OpenStackControlPlane, version *corev1beta1.OpenStackVersion, helper *helper.Helper) (ctrl.Result, error) { customData := map[string]string{ InstanceHaImageKey: *getImg(version.Status.ContainerImages.OpenstackClientImage, &missingImageDefault), diff --git a/pkg/openstack/ironic.go b/pkg/openstack/ironic.go index 576af7c4c0..fc2ca0a119 100644 --- a/pkg/openstack/ironic.go +++ b/pkg/openstack/ironic.go @@ -222,7 +222,7 @@ func ReconcileIronic(ctx context.Context, instance *corev1beta1.OpenStackControl } -// IronicImagesCheck - return true if the ironic images match on the ControlPlane and Version, or if Ironic is not enabled +// IronicImageMatch returns true if the ironic images match on the ControlPlane and Version, or if Ironic is not enabled func IronicImageMatch(ctx context.Context, controlPlane *corev1beta1.OpenStackControlPlane, version *corev1beta1.OpenStackVersion) bool { Log := GetLogger(ctx) if controlPlane.Spec.Ironic.Enabled { diff --git a/pkg/openstack/memcached.go b/pkg/openstack/memcached.go index 0e8c081749..526b5fac00 100644 --- a/pkg/openstack/memcached.go +++ b/pkg/openstack/memcached.go @@ -119,7 +119,7 @@ func ReconcileMemcacheds( corev1beta1.OpenStackControlPlaneMemcachedReadyErrorMessage, errors)) - return ctrlResult, fmt.Errorf(errors) + return ctrlResult, fmt.Errorf("%s", errors) } else if len(inprogress) > 0 { instance.Status.Conditions.Set(condition.FalseCondition( diff --git a/pkg/openstack/nova.go b/pkg/openstack/nova.go index 60df6b4fe8..ad51ddc8d2 100644 --- a/pkg/openstack/nova.go +++ b/pkg/openstack/nova.go @@ -348,12 +348,12 @@ func ReconcileNova(ctx context.Context, instance *corev1beta1.OpenStackControlPl // RabbitMQCluster per nova cell. instance.Spec.Nova.Template.DeepCopyInto(&nova.Spec.NovaSpecCore) - nova.Spec.NovaImages.APIContainerImageURL = *version.Status.ContainerImages.NovaAPIImage - nova.Spec.NovaImages.NovaComputeContainerImageURL = *version.Status.ContainerImages.NovaComputeImage - nova.Spec.NovaImages.ConductorContainerImageURL = *version.Status.ContainerImages.NovaConductorImage - nova.Spec.NovaImages.MetadataContainerImageURL = *version.Status.ContainerImages.NovaAPIImage //metadata uses novaAPI image - nova.Spec.NovaImages.SchedulerContainerImageURL = *version.Status.ContainerImages.NovaSchedulerImage - nova.Spec.NovaImages.NoVNCContainerImageURL = *version.Status.ContainerImages.NovaNovncImage + nova.Spec.APIContainerImageURL = *version.Status.ContainerImages.NovaAPIImage + nova.Spec.NovaComputeContainerImageURL = *version.Status.ContainerImages.NovaComputeImage + nova.Spec.ConductorContainerImageURL = *version.Status.ContainerImages.NovaConductorImage + nova.Spec.MetadataContainerImageURL = *version.Status.ContainerImages.NovaAPIImage //metadata uses novaAPI image + nova.Spec.SchedulerContainerImageURL = *version.Status.ContainerImages.NovaSchedulerImage + nova.Spec.NoVNCContainerImageURL = *version.Status.ContainerImages.NovaNovncImage if nova.Spec.Secret == "" { nova.Spec.Secret = instance.Spec.Secret diff --git a/pkg/openstack/openstackclient.go b/pkg/openstack/openstackclient.go index efc7fd520a..ce8a27f0d6 100644 --- a/pkg/openstack/openstackclient.go +++ b/pkg/openstack/openstackclient.go @@ -58,7 +58,7 @@ func ReconcileOpenStackClient(ctx context.Context, instance *corev1.OpenStackCon openstackclient.Spec.ContainerImage = *version.Status.ContainerImages.OpenstackClientImage if instance.Spec.TLS.Ingress.Enabled || instance.Spec.TLS.PodLevel.Enabled { - openstackclient.Spec.Ca.CaBundleSecretName = tls.CABundleSecret + openstackclient.Spec.CaBundleSecretName = tls.CABundleSecret } err := controllerutil.SetControllerReference(helper.GetBeforeObject(), openstackclient, helper.GetScheme()) diff --git a/pkg/openstack/ovn.go b/pkg/openstack/ovn.go index 6ba45f338d..2b48031c2a 100644 --- a/pkg/openstack/ovn.go +++ b/pkg/openstack/ovn.go @@ -72,6 +72,7 @@ func ReconcileOVN(ctx context.Context, instance *corev1beta1.OpenStackControlPla return ctrl.Result{}, nil } +// ReconcileOVNDbClusters reconciles the OVN database clusters for the OpenStack control plane func ReconcileOVNDbClusters(ctx context.Context, instance *corev1beta1.OpenStackControlPlane, version *corev1beta1.OpenStackVersion, helper *helper.Helper) (bool, error) { Log := GetLogger(ctx) dnsSuffix := clusterdns.GetDNSClusterDomain() @@ -162,9 +163,10 @@ func ReconcileOVNDbClusters(ctx context.Context, instance *corev1beta1.OpenStack dbcluster.DeepCopyInto(&OVNDBCluster.Spec.OVNDBClusterSpecCore) // we always set these to match OpenStackVersion - if dbcluster.DBType == ovnv1.NBDBType { + switch dbcluster.DBType { + case ovnv1.NBDBType: OVNDBCluster.Spec.ContainerImage = *version.Status.ContainerImages.OvnNbDbclusterImage - } else if dbcluster.DBType == ovnv1.SBDBType { + case ovnv1.SBDBType: OVNDBCluster.Spec.ContainerImage = *version.Status.ContainerImages.OvnSbDbclusterImage } @@ -199,6 +201,7 @@ func ReconcileOVNDbClusters(ctx context.Context, instance *corev1beta1.OpenStack } +// ReconcileOVNNorthd reconciles the OVN Northd service for the OpenStack control plane func ReconcileOVNNorthd(ctx context.Context, instance *corev1beta1.OpenStackControlPlane, version *corev1beta1.OpenStackVersion, helper *helper.Helper) (bool, error) { Log := GetLogger(ctx) @@ -317,6 +320,7 @@ func ReconcileOVNNorthd(ctx context.Context, instance *corev1beta1.OpenStackCont } +// ReconcileOVNController reconciles the OVN Controller service for the OpenStack control plane func ReconcileOVNController(ctx context.Context, instance *corev1beta1.OpenStackControlPlane, version *corev1beta1.OpenStackVersion, helper *helper.Helper) (bool, error) { Log := GetLogger(ctx) diff --git a/pkg/openstack/rabbitmq.go b/pkg/openstack/rabbitmq.go index d19715081d..895fab388e 100644 --- a/pkg/openstack/rabbitmq.go +++ b/pkg/openstack/rabbitmq.go @@ -128,7 +128,7 @@ func ReconcileRabbitMQs( corev1beta1.OpenStackControlPlaneRabbitMQReadyErrorMessage, errors)) - return ctrl.Result{}, fmt.Errorf(errors) + return ctrl.Result{}, fmt.Errorf("%s", errors) } else if len(inprogress) > 0 { instance.Status.Conditions.Set(condition.FalseCondition( @@ -259,7 +259,7 @@ func reconcileRabbitMQ( op, err := controllerutil.CreateOrPatch(ctx, helper.GetClient(), rabbitmq, func() error { spec.DeepCopyInto(&rabbitmq.Spec.RabbitMqSpecCore) if rabbitmq.Spec.Persistence.StorageClassName == nil { - log.Info(fmt.Sprintf("Setting StorageClassName: " + instance.Spec.StorageClass)) + log.Info(fmt.Sprintf("Setting StorageClassName: %s", instance.Spec.StorageClass)) rabbitmq.Spec.Persistence.StorageClassName = &instance.Spec.StorageClass } if tlsCert != "" { diff --git a/pkg/openstack/redis.go b/pkg/openstack/redis.go index c64c7a0722..1dcc059768 100644 --- a/pkg/openstack/redis.go +++ b/pkg/openstack/redis.go @@ -134,7 +134,7 @@ func ReconcileRedis( corev1beta1.OpenStackControlPlaneRedisReadyErrorMessage, errors)) - return ctrlResult, fmt.Errorf(errors) + return ctrlResult, fmt.Errorf("%s", errors) } else if len(inprogress) > 0 { instance.Status.Conditions.Set(condition.FalseCondition( diff --git a/pkg/openstack/telemetry.go b/pkg/openstack/telemetry.go index 505fb47240..bbf3a5a837 100644 --- a/pkg/openstack/telemetry.go +++ b/pkg/openstack/telemetry.go @@ -225,7 +225,7 @@ func ReconcileTelemetry(ctx context.Context, instance *corev1beta1.OpenStackCont Spec: &alertmanagerSvc, }, } - ed.Route.Create = alertmanagerSvc.ObjectMeta.Annotations[service.AnnotationIngressCreateKey] == "true" + ed.Route.Create = alertmanagerSvc.Annotations[service.AnnotationIngressCreateKey] == "true" ed.Route.TLS.Enabled = false if instance.Spec.Telemetry.AlertmanagerOverride.Route != nil { ed.Route.OverrideSpec = *instance.Spec.Telemetry.AlertmanagerOverride.Route @@ -332,10 +332,10 @@ func ReconcileTelemetry(ctx context.Context, instance *corev1beta1.OpenStackCont telemetry.Spec.Ceilometer.NotificationImage = *version.Status.ContainerImages.CeilometerNotificationImage telemetry.Spec.Ceilometer.SgCoreImage = *version.Status.ContainerImages.CeilometerSgcoreImage telemetry.Spec.Ceilometer.ProxyImage = *version.Status.ContainerImages.CeilometerProxyImage - telemetry.Spec.Autoscaling.AutoscalingSpec.Aodh.APIImage = *version.Status.ContainerImages.AodhAPIImage - telemetry.Spec.Autoscaling.AutoscalingSpec.Aodh.EvaluatorImage = *version.Status.ContainerImages.AodhEvaluatorImage - telemetry.Spec.Autoscaling.AutoscalingSpec.Aodh.NotifierImage = *version.Status.ContainerImages.AodhNotifierImage - telemetry.Spec.Autoscaling.AutoscalingSpec.Aodh.ListenerImage = *version.Status.ContainerImages.AodhListenerImage + telemetry.Spec.Autoscaling.Aodh.APIImage = *version.Status.ContainerImages.AodhAPIImage + telemetry.Spec.Autoscaling.Aodh.EvaluatorImage = *version.Status.ContainerImages.AodhEvaluatorImage + telemetry.Spec.Autoscaling.Aodh.NotifierImage = *version.Status.ContainerImages.AodhNotifierImage + telemetry.Spec.Autoscaling.Aodh.ListenerImage = *version.Status.ContainerImages.AodhListenerImage telemetry.Spec.Ceilometer.KSMImage = *getImg(version.Status.ContainerImages.KsmImage, &missingImageDefault) telemetry.Spec.Ceilometer.MysqldExporterImage = *getImg(version.Status.ContainerImages.CeilometerMysqldExporterImage, &missingImageDefault) diff --git a/pkg/openstack/test.go b/pkg/openstack/test.go index 3de495f96e..0ad750f0fd 100644 --- a/pkg/openstack/test.go +++ b/pkg/openstack/test.go @@ -13,17 +13,24 @@ import ( ) const ( - // config map generated by Keyston operator containing clouds.yaml - CloudsConfigMap = "openstack-config" + // CloudsConfigMap is the config map generated by Keystone operator containing clouds.yaml + CloudsConfigMap = "openstack-config" + // TestOperatorConfigMap is the name of the ConfigMap used for test operator configuration TestOperatorConfigMap = "test-operator-config" - TempestImageKey = "tempest-image" - TobikoImageKey = "tobiko-image" + // TempestImageKey is the key for Tempest image in the ConfigMap + TempestImageKey = "tempest-image" + // TobikoImageKey is the key for Tobiko image in the ConfigMap + TobikoImageKey = "tobiko-image" + // HorizontestImageKey is the key for Horizontest image in the ConfigMap HorizontestImageKey = "horizontest-image" + // AnsibletestImageKey is the key for Ansibletest image in the ConfigMap AnsibletestImageKey = "ansibletest-image" - CloudsKey = "clouds-secret-name" + // CloudsKey is the key for clouds secret name in the ConfigMap + CloudsKey = "clouds-secret-name" ) +// ReconcileTest reconciles test operator configuration for the OpenStack control plane func ReconcileTest(ctx context.Context, instance *corev1beta1.OpenStackControlPlane, version *corev1beta1.OpenStackVersion, helper *helper.Helper) (ctrl.Result, error) { customData := map[string]string{ TempestImageKey: *getImg(version.Status.ContainerImages.TestTempestImage, &missingImageDefault), diff --git a/pkg/openstack/version.go b/pkg/openstack/version.go index 8fe0ec6a57..4ab083ef67 100644 --- a/pkg/openstack/version.go +++ b/pkg/openstack/version.go @@ -42,7 +42,7 @@ func InitializeOpenStackVersionImageDefaults(ctx context.Context, envImages map[ fieldName += strings.ToLower(matches[i])[1:] } // format API so we adhere to go linting standards - fieldName = strings.Replace(fieldName, "Api", "API", -1) + fieldName = strings.ReplaceAll(fieldName, "Api", "API") } //Log.Info(fmt.Sprintf("Initialize Field name: %s", fieldName)) field := d.FieldByName(fieldName) @@ -214,7 +214,7 @@ func GetContainerImages(defaults *corev1beta1.ContainerDefaults, instance corev1 return containerImages } -// InitializeOpenStackVersionImageDefaults - initializes OpenStackVersion CR with default container images +// InitializeOpenStackVersionServiceDefaults initializes OpenStackVersion CR with default container images func InitializeOpenStackVersionServiceDefaults(ctx context.Context) *corev1beta1.ServiceDefaults { Log := GetLogger(ctx) Log.Info("Initialize OpenStackVersion Service Defaults") diff --git a/pkg/openstackclient/funcs.go b/pkg/openstackclient/funcs.go index 994b48221e..56ef418d48 100644 --- a/pkg/openstackclient/funcs.go +++ b/pkg/openstackclient/funcs.go @@ -10,6 +10,7 @@ See the License for the specific language governing permissions and limitations under the License. */ +// Package openstackclient provides functionality for managing OpenStack client resources package openstackclient import ( diff --git a/pkg/operator/bindata/apply.go b/pkg/operator/bindata/apply.go index 28c305c25d..7de97123af 100644 --- a/pkg/operator/bindata/apply.go +++ b/pkg/operator/bindata/apply.go @@ -1,3 +1,4 @@ +// Package bindata provides functionality for applying binary data and resources to Kubernetes package bindata import ( diff --git a/pkg/operator/bindata/render.go b/pkg/operator/bindata/render.go index 599f7dbd49..7ac398e1f7 100644 --- a/pkg/operator/bindata/render.go +++ b/pkg/operator/bindata/render.go @@ -44,7 +44,7 @@ func RenderDir(manifestDir string, d *RenderData) ([]*unstructured.Unstructured, } // Skip non-manifest files - if !(strings.HasSuffix(path, ".yml") || strings.HasSuffix(path, ".yaml") || strings.HasSuffix(path, ".json")) { + if !strings.HasSuffix(path, ".yml") && !strings.HasSuffix(path, ".yaml") && !strings.HasSuffix(path, ".json") { return nil } diff --git a/pkg/operator/override.go b/pkg/operator/override.go index d62653de49..6f39067b91 100644 --- a/pkg/operator/override.go +++ b/pkg/operator/override.go @@ -14,6 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ +// Package operator provides functionality for managing operator overrides and configurations package operator import ( @@ -70,6 +71,7 @@ func memQuantity(mega int64) *resource.Quantity { return q } +// HasOverrides checks if the given operator name has overrides in the provided list func HasOverrides(operatorOverrides []operatorv1beta1.OperatorSpec, operatorName string) *operatorv1beta1.OperatorSpec { // validate of operatorName is in the list of operatorOverrides f := func(c operatorv1beta1.OperatorSpec) bool { @@ -83,6 +85,7 @@ func HasOverrides(operatorOverrides []operatorv1beta1.OperatorSpec, operatorName return nil } +// SetOverrides applies the provided operator overrides to the operator configuration func SetOverrides(opOvr operatorv1beta1.OperatorSpec, op *Operator) { if opOvr.Replicas != nil { op.Deployment.Replicas = opOvr.Replicas @@ -143,6 +146,7 @@ func mergeTolerations(defaults, custom []corev1.Toleration) []corev1.Toleration return merged } +// GetOperator finds and returns the operator with the given name from the list func GetOperator(operators []Operator, name string) (int, Operator) { f := func(c Operator) bool { return c.Name == name diff --git a/tests/functional/ctlplane/openstackoperator_controller_test.go b/tests/functional/ctlplane/openstackoperator_controller_test.go index 7f4b41c0be..ff9b033a5e 100644 --- a/tests/functional/ctlplane/openstackoperator_controller_test.go +++ b/tests/functional/ctlplane/openstackoperator_controller_test.go @@ -2367,7 +2367,7 @@ var _ = Describe("OpenStackOperator controller", func() { Expect(err).ShouldNot(HaveOccurred()) openStackControlPlane := &corev1.OpenStackControlPlane{} - openStackControlPlane.ObjectMeta.Namespace = names.Namespace + openStackControlPlane.Namespace = names.Namespace openStackControlPlane.Name = names.OpenStackVersionName2.Name err = k8sClient.Delete(ctx, openStackControlPlane) Expect(err).ShouldNot(HaveOccurred()) diff --git a/tests/functional/ctlplane/openstackversion_controller_test.go b/tests/functional/ctlplane/openstackversion_controller_test.go index 4aca2f9074..eb63a231fe 100644 --- a/tests/functional/ctlplane/openstackversion_controller_test.go +++ b/tests/functional/ctlplane/openstackversion_controller_test.go @@ -75,7 +75,7 @@ var _ = Describe("OpenStackOperator controller", func() { It("should fail to create more than one OpenStackVersion", func() { instance := &corev1.OpenStackVersion{} - instance.ObjectMeta.Namespace = names.Namespace + instance.Namespace = names.Namespace instance.Name = "foo" err := k8sClient.Create(ctx, instance) diff --git a/tests/functional/ctlplane/suite_test.go b/tests/functional/ctlplane/suite_test.go index 2ac237380b..fd2cf9aba4 100644 --- a/tests/functional/ctlplane/suite_test.go +++ b/tests/functional/ctlplane/suite_test.go @@ -378,7 +378,9 @@ var _ = BeforeSuite(func() { if err != nil { return err } - conn.Close() + if err := conn.Close(); err != nil { + return fmt.Errorf("failed to close connection: %w", err) + } return nil }).Should(Succeed()) }) diff --git a/tests/functional/dataplane/openstackdataplanenodeset_controller_test.go b/tests/functional/dataplane/openstackdataplanenodeset_controller_test.go index 098d2dd257..5500321e68 100644 --- a/tests/functional/dataplane/openstackdataplanenodeset_controller_test.go +++ b/tests/functional/dataplane/openstackdataplanenodeset_controller_test.go @@ -1380,8 +1380,8 @@ var _ = Describe("Dataplane NodeSet Test", func() { const bootstrapName string = "bootstrap" // Make an AnsibleEE name for each service ansibleeeName := types.NamespacedName{ - Name: fmt.Sprintf( - bootstrapName + "-" + dataplaneDeploymentName.Name + "-" + dataplaneNodeSetName.Name), + Name: fmt.Sprintf("%s-%s-%s", + bootstrapName, dataplaneDeploymentName.Name, dataplaneNodeSetName.Name), Namespace: namespace, } ansibleEE := GetAnsibleee(ansibleeeName) @@ -1447,8 +1447,8 @@ var _ = Describe("Dataplane NodeSet Test", func() { const bootstrapName string = "bootstrap" // Make an AnsibleEE name for each service ansibleeeName := types.NamespacedName{ - Name: fmt.Sprintf( - bootstrapName + "-" + dataplaneDeploymentName.Name + "-" + dataplaneNodeSetName.Name), + Name: fmt.Sprintf("%s-%s-%s", + bootstrapName, dataplaneDeploymentName.Name, dataplaneNodeSetName.Name), Namespace: namespace, } ansibleEE := GetAnsibleee(ansibleeeName) diff --git a/tests/functional/dataplane/openstackdataplaneservice_controller_test.go b/tests/functional/dataplane/openstackdataplaneservice_controller_test.go index 38eba22232..3056687617 100644 --- a/tests/functional/dataplane/openstackdataplaneservice_controller_test.go +++ b/tests/functional/dataplane/openstackdataplaneservice_controller_test.go @@ -34,7 +34,7 @@ var _ = Describe("OpenstackDataplaneService Test", func() { When("A defined service resource is created", func() { BeforeEach(func() { - os.Unsetenv("OPERATOR_SERVICES") + _ = os.Unsetenv("OPERATOR_SERVICES") CreateDataplaneService(dataplaneServiceName, false) DeferCleanup(th.DeleteService, dataplaneServiceName) }) @@ -50,7 +50,7 @@ var _ = Describe("OpenstackDataplaneService Test", func() { When("A defined service resource for all nodes is created", func() { BeforeEach(func() { - os.Unsetenv("OPERATOR_SERVICES") + _ = os.Unsetenv("OPERATOR_SERVICES") CreateDataplaneService(dataplaneServiceName, true) DeferCleanup(th.DeleteService, dataplaneServiceName) }) From 57a1c504e2ddef9e245fd42da8dfbab429eaaa3c Mon Sep 17 00:00:00 2001 From: Martin Schuppert Date: Wed, 23 Apr 2025 12:17:30 +0200 Subject: [PATCH 3/3] [golang] replace "golang.org/x/exp/slices" with stdlib one Signed-off-by: Martin Schuppert --- apis/core/v1beta1/openstackcontrolplane_webhook.go | 2 +- apis/dataplane/v1beta1/openstackdataplanenodeset_types.go | 2 +- controllers/dataplane/openstackdataplanenodeset_controller.go | 2 +- go.mod | 2 +- pkg/dataplane/cert.go | 3 +-- pkg/dataplane/deployment.go | 2 +- pkg/dataplane/service.go | 2 +- pkg/openstack/ca.go | 2 +- 8 files changed, 8 insertions(+), 9 deletions(-) diff --git a/apis/core/v1beta1/openstackcontrolplane_webhook.go b/apis/core/v1beta1/openstackcontrolplane_webhook.go index ec36700441..a99fa3de93 100644 --- a/apis/core/v1beta1/openstackcontrolplane_webhook.go +++ b/apis/core/v1beta1/openstackcontrolplane_webhook.go @@ -19,6 +19,7 @@ package v1beta1 import ( "context" "fmt" + "slices" "strings" keystonev1 "github.com/openstack-k8s-operators/keystone-operator/api/v1beta1" @@ -28,7 +29,6 @@ import ( placementv1 "github.com/openstack-k8s-operators/placement-operator/api/v1beta1" watcherv1 "github.com/openstack-k8s-operators/watcher-operator/api/v1beta1" "golang.org/x/exp/maps" - "golang.org/x/exp/slices" apierrors "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" diff --git a/apis/dataplane/v1beta1/openstackdataplanenodeset_types.go b/apis/dataplane/v1beta1/openstackdataplanenodeset_types.go index 2462974e32..6102d39f10 100644 --- a/apis/dataplane/v1beta1/openstackdataplanenodeset_types.go +++ b/apis/dataplane/v1beta1/openstackdataplanenodeset_types.go @@ -19,8 +19,8 @@ package v1beta1 import ( "context" "fmt" + "slices" - "golang.org/x/exp/slices" "sigs.k8s.io/controller-runtime/pkg/client" infranetworkv1 "github.com/openstack-k8s-operators/infra-operator/apis/network/v1beta1" diff --git a/controllers/dataplane/openstackdataplanenodeset_controller.go b/controllers/dataplane/openstackdataplanenodeset_controller.go index 58f49fea80..9848413437 100644 --- a/controllers/dataplane/openstackdataplanenodeset_controller.go +++ b/controllers/dataplane/openstackdataplanenodeset_controller.go @@ -19,11 +19,11 @@ package dataplane import ( "context" "fmt" + "slices" "strings" "time" "github.com/go-playground/validator/v10" - "golang.org/x/exp/slices" batchv1 "k8s.io/api/batch/v1" corev1 "k8s.io/api/core/v1" rbacv1 "k8s.io/api/rbac/v1" diff --git a/go.mod b/go.mod index 38e52d7992..37f20ad44b 100644 --- a/go.mod +++ b/go.mod @@ -43,7 +43,6 @@ require ( github.com/rabbitmq/cluster-operator/v2 v2.9.0 github.com/stretchr/testify v1.10.0 go.uber.org/zap v1.27.0 - golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 gopkg.in/yaml.v3 v3.0.1 k8s.io/api v0.29.15 k8s.io/apimachinery v0.29.15 @@ -97,6 +96,7 @@ require ( github.com/spf13/pflag v1.0.6 // indirect go.uber.org/multierr v1.11.0 // indirect golang.org/x/crypto v0.33.0 // indirect + golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 // indirect golang.org/x/mod v0.20.0 // indirect golang.org/x/net v0.34.0 // indirect golang.org/x/oauth2 v0.18.0 // indirect diff --git a/pkg/dataplane/cert.go b/pkg/dataplane/cert.go index 2e3fe346b3..c90fb124f8 100644 --- a/pkg/dataplane/cert.go +++ b/pkg/dataplane/cert.go @@ -21,13 +21,12 @@ import ( "crypto/sha256" "encoding/hex" "fmt" + "slices" "sort" "strconv" "strings" "time" - "golang.org/x/exp/slices" - corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" apimachineryvalidation "k8s.io/apimachinery/pkg/util/validation" diff --git a/pkg/dataplane/deployment.go b/pkg/dataplane/deployment.go index b4062c9118..1553eabb24 100644 --- a/pkg/dataplane/deployment.go +++ b/pkg/dataplane/deployment.go @@ -23,13 +23,13 @@ import ( "fmt" "path" "reflect" + "slices" "sort" "strconv" batchv1 "k8s.io/api/batch/v1" corev1 "k8s.io/api/core/v1" - slices "golang.org/x/exp/slices" k8s_errors "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/types" apimachineryvalidation "k8s.io/apimachinery/pkg/util/validation" diff --git a/pkg/dataplane/service.go b/pkg/dataplane/service.go index cb80cd6808..0f082c746d 100644 --- a/pkg/dataplane/service.go +++ b/pkg/dataplane/service.go @@ -21,9 +21,9 @@ import ( "fmt" "os" "path" + "slices" "strings" - "golang.org/x/exp/slices" yaml "gopkg.in/yaml.v3" k8s_errors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" diff --git a/pkg/openstack/ca.go b/pkg/openstack/ca.go index 41ba594ea6..6070400dae 100644 --- a/pkg/openstack/ca.go +++ b/pkg/openstack/ca.go @@ -9,6 +9,7 @@ import ( "fmt" "math" "os" + "slices" "strings" "time" @@ -20,7 +21,6 @@ import ( "github.com/openstack-k8s-operators/lib-common/modules/common/secret" "github.com/openstack-k8s-operators/lib-common/modules/common/tls" "github.com/openstack-k8s-operators/lib-common/modules/common/util" - "golang.org/x/exp/slices" k8s_errors "k8s.io/apimachinery/pkg/api/errors" corev1 "github.com/openstack-k8s-operators/openstack-operator/apis/core/v1beta1"