From dacb5dfe732874ca2f8621344cb0cc2666514915 Mon Sep 17 00:00:00 2001 From: Martin Date: Tue, 15 Apr 2025 18:54:25 +0200 Subject: [PATCH] chore: Upgrade golangci-lint to next major version (#686) * chore: Upgrade golangci-lint to next major version * chore: Add //nolint to new tests --------- Co-authored-by: Martin Wentzel --- .github/workflows/golangci-lint.yaml | 4 ++-- .golangci.yml | 15 +++++++++++---- GNUmakefile | 2 +- internal/provider/config.go | 2 +- internal/provider/data_source_docker_logs.go | 2 +- internal/provider/provider_test.go | 2 +- internal/provider/resource_docker_config.go | 6 +++--- .../provider/resource_docker_container_funcs.go | 15 +++++++++------ .../provider/resource_docker_container_test.go | 12 ++++++++---- internal/provider/resource_docker_image_funcs.go | 8 ++++---- internal/provider/resource_docker_image_test.go | 12 ++++++------ .../provider/resource_docker_network_funcs.go | 2 +- .../resource_docker_registry_image_funcs.go | 2 +- internal/provider/resource_docker_secret.go | 3 ++- scripts/testing/v1/main.go | 2 +- scripts/testing/v2/main.go | 2 +- scripts/testing/v3/main.go | 2 +- 17 files changed, 54 insertions(+), 39 deletions(-) diff --git a/.github/workflows/golangci-lint.yaml b/.github/workflows/golangci-lint.yaml index b4d30227..041fcfaa 100644 --- a/.github/workflows/golangci-lint.yaml +++ b/.github/workflows/golangci-lint.yaml @@ -19,6 +19,6 @@ jobs: with: go-version: ${{ env.GO_VERSION }} - name: golangci-lint - uses: golangci/golangci-lint-action@v6 + uses: golangci/golangci-lint-action@v7 with: - version: v1.57 + version: v2.1.1 diff --git a/.golangci.yml b/.golangci.yml index 9b3fc8c2..660e7be8 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -1,7 +1,14 @@ -linters-settings: - errcheck: - # https://github.com/hashicorp/terraform-provider-aws/blob/9c9a116a857fb838a0e7d1cfbf420c2524f0abe1/.golangci.yml#L37-L39 - ignore: github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema:ForceNew|Set,fmt:.*,io:Close +version: "2" + +linters: + settings: + errcheck: + # https://github.com/hashicorp/terraform-provider-aws/blob/9c9a116a857fb838a0e7d1cfbf420c2524f0abe1/.golangci.yml#L37-L39 + exclude-functions: + - github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema:ForceNew|Set,fmt:.*,io:Close + - (*github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema.ResourceData).Set + - io.Close + run: diff --git a/GNUmakefile b/GNUmakefile index b2b9ce36..6ddd7332 100644 --- a/GNUmakefile +++ b/GNUmakefile @@ -2,7 +2,7 @@ TEST?=$$(go list ./... |grep -v 'vendor') GOFMT_FILES?=$$(find . -name '*.go' |grep -v vendor) PKG_NAME=internal/provider -GOLANGCI_VERSION = 1.49.0 +GOLANGCI_VERSION = 2.1.1 # Values to install the provider locally for testing purposes HOSTNAME=registry.terraform.io diff --git a/internal/provider/config.go b/internal/provider/config.go index 32a99d7a..b5c3ac03 100644 --- a/internal/provider/config.go +++ b/internal/provider/config.go @@ -44,7 +44,7 @@ func buildHTTPClientFromBytes(caPEMCert, certPEMBlock, keyPEMBlock []byte) (*htt } else { caPool := x509.NewCertPool() if !caPool.AppendCertsFromPEM(caPEMCert) { - return nil, errors.New("Could not add RootCA pem") + return nil, errors.New("could not add RootCA pem") } tlsConfig.RootCAs = caPool } diff --git a/internal/provider/data_source_docker_logs.go b/internal/provider/data_source_docker_logs.go index 3ab8867e..e8c24602 100644 --- a/internal/provider/data_source_docker_logs.go +++ b/internal/provider/data_source_docker_logs.go @@ -101,7 +101,7 @@ func dataSourceDockerLogsRead(ctx context.Context, d *schema.ResourceData, meta if err != nil { return diag.Errorf("dataSourceDockerLogsRead: error while asking for logs %s", err) } - defer readCloser.Close() + defer readCloser.Close() //nolint:errcheck // see https://github.com/moby/moby/issues/7375#issuecomment-51462963 discard := d.Get("discard_headers").(bool) diff --git a/internal/provider/provider_test.go b/internal/provider/provider_test.go index fe95dba4..c64a2387 100644 --- a/internal/provider/provider_test.go +++ b/internal/provider/provider_test.go @@ -36,7 +36,7 @@ func init() { } func TestProvider_impl(t *testing.T) { - var _ *schema.Provider = New("dev")() + var _ = New("dev")() } func TestProvider(t *testing.T) { diff --git a/internal/provider/resource_docker_config.go b/internal/provider/resource_docker_config.go index 1677b6e9..b7596c2a 100644 --- a/internal/provider/resource_docker_config.go +++ b/internal/provider/resource_docker_config.go @@ -74,8 +74,8 @@ func resourceDockerConfigRead(ctx context.Context, d *schema.ResourceData, meta log.Printf("[DEBUG] Docker config inspect from readFunc: %s", jsonObj) d.SetId(config.ID) - d.Set("name", config.Spec.Name) - d.Set("data", base64.StdEncoding.EncodeToString(config.Spec.Data)) + d.Set("name", config.Spec.Name) //nolint:errcheck + d.Set("data", base64.StdEncoding.EncodeToString(config.Spec.Data)) //nolint:errcheck return nil } @@ -86,6 +86,6 @@ func resourceDockerConfigDelete(ctx context.Context, d *schema.ResourceData, met return diag.FromErr(err) } - d.SetId("") + d.SetId("") //nolint:errcheck return nil } diff --git a/internal/provider/resource_docker_container_funcs.go b/internal/provider/resource_docker_container_funcs.go index 3a183312..7b66ca5f 100644 --- a/internal/provider/resource_docker_container_funcs.go +++ b/internal/provider/resource_docker_container_funcs.go @@ -170,7 +170,8 @@ func resourceDockerContainerCreate(ctx context.Context, d *schema.ResourceData, mountInstance.ReadOnly = value.(bool) } - if mountType == mount.TypeBind { + // QF1003: could use tagged switch on mountType + if mountType == mount.TypeBind { //nolint:staticcheck if value, ok := rawMount["bind_options"]; ok { if len(value.([]interface{})) > 0 { mountInstance.BindOptions = &mount.BindOptions{} @@ -521,8 +522,8 @@ func resourceDockerContainerCreate(ctx context.Context, d *schema.ResourceData, if err != nil { result <- fmt.Errorf("error inspecting container state: %s", err) } - //infos.ContainerJSONBase.State.Health is only set when there is a healthcheck defined on the container resource - if infos.ContainerJSONBase.State.Health.Status == types.Healthy { + // QF1008: could remove embedded field "ContainerJSONBase" from selector + if infos.ContainerJSONBase.State.Health.Status == types.Healthy { //nolint:staticcheck log.Printf("[DEBUG] container state is healthy") break } @@ -564,7 +565,7 @@ func resourceDockerContainerCreate(ctx context.Context, d *schema.ResourceData, if err != nil { log.Panic(err) } - defer reader.Close() + defer reader.Close() //nolint:errcheck scanner := bufio.NewScanner(reader) for scanner.Scan() { @@ -870,7 +871,8 @@ func resourceDockerContainerUpdate(ctx context.Context, d *schema.ResourceData, if a > 0 { a = a * 1024 * 1024 } - updateConfig.Resources.MemorySwap = a + // QF1008: could remove embedded field "Resources" from selector + updateConfig.Resources.MemorySwap = a //nolint:staticcheck } client := meta.(*ProviderConfig).DockerClient _, err := client.ContainerUpdate(ctx, d.Id(), updateConfig) @@ -936,7 +938,8 @@ func resourceDockerContainerDelete(ctx context.Context, d *schema.ResourceData, func fetchDockerContainer(ctx context.Context, ID string, client *client.Client) (*types.Container, error) { apiContainers, err := client.ContainerList(ctx, types.ContainerListOptions{All: true}) if err != nil { - return nil, fmt.Errorf("error fetching container information from Docker: %s\n", err) + // ST1005: error strings should not end with punctuation or newlines + return nil, fmt.Errorf("error fetching container information from Docker: %s\n", err) //nolint:staticcheck } for _, apiContainer := range apiContainers { diff --git a/internal/provider/resource_docker_container_test.go b/internal/provider/resource_docker_container_test.go index d1c8b8c3..16567ecf 100644 --- a/internal/provider/resource_docker_container_test.go +++ b/internal/provider/resource_docker_container_test.go @@ -1069,7 +1069,8 @@ func TestAccDockerContainer_port_internal(t *testing.T) { var c types.ContainerJSON testCheck := func(*terraform.State) error { - portMap := c.NetworkSettings.NetworkSettingsBase.Ports + // QF1008: could remove embedded field "NetworkSettingsBase" from selector + portMap := c.NetworkSettings.NetworkSettingsBase.Ports //nolint:staticcheck portBindings, ok := portMap["80/tcp"] if !ok || len(portMap["80/tcp"]) == 0 { return fmt.Errorf("Port 80 on tcp is not set") @@ -1116,7 +1117,8 @@ func TestAccDockerContainer_port_multiple_internal(t *testing.T) { var c types.ContainerJSON testCheck := func(*terraform.State) error { - portMap := c.NetworkSettings.NetworkSettingsBase.Ports + // QF1008: could remove embedded field "NetworkSettingsBase" from selector + portMap := c.NetworkSettings.NetworkSettingsBase.Ports //nolint:staticcheck portBindings, ok := portMap["80/tcp"] if !ok || len(portMap["80/tcp"]) == 0 { return fmt.Errorf("Port 80 on tcp is not set") @@ -1185,7 +1187,8 @@ func TestAccDockerContainer_port(t *testing.T) { var c types.ContainerJSON testCheck := func(*terraform.State) error { - portMap := c.NetworkSettings.NetworkSettingsBase.Ports + // QF1008: could remove embedded field "NetworkSettingsBase" from selector + portMap := c.NetworkSettings.NetworkSettingsBase.Ports //nolint:staticcheck portBindings, ok := portMap["80/tcp"] if !ok || len(portMap["80/tcp"]) == 0 { return fmt.Errorf("Port 80 on tcp is not set") @@ -1240,7 +1243,8 @@ func TestAccDockerContainer_multiple_ports(t *testing.T) { var c types.ContainerJSON testCheck := func(*terraform.State) error { - portMap := c.NetworkSettings.NetworkSettingsBase.Ports + // QF1008: could remove embedded field "NetworkSettingsBase" from selector + portMap := c.NetworkSettings.NetworkSettingsBase.Ports //nolint:staticcheck portBindings, ok := portMap["80/tcp"] if !ok || len(portMap["80/tcp"]) == 0 { return fmt.Errorf("Port 80 on tcp is not set") diff --git a/internal/provider/resource_docker_image_funcs.go b/internal/provider/resource_docker_image_funcs.go index e7f7c483..42f1006c 100644 --- a/internal/provider/resource_docker_image_funcs.go +++ b/internal/provider/resource_docker_image_funcs.go @@ -213,7 +213,7 @@ func pullImage(ctx context.Context, data *Data, client *client.Client, authConfi if err != nil { return fmt.Errorf("error pulling image %s: %w", image, err) } - defer out.Close() + defer out.Close() //nolint:errcheck buf := new(bytes.Buffer) if _, err := buf.ReadFrom(out); err != nil { @@ -362,7 +362,7 @@ func buildDockerImage(ctx context.Context, rawBuild map[string]interface{}, imag if err != nil { return err } - defer response.Body.Close() + defer response.Body.Close() //nolint:errcheck buildResult, err := decodeBuildMessages(response) if err != nil { @@ -386,7 +386,7 @@ func enableBuildKitIfSupported( } //nolint go s.Run(ctx, dialSession) - defer s.Close() + defer s.Close() //nolint:errcheck buildOptions.SessionID = s.ID() buildOptions.Version = types.BuilderBuildKit return s @@ -413,7 +413,7 @@ func prepareBuildContext(specifiedContext string, specifiedDockerfile string) (i if err != nil { return nil, "", errors.Errorf("unable to open Dockerfile: %v", err) } - defer dockerfileCtx.Close() + defer dockerfileCtx.Close() //nolint:errcheck } excludes, err := build.ReadDockerignore(contextDir) if err != nil { diff --git a/internal/provider/resource_docker_image_test.go b/internal/provider/resource_docker_image_test.go index 4e081390..e87ebade 100644 --- a/internal/provider/resource_docker_image_test.go +++ b/internal/provider/resource_docker_image_test.go @@ -431,7 +431,7 @@ func TestAccDockerImage_build(t *testing.T) { if err := os.WriteFile(dfPath, []byte(testDockerFileExample), 0o644); err != nil { t.Fatalf("failed to create a Dockerfile %s for test: %+v", dfPath, err) } - defer os.Remove(dfPath) + defer os.Remove(dfPath) //nolint:errcheck resource.Test(t, resource.TestCase{ PreCheck: func() { testAccPreCheck(t) }, ProviderFactories: providerFactories, @@ -469,7 +469,7 @@ func TestAccDockerImageSecrets_build(t *testing.T) { if err := os.WriteFile(dfPath, []byte(testDockerFileWithSecret), 0o644); err != nil { t.Fatalf("failed to create a Dockerfile %s for test: %+v", dfPath, err) } - defer os.Remove(dfPath) + defer os.Remove(dfPath) //nolint:errcheck const secretContent = "THIS IS A SECRET" sPath := filepath.Join(wd, "secret") @@ -477,7 +477,7 @@ func TestAccDockerImageSecrets_build(t *testing.T) { t.Fatalf("failed to create a secret file %s for test: %+v", sPath, err) } - defer os.Remove(sPath) + defer os.Remove(sPath) //nolint:errcheck resource.Test(t, resource.TestCase{ PreCheck: func() { testAccPreCheck(t) }, @@ -516,7 +516,7 @@ func TestAccDockerImage_buildOutsideContext(t *testing.T) { if err := os.WriteFile(dfPath, []byte(testDockerFileExample), 0o644); err != nil { t.Fatalf("failed to create a Dockerfile %s for test: %+v", dfPath, err) } - defer os.Remove(dfPath) + defer os.Remove(dfPath) //nolint:errcheck resource.Test(t, resource.TestCase{ PreCheck: func() { testAccPreCheck(t) }, ProviderFactories: providerFactories, @@ -622,7 +622,7 @@ func TestAccDockerImageResource_buildWithDockerignore(t *testing.T) { if err != nil { panic("failed to create test file") } - f.Close() + f.Close() //nolint:errcheck }, Config: fmt.Sprintf(loadTestConfiguration(t, RESOURCE, "docker_image", "testBuildDockerImageNoKeepJustCache"), "two", name, context), Check: resource.ComposeTestCheckFunc( @@ -657,7 +657,7 @@ func testAccImageCreated(resourceName string, image *types.ImageInspect) resourc // TODO mavogel: it's because we set the ID in the format: // d.SetId(foundImage.ID + d.Get("name").(string)) // so we need to strip away the name - strippedID := strings.Replace(rs.Primary.ID, name, "", -1) + strippedID := strings.ReplaceAll(rs.Primary.ID, name, "") client := testAccProvider.Meta().(*ProviderConfig).DockerClient inspectedImage, _, err := client.ImageInspectWithRaw(ctx, strippedID) diff --git a/internal/provider/resource_docker_network_funcs.go b/internal/provider/resource_docker_network_funcs.go index c4825722..8004056d 100644 --- a/internal/provider/resource_docker_network_funcs.go +++ b/internal/provider/resource_docker_network_funcs.go @@ -173,7 +173,7 @@ func resourceDockerNetworkReadRefreshFunc(ctx context.Context, d.Set("ipam_options", retNetwork.IPAM.Options) d.Set("scope", retNetwork.Scope) if retNetwork.Scope == "overlay" { - if retNetwork.Options != nil && len(retNetwork.Options) != 0 { + if len(retNetwork.Options) != 0 { d.Set("options", retNetwork.Options) } else { log.Printf("[DEBUG] options: %v not exposed", retNetwork.Options) diff --git a/internal/provider/resource_docker_registry_image_funcs.go b/internal/provider/resource_docker_registry_image_funcs.go index 33ba4740..1ebdb7bd 100644 --- a/internal/provider/resource_docker_registry_image_funcs.go +++ b/internal/provider/resource_docker_registry_image_funcs.go @@ -214,7 +214,7 @@ func pushDockerRegistryImage(ctx context.Context, client *client.Client, pushOpt if err != nil { return err } - defer out.Close() + defer out.Close() //nolint:errcheck type ErrorMessage struct { Error string diff --git a/internal/provider/resource_docker_secret.go b/internal/provider/resource_docker_secret.go index 807e523e..b0d9e0ec 100644 --- a/internal/provider/resource_docker_secret.go +++ b/internal/provider/resource_docker_secret.go @@ -100,7 +100,8 @@ func resourceDockerSecretCreate(ctx context.Context, d *schema.ResourceData, met } if v, ok := d.GetOk("labels"); ok { - secretSpec.Annotations.Labels = labelSetToMap(v.(*schema.Set)) + // QF1008: could remove embedded field "Annotations" from selector + secretSpec.Annotations.Labels = labelSetToMap(v.(*schema.Set)) //nolint:staticcheck } secret, err := client.SecretCreate(ctx, secretSpec) diff --git a/scripts/testing/v1/main.go b/scripts/testing/v1/main.go index 149f409a..0845602c 100644 --- a/scripts/testing/v1/main.go +++ b/scripts/testing/v1/main.go @@ -32,7 +32,7 @@ func main() { http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusOK) - _, err = w.Write([]byte(fmt.Sprintf("%s - Hello World!", configs.Prefix))) + _, err = w.Write([]byte(fmt.Sprintf("%s - Hello World!", configs.Prefix))) //nolint:staticcheck if err != nil { log.Fatalln("failed to write for path '/'") } diff --git a/scripts/testing/v2/main.go b/scripts/testing/v2/main.go index 9908aeaf..26bde98b 100644 --- a/scripts/testing/v2/main.go +++ b/scripts/testing/v2/main.go @@ -32,7 +32,7 @@ func main() { http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusOK) - _, err = w.Write([]byte(fmt.Sprintf("%s - Hello World!", configs.Prefix))) + _, err = w.Write([]byte(fmt.Sprintf("%s - Hello World!", configs.Prefix))) //nolint:staticcheck if err != nil { log.Fatalln("failed to write for path '/'") } diff --git a/scripts/testing/v3/main.go b/scripts/testing/v3/main.go index 325a4cee..63f00f8e 100644 --- a/scripts/testing/v3/main.go +++ b/scripts/testing/v3/main.go @@ -32,7 +32,7 @@ func main() { http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusOK) - _, err = w.Write([]byte(fmt.Sprintf("%s - Hello World!", configs.Prefix))) + _, err = w.Write([]byte(fmt.Sprintf("%s - Hello World!", configs.Prefix))) //nolint:staticcheck if err != nil { log.Fatalln("failed to write for path '/'") }