diff --git a/.builder-image-version.txt b/.builder-image-version.txt index 63b41b20..ad7bb75d 100644 --- a/.builder-image-version.txt +++ b/.builder-image-version.txt @@ -1 +1 @@ -1.1.28 \ No newline at end of file +1.1.29 diff --git a/.github/workflows/pr-lint.yml b/.github/workflows/pr-lint.yml index fd2e46ba..d254787c 100644 --- a/.github/workflows/pr-lint.yml +++ b/.github/workflows/pr-lint.yml @@ -21,7 +21,7 @@ jobs: if: github.event_name != 'pull_request' || !github.event.pull_request.draft runs-on: ubuntu-latest container: - image: ghcr.io/sovereigncloudstack/cso-builder:1.1.28 + image: ghcr.io/sovereigncloudstack/cso-builder:1.1.29 credentials: username: ${{ github.actor }} password: ${{ secrets.github_token }} diff --git a/.github/workflows/schedule-scan-image.yml b/.github/workflows/schedule-scan-image.yml index 4d6192a7..8b398923 100644 --- a/.github/workflows/schedule-scan-image.yml +++ b/.github/workflows/schedule-scan-image.yml @@ -9,7 +9,7 @@ jobs: name: Trivy runs-on: ubuntu-latest container: - image: ghcr.io/sovereigncloudstack/cso-builder:1.1.28 + image: ghcr.io/sovereigncloudstack/cso-builder:1.1.29 credentials: username: ${{ github.actor }} password: ${{ secrets.github_token }} diff --git a/.github/workflows/schedule-update-bot.yaml b/.github/workflows/schedule-update-bot.yaml index 35368815..dede3067 100644 --- a/.github/workflows/schedule-update-bot.yaml +++ b/.github/workflows/schedule-update-bot.yaml @@ -45,7 +45,7 @@ jobs: echo "LOG_LEVEL=${{ github.event.inputs.logLevel || env.LOG_LEVEL }}" >> "$GITHUB_ENV" - name: Renovate - uses: renovatebot/github-action@c21017a4a2fc9f42953bcc907e375a5a544557ec # v41.0.18 + uses: renovatebot/github-action@12f8ed8e6a936a00dc66b628d224488ac406b5e8 # v42.0.5 env: RENOVATE_HOST_RULES: '[{"hostType": "docker", "matchHost": "ghcr.io", "username": "${{ github.actor }}", "password": "${{ secrets.GITHUB_TOKEN }}" }]' RENOVATE_ALLOWED_POST_UPGRADE_COMMANDS: '[".*"]' diff --git a/.golangci.yaml b/.golangci.yaml index d14076df..70936465 100644 --- a/.golangci.yaml +++ b/.golangci.yaml @@ -1,5 +1,10 @@ +version: "2" +run: + go: "1.22" + modules-download-mode: vendor + allow-parallel-runners: true linters: - disable-all: true + default: none enable: - asasalint - asciicheck @@ -7,23 +12,18 @@ linters: - bodyclose - containedctx - contextcheck + - copyloopvar - durationcheck - errchkjson - errname - errorlint - exhaustive - - copyloopvar - forcetypeassert - - gci - goconst - gocritic - godot - - gofmt - - gofumpt - - goimports - goprintffuncname - gosec - - gosimple - govet - importas - ineffassign @@ -41,246 +41,211 @@ linters: - revive - rowserrcheck - staticcheck - - stylecheck - tagliatelle - thelper - tparallel - - typecheck - unconvert - - usestdlibvars - unused + - usestdlibvars - wastedassign - wrapcheck - -linters-settings: - godot: - # declarations - for top level declaration comments (default); - # toplevel - for top level comments; - # all - for all comments. - scope: toplevel - exclude: - - '^ \+.*' - - "^ ANCHOR.*" - importas: - no-unaliased: true - alias: - # Kubernetes - - pkg: k8s.io/api/core/v1 - alias: corev1 - - pkg: k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1 - alias: apiextensionsv1 - - pkg: k8s.io/apimachinery/pkg/apis/meta/v1 - alias: metav1 - - pkg: k8s.io/apimachinery/pkg/api/errors - alias: apierrors - - pkg: k8s.io/apimachinery/pkg/util/errors - alias: kerrors - - pkg: k8s.io/component-base/logs/api/v1 - alias: logsv1 - # Controller Runtime - - pkg: sigs.k8s.io/controller-runtime - alias: ctrl - gofumpt: - extra-rules: true - nolintlint: - allow-unused: false - allow-leading-space: false - require-specific: true - stylecheck: - checks: ["all", "-ST1006"] - dot-import-whitelist: - - "github.com/onsi/gomega" - - "github.com/onsi/ginkgo/v2" - gocritic: - enabled-tags: - - diagnostic - - style - - performance - - experimental - - opinionated - settings: - hugeParam: - sizeThreshold: 120 - revive: - enable-all-rules: true + settings: + gocritic: + enabled-tags: + - diagnostic + - style + - performance + - experimental + - opinionated + settings: + hugeParam: + sizeThreshold: 120 + godot: + scope: toplevel + exclude: + - ^ \+.* + - ^ ANCHOR.* + importas: + alias: + - pkg: k8s.io/api/core/v1 + alias: corev1 + - pkg: k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1 + alias: apiextensionsv1 + - pkg: k8s.io/apimachinery/pkg/apis/meta/v1 + alias: metav1 + - pkg: k8s.io/apimachinery/pkg/api/errors + alias: apierrors + - pkg: k8s.io/apimachinery/pkg/util/errors + alias: kerrors + - pkg: k8s.io/component-base/logs/api/v1 + alias: logsv1 + - pkg: sigs.k8s.io/controller-runtime + alias: ctrl + no-unaliased: true + nolintlint: + require-specific: true + allow-unused: false + revive: + enable-all-rules: true + rules: + - name: import-alias-naming + disabled: true + - name: redundant-import-alias + disabled: true + - name: dot-imports + disabled: true + - name: add-constant + arguments: + - allowInts: 0,1,2,3,42,100 + allowStrs: '""' + maxLitCount: "3" + severity: warning + disabled: true + - name: argument-limit + arguments: + - 3 + severity: warning + disabled: true + - name: banned-characters + disabled: true + - name: cognitive-complexity + severity: warning + disabled: true + - name: cyclomatic + arguments: + - 10 + severity: warning + disabled: true + - name: defer + arguments: + - - call-chain + - loop + - method-call + - recover + - immediate-recover + - return + severity: warning + disabled: false + - name: exported + severity: warning + disabled: false + - name: file-header + disabled: true + - name: flag-parameter + disabled: true + - name: function-result-limit + arguments: + - 3 + severity: warning + disabled: false + - name: function-length + arguments: + - 15 + - 0 + severity: warning + disabled: true + - name: line-length-limit + arguments: + - 120 + severity: warning + disabled: true + - name: max-public-structs + arguments: + - 3 + severity: warning + disabled: true + - name: string-format + arguments: + - - core.WriteError[1].Message + - /^([^A-Z]|$)/ + - must not start with a capital letter + - - fmt.Errorf[0] + - /(^|[^\.!?])$/ + - must not end in punctuation + - - panic + - /^[^\n]*$/ + - must not contain line breaks + severity: warning + disabled: false + - name: unhandled-error + arguments: + - fmt.Printf + - fmt.Println + severity: warning + disabled: false + - name: var-naming + arguments: + - - ID + - - VM + severity: warning + disabled: false + - name: comment-spacings + disabled: true + - name: use-any + disabled: true + - name: deep-exit + disabled: true + - name: nested-structs + disabled: true + - name: struct-tag + disabled: true + staticcheck: + checks: + - all + - -ST1006 + dot-import-whitelist: + - github.com/onsi/gomega + - github.com/onsi/ginkgo/v2 + usestdlibvars: + http-method: true + http-status-code: true + time-weekday: true + time-month: true + time-layout: true + crypto-hash: true + default-rpc-path: true + sql-isolation-level: true + tls-signature-scheme: true + constant-kind: true + wrapcheck: + ignore-sigs: + - status.Error( + - .Errorf( + - errors.New( + - errors.Unwrap( + - .Wrap( + - .Wrapf( + - .WithMessage( + - .WithMessagef( + - .WithStack( + - .Complete( + exclusions: + generated: lax rules: - - name: import-alias-naming - disabled: true - - name: redundant-import-alias - disabled: true - - name: dot-imports - disabled: true - # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#add-constant - - name: add-constant - severity: warning - disabled: true - arguments: - - maxLitCount: "3" - allowStrs: '""' - allowInts: "0,1,2,3,42,100" - - # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#argument-limit - - name: argument-limit - severity: warning - disabled: true - arguments: [3] - # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#banned-characters - - name: banned-characters - disabled: true - # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#cognitive-complexity - - name: cognitive-complexity - severity: warning - disabled: true - # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#cyclomatic - - name: cyclomatic - severity: warning - disabled: true - arguments: [10] - # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#defer - - name: defer - severity: warning - disabled: false - arguments: - - [ "call-chain", "loop", "method-call", "recover", "immediate-recover", "return"] # yamllint disable-line rule:line-length - # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#exported - - name: exported - severity: warning - disabled: false - # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#file-header - - name: file-header - disabled: true - # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#flag-parameter - - name: flag-parameter - disabled: true - # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#function-result-limit - - name: function-result-limit - severity: warning - disabled: false - arguments: [3] - # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#function-length - - name: function-length - severity: warning - disabled: true - arguments: [15, 0] - # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#imports-blacklist - - name: imports-blacklist - severity: warning - disabled: false - arguments: - - "crypto/md5" - - "crypto/sha1" - # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#line-length-limit - - name: line-length-limit - severity: warning - disabled: true - arguments: [120] - # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#max-public-structs - - name: max-public-structs - severity: warning - disabled: true - arguments: [3] - # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#string-format - - name: string-format - severity: warning - disabled: false - arguments: - - - "core.WriteError[1].Message" - - "/^([^A-Z]|$)/" - - must not start with a capital letter - - - "fmt.Errorf[0]" - - '/(^|[^\.!?])$/' - - must not end in punctuation - - - panic - - '/^[^\n]*$/' - - must not contain line breaks - # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#unhandled-error - - name: unhandled-error - severity: warning - disabled: false - arguments: - - "fmt.Printf" - - "fmt.Println" # allow these ones - # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#var-naming - - name: var-naming - severity: warning - disabled: false - arguments: - - ["ID"] # AllowList - - ["VM"] # DenyList - # revive changed configuration - # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#comment-spacings - - name: comment-spacings - disabled: true - # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#use-any - - name: use-any - disabled: true - # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#deep-exit - - name: deep-exit - disabled: true - # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#receiver-naming - - name: nested-structs - disabled: true - # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#struct-tag - - name: struct-tag - disabled: true - usestdlibvars: - # Suggest the use of http.MethodXX. - # Default: true - http-method: true - # Suggest the use of http.StatusXX. - # Default: true - http-status-code: true - # Suggest the use of time.Weekday.String(). - # Default: true - time-weekday: true - # Suggest the use of time.Month.String(). - # Default: false - time-month: true - # Suggest the use of time.Layout. - # Default: false - time-layout: true - # Suggest the use of crypto.Hash.String(). - # Default: false - crypto-hash: true - # Suggest the use of rpc.DefaultXXPath. - # Default: false - default-rpc-path: true - # Suggest the use of sql.LevelXX.String(). - # Default: false - sql-isolation-level: true - # Suggest the use of tls.SignatureScheme.String(). - # Default: false - tls-signature-scheme: true - # Suggest the use of constant.Kind.String(). - # Default: false - constant-kind: true - wrapcheck: - ignoreSigs: - - status.Error( - - .Errorf( - - errors.New( - - errors.Unwrap( - - .Wrap( - - .Wrapf( - - .WithMessage( - - .WithMessagef( - - .WithStack( - - .Complete( + - linters: + - wrapcheck + path: _test\.go + paths: + - vendor$ + - third_party$ + - builtin$ + - examples$ issues: - max-same-issues: 0 max-issues-per-linter: 0 - # We are disabling default golangci exclusions - # because we want to help reviewers to focus on reviewing the most relevant - # changes in PRs and avoid nitpicking. - exclude-use-default: false - exclude-rules: - - linters: - - wrapcheck - path: _test\.go - exclude-dirs: - - vendor$ -run: - timeout: 10m - go: "1.22" - allow-parallel-runners: true - modules-download-mode: vendor + max-same-issues: 0 +formatters: + enable: + - gci + - gofmt + - gofumpt + - goimports + settings: + gofumpt: + extra-rules: true + exclusions: + generated: lax + paths: + - vendor$ + - third_party$ + - builtin$ + - examples$ diff --git a/Makefile b/Makefile index 0fac7983..4728fcbf 100644 --- a/Makefile +++ b/Makefile @@ -451,7 +451,7 @@ ifeq ($(BUILD_IN_CONTAINER),true) else go version golangci-lint version - GO111MODULE=on golangci-lint run -v --out-format=colored-line-number + GO111MODULE=on golangci-lint run -v --output.text.colors=true endif .PHONY: lint-yaml diff --git a/api/v1alpha1/resources.go b/api/v1alpha1/resources.go index ee9b0142..017a2332 100644 --- a/api/v1alpha1/resources.go +++ b/api/v1alpha1/resources.go @@ -17,14 +17,14 @@ limitations under the License. package v1alpha1 import ( - "fmt" + "errors" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "k8s.io/apimachinery/pkg/runtime/schema" ) // ErrNilInput indicates a nil input. -var ErrNilInput = fmt.Errorf("nil input") +var ErrNilInput = errors.New("nil input") // Resource defines the status of a resource. type Resource struct { diff --git a/internal/controller/clusteraddon_controller.go b/internal/controller/clusteraddon_controller.go index e670b027..bb7b1e64 100644 --- a/internal/controller/clusteraddon_controller.go +++ b/internal/controller/clusteraddon_controller.go @@ -161,8 +161,8 @@ func (r *ClusterAddonReconciler) Reconcile(ctx context.Context, req reconcile.Re // usually this is only nil in unit tests if restConfig != nil { - restConfig.QPS = r.RestConfigSettings.QPS - restConfig.Burst = r.RestConfigSettings.Burst + restConfig.QPS = r.QPS + restConfig.Burst = r.Burst clientSet, err := kubernetes.NewForConfig(restConfig) if err != nil { @@ -860,52 +860,51 @@ check: in.clusterAddon.SetStagePhase(stage.Name, stage.Action, csov1alpha1.StagePhaseWaitingForPostCondition) goto check - } else { - // Delete part - logger.V(1).Info("starting to template helm chart", "clusterStack", in.clusterAddon.Spec.ClusterStack, "name", stage.Name, "hook", in.clusterAddon.Spec.Hook) - helmTemplate, err := helmTemplateNewClusterStack(in, stage.Name) - if err != nil { - conditions.MarkFalse( - in.clusterAddon, - csov1alpha1.HelmChartTemplatedCondition, - csov1alpha1.TemplateNewClusterStackFailedReason, - clusterv1.ConditionSeverityError, - "failed to template new helm chart: %s", err.Error(), - ) + } + // Delete part + logger.V(1).Info("starting to template helm chart", "clusterStack", in.clusterAddon.Spec.ClusterStack, "name", stage.Name, "hook", in.clusterAddon.Spec.Hook) + helmTemplate, err := helmTemplateNewClusterStack(in, stage.Name) + if err != nil { + conditions.MarkFalse( + in.clusterAddon, + csov1alpha1.HelmChartTemplatedCondition, + csov1alpha1.TemplateNewClusterStackFailedReason, + clusterv1.ConditionSeverityError, + "failed to template new helm chart: %s", err.Error(), + ) - return false, nil - } - logger.V(1).Info("finished templating helm chart and starting to delete helm chart", "clusterStack", in.clusterAddon.Spec.ClusterStack, "name", stage.Name, "hook", in.clusterAddon.Spec.Hook) + return false, nil + } + logger.V(1).Info("finished templating helm chart and starting to delete helm chart", "clusterStack", in.clusterAddon.Spec.ClusterStack, "name", stage.Name, "hook", in.clusterAddon.Spec.Hook) - deletedResources, shouldRequeue, err := in.kubeClient.DeleteNewClusterStack(ctx, helmTemplate) - if err != nil { - conditions.MarkFalse( - in.clusterAddon, - csov1alpha1.HelmChartDeletedCondition, - csov1alpha1.FailedToDeleteObjectsReason, - clusterv1.ConditionSeverityInfo, - "failed to successfully delete helm chart: %q", stage.Name, - ) + deletedResources, shouldRequeue, err := in.kubeClient.DeleteNewClusterStack(ctx, helmTemplate) + if err != nil { + conditions.MarkFalse( + in.clusterAddon, + csov1alpha1.HelmChartDeletedCondition, + csov1alpha1.FailedToDeleteObjectsReason, + clusterv1.ConditionSeverityInfo, + "failed to successfully delete helm chart: %q", stage.Name, + ) - return false, fmt.Errorf("failed to delete objects from cluster addon Helm chart: %w", err) - } - if shouldRequeue { - return true, nil - } + return false, fmt.Errorf("failed to delete objects from cluster addon Helm chart: %w", err) + } + if shouldRequeue { + return true, nil + } - // This is for the current stage objects and will be removed once done. - in.clusterAddon.Status.Resources = deletedResources - logger.V(1).Info("finished deleting helm chart", "clusterStack", in.clusterAddon.Spec.ClusterStack, "name", stage.Name, "hook", in.clusterAddon.Spec.Hook) + // This is for the current stage objects and will be removed once done. + in.clusterAddon.Status.Resources = deletedResources + logger.V(1).Info("finished deleting helm chart", "clusterStack", in.clusterAddon.Spec.ClusterStack, "name", stage.Name, "hook", in.clusterAddon.Spec.Hook) - // remove status resource if deleted successfully - in.clusterAddon.Status.Resources = make([]*csov1alpha1.Resource, 0) + // remove status resource if deleted successfully + in.clusterAddon.Status.Resources = make([]*csov1alpha1.Resource, 0) - // delete the false condition with failed to apply reason - conditions.Delete(in.clusterAddon, csov1alpha1.HelmChartDeletedCondition) + // delete the false condition with failed to apply reason + conditions.Delete(in.clusterAddon, csov1alpha1.HelmChartDeletedCondition) - in.clusterAddon.SetStagePhase(stage.Name, stage.Action, csov1alpha1.StagePhaseWaitingForPostCondition) - goto check - } + in.clusterAddon.SetStagePhase(stage.Name, stage.Action, csov1alpha1.StagePhaseWaitingForPostCondition) + goto check case csov1alpha1.StagePhaseWaitingForPostCondition: // If WaitForPostCondition is mentioned. diff --git a/internal/controller/clusterstack_controller.go b/internal/controller/clusterstack_controller.go index 808eb62f..9f998550 100644 --- a/internal/controller/clusterstack_controller.go +++ b/internal/controller/clusterstack_controller.go @@ -19,6 +19,7 @@ package controller import ( "context" + "errors" "fmt" "reflect" "sort" @@ -321,7 +322,7 @@ func (r *ClusterStackReconciler) createOrUpdateProviderClusterStackRelease(ctx c // update if it exists already and should be updated if existsAlready { if shouldUpdate { - if err := r.Client.Update(ctx, to); err != nil { + if err := r.Update(ctx, to); err != nil { return nil, fmt.Errorf("failed to update object: %w", err) } record.Eventf(clusterStack, "UpdateProviderStackRelease", "Updated ProviderClusterStackRelease %s", name) @@ -330,7 +331,7 @@ func (r *ClusterStackReconciler) createOrUpdateProviderClusterStackRelease(ctx c } // object does not exist yet - create it - if err := r.Client.Create(ctx, to); err != nil { + if err := r.Create(ctx, to); err != nil { return nil, fmt.Errorf("failed to create object: %w", err) } @@ -646,7 +647,7 @@ func unstructuredSpecEqual(oldObj, newObj map[string]interface{}) (newSpec map[s return nil, false, fmt.Errorf("failed to retrieve spec map of object: %w", err) } if !isEqual { - return nil, false, fmt.Errorf("missing spec") + return nil, false, errors.New("missing spec") } newSpec, isEqual, err = unstructured.NestedMap(newObj, "spec") @@ -654,7 +655,7 @@ func unstructuredSpecEqual(oldObj, newObj map[string]interface{}) (newSpec map[s return nil, false, fmt.Errorf("failed to retrieve spec map of object: %w", err) } if !isEqual { - return nil, false, fmt.Errorf("missing spec") + return nil, false, errors.New("missing spec") } return newSpec, reflect.DeepEqual(oldSpec, newSpec), nil @@ -726,7 +727,7 @@ func (*ClusterStackReconciler) ClusterStackReleaseToClusterStack(ctx context.Con } // check if the controller reference is already set and return an empty result when one is found. - for _, ref := range m.ObjectMeta.GetOwnerReferences() { + for _, ref := range m.GetOwnerReferences() { result = append(result, reconcile.Request{NamespacedName: types.NamespacedName{Name: ref.Name, Namespace: m.Namespace}}) } diff --git a/internal/controller/clusterstackrelease_controller.go b/internal/controller/clusterstackrelease_controller.go index 55c7ab60..107a6e5f 100644 --- a/internal/controller/clusterstackrelease_controller.go +++ b/internal/controller/clusterstackrelease_controller.go @@ -19,6 +19,7 @@ package controller import ( "bytes" "context" + "errors" "fmt" "os" "os/exec" @@ -264,7 +265,7 @@ func (r *ClusterStackReleaseReconciler) updateProviderClusterStackRelease(ctx co return false, fmt.Errorf("failed to create patch helper for ProviderClusterStackRelease: %w", err) } - if err := controllerutil.SetControllerReference(clusterStackRelease, providerClusterStackRelease, r.Client.Scheme()); err != nil { + if err := controllerutil.SetControllerReference(clusterStackRelease, providerClusterStackRelease, r.Scheme()); err != nil { return false, fmt.Errorf("failed to set owner reference to ProviderClusterStackRelease: %w", err) } @@ -273,7 +274,7 @@ func (r *ClusterStackReleaseReconciler) updateProviderClusterStackRelease(ctx co } // ensure we add a watch to the external object, if there isn't one already - eventHandler := handler.EnqueueRequestForOwner(r.Client.Scheme(), r.Client.RESTMapper(), &csov1alpha1.ClusterStackRelease{}) + eventHandler := handler.EnqueueRequestForOwner(r.Scheme(), r.RESTMapper(), &csov1alpha1.ClusterStackRelease{}) if err := r.externalTracker.Watch(log.FromContext(ctx), providerClusterStackRelease, eventHandler); err != nil { return false, fmt.Errorf("failed to add external watch to ProviderClusterStackRelease: %w", err) } @@ -302,7 +303,7 @@ func (r *ClusterStackReleaseReconciler) templateAndApply(ctx context.Context, re } if template == nil { - return false, fmt.Errorf("template is empty") + return false, errors.New("template is empty") } newResources, shouldRequeue, err := kubeClient.Apply(ctx, template, clusterStackRelease.Status.Resources) diff --git a/internal/controller/controller_suite_test.go b/internal/controller/controller_suite_test.go index 547752c5..0e6e6dc1 100644 --- a/internal/controller/controller_suite_test.go +++ b/internal/controller/controller_suite_test.go @@ -85,7 +85,7 @@ var _ = BeforeSuite(func() { Expect(testEnv.StartManager(ctx)).To(Succeed()) }() - <-testEnv.Manager.Elected() + <-testEnv.Elected() // wait for webhook port to be open prior to running tests testEnv.WaitForWebhooks() }) diff --git a/internal/test/helpers/envtest.go b/internal/test/helpers/envtest.go index eb33c128..53f410ab 100644 --- a/internal/test/helpers/envtest.go +++ b/internal/test/helpers/envtest.go @@ -262,7 +262,7 @@ func NewTestEnvironment() *TestEnvironment { func (t *TestEnvironment) StartManager(ctx context.Context) error { ctx, cancel := context.WithCancel(ctx) t.cancel = cancel - if err := t.Manager.Start(ctx); err != nil { + if err := t.Start(ctx); err != nil { return fmt.Errorf("failed to start manager: %w", err) } return nil @@ -292,7 +292,7 @@ func (t *TestEnvironment) Stop() error { func (t *TestEnvironment) Cleanup(ctx context.Context, objs ...client.Object) error { errs := make([]error, 0, len(objs)) for _, o := range objs { - err := t.Client.Delete(ctx, o) + err := t.Delete(ctx, o) if apierrors.IsNotFound(err) { // If the object is not found, it must've been garbage collected // already. For example, if we delete namespace first and then @@ -314,7 +314,7 @@ func (t *TestEnvironment) CreateNamespace(ctx context.Context, generateName stri }, }, } - if err := t.Client.Create(ctx, ns); err != nil { + if err := t.Create(ctx, ns); err != nil { return nil, fmt.Errorf("failed to create namespace: %w", err) } diff --git a/internal/test/integration/github/integration_suite_test.go b/internal/test/integration/github/integration_suite_test.go index 4531ca3f..6ce90bcb 100644 --- a/internal/test/integration/github/integration_suite_test.go +++ b/internal/test/integration/github/integration_suite_test.go @@ -62,7 +62,7 @@ var _ = BeforeSuite(func() { defer GinkgoRecover() Expect(testEnv.StartManager(ctx)).To(Succeed()) }() - <-testEnv.Manager.Elected() + <-testEnv.Elected() }) var _ = AfterSuite(func() { diff --git a/internal/test/integration/oci/integration_suite_test.go b/internal/test/integration/oci/integration_suite_test.go index 6be1a998..46757995 100644 --- a/internal/test/integration/oci/integration_suite_test.go +++ b/internal/test/integration/oci/integration_suite_test.go @@ -82,7 +82,7 @@ var _ = BeforeSuite(func() { Expect(testEnv.StartManager(ctx)).To(Succeed()) }() - <-testEnv.Manager.Elected() + <-testEnv.Elected() // wait for webhook port to be open prior to running tests testEnv.WaitForWebhooks() diff --git a/internal/test/integration/workloadcluster/controller_suite_test.go b/internal/test/integration/workloadcluster/controller_suite_test.go index 36419541..27d59af8 100644 --- a/internal/test/integration/workloadcluster/controller_suite_test.go +++ b/internal/test/integration/workloadcluster/controller_suite_test.go @@ -88,7 +88,7 @@ var _ = BeforeSuite(func() { Expect(testEnv.StartManager(ctx)).To(Succeed()) }() - <-testEnv.Manager.Elected() + <-testEnv.Elected() }) var _ = AfterSuite(func() { diff --git a/pkg/clusterstack/clusterstack.go b/pkg/clusterstack/clusterstack.go index 47f5b99e..2bd2dbfd 100644 --- a/pkg/clusterstack/clusterstack.go +++ b/pkg/clusterstack/clusterstack.go @@ -18,6 +18,7 @@ limitations under the License. package clusterstack import ( + "errors" "fmt" "strings" @@ -48,11 +49,11 @@ type ClusterStack struct { var ( // ErrInvalidFormat indicates a cluster stack string has an invalid format. - ErrInvalidFormat = fmt.Errorf("invalid format") + ErrInvalidFormat = errors.New("invalid format") // ErrInvalidProvider indicates a cluster stack string has an invalid provider. - ErrInvalidProvider = fmt.Errorf("invalid provider") + ErrInvalidProvider = errors.New("invalid provider") // ErrInvalidName indicates a cluster stack string has an invalid name. - ErrInvalidName = fmt.Errorf("invalid name") + ErrInvalidName = errors.New("invalid name") ) // NewFromClusterClassProperties returns a ClusterStack based on a cluster stack string. diff --git a/pkg/kube/helpers.go b/pkg/kube/helpers.go index 45fbfa8d..c9fa762b 100644 --- a/pkg/kube/helpers.go +++ b/pkg/kube/helpers.go @@ -316,7 +316,7 @@ func getName(obj runtime.Object) (string, error) { case metav1.Object: return t.GetName(), nil default: - return "", fmt.Errorf("object does not implement GetName()") + return "", errors.New("object does not implement GetName()") } } diff --git a/pkg/kubernetesversion/kubernetesversion.go b/pkg/kubernetesversion/kubernetesversion.go index 88ca6a20..2dd6dba0 100644 --- a/pkg/kubernetesversion/kubernetesversion.go +++ b/pkg/kubernetesversion/kubernetesversion.go @@ -18,6 +18,7 @@ limitations under the License. package kubernetesversion import ( + "errors" "fmt" "strconv" "strings" @@ -31,13 +32,13 @@ type KubernetesVersion struct { var ( // ErrInvalidFormat is used for invalid format. - ErrInvalidFormat = fmt.Errorf("invalid format") + ErrInvalidFormat = errors.New("invalid format") // ErrInvalidMajorVersion is used for invalid major version. - ErrInvalidMajorVersion = fmt.Errorf("invalid major version") + ErrInvalidMajorVersion = errors.New("invalid major version") // ErrInvalidMinorVersion is used for invalid minor version. - ErrInvalidMinorVersion = fmt.Errorf("invalid minor version") + ErrInvalidMinorVersion = errors.New("invalid minor version") ) // New returns a kubernetes version from specified major and minor version. diff --git a/pkg/release/metadata.go b/pkg/release/metadata.go index 261fbf8d..912c3f59 100644 --- a/pkg/release/metadata.go +++ b/pkg/release/metadata.go @@ -17,11 +17,12 @@ limitations under the License. package release import ( + "errors" "fmt" ) // ErrEmptyVersion indicates that the version is empty. -var ErrEmptyVersion = fmt.Errorf("empty version") +var ErrEmptyVersion = errors.New("empty version") // Metadata is the metadata for cluster stacks. type Metadata struct { diff --git a/pkg/release/release.go b/pkg/release/release.go index 581a4996..509ed980 100644 --- a/pkg/release/release.go +++ b/pkg/release/release.go @@ -18,6 +18,7 @@ limitations under the License. package release import ( + "errors" "fmt" "os" "path/filepath" @@ -38,11 +39,11 @@ type Release struct { var ( // ErrEmptyReleaseName indicates release name is not provided. - ErrEmptyReleaseName = fmt.Errorf("name is empty") + ErrEmptyReleaseName = errors.New("name is empty") // ErrEmptyReleaseCSR indicates cluster stack is not provided. - ErrEmptyReleaseCSR = fmt.Errorf("cluster stack is empty") + ErrEmptyReleaseCSR = errors.New("cluster stack is empty") // ErrEmptyReleaseDownloadPath indicates download path is not provided. - ErrEmptyReleaseDownloadPath = fmt.Errorf("local download path is empty") + ErrEmptyReleaseDownloadPath = errors.New("local download path is empty") ) const ( diff --git a/pkg/version/version.go b/pkg/version/version.go index ec77f7cf..4e05d1ad 100644 --- a/pkg/version/version.go +++ b/pkg/version/version.go @@ -18,6 +18,7 @@ limitations under the License. package version import ( + "errors" "fmt" "regexp" "strconv" @@ -149,7 +150,7 @@ func FromReleaseTag(releaseTag string) (Version, error) { // Validate validates the version. func (csv *Version) Validate() error { if csv.Major < 0 { - return fmt.Errorf("major version should be a non-negative integer") + return errors.New("major version should be a non-negative integer") } if csv.Channel != ChannelStable { @@ -158,13 +159,13 @@ func (csv *Version) Validate() error { // If it's an integer, check if it's greater than 0 patchInt, _ := strconv.Atoi(csv.Patch) if patchInt < 0 { - return fmt.Errorf("patch version should be a non-negative integer") + return errors.New("patch version should be a non-negative integer") } } // If it's alpha numeric, check if it's empty if csv.Patch == "" { - return fmt.Errorf("patch can't empty") + return errors.New("patch can't empty") } }