diff --git a/.github/workflows/static.yaml b/.github/workflows/static.yaml index 60e9ac030..a6298d6ec 100644 --- a/.github/workflows/static.yaml +++ b/.github/workflows/static.yaml @@ -15,5 +15,5 @@ jobs: - name: Run linter uses: golangci/golangci-lint-action@v3 with: - version: v1.54 + version: v1.60 args: -E=gofmt,unused,ineffassign,revive,misspell,exportloopref,asciicheck,bodyclose,depguard,dogsled,durationcheck,errname,forbidigo -D=staticcheck --timeout=30m0s diff --git a/hack/verify-golint.sh b/hack/verify-golint.sh index b96f4a45b..4de73a5cd 100755 --- a/hack/verify-golint.sh +++ b/hack/verify-golint.sh @@ -18,12 +18,12 @@ set -euo pipefail if [[ -z "$(command -v golangci-lint)" ]]; then echo "Cannot find golangci-lint. Installing golangci-lint..." - go install github.com/golangci/golangci-lint/cmd/golangci-lint@v1.45.0 + go install github.com/golangci/golangci-lint/cmd/golangci-lint@v1.60.0 export PATH=$PATH:$(go env GOPATH)/bin fi echo "Verifying golint" -golangci-lint run --no-config --enable=golint --disable=typecheck --deadline=10m +golangci-lint run --no-config -E=gofmt,unused,ineffassign,revive,misspell,exportloopref,asciicheck,bodyclose,depguard,dogsled,durationcheck,errname,forbidigo -D=staticcheck --timeout=30m echo "Congratulations! Lint check completed for all Go source files." diff --git a/pkg/blob/blob.go b/pkg/blob/blob.go index 0343a9505..da04161c0 100644 --- a/pkg/blob/blob.go +++ b/pkg/blob/blob.go @@ -267,7 +267,7 @@ func NewDriver(options *DriverOptions, kubeClient kubernetes.Interface, cloud *p d.Version = driverVersion d.NodeID = options.NodeID - getter := func(key string) (interface{}, error) { return nil, nil } + getter := func(_ string) (interface{}, error) { return nil, nil } if d.accountSearchCache, err = azcache.NewTimedCache(time.Minute, getter, false); err != nil { klog.Fatalf("%v", err) } diff --git a/pkg/blob/controllerserver.go b/pkg/blob/controllerserver.go index 8c290e46d..a9fefd4e9 100644 --- a/pkg/blob/controllerserver.go +++ b/pkg/blob/controllerserver.go @@ -203,13 +203,13 @@ func (d *Driver) CreateVolume(ctx context.Context, req *csi.CreateVolumeRequest) // only do validations here, used in NodeStageVolume, NodePublishVolume if v != "" { if _, err := strconv.ParseUint(v, 8, 32); err != nil { - return nil, status.Errorf(codes.InvalidArgument, fmt.Sprintf("invalid mountPermissions %s in storage class", v)) + return nil, status.Errorf(codes.InvalidArgument, "invalid mountPermissions %s in storage class", v) } } case useDataPlaneAPIField: useDataPlaneAPI = strings.EqualFold(v, trueValue) default: - return nil, status.Errorf(codes.InvalidArgument, fmt.Sprintf("invalid parameter %q in storage class", k)) + return nil, status.Errorf(codes.InvalidArgument, "invalid parameter %q in storage class", k) } } @@ -220,7 +220,7 @@ func (d *Driver) CreateVolume(ctx context.Context, req *csi.CreateVolumeRequest) } if matchTags && account != "" { - return nil, status.Errorf(codes.InvalidArgument, fmt.Sprintf("matchTags must set as false when storageAccount(%s) is provided", account)) + return nil, status.Errorf(codes.InvalidArgument, "matchTags must set as false when storageAccount(%s) is provided", account) } if resourceGroup == "" { @@ -286,13 +286,13 @@ func (d *Driver) CreateVolume(ctx context.Context, req *csi.CreateVolumeRequest) if IsAzureStackCloud(d.cloud) { accountKind = string(storage.KindStorage) if storageAccountType != "" && storageAccountType != string(storage.SkuNameStandardLRS) && storageAccountType != string(storage.SkuNamePremiumLRS) { - return nil, status.Errorf(codes.InvalidArgument, fmt.Sprintf("Invalid skuName value: %s, as Azure Stack only supports %s and %s Storage Account types.", storageAccountType, storage.SkuNamePremiumLRS, storage.SkuNameStandardLRS)) + return nil, status.Errorf(codes.InvalidArgument, "Invalid skuName value: %s, as Azure Stack only supports %s and %s Storage Account types.", storageAccountType, storage.SkuNamePremiumLRS, storage.SkuNameStandardLRS) } } tags, err := util.ConvertTagsToMap(customTags) if err != nil { - return nil, status.Errorf(codes.InvalidArgument, err.Error()) + return nil, status.Errorf(codes.InvalidArgument, "%v", err) } if strings.TrimSpace(storageEndpointSuffix) == "" { @@ -380,7 +380,7 @@ func (d *Driver) CreateVolume(ctx context.Context, req *csi.CreateVolumeRequest) // search in cache first cache, err := d.accountSearchCache.Get(lockKey, azcache.CacheReadTypeDefault) if err != nil { - return nil, status.Errorf(codes.Internal, err.Error()) + return nil, status.Errorf(codes.Internal, "%v", err) } if cache != nil { accountName = cache.(string) @@ -841,7 +841,7 @@ func (d *Driver) authorizeAzcopyWithIdentity() ([]string, error) { authAzcopyEnv = append(authAzcopyEnv, fmt.Sprintf("%s=%s", azcopySPAApplicationID, azureAuthConfig.AADClientID)) authAzcopyEnv = append(authAzcopyEnv, fmt.Sprintf("%s=%s", azcopySPAClientSecret, azureAuthConfig.AADClientSecret)) authAzcopyEnv = append(authAzcopyEnv, fmt.Sprintf("%s=%s", azcopyTenantID, azureAuthConfig.TenantID)) - klog.V(2).Infof(fmt.Sprintf("set AZCOPY_SPA_APPLICATION_ID=%s, AZCOPY_TENANT_ID=%s successfully", azureAuthConfig.AADClientID, azureAuthConfig.TenantID)) + klog.V(2).Infof("set AZCOPY_SPA_APPLICATION_ID=%s, AZCOPY_TENANT_ID=%s successfully", azureAuthConfig.AADClientID, azureAuthConfig.TenantID) return authAzcopyEnv, nil } @@ -897,10 +897,10 @@ func isValidVolumeCapabilities(volCaps []*csi.VolumeCapability) error { func parseDays(dayStr string) (int32, error) { days, err := strconv.Atoi(dayStr) if err != nil { - return 0, status.Errorf(codes.InvalidArgument, fmt.Sprintf("invalid %s:%s in storage class", softDeleteBlobsField, dayStr)) + return 0, status.Errorf(codes.InvalidArgument, "invalid %s:%s in storage class", softDeleteBlobsField, dayStr) } if days <= 0 || days > 365 { - return 0, status.Errorf(codes.InvalidArgument, fmt.Sprintf("invalid %s:%s in storage class, should be in range [1, 365]", softDeleteBlobsField, dayStr)) + return 0, status.Errorf(codes.InvalidArgument, "invalid %s:%s in storage class, should be in range [1, 365]", softDeleteBlobsField, dayStr) } return int32(days), nil @@ -920,11 +920,11 @@ func (d *Driver) generateSASToken(accountName, accountKey, storageEndpointSuffix credential, err := azblob.NewSharedKeyCredential(accountName, accountKey) if err != nil { - return "", status.Errorf(codes.Internal, fmt.Sprintf("failed to generate sas token in creating new shared key credential, accountName: %s, err: %s", accountName, err.Error())) + return "", status.Errorf(codes.Internal, "failed to generate sas token in creating new shared key credential, accountName: %s, err: %v", accountName, err) } serviceClient, err := service.NewClientWithSharedKeyCredential(fmt.Sprintf("https://%s.blob.%s/", accountName, storageEndpointSuffix), credential, nil) if err != nil { - return "", status.Errorf(codes.Internal, fmt.Sprintf("failed to generate sas token in creating new client with shared key credential, accountName: %s, err: %s", accountName, err.Error())) + return "", status.Errorf(codes.Internal, "failed to generate sas token in creating new client with shared key credential, accountName: %s, err: %v", accountName, err) } sasURL, err := serviceClient.GetSASURL( sas.AccountResourceTypes{Object: true, Service: false, Container: true}, diff --git a/pkg/blob/controllerserver_test.go b/pkg/blob/controllerserver_test.go index a4b1223ee..c3824295a 100644 --- a/pkg/blob/controllerserver_test.go +++ b/pkg/blob/controllerserver_test.go @@ -68,7 +68,7 @@ func (c *mockBlobClient) CreateContainer(_ context.Context, _, _, _, _ string, _ case MANAGEMENT: return retry.GetError(&http.Response{}, fmt.Errorf(containerBeingDeletedManagementAPIError)) case CUSTOM: - return retry.GetError(&http.Response{}, fmt.Errorf(*c.custom)) + return retry.GetError(&http.Response{}, fmt.Errorf("%v", *c.custom)) } return nil } @@ -79,7 +79,7 @@ func (c *mockBlobClient) DeleteContainer(_ context.Context, _, _, _, _ string) * case MANAGEMENT: return retry.GetError(&http.Response{}, fmt.Errorf(containerBeingDeletedManagementAPIError)) case CUSTOM: - return retry.GetError(&http.Response{}, fmt.Errorf(*c.custom)) + return retry.GetError(&http.Response{}, fmt.Errorf("%v", *c.custom)) } return nil } @@ -90,7 +90,7 @@ func (c *mockBlobClient) GetContainer(_ context.Context, _, _, _, _ string) (sto case MANAGEMENT: return storage.BlobContainer{ContainerProperties: c.conProp}, retry.GetError(&http.Response{}, fmt.Errorf(containerBeingDeletedManagementAPIError)) case CUSTOM: - return storage.BlobContainer{ContainerProperties: c.conProp}, retry.GetError(&http.Response{}, fmt.Errorf(*c.custom)) + return storage.BlobContainer{ContainerProperties: c.conProp}, retry.GetError(&http.Response{}, fmt.Errorf("%v", *c.custom)) } return storage.BlobContainer{ContainerProperties: c.conProp}, nil } @@ -411,7 +411,7 @@ func TestCreateVolume(t *testing.T) { controllerServiceCapability, } - expectedErr := status.Errorf(codes.InvalidArgument, fmt.Sprintf("invalid parameter %q in storage class", "invalidparameter")) + expectedErr := status.Errorf(codes.InvalidArgument, "invalid parameter %q in storage class", "invalidparameter") _, err := d.CreateVolume(context.Background(), req) if !reflect.DeepEqual(err, expectedErr) { t.Errorf("Unexpected error: %v", err) @@ -433,7 +433,7 @@ func TestCreateVolume(t *testing.T) { controllerServiceCapability, } - expectedErr := status.Errorf(codes.InvalidArgument, fmt.Sprintf("invalid %s %s in storage class", "mountPermissions", "0abc")) + expectedErr := status.Errorf(codes.InvalidArgument, "invalid %s %s in storage class", "mountPermissions", "0abc") _, err := d.CreateVolume(context.Background(), req) if !reflect.DeepEqual(err, expectedErr) { t.Errorf("Unexpected error: %v", err) @@ -529,7 +529,7 @@ func TestCreateVolume(t *testing.T) { controllerServiceCapability, } - expectedErr := status.Errorf(codes.InvalidArgument, fmt.Sprintf("Invalid skuName value: %s, as Azure Stack only supports %s and %s Storage Account types.", "unit-test", storage.SkuNamePremiumLRS, storage.SkuNameStandardLRS)) + expectedErr := status.Errorf(codes.InvalidArgument, "Invalid skuName value: %s, as Azure Stack only supports %s and %s Storage Account types.", "unit-test", storage.SkuNamePremiumLRS, storage.SkuNameStandardLRS) _, err := d.CreateVolume(context.Background(), req) if !reflect.DeepEqual(err, expectedErr) { t.Errorf("Unexpected error: %v", err) @@ -1088,7 +1088,7 @@ func TestValidateVolumeCapabilities(t *testing.T) { clientErr: NULL, containerProp: &storage.ContainerProperties{}, expectedRes: nil, - expectedErr: status.Errorf(codes.Internal, retry.GetError(&http.Response{}, fmt.Errorf(containerBeingDeletedDataplaneAPIError)).Error().Error()), + expectedErr: status.Errorf(codes.Internal, "%v", retry.GetError(&http.Response{}, fmt.Errorf(containerBeingDeletedDataplaneAPIError)).Error()), }, /*{ //Volume being shown as not existing. ContainerProperties.Deleted not setting correctly?? name: "Successful I/O", @@ -1756,7 +1756,7 @@ func TestGenerateSASToken(t *testing.T) { accountName: "unit-test", accountKey: "fakeValue", want: "", - expectedErr: status.Errorf(codes.Internal, fmt.Sprintf("failed to generate sas token in creating new shared key credential, accountName: %s, err: %s", "unit-test", "decode account key: illegal base64 data at input byte 8")), + expectedErr: status.Errorf(codes.Internal, "failed to generate sas token in creating new shared key credential, accountName: %s, err: %s", "unit-test", "decode account key: illegal base64 data at input byte 8"), }, } for _, tt := range tests { @@ -1971,7 +1971,7 @@ func TestGetAzcopyAuth(t *testing.T) { } expectedAccountSASToken := "" - expectedErr := status.Errorf(codes.Internal, fmt.Sprintf("failed to generate sas token in creating new shared key credential, accountName: %s, err: %s", "accountName", "decode account key: illegal base64 data at input byte 8")) + expectedErr := status.Errorf(codes.Internal, "failed to generate sas token in creating new shared key credential, accountName: %s, err: %s", "accountName", "decode account key: illegal base64 data at input byte 8") accountSASToken, _, err := d.getAzcopyAuth(context.Background(), "accountName", "", "core.windows.net", &azure.AccountOptions{}, secrets, "secretsName", "secretsNamespace", false) if !reflect.DeepEqual(err, expectedErr) || !reflect.DeepEqual(accountSASToken, expectedAccountSASToken) { t.Errorf("Unexpected accountSASToken: %s, Unexpected error: %v", accountSASToken, err) @@ -1992,7 +1992,7 @@ func TestGetAzcopyAuth(t *testing.T) { ctx := context.Background() expectedAccountSASToken := "" - expectedErr := status.Errorf(codes.Internal, fmt.Sprintf("failed to generate sas token in creating new shared key credential, accountName: %s, err: %s", "accountName", "decode account key: illegal base64 data at input byte 8")) + expectedErr := status.Errorf(codes.Internal, "failed to generate sas token in creating new shared key credential, accountName: %s, err: %s", "accountName", "decode account key: illegal base64 data at input byte 8") accountSASToken, _, err := d.getAzcopyAuth(ctx, "accountName", "", "core.windows.net", &azure.AccountOptions{}, secrets, "secretsName", "secretsNamespace", false) if !reflect.DeepEqual(err, expectedErr) || !reflect.DeepEqual(accountSASToken, expectedAccountSASToken) { t.Errorf("Unexpected accountSASToken: %s, Unexpected error: %v", accountSASToken, err) diff --git a/pkg/blob/nodeserver.go b/pkg/blob/nodeserver.go index 78a25e845..ca7618aa5 100644 --- a/pkg/blob/nodeserver.go +++ b/pkg/blob/nodeserver.go @@ -112,7 +112,7 @@ func (d *Driver) NodePublishVolume(ctx context.Context, req *csi.NodePublishVolu if perm := getValueInMap(context, mountPermissionsField); perm != "" { var err error if mountPermissions, err = strconv.ParseUint(perm, 8, 32); err != nil { - return nil, status.Errorf(codes.InvalidArgument, fmt.Sprintf("invalid mountPermissions %s", perm)) + return nil, status.Errorf(codes.InvalidArgument, "invalid mountPermissions %s", perm) } } } @@ -141,7 +141,7 @@ func (d *Driver) NodePublishVolume(ctx context.Context, req *csi.NodePublishVolu klog.Warningf("NodePublishVolume: mock mount on volumeID(%s), this is only for TESTING!!!", volumeID) if err := volumehelper.MakeDir(target, os.FileMode(mountPermissions)); err != nil { klog.Errorf("MakeDir failed on target: %s (%v)", target, err) - return nil, status.Errorf(codes.Internal, err.Error()) + return nil, status.Errorf(codes.Internal, "%v", err) } return &csi.NodePublishVolumeResponse{}, nil } @@ -288,7 +288,7 @@ func (d *Driver) NodeStageVolume(ctx context.Context, req *csi.NodeStageVolumeRe var err error var perm uint64 if perm, err = strconv.ParseUint(v, 8, 32); err != nil { - return nil, status.Errorf(codes.InvalidArgument, fmt.Sprintf("invalid mountPermissions %s", v)) + return nil, status.Errorf(codes.InvalidArgument, "invalid mountPermissions %s", v) } if perm == 0 { performChmodOp = false @@ -310,7 +310,7 @@ func (d *Driver) NodeStageVolume(ctx context.Context, req *csi.NodeStageVolumeRe _, accountName, _, containerName, authEnv, err := d.GetAuthEnv(ctx, volumeID, protocol, attrib, secrets) if err != nil { - return nil, status.Errorf(codes.Internal, err.Error()) + return nil, status.Errorf(codes.Internal, "%v", err) } // replace pv/pvc name namespace metadata in subDir @@ -391,7 +391,7 @@ func (d *Driver) NodeStageVolume(ctx context.Context, req *csi.NodeStageVolumeRe klog.Warningf("NodeStageVolume: mock mount on volumeID(%s), this is only for TESTING!!!", volumeID) if err := volumehelper.MakeDir(targetPath, os.FileMode(mountPermissions)); err != nil { klog.Errorf("MakeDir failed on target: %s (%v)", targetPath, err) - return nil, status.Errorf(codes.Internal, err.Error()) + return nil, status.Errorf(codes.Internal, "%v", err) } return &csi.NodeStageVolumeResponse{}, nil } @@ -504,7 +504,7 @@ func (d *Driver) NodeGetVolumeStats(_ context.Context, req *csi.NodeGetVolumeSta // check if the volume stats is cached cache, err := d.volStatsCache.Get(req.VolumeId, azcache.CacheReadTypeDefault) if err != nil { - return nil, status.Errorf(codes.Internal, err.Error()) + return nil, status.Errorf(codes.Internal, "%v", err) } if cache != nil { resp := cache.(csi.NodeGetVolumeStatsResponse) diff --git a/pkg/csi-common/utils.go b/pkg/csi-common/utils.go index 957a26fc7..21f5889c9 100644 --- a/pkg/csi-common/utils.go +++ b/pkg/csi-common/utils.go @@ -44,7 +44,7 @@ func ParseEndpoint(ep string) (string, string, error) { func Listen(ctx context.Context, endpoint string) (net.Listener, error) { proto, addr, err := ParseEndpoint(endpoint) if err != nil { - klog.Errorf(err.Error()) + klog.Errorf("%v", err) return nil, err } @@ -53,7 +53,7 @@ func Listen(ctx context.Context, endpoint string) (net.Listener, error) { addr = "/" + addr } if err := os.Remove(addr); err != nil && !os.IsNotExist(err) { - klog.Errorf("Failed to remove %s, error: %s", addr, err.Error()) + klog.Errorf("Failed to remove %s, error: %v", addr, err) return nil, err } } diff --git a/pkg/csi-common/utils_test.go b/pkg/csi-common/utils_test.go index 04a8f18ce..720e5f1e9 100644 --- a/pkg/csi-common/utils_test.go +++ b/pkg/csi-common/utils_test.go @@ -90,7 +90,7 @@ func TestLogGRPC(t *testing.T) { klog.SetOutput(buf) defer klog.SetOutput(io.Discard) - handler := func(ctx context.Context, req interface{}) (interface{}, error) { return nil, nil } + handler := func(_ context.Context, _ interface{}) (interface{}, error) { return nil, nil } info := grpc.UnaryServerInfo{ FullMethod: "fake", } diff --git a/test/e2e/dynamic_provisioning_test.go b/test/e2e/dynamic_provisioning_test.go index 177a9dd90..329f5a8f9 100644 --- a/test/e2e/dynamic_provisioning_test.go +++ b/test/e2e/dynamic_provisioning_test.go @@ -40,7 +40,7 @@ var _ = ginkgo.Describe("[blob-csi-e2e] Dynamic Provisioning", func() { testDriver driver.PVTestDriver ) - ginkgo.BeforeEach(func(ctx ginkgo.SpecContext) { + ginkgo.BeforeEach(func(_ ginkgo.SpecContext) { checkPodsRestart := testCmd{ command: "sh", args: []string{"test/utils/check_driver_pods_restart.sh"}, @@ -827,7 +827,7 @@ var _ = ginkgo.Describe("[blob-csi-e2e] Dynamic Provisioning", func() { test.Run(ctx, cs, ns) }) - ginkgo.It("[blob.csi.azure.com] verify examples", ginkgo.Label("flaky"), func(ctx ginkgo.SpecContext) { + ginkgo.It("[blob.csi.azure.com] verify examples", ginkgo.Label("flaky"), func(_ ginkgo.SpecContext) { createExampleDeployment := testCmd{ command: "bash", args: []string{"hack/verify-examples.sh"}, diff --git a/test/e2e/suite_test.go b/test/e2e/suite_test.go index 051d9418e..19349ab25 100644 --- a/test/e2e/suite_test.go +++ b/test/e2e/suite_test.go @@ -101,7 +101,7 @@ var _ = ginkgo.SynchronizedBeforeSuite(func(ctx ginkgo.SpecContext) []byte { } execTestCmd([]testCmd{e2eBootstrap, createMetricsSVC}) return nil -}, func(ctx ginkgo.SpecContext, data []byte) { +}, func(_ ginkgo.SpecContext, _ []byte) { // k8s.io/kubernetes/test/e2e/framework requires env KUBECONFIG to be set // it does not fall back to defaults if os.Getenv(kubeconfigEnvVar) == "" { @@ -132,7 +132,7 @@ var _ = ginkgo.SynchronizedBeforeSuite(func(ctx ginkgo.SpecContext) []byte { }() }) -var _ = ginkgo.SynchronizedAfterSuite(func(ctx ginkgo.SpecContext) {}, +var _ = ginkgo.SynchronizedAfterSuite(func(_ ginkgo.SpecContext) {}, func(ctx ginkgo.SpecContext) { blobLog := testCmd{ command: "bash", @@ -181,7 +181,7 @@ func execTestCmd(cmds []testCmd) { cmdSh.Stderr = os.Stderr err := cmdSh.Run() if err != nil { - log.Printf("Failed to run command: %s %s, Error: %s\n", cmd.command, strings.Join(cmd.args, " "), err.Error()) + log.Printf("Failed to run command: %s %s, Error: %v\n", cmd.command, strings.Join(cmd.args, " "), err) if !cmd.ignoreError { gomega.Expect(err).NotTo(gomega.HaveOccurred()) }