From 2e98e99dbfd1c46bc0cf871efce7361434bc2dc7 Mon Sep 17 00:00:00 2001 From: Iamrushabhshahh Date: Thu, 15 Oct 2026 17:41:41 +0530 Subject: [PATCH 1/2] ci: migrate golangci-lint to v2 golangci-lint v1 is no longer maintained and cannot load modules that target Go 1.25, which the pending dependency updates need. Move to v2 first, on the current Go version, so the Go bump can follow separately. - Use golangci-lint v2.14.0 with golangci-lint-action@v9. - Migrate .golangci.yml to the v2 format and keep the v1 rule set: gosimple and stylecheck are now part of staticcheck, gofumpt moves to formatters, the QF* quick fixes and govet's inline analyser stay off, and v1's default exclusions are kept through presets. - Skip prealloc in _test.go files, and match third_party, builtin and examples directories the way v1 did. - make lint and lint-fix now install GOLINTER_VERSION when the golangci-lint on PATH is missing or a different version, and fail with a clear message if an older binary still shadows it. Co-authored-by: Iamrushabhshahh Signed-off-by: Iamrushabhshahh --- .github/workflows/test.yaml | 4 +- .golangci.yml | 111 ++++++++++++++++++++++++------------ Makefile | 20 +++++-- 3 files changed, 90 insertions(+), 45 deletions(-) diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 1299963de..adfb8a242 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -47,7 +47,7 @@ jobs: with: go-version: 1.22 - name: golangci-lint - uses: golangci/golangci-lint-action@v3 + uses: golangci/golangci-lint-action@v9 with: # Optional: version of golangci-lint to use in form of v1.2 or v1.2.3 or `latest` to use the latest version - version: v1.56.2 \ No newline at end of file + version: v2.14.0 \ No newline at end of file diff --git a/.golangci.yml b/.golangci.yml index e770009ca..9a654eff7 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -1,40 +1,32 @@ -# This file contains all available configuration options -# with their default values. -# For complete .golangci.yml configuration, reference: https://golangci-lint.run/usage/configuration/#config-file +# golangci-lint v2 configuration. +# For the full reference, see: https://golangci-lint.run/usage/configuration/ +version: "2" -# options for analysis running run: timeout: 10m linters: - disable-all: true + default: none enable: # please keep this alphabetized - # Don't use soon to deprecated[1] linters that lead to false - # https://github.com/golangci/golangci-lint/issues/1841 - # - deadcode - # - structcheck - # - varcheck - - ineffassign - - staticcheck - - unused - - gosimple - - govet - - gofumpt + # gosimple and stylecheck are part of staticcheck since golangci-lint v2. + # exportloopref was removed: Go 1.22 loop variable semantics make it obsolete. + # typecheck is always on and can no longer be listed. - bodyclose - # - depguard - dogsled - dupl - - exportloopref - gocritic -# - misspell + - govet + - ineffassign + # - misspell - nolintlint - prealloc - predeclared - - stylecheck + - staticcheck - tparallel - - typecheck - unconvert + - unused - whitespace + # - depguard # - wsl # - revive # - unparam @@ -44,20 +36,65 @@ linters: # - thelper # - goconst # - errcheck + settings: + govet: + disable: + # New in recent Go releases; not enabled under golangci-lint v1. + - inline + staticcheck: + # Default checks, minus the QF* quick fixes that staticcheck gained when + # gosimple and stylecheck were merged into it in golangci-lint v2. + checks: + - all + - -ST1000 + - -ST1003 + - -ST1016 + - -ST1020 + - -ST1021 + - -ST1022 + - -QF* + exclusions: + generated: lax + # Keep the exclusions and skipped directories that golangci-lint v1 + # applied by default. + presets: + - comments + - common-false-positives + - legacy + - std-error-handling + rules: + # Newer prealloc versions also flag slices that start from a literal. + # Allocation hints are not worth the churn in table-driven tests. + - path: _test\.go$ + linters: + - prealloc + - path: (.+)\.go$ + text: "G306: Expect WriteFile permissions to be 0600 or less" + - path: (.+)\.go$ + text: "ST1018: string literal contains Unicode control characters, consider using escape sequences instead" + - path: (.+)\.go$ + text: "ifElseChain: rewrite if-else to switch statement" + - path: (.+)\.go$ + text: "S1000: should use for range instead of for { select {} }" + - path: (.+)\.go$ + text: "SA4004: the surrounding loop is unconditionally terminated" + - path: (.+)\.go$ + text: "copylocks: call of c\\.Post copies lock value: kcl-lang\\.io/kcl-go/pkg/spec/gpyrpc\\.Ping_Args contains google\\.golang\\.org/protobuf/internal/impl\\.MessageState contains sync\\.Mutex" + paths: + - (^|/)third_party($|/) + - (^|/)builtin($|/) + - (^|/)examples($|/) -linters-settings: - gofumpt: - # Select the Go version to target. The default is `1.15`. - lang-version: "1.22" - # Choose whether or not to use the extra rules that are disabled - # by default - extra-rules: false - -issues: - exclude: - - "G306: Expect WriteFile permissions to be 0600 or less" - - "ST1018: string literal contains Unicode control characters, consider using escape sequences instead" - - "ifElseChain: rewrite if-else to switch statement" - - "S1000: should use for range instead of for { select {} }" - - "SA4004: the surrounding loop is unconditionally terminated" - - "copylocks: call of c\\.Post copies lock value: kcl-lang\\.io/kcl-go/pkg/spec/gpyrpc\\.Ping_Args contains google\\.golang\\.org/protobuf/internal/impl\\.MessageState contains sync\\.Mutex" +formatters: + enable: + - gofumpt + settings: + gofumpt: + # The target Go version is read from go.mod. + extra-rules: false + exclusions: + generated: lax + paths: + - (^|/)third_party($|/) + - (^|/)builtin($|/) + - (^|/)examples($|/) diff --git a/Makefile b/Makefile index 7b507ac98..dc7f29b2e 100644 --- a/Makefile +++ b/Makefile @@ -13,7 +13,7 @@ RUN_IN_DOCKER+=-w /root/kusion ${KCLVM_BUILDER} GOFORMATER ?= gofumpt GOFORMATER_VERSION ?= v0.2.0 GOLINTER ?= golangci-lint -GOLINTER_VERSION ?= v1.56.2 +GOLINTER_VERSION ?= v2.14.0 COVER_FILE ?= coverage.out SOURCE_PATHS ?= ./pkg/... @@ -62,12 +62,20 @@ format: ## Format source code @which $(GOFORMATER) > /dev/null || (echo "Installing $(GOFORMATER)@$(GOFORMATER_VERSION) ..."; go install mvdan.cc/gofumpt@$(GOFORMATER_VERSION) && echo -e "Installation complete!\n") @for path in $(SOURCE_PATHS); do ${GOFORMATER} -l -w -e `echo $${path} | cut -b 3- | rev | cut -b 5- | rev`; done; -lint: ## Lint, will not fix but sets exit code on error - @which $(GOLINTER) > /dev/null || (echo "Installing $(GOLINTER)@$(GOLINTER_VERSION) ..."; go install github.com/golangci/golangci-lint/cmd/golangci-lint@$(GOLINTER_VERSION) && echo -e "Installation complete!\n") +# Install golangci-lint if it is missing or not at GOLINTER_VERSION, so an older +# local install (for example v1, which cannot read the v2 config) is not used. +lint-install: + @if ! $(GOLINTER) --version 2>/dev/null | grep -q "version $(GOLINTER_VERSION:v%=%) "; then \ + echo "Installing $(GOLINTER)@$(GOLINTER_VERSION) ..."; \ + go install github.com/golangci/golangci-lint/v2/cmd/golangci-lint@$(GOLINTER_VERSION) && echo -e "Installation complete!\n"; \ + fi + @$(GOLINTER) --version 2>/dev/null | grep -q "version $(GOLINTER_VERSION:v%=%) " || \ + (echo -e "$(CCRED)$$(which $(GOLINTER)) is not $(GOLINTER_VERSION). Remove it or put $$(go env GOPATH)/bin first in PATH.$(CCEND)"; exit 1) + +lint: lint-install ## Lint, will not fix but sets exit code on error $(GOLINTER) run --timeout=10m $(SOURCE_PATHS) -lint-fix: ## Lint, will try to fix errors and modify code - @which $(GOLINTER) > /dev/null || (echo "Installing $(GOLINTER)@$(GOLINTER_VERSION) ..."; go install github.com/golangci/golangci-lint/cmd/golangci-lint@$(GOLINTER_VERSION) && echo -e "Installation complete!\n") +lint-fix: lint-install ## Lint, will try to fix errors and modify code $(GOLINTER) run --timeout=10m $(SOURCE_PATHS) --fix doc: ## Start the documentation server with godoc @@ -211,4 +219,4 @@ gen-api-doc: ## Generate API Documentation by API Specification @which swagger > /dev/null || (echo "Installing swagger@v0.30.5 ..."; go install github.com/go-swagger/go-swagger/cmd/swagger@v0.30.5 && echo "Installation complete!\n") -swagger generate markdown -f ./api/openapispec/swagger.json --output=docs/api.md && echo "🎉 Done!" || (echo "💥 Fail!"; exit 1) -.PHONY: test cover cover-html format lint lint-fix doc build-changelog upload clean build-all build-image build-local-linux build-local-windows build-local-linux-all build-local-windows-all e2e-test gen-api-spec gen-api-doc build-portal show-portal-status +.PHONY: test cover cover-html format lint-install lint lint-fix doc build-changelog upload clean build-all build-image build-local-linux build-local-windows build-local-linux-all build-local-windows-all e2e-test gen-api-spec gen-api-doc build-portal show-portal-status From 4444ba8ecf192110b6e3bb73de147fbeef780f1d Mon Sep 17 00:00:00 2001 From: Iamrushabhshahh Date: Thu, 15 Oct 2026 17:41:41 +0530 Subject: [PATCH 2/2] style: fix findings reported by golangci-lint v2 The linters bundled with golangci-lint v2 report findings that v1 did not. All are small and do not change behaviour, except the slog calls, which logged the error as the message and produced a !BADKEY attribute. - govet slog: logger.Error(err.Error(), "msg", "error", err) becomes logger.Error("msg", "error", err). - staticcheck SA1006: fmt.Errorf(s) becomes errors.New(s), and fmt.Printf(s) becomes fmt.Print(s). - staticcheck S1009: drop nil checks that len() already covers. - predeclared: rename local "max" variables, which shadow the Go 1.21 builtin, to "maxItems". - prealloc: preallocate slices in non-test code. - gofumpt: reformat k8s_printer.go. Co-authored-by: Iamrushabhshahh Signed-off-by: Iamrushabhshahh --- pkg/cmd/project/list/options.go | 2 +- pkg/cmd/resource/show.go | 2 +- pkg/engine/operation/models/change.go | 8 +++-- pkg/engine/operation/watch.go | 2 +- pkg/engine/printers/printer/k8s_printer.go | 36 +++++++++---------- .../runtime/terraform/tfops/tferrors.go | 2 +- pkg/oci/client/client.go | 5 ++- .../alicloud/secretsmanager/secretsmanager.go | 5 +-- .../aws/secretsmanager/secretsmanager.go | 4 +-- .../providers/azure/keyvault/keyvault.go | 9 ++--- pkg/secrets/providers/fake/fake.go | 5 +-- pkg/secrets/providers/hashivault/vault.go | 3 +- .../secretsmanager/secretsmanager.go | 5 +-- pkg/server/handler/endpoint/endpoint.go | 2 +- pkg/server/route/route.go | 20 +++++------ pkg/util/yaml/yaml.go | 2 +- 16 files changed, 59 insertions(+), 53 deletions(-) diff --git a/pkg/cmd/project/list/options.go b/pkg/cmd/project/list/options.go index 48dd14d85..ca4d2dac9 100644 --- a/pkg/cmd/project/list/options.go +++ b/pkg/cmd/project/list/options.go @@ -132,7 +132,7 @@ func (o *Options) Validate(cmd *cobra.Command, args []string) error { // Run executes the `list` command. func (o *Options) Run() error { - if o.Workspace == nil || len(o.Workspace) == 0 { + if len(o.Workspace) == 0 { return fmt.Errorf("workspace is empty") } diff --git a/pkg/cmd/resource/show.go b/pkg/cmd/resource/show.go index 12f43e979..2d1995b8a 100644 --- a/pkg/cmd/resource/show.go +++ b/pkg/cmd/resource/show.go @@ -201,7 +201,7 @@ func (o *ShowOptions) Run() (err error) { return fmt.Errorf("no release found for project: %s, workspace: %s", *o.Project, *o.Workspace) } - if rel.Spec.Resources == nil || len(rel.Spec.Resources) == 0 { + if len(rel.Spec.Resources) == 0 { return fmt.Errorf("no resources found for project: %s, workspace: %s", *o.Project, *o.Workspace) } resourceMap := make(map[string]apiv1.Resource) diff --git a/pkg/engine/operation/models/change.go b/pkg/engine/operation/models/change.go index 74526b1f0..c209f5ecd 100644 --- a/pkg/engine/operation/models/change.go +++ b/pkg/engine/operation/models/change.go @@ -223,7 +223,8 @@ func (p *Changes) Summary(writer io.Writer, noStyle bool) { // Create a fork of the default table, fill it with data and print it. // Data can also be generated and inserted later. tableHeader := []string{fmt.Sprintf("Stack: %s\nID", p.stack.Name), "\nAction"} - tableData := pterm.TableData{tableHeader} + tableData := make(pterm.TableData, 0, 1+len(p.Values())) + tableData = append(tableData, tableHeader) if noStyle { pterm.DisableStyling() @@ -246,7 +247,8 @@ func (p *Changes) Summary(writer io.Writer, noStyle bool) { func (o *ChangeOrder) PromptDetails(ui *terminal.UI) (string, error) { // Prepare the selects - options := []string{"all"} + options := make([]string, 0, len(o.StepKeys)+2) + options = append(options, "all") optionMaps := map[string]string{"all": "all"} for _, key := range o.StepKeys { @@ -267,7 +269,7 @@ func (o *ChangeOrder) PromptDetails(ui *terminal.UI) (string, error) { WithOnInterruptFunc(func() { hint := `Interruption during 'apply' or 'destroy' may result in a locked release file. Please use 'kusion release unlock' before executing the next operation.` - fmt.Printf("\n" + hint + "\n") + fmt.Print("\n" + hint + "\n") os.Exit(1) }). Show() diff --git a/pkg/engine/operation/watch.go b/pkg/engine/operation/watch.go index 8a7518a29..daab13c2c 100644 --- a/pkg/engine/operation/watch.go +++ b/pkg/engine/operation/watch.go @@ -68,7 +68,7 @@ func (wo *WatchOperation) Watch(req *WatchRequest) error { continue } if v1.IsErr(resp.Status) { - return fmt.Errorf(resp.Status.String()) + return errors.New(resp.Status.String()) } // Save watchers diff --git a/pkg/engine/printers/printer/k8s_printer.go b/pkg/engine/printers/printer/k8s_printer.go index 895789fcd..3dd5a2a86 100644 --- a/pkg/engine/printers/printer/k8s_printer.go +++ b/pkg/engine/printers/printer/k8s_printer.go @@ -189,7 +189,7 @@ func formatEndpoints(endpoints *corev1.Endpoints, ports sets.Set[string]) string return "" } list := []string{} - max := 3 + maxItems := 3 more := false count := 0 for i := range endpoints.Subsets { @@ -197,7 +197,7 @@ func formatEndpoints(endpoints *corev1.Endpoints, ports sets.Set[string]) string if len(ss.Ports) == 0 { // It's possible to have headless services with no ports. for i := range ss.Addresses { - if len(list) == max { + if len(list) == maxItems { more = true } if !more { @@ -211,7 +211,7 @@ func formatEndpoints(endpoints *corev1.Endpoints, ports sets.Set[string]) string port := &ss.Ports[i] if ports == nil || ports.Has(port.Name) { for i := range ss.Addresses { - if len(list) == max { + if len(list) == maxItems { more = true } addr := &ss.Addresses[i] @@ -227,7 +227,7 @@ func formatEndpoints(endpoints *corev1.Endpoints, ports sets.Set[string]) string } ret := strings.Join(list, ",") if more { - return fmt.Sprintf("%s + %d more...", ret, count-max) + return fmt.Sprintf("%s + %d more...", ret, count-maxItems) } return ret } @@ -687,7 +687,7 @@ func printServiceAccount(obj *corev1.ServiceAccount) (string, bool) { } func printDeployment(obj *appsv1.Deployment) (string, bool) { - desiredReplicas := *(obj.Spec.Replicas) + desiredReplicas := *obj.Spec.Replicas updatedReplicas := obj.Status.UpdatedReplicas readyReplicas := obj.Status.ReadyReplicas availableReplicas := obj.Status.AvailableReplicas @@ -706,11 +706,11 @@ func printEndpointSlice(obj *discoveryv1.EndpointSlice) (string, bool) { func formatDiscoveryPorts(ports []discoveryv1.EndpointPort) string { list := []string{} - max := 3 + maxItems := 3 more := false count := 0 for _, port := range ports { - if len(list) < max { + if len(list) < maxItems { portNum := "*" if port.Port != nil { portNum = strconv.Itoa(int(*port.Port)) @@ -718,36 +718,36 @@ func formatDiscoveryPorts(ports []discoveryv1.EndpointPort) string { portNum = *port.Name } list = append(list, portNum) - } else if len(list) == max { + } else if len(list) == maxItems { more = true } count++ } - return listWithMoreString(list, more, count, max) + return listWithMoreString(list, more, count, maxItems) } func formatDiscoveryEndpoints(endpoints []discoveryv1.Endpoint) string { list := []string{} - max := 3 + maxItems := 3 more := false count := 0 for _, endpoint := range endpoints { for _, address := range endpoint.Addresses { - if len(list) < max { + if len(list) < maxItems { list = append(list, address) - } else if len(list) == max { + } else if len(list) == maxItems { more = true } count++ } } - return listWithMoreString(list, more, count, max) + return listWithMoreString(list, more, count, maxItems) } -func listWithMoreString(list []string, more bool, count, max int) string { +func listWithMoreString(list []string, more bool, count, maxItems int) string { ret := strings.Join(list, ",") if more { - return fmt.Sprintf("%s + %d more...", ret, count-max) + return fmt.Sprintf("%s + %d more...", ret, count-maxItems) } if ret == "" { ret = "" @@ -756,7 +756,7 @@ func listWithMoreString(list []string, more bool, count, max int) string { } func printReplicaSet(obj *appsv1.ReplicaSet) (string, bool) { - desiredReplicas := *(obj.Spec.Replicas) + desiredReplicas := *obj.Spec.Replicas currentReplicas := obj.Status.Replicas readyReplicas := obj.Status.ReadyReplicas return fmt.Sprintf("Desired: %d, Current: %d, Ready: %d", @@ -776,7 +776,7 @@ func printDaemonSet(obj *appsv1.DaemonSet) (string, bool) { } func printStatefulSet(obj *appsv1.StatefulSet) (string, bool) { - desiredReplicas := *(obj.Spec.Replicas) + desiredReplicas := *obj.Spec.Replicas readyReplicas := obj.Status.ReadyReplicas createTime := translateTimestampSince(obj.CreationTimestamp) return fmt.Sprintf("Ready: %d/%d, Age: %s", desiredReplicas, readyReplicas, createTime), @@ -880,7 +880,7 @@ func printIngress(obj *networkingv1.Ingress) (string, bool) { } func getIngressHosts(obj *networkingv1.Ingress) string { - results := []string{} + results := make([]string, 0, len(obj.Spec.Rules)) for _, rule := range obj.Spec.Rules { host := "*" if rule.Host != "" { diff --git a/pkg/engine/runtime/terraform/tfops/tferrors.go b/pkg/engine/runtime/terraform/tfops/tferrors.go index 616cfea4d..a5f30a038 100644 --- a/pkg/engine/runtime/terraform/tfops/tferrors.go +++ b/pkg/engine/runtime/terraform/tfops/tferrors.go @@ -84,7 +84,7 @@ func parseTerraformInfo(infos []byte) ([]*TerraformInfo, error) { err := json.Unmarshal([]byte(v), terraformInfo) if err != nil { log.Debug("unmarshall TF output to TerraformInfo failed. Return the output directly.") - return nil, fmt.Errorf(string(infos)) + return nil, errors.New(string(infos)) } tfInfos = append(tfInfos, terraformInfo) } diff --git a/pkg/oci/client/client.go b/pkg/oci/client/client.go index 72ef23036..9729ae740 100644 --- a/pkg/oci/client/client.go +++ b/pkg/oci/client/client.go @@ -93,8 +93,7 @@ func NewClient(options ...ClientOption) *Client { // optionsWithContext returns the crane options for the given context. func (c *Client) optionsWithContext(ctx context.Context) []crane.Option { - options := []crane.Option{ - crane.WithContext(ctx), - } + options := make([]crane.Option, 0, 1+len(c.opts.craneOptions)) + options = append(options, crane.WithContext(ctx)) return append(options, c.opts.craneOptions...) } diff --git a/pkg/secrets/providers/alicloud/secretsmanager/secretsmanager.go b/pkg/secrets/providers/alicloud/secretsmanager/secretsmanager.go index bb584eb50..05fbeb8f2 100644 --- a/pkg/secrets/providers/alicloud/secretsmanager/secretsmanager.go +++ b/pkg/secrets/providers/alicloud/secretsmanager/secretsmanager.go @@ -2,6 +2,7 @@ package secretsmanager import ( "context" + "errors" "fmt" "os" "strings" @@ -45,10 +46,10 @@ type smSecretStore struct { func (p *DefaultSecretStoreProvider) NewSecretStore(spec *v1.SecretStore) (secrets.SecretStore, error) { providerSpec := spec.Provider if providerSpec == nil { - return nil, fmt.Errorf(errMissingProviderSpec) + return nil, errors.New(errMissingProviderSpec) } if providerSpec.Alicloud == nil { - return nil, fmt.Errorf(errMissingAlicloudProvider) + return nil, errors.New(errMissingAlicloudProvider) } client, err := getAlicloudClient(providerSpec.Alicloud.Region) diff --git a/pkg/secrets/providers/aws/secretsmanager/secretsmanager.go b/pkg/secrets/providers/aws/secretsmanager/secretsmanager.go index 5cb9ba3de..556deea85 100644 --- a/pkg/secrets/providers/aws/secretsmanager/secretsmanager.go +++ b/pkg/secrets/providers/aws/secretsmanager/secretsmanager.go @@ -34,10 +34,10 @@ type DefaultSecretStoreProvider struct{} func (p *DefaultSecretStoreProvider) NewSecretStore(spec *v1.SecretStore) (secrets.SecretStore, error) { providerSpec := spec.Provider if providerSpec == nil { - return nil, fmt.Errorf(errMissingProviderSpec) + return nil, errors.New(errMissingProviderSpec) } if providerSpec.AWS == nil { - return nil, fmt.Errorf(errMissingAWSProvider) + return nil, errors.New(errMissingAWSProvider) } config, err := auth.NewV2Config(context.TODO(), providerSpec.AWS.Region, providerSpec.AWS.Profile) diff --git a/pkg/secrets/providers/azure/keyvault/keyvault.go b/pkg/secrets/providers/azure/keyvault/keyvault.go index 8c8f19752..2a4f19e24 100644 --- a/pkg/secrets/providers/azure/keyvault/keyvault.go +++ b/pkg/secrets/providers/azure/keyvault/keyvault.go @@ -3,6 +3,7 @@ package keyvault import ( "context" "encoding/json" + "errors" "fmt" "os" "strings" @@ -42,10 +43,10 @@ type DefaultSecretStoreProvider struct{} func (p *DefaultSecretStoreProvider) NewSecretStore(spec *v1.SecretStore) (secrets.SecretStore, error) { providerSpec := spec.Provider if providerSpec == nil { - return nil, fmt.Errorf(errMissingProviderSpec) + return nil, errors.New(errMissingProviderSpec) } if providerSpec.Azure == nil { - return nil, fmt.Errorf(errMissingAzureProvider) + return nil, errors.New(errMissingAzureProvider) } secretClient, err := getSecretClient(providerSpec.Azure) @@ -70,13 +71,13 @@ func getSecretClient(spec *v1.AzureKVProvider) (SecretClient, error) { // See https://docs.microsoft.com/en-us/go/azure/azure-sdk-go-authorization#use-environment-based-authentication. func authorizerForServicePrincipal(spec *v1.AzureKVProvider) (autorest.Authorizer, error) { if spec.TenantID == nil { - return nil, fmt.Errorf(errMissingTenant) + return nil, errors.New(errMissingTenant) } clientID := os.Getenv("AZURE_CLIENT_ID") clientSecret := os.Getenv("AZURE_CLIENT_SECRET") if clientID == "" || clientSecret == "" { - return nil, fmt.Errorf(errMissingClientIDSecret) + return nil, errors.New(errMissingClientIDSecret) } clientCredentialsConfig := auth.NewClientCredentialsConfig(clientID, clientSecret, *spec.TenantID) diff --git a/pkg/secrets/providers/fake/fake.go b/pkg/secrets/providers/fake/fake.go index 2bdfc6913..a1cb1f836 100644 --- a/pkg/secrets/providers/fake/fake.go +++ b/pkg/secrets/providers/fake/fake.go @@ -2,6 +2,7 @@ package fake import ( "context" + "errors" "fmt" "github.com/tidwall/gjson" @@ -34,10 +35,10 @@ type DefaultSecretStoreProvider struct{} func (p *DefaultSecretStoreProvider) NewSecretStore(spec *v1.SecretStore) (secrets.SecretStore, error) { providerSpec := spec.Provider if providerSpec == nil { - return nil, fmt.Errorf(errMissingProviderSpec) + return nil, errors.New(errMissingProviderSpec) } if providerSpec.Fake == nil { - return nil, fmt.Errorf(errMissingFakeProvider) + return nil, errors.New(errMissingFakeProvider) } dataMap := make(map[string]*SecretData) diff --git a/pkg/secrets/providers/hashivault/vault.go b/pkg/secrets/providers/hashivault/vault.go index 5432a129b..2e081d398 100644 --- a/pkg/secrets/providers/hashivault/vault.go +++ b/pkg/secrets/providers/hashivault/vault.go @@ -189,7 +189,8 @@ func (v *vaultSecretStore) buildPath(path string) string { } if !strings.Contains(out, "/data/") && v.provider.Version == v1.VaultKVStoreV2 { buildPath := strings.Split(out, "/") - buildMount := []string{buildPath[0], "data"} + buildMount := make([]string, 0, len(buildPath)+1) + buildMount = append(buildMount, buildPath[0], "data") buildMount = append(buildMount, buildPath[1:]...) out = strings.Join(buildMount, "/") return out diff --git a/pkg/secrets/providers/viettelcloud/secretsmanager/secretsmanager.go b/pkg/secrets/providers/viettelcloud/secretsmanager/secretsmanager.go index ba43a4b89..c8f2ec4e7 100644 --- a/pkg/secrets/providers/viettelcloud/secretsmanager/secretsmanager.go +++ b/pkg/secrets/providers/viettelcloud/secretsmanager/secretsmanager.go @@ -3,6 +3,7 @@ package secretsmanager import ( "context" "encoding/json" + "errors" "fmt" "os" "strings" @@ -49,10 +50,10 @@ type smSecretStore struct { func (p *DefaultSecretStoreProvider) NewSecretStore(spec *v1.SecretStore) (secrets.SecretStore, error) { providerSpec := spec.Provider if providerSpec == nil { - return nil, fmt.Errorf(errMissingProviderSpec) + return nil, errors.New(errMissingProviderSpec) } if providerSpec.ViettelCloud == nil { - return nil, fmt.Errorf(errMissingViettelCloudProvider) + return nil, errors.New(errMissingViettelCloudProvider) } var project string if providerSpec.ViettelCloud.ProjectID != "" { diff --git a/pkg/server/handler/endpoint/endpoint.go b/pkg/server/handler/endpoint/endpoint.go index 84d6bf908..e81567f10 100644 --- a/pkg/server/handler/endpoint/endpoint.go +++ b/pkg/server/handler/endpoint/endpoint.go @@ -49,7 +49,7 @@ func listEndpoints(ctx context.Context, r chi.Router) []string { // Populate the list of endpoints by walking through the router if err := chi.Walk(r, walkFunc); err != nil { - logger.Error(err.Error(), "Walking routes error", "error", err) + logger.Error("Walking routes error", "error", err) } // Sort the collected endpoints alphabetically diff --git a/pkg/server/route/route.go b/pkg/server/route/route.go index 32639b269..8271602dd 100644 --- a/pkg/server/route/route.go +++ b/pkg/server/route/route.go @@ -198,52 +198,52 @@ func setupRestAPIV1( // Set up the handlers for the resources. sourceHandler, err := source.NewHandler(sourceManager) if err != nil { - logger.Error(err.Error(), "Error creating source handler...", "error", err) + logger.Error("Error creating source handler...", "error", err) return } orgHandler, err := organization.NewHandler(organizationManager) if err != nil { - logger.Error(err.Error(), "Error creating org handler...", "error", err) + logger.Error("Error creating org handler...", "error", err) return } projectHandler, err := project.NewHandler(projectManager) if err != nil { - logger.Error(err.Error(), "Error creating project handler...", "error", err) + logger.Error("Error creating project handler...", "error", err) return } stackHandler, err := stack.NewHandler(stackManager, config.MaxAsyncConcurrent, config.MaxAsyncBuffer) if err != nil { - logger.Error(err.Error(), "Error creating stack handler...", "error", err) + logger.Error("Error creating stack handler...", "error", err) return } workspaceHandler, err := workspace.NewHandler(workspaceManager) if err != nil { - logger.Error(err.Error(), "Error creating workspace handler...", "error", err) + logger.Error("Error creating workspace handler...", "error", err) return } backendHandler, err := backend.NewHandler(backendManager) if err != nil { - logger.Error(err.Error(), "Error creating backend handler...", "error", err) + logger.Error("Error creating backend handler...", "error", err) return } resourceHandler, err := resource.NewHandler(resourceManager) if err != nil { - logger.Error(err.Error(), "Error creating resource handler...", "error", err) + logger.Error("Error creating resource handler...", "error", err) return } moduleHandler, err := module.NewHandler(moduleManager) if err != nil { - logger.Error(err.Error(), "Error creating module handler", "error", err) + logger.Error("Error creating module handler", "error", err) return } variableSetHandler, err := variableset.NewHandler(variableSetManager) if err != nil { - logger.Error(err.Error(), "Error creating variable set handler", "error", err) + logger.Error("Error creating variable set handler", "error", err) return } variableHandler, err := variable.NewHandler(variableManager) if err != nil { - logger.Error(err.Error(), "Error creating variable handler", "error", err) + logger.Error("Error creating variable handler", "error", err) return } diff --git a/pkg/util/yaml/yaml.go b/pkg/util/yaml/yaml.go index 5c75ec6f8..c4b035bd1 100644 --- a/pkg/util/yaml/yaml.go +++ b/pkg/util/yaml/yaml.go @@ -141,7 +141,7 @@ func MergeToOneYAML(yamlList ...interface{}) string { // Merge multiple yaml string into a single string, // separate yaml documents with '---' func MergeStringsToOneYAML(yamlList []string) string { - documents := []interface{}{} + documents := make([]interface{}, 0, len(yamlList)) for _, y := range yamlList { document := map[string]interface{}{} yamlv3.Unmarshal([]byte(y), document)