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 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)