diff --git a/hack/build-image/Dockerfile b/hack/build-image/Dockerfile index e2166b39f2..5a7bbc6f52 100644 --- a/hack/build-image/Dockerfile +++ b/hack/build-image/Dockerfile @@ -56,7 +56,7 @@ RUN wget --quiet https://github.com/goreleaser/goreleaser/releases/download/v1.1 chmod +x /usr/bin/goreleaser # get golangci-lint -RUN curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b $(go env GOPATH)/bin v1.51.0 +RUN curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b $(go env GOPATH)/bin v1.54.2 # install kubectl RUN curl -LO https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl diff --git a/pkg/archive/extractor.go b/pkg/archive/extractor.go index 7129b4e755..87d9ab413c 100644 --- a/pkg/archive/extractor.go +++ b/pkg/archive/extractor.go @@ -84,7 +84,7 @@ func (e *Extractor) readBackup(tarRdr *tar.Reader) (string, error) { return "", err } - target := filepath.Join(dir, header.Name) //nolint:gosec + target := filepath.Join(dir, header.Name) //nolint:gosec // Internal usage. No need to check. switch header.Typeflag { case tar.TypeDir: diff --git a/pkg/builder/server_status_request_builder.go b/pkg/builder/server_status_request_builder.go index 9dcf9cfb66..bc88767180 100644 --- a/pkg/builder/server_status_request_builder.go +++ b/pkg/builder/server_status_request_builder.go @@ -29,7 +29,7 @@ type ServerStatusRequestBuilder struct { object *velerov1api.ServerStatusRequest } -// ForServerStatusRequest is the constructor for for a ServerStatusRequestBuilder. +// ForServerStatusRequest is the constructor for a ServerStatusRequestBuilder. func ForServerStatusRequest(ns, name, resourceVersion string) *ServerStatusRequestBuilder { return &ServerStatusRequestBuilder{ object: &velerov1api.ServerStatusRequest{ diff --git a/pkg/cmd/cli/nodeagent/server.go b/pkg/cmd/cli/nodeagent/server.go index 86340a02d6..5f3a9af485 100644 --- a/pkg/cmd/cli/nodeagent/server.go +++ b/pkg/cmd/cli/nodeagent/server.go @@ -523,7 +523,7 @@ func (s *nodeAgentServer) getDataPathConcurrentNum(defaultNum int) int { concurrentNum := math.MaxInt32 for _, rule := range configs.DataPathConcurrency.PerNodeConfig { - selector, err := metav1.LabelSelectorAsSelector(&rule.NodeSelector) + selector, err := metav1.LabelSelectorAsSelector(&(rule.NodeSelector)) if err != nil { s.logger.WithError(err).Warnf("Failed to parse rule with label selector %s, skip it", rule.NodeSelector.String()) continue diff --git a/pkg/cmd/server/server.go b/pkg/cmd/server/server.go index ca8c49c3ce..5098a7b13f 100644 --- a/pkg/cmd/server/server.go +++ b/pkg/cmd/server/server.go @@ -248,7 +248,7 @@ type server struct { discoveryHelper velerodiscovery.Helper dynamicClient dynamic.Interface // controller-runtime client. the difference from the controller-manager's client - // is that the the controller-manager's client is limited to list namespaced-scoped + // is that the controller-manager's client is limited to list namespaced-scoped // resources in the namespace where Velero is installed, or the cluster-scoped // resources. The crClient doesn't have the limitation. crClient ctrlclient.Client diff --git a/pkg/cmd/util/downloadrequest/downloadrequest.go b/pkg/cmd/util/downloadrequest/downloadrequest.go index b7a016bb9c..9595c76259 100644 --- a/pkg/cmd/util/downloadrequest/downloadrequest.go +++ b/pkg/cmd/util/downloadrequest/downloadrequest.go @@ -111,7 +111,7 @@ func Stream(ctx context.Context, kbClient kbclient.Client, namespace, name strin httpClient := new(http.Client) httpClient.Transport = &http.Transport{ TLSClientConfig: &tls.Config{ - InsecureSkipVerify: insecureSkipTLSVerify, //nolint:gosec + InsecureSkipVerify: insecureSkipTLSVerify, //nolint:gosec // This parameter is useful for some scenarios. RootCAs: caPool, }, IdleConnTimeout: timeout, diff --git a/pkg/cmd/util/output/describe.go b/pkg/cmd/util/output/describe.go index 464ffa1470..c0ec080281 100644 --- a/pkg/cmd/util/output/describe.go +++ b/pkg/cmd/util/output/describe.go @@ -164,6 +164,11 @@ func (d *StructuredDescriber) JSONEncode() string { encoder := json.NewEncoder(byteBuffer) encoder.SetEscapeHTML(false) encoder.SetIndent("", " ") - encoder.Encode(d.output) + + err := encoder.Encode(d.output) + if err != nil { + fmt.Printf("fail to encode %s", err.Error()) + return "" + } return byteBuffer.String() } diff --git a/pkg/controller/backup_controller.go b/pkg/controller/backup_controller.go index e8a8c2eec8..bfbacc5418 100644 --- a/pkg/controller/backup_controller.go +++ b/pkg/controller/backup_controller.go @@ -1080,7 +1080,7 @@ func generateVolumeInfoForCSIVolumeSnapshot(backup *pkgbackup.Request, csiVolume SnapshotDataMoved: false, PreserveLocalSnapshot: true, OperationID: operation.Spec.OperationID, - StartTimestamp: &volumeSnapshot.CreationTimestamp, + StartTimestamp: &(volumeSnapshot.CreationTimestamp), CSISnapshotInfo: volume.CSISnapshotInfo{ VSCName: *volumeSnapshot.Status.BoundVolumeSnapshotContentName, Size: size, diff --git a/pkg/controller/pod_volume_restore_controller.go b/pkg/controller/pod_volume_restore_controller.go index 34d6c65511..eda541fc19 100644 --- a/pkg/controller/pod_volume_restore_controller.go +++ b/pkg/controller/pod_volume_restore_controller.go @@ -303,7 +303,7 @@ func (c *PodVolumeRestoreReconciler) OnDataPathCompleted(ctx context.Context, na // Write a done file with name= into the just-created .velero dir // within the volume. The velero init container on the pod is waiting // for this file to exist in each restored volume before completing. - if err := os.WriteFile(filepath.Join(volumePath, ".velero", string(restoreUID)), nil, 0644); err != nil { //nolint:gosec + if err := os.WriteFile(filepath.Join(volumePath, ".velero", string(restoreUID)), nil, 0644); err != nil { //nolint:gosec // Internal usage. No need to check. _, _ = c.errorOut(ctx, &pvr, err, "error writing done file", log) return } diff --git a/pkg/datamover/dataupload_delete_action.go b/pkg/datamover/dataupload_delete_action.go index 3fb3941c1a..f6cab19455 100644 --- a/pkg/datamover/dataupload_delete_action.go +++ b/pkg/datamover/dataupload_delete_action.go @@ -63,7 +63,9 @@ func genConfigmap(bak *velerov1.Backup, du velerov2alpha1.DataUpload) *corev1api return nil } data := make(map[string]string) - json.Unmarshal(b, &data) + if err := json.Unmarshal(b, &data); err != nil { + return &corev1api.ConfigMap{} + } return &corev1api.ConfigMap{ TypeMeta: metav1.TypeMeta{ APIVersion: corev1api.SchemeGroupVersion.String(), diff --git a/pkg/metrics/metrics.go b/pkg/metrics/metrics.go index 593d642fd0..b1bcaf765a 100644 --- a/pkg/metrics/metrics.go +++ b/pkg/metrics/metrics.go @@ -69,7 +69,7 @@ const ( // data mover metrics DataUploadSuccessTotal = "data_upload_success_total" DataUploadFailureTotal = "data_upload_failure_total" - DataUploadCancelTotal = "data_upload_cancel_total" + DataUploadCancelTotal = "data_upload_cancel_total" //nolint:gosec // Not a hard code secret. DataDownloadSuccessTotal = "data_download_success_total" DataDownloadFailureTotal = "data_download_failure_total" DataDownloadCancelTotal = "data_download_cancel_total" diff --git a/pkg/repository/config/aws.go b/pkg/repository/config/aws.go index d7208068fa..6cb87f0a62 100644 --- a/pkg/repository/config/aws.go +++ b/pkg/repository/config/aws.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -//nolint:gosec +//nolint:gosec // Internal usage. No need to check. package config import ( diff --git a/pkg/repository/config/gcp.go b/pkg/repository/config/gcp.go index 8beb8a016c..809d74d254 100644 --- a/pkg/repository/config/gcp.go +++ b/pkg/repository/config/gcp.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -//nolint:gosec +//nolint:gosec // Internal usage. No need to check. package config import "os" diff --git a/pkg/repository/keys/keys.go b/pkg/repository/keys/keys.go index 48d3bd75ca..21423afe09 100644 --- a/pkg/repository/keys/keys.go +++ b/pkg/repository/keys/keys.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -//nolint:gosec +//nolint:gosec // Internal call. No need to check. package keys import ( diff --git a/pkg/restore/restore.go b/pkg/restore/restore.go index f82800ac53..daee1d9a2c 100644 --- a/pkg/restore/restore.go +++ b/pkg/restore/restore.go @@ -1883,7 +1883,7 @@ func shouldRenamePV(ctx *restoreContext, obj *unstructured.Unstructured, client // remapClaimRefNS remaps a PersistentVolume's claimRef.Namespace based on a // restore's NamespaceMappings, if necessary. Returns true if the namespace was // remapped, false if it was not required. -func remapClaimRefNS(ctx *restoreContext, obj *unstructured.Unstructured) (bool, error) { //nolint:unparam +func remapClaimRefNS(ctx *restoreContext, obj *unstructured.Unstructured) (bool, error) { //nolint:unparam // ignore the result 0 (bool) is never used warning. if len(ctx.restore.Spec.NamespaceMapping) == 0 { ctx.log.Debug("Persistent volume does not need to have the claimRef.namespace remapped because restore is not remapping any namespaces") return false, nil @@ -2310,7 +2310,7 @@ func (ctx *restoreContext) getOrderedResourceCollection( // getSelectedRestoreableItems applies Kubernetes selectors on individual items // of each resource type to create a list of items which will be actually // restored. -func (ctx *restoreContext) getSelectedRestoreableItems(resource, targetNamespace, originalNamespace string, items []string) (restoreableResource, results.Result, results.Result) { +func (ctx *restoreContext) getSelectedRestoreableItems(resource, targetNamespace, originalNamespace string, items []string) (restoreableResource, results.Result, results.Result) { //nolint:unparam // Ignore the warnings is always nil warning. warnings, errs := results.Result{}, results.Result{} restorable := restoreableResource{ @@ -2411,7 +2411,7 @@ func removeRestoreLabels(obj metav1.Object) { } // updates the backup/restore labels -func (ctx *restoreContext) updateBackupRestoreLabels(fromCluster, fromClusterWithLabels *unstructured.Unstructured, namespace string, resourceClient client.Dynamic) (warnings, errs results.Result) { +func (ctx *restoreContext) updateBackupRestoreLabels(fromCluster, fromClusterWithLabels *unstructured.Unstructured, namespace string, resourceClient client.Dynamic) (warnings, errs results.Result) { //nolint:unparam // Ignore the warnings is nil warning. patchBytes, err := generatePatch(fromCluster, fromClusterWithLabels) if err != nil { ctx.log.Errorf("error generating patch for %s %s: %v", fromCluster.GroupVersionKind().Kind, kube.NamespaceAndName(fromCluster), err) diff --git a/pkg/uploader/kopia/progress.go b/pkg/uploader/kopia/progress.go index fab980a64e..6b38b6da51 100644 --- a/pkg/uploader/kopia/progress.go +++ b/pkg/uploader/kopia/progress.go @@ -33,7 +33,7 @@ type Throttle struct { func (t *Throttle) ShouldOutput() bool { nextOutputTimeUnixNano := atomic.LoadInt64(&t.throttle) - if nowNano := time.Now().UnixNano(); nowNano > nextOutputTimeUnixNano { //nolint:forbidigo + if nowNano := time.Now().UnixNano(); nowNano > nextOutputTimeUnixNano { if atomic.CompareAndSwapInt64(&t.throttle, nextOutputTimeUnixNano, nowNano+t.interval.Nanoseconds()) { return true }