diff --git a/.github/workflows/actions.yml b/.github/workflows/actions.yml index b15b014..4f7bce8 100644 --- a/.github/workflows/actions.yml +++ b/.github/workflows/actions.yml @@ -58,10 +58,10 @@ jobs: name: Image Scanner runs-on: ubuntu-latest steps: - - name: Set up Go 1.20+ + - name: Set up Go 1.21+ uses: actions/setup-go@v2 with: - go-version: ^1.20 + go-version: ^1.21 id: go - name: Checkout the code uses: actions/checkout@v2 @@ -71,10 +71,7 @@ jobs: run: go mod download - name: Build csm-metrics-powermax Docker Image run: make clean build docker - - name: Image scanner - uses: Azure/container-scan@v0 + - name: Run Trivy action + uses: aquasecurity/trivy-action@master with: - image-name: csm-metrics-powermax - severity-threshold: HIGH - env: - DOCKLE_HOST: "unix:///var/run/docker.sock" + image-ref: csm-metrics-powermax diff --git a/Dockerfile b/Dockerfile index 8f8eb98..5e8e459 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM registry.access.redhat.com/ubi9/ubi-micro +FROM registry.access.redhat.com/ubi9/ubi-micro@sha256:630cf7bdef807f048cadfe7180d6c27eb3aaa99323ffc3628811da230ed3322a LABEL vendor="Dell Inc." \ name="csm-metrics-powermax" \ summary="Dell Container Storage Modules (CSM) for Observability - Metrics for PowerMax" \ diff --git a/cmd/metrics-powermax/main.go b/cmd/metrics-powermax/main.go index e270fb3..2199c50 100644 --- a/cmd/metrics-powermax/main.go +++ b/cmd/metrics-powermax/main.go @@ -19,6 +19,7 @@ package main import ( "context" "fmt" + "os" "strconv" "strings" "time" @@ -37,8 +38,6 @@ import ( "github.com/sirupsen/logrus" - "os" - "go.opentelemetry.io/otel/metric/global" "github.com/fsnotify/fsnotify" @@ -52,12 +51,13 @@ const ( defaultReverseProxyConfigFile = "/etc/reverseproxy/config.yaml" ) -var logger *logrus.Logger -var powerMaxSvc *service.PowerMaxService -var ctx context.Context +var ( + logger *logrus.Logger + powerMaxSvc *service.PowerMaxService + ctx context.Context +) func main() { - logger = logrus.New() viper.SetConfigFile(defaultConfigFile) diff --git a/go.mod b/go.mod index a373830..6f57bac 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module github.com/dell/csm-metrics-powermax go 1.21 require ( - github.com/dell/gopowermax/v2 v2.2.0 + github.com/dell/gopowermax/v2 v2.3.1-0.20230822074322-4ff408a66ad3 github.com/fsnotify/fsnotify v1.5.1 github.com/golang/mock v1.6.0 github.com/gorilla/mux v1.8.0 diff --git a/go.sum b/go.sum index 7e9ed80..527e23a 100644 --- a/go.sum +++ b/go.sum @@ -75,17 +75,17 @@ github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWH github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/cucumber/gherkin-go/v11 v11.0.0 h1:cwVwN1Qn2VRSfHZNLEh5x00tPBmZcjATBWDpxsR5Xug= -github.com/cucumber/gherkin-go/v11 v11.0.0/go.mod h1:CX33k2XU2qog4e+TFjOValoq6mIUq0DmVccZs238R9w= -github.com/cucumber/godog v0.10.0 h1:W01u1+o8bRpgqJRLrclN3iAanU1jAao+TwOMoSV9g1Y= -github.com/cucumber/godog v0.10.0/go.mod h1:0Q+MOUg8Z9AhzLV+nNMbThQ2x1b17yYwGyahApTLjJA= -github.com/cucumber/messages-go/v10 v10.0.3 h1:m/9SD/K/A15WP7i1aemIv7cwvUw+viS51Ui5HBw1cdE= -github.com/cucumber/messages-go/v10 v10.0.3/go.mod h1:9jMZ2Y8ZxjLY6TG2+x344nt5rXstVVDYSdS5ySfI1WY= +github.com/cucumber/gherkin-go/v19 v19.0.3 h1:mMSKu1077ffLbTJULUfM5HPokgeBcIGboyeNUof1MdE= +github.com/cucumber/gherkin-go/v19 v19.0.3/go.mod h1:jY/NP6jUtRSArQQJ5h1FXOUgk5fZK24qtE7vKi776Vw= +github.com/cucumber/godog v0.12.6 h1:3IToXviU45G7FgijwTk/LdB4iojn8zUFDfQLj4MMiHc= +github.com/cucumber/godog v0.12.6/go.mod h1:Y02TTpimPXDb70PnG6M3zpODXm1+bjCsuZzcW76xAww= +github.com/cucumber/messages-go/v16 v16.0.1 h1:fvkpwsLgnIm0qugftrw2YwNlio+ABe2Iu94Ap8GMYIY= +github.com/cucumber/messages-go/v16 v16.0.1/go.mod h1:EJcyR5Mm5ZuDsKJnT2N9KRnBK30BGjtYotDKpwQ0v6g= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/dell/gopowermax/v2 v2.2.0 h1:g41Ms/GWxwZbe3IJeeVfdX1/IgnZNzpxHGi+VO+mcBA= -github.com/dell/gopowermax/v2 v2.2.0/go.mod h1:06DoVqIp9Xt//mEqgSTzTbG2xXhWbT0mCjIjGrRRoAI= +github.com/dell/gopowermax/v2 v2.3.1-0.20230822074322-4ff408a66ad3 h1:wHcu7itw+rV2S81MOsidNCoD0E72kSKMcaXSaMkLrRM= +github.com/dell/gopowermax/v2 v2.3.1-0.20230822074322-4ff408a66ad3/go.mod h1:IvFKMvXw35EiuBKig9v4eDf2tYX5up/0LqDBLzvwGZ4= github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= @@ -126,8 +126,8 @@ github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34 github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= -github.com/gofrs/uuid v4.0.0+incompatible h1:1SD/1F5pU8p29ybwgQSwpQk+mwdRrXCYuPhW6m+TnJw= -github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= +github.com/gofrs/uuid v4.4.0+incompatible h1:3qXRTX8/NbyulANqlc0lchS1gqAVxRgsuW1YrTJupqA= +github.com/gofrs/uuid v4.4.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= @@ -221,8 +221,8 @@ github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0 h1:BZHcxBETFHIdVyhyEfOvn/RdU/QG github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0/go.mod h1:hgWBS7lorOAVIJEQMi4ZsPv9hVvWI6+ch50m39Pf2Ks= github.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc= github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-memdb v1.3.0 h1:xdXq34gBOMEloa9rlGStLxmfX/dyIK8htOv36dQUwHU= -github.com/hashicorp/go-memdb v1.3.0/go.mod h1:Mluclgwib3R93Hk5fxEfiRhB+6Dar64wWh71LpNSe3g= +github.com/hashicorp/go-memdb v1.3.4 h1:XSL3NR682X/cVk2IeV0d70N4DZ9ljI885xAEU8IoK3c= +github.com/hashicorp/go-memdb v1.3.4/go.mod h1:uBTr1oQbtuMgd1SSGoR8YV27eT3sBHbYiNm53bMpgSg= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc= diff --git a/internal/common/common.go b/internal/common/common.go index 8d2fb96..15e9e52 100644 --- a/internal/common/common.go +++ b/internal/common/common.go @@ -19,14 +19,15 @@ package common import ( "context" "errors" + "os" + "time" + "github.com/dell/csm-metrics-powermax/internal/k8sutils" "github.com/dell/csm-metrics-powermax/internal/reverseproxy/config" "github.com/dell/csm-metrics-powermax/internal/service/types" pmax "github.com/dell/gopowermax/v2" "github.com/sirupsen/logrus" corev1 "k8s.io/api/core/v1" - "os" - "time" ) const ( @@ -160,7 +161,6 @@ func GetPowerMaxArrays(ctx context.Context, k8sUtils k8sutils.UtilsInterface, fi ApplicationName, true, false) - if err != nil { logger.WithError(err).Errorf("cannot connect to PowerMax array %s, %s", arrayID, array.Endpoint) continue diff --git a/internal/common/common_test.go b/internal/common/common_test.go index 46192dc..51d0fa1 100644 --- a/internal/common/common_test.go +++ b/internal/common/common_test.go @@ -36,7 +36,6 @@ import ( ) func Test_Run(t *testing.T) { - mockUtils := k8smock.Init() mockUtils.CreateNewCredentialSecret("powermax-creds") @@ -78,7 +77,7 @@ func Test_Run(t *testing.T) { newContent := strings.ReplaceAll(string(fileContentBytes), "[serverip]", serverIP) newContent = strings.ReplaceAll(newContent, "[serverport]", serverPort) - os.WriteFile(filePath, []byte(newContent), 0644) + os.WriteFile(filePath, []byte(newContent), 0o600) clusters, err := common.GetPowerMaxArrays(context.Background(), k8sUtils, filePath, logger) @@ -89,13 +88,12 @@ func Test_Run(t *testing.T) { assert.NotNil(t, clusters) assert.Nil(t, err) } - os.WriteFile(filePath, fileContentBytes, 0644) + os.WriteFile(filePath, fileContentBytes, 0o600) }) } } func Test_Run_Unauthorized(t *testing.T) { - mockUtils := k8smock.Init() mockUtils.CreateNewCredentialSecret("powermax-creds") @@ -125,7 +123,7 @@ func Test_Run_Unauthorized(t *testing.T) { newContent := strings.ReplaceAll(string(fileContentBytes), "[serverip]", serverIP) newContent = strings.ReplaceAll(newContent, "[serverport]", serverPort) - os.WriteFile(filePath, []byte(newContent), 0644) + os.WriteFile(filePath, []byte(newContent), 0o600) clusters, err := common.GetPowerMaxArrays(context.Background(), k8sUtils, filePath, logger) @@ -136,7 +134,7 @@ func Test_Run_Unauthorized(t *testing.T) { assert.NotNil(t, clusters) assert.Nil(t, err) } - os.WriteFile(filePath, fileContentBytes, 0644) + os.WriteFile(filePath, fileContentBytes, 0o600) }) } } diff --git a/internal/entrypoint/run.go b/internal/entrypoint/run.go index 13fb0d1..1a862e6 100644 --- a/internal/entrypoint/run.go +++ b/internal/entrypoint/run.go @@ -19,11 +19,12 @@ package entrypoint import ( "context" "fmt" - "github.com/dell/csm-metrics-powermax/internal/common" "os" "runtime" "time" + "github.com/dell/csm-metrics-powermax/internal/common" + "github.com/dell/csm-metrics-powermax/internal/service/types" otlexporters "github.com/dell/csm-metrics-powermax/opentelemetry/exporters" @@ -46,10 +47,8 @@ const ( LivenessProbeInterval = 30 * time.Second ) -var ( - // ConfigValidatorFunc is used to override config validation in testing - ConfigValidatorFunc func(*Config) error = ValidateConfig -) +// ConfigValidatorFunc is used to override config validation in testing +var ConfigValidatorFunc = ValidateConfig // Config holds data that will be used by the service type Config struct { diff --git a/internal/entrypoint/run_test.go b/internal/entrypoint/run_test.go index a1f0fea..6ea5fc9 100644 --- a/internal/entrypoint/run_test.go +++ b/internal/entrypoint/run_test.go @@ -34,7 +34,6 @@ import ( ) func Test_Run(t *testing.T) { - tests := map[string]func(t *testing.T) (expectError bool, config *entrypoint.Config, exporter otlexporters.Otlexporter, pScaleSvc types.Service, prevConfigValidationFunc func(*entrypoint.Config) error, ctrl *gomock.Controller, validatingConfig bool){ "success": func(*testing.T) (bool, *entrypoint.Config, otlexporters.Otlexporter, types.Service, func(*entrypoint.Config) error, *gomock.Controller, bool) { ctrl := gomock.NewController(t) diff --git a/internal/k8s/k8sapi_test.go b/internal/k8s/k8sapi_test.go index b99eacc..9e52267 100644 --- a/internal/k8s/k8sapi_test.go +++ b/internal/k8s/k8sapi_test.go @@ -59,7 +59,6 @@ func Test_GetPersistentVolumes(t *testing.T) { tests := map[string]func(t *testing.T) (connectFn, configFn, []checkFn){ "success": func(*testing.T) (connectFn, configFn, []checkFn) { - volumes := &corev1.PersistentVolumeList{ Items: []corev1.PersistentVolume{ { @@ -108,7 +107,6 @@ func Test_GetPersistentVolumes(t *testing.T) { } }) } - } func Test_GetStorageClasses(t *testing.T) { diff --git a/internal/k8s/leader_elector.go b/internal/k8s/leader_elector.go index 80386fa..549d67c 100644 --- a/internal/k8s/leader_elector.go +++ b/internal/k8s/leader_elector.go @@ -46,7 +46,6 @@ type LeaderElector struct { // InitLeaderElection will run algorithm for leader election, call during service initialzation process func (elect *LeaderElector) InitLeaderElection(endpoint string, namespace string) error { - k8sconfig, err := InClusterConfigFn() if err != nil { return err diff --git a/internal/k8s/storageclass_finder.go b/internal/k8s/storageclass_finder.go index 2773e22..cfe923c 100644 --- a/internal/k8s/storageclass_finder.go +++ b/internal/k8s/storageclass_finder.go @@ -45,7 +45,7 @@ type StorageClassFinder struct { } // GetStorageClasses will return a list of storage classes that match the given DriverName in Kubernetes -func (f *StorageClassFinder) GetStorageClasses(ctx context.Context) ([]v1.StorageClass, error) { +func (f *StorageClassFinder) GetStorageClasses(_ context.Context) ([]v1.StorageClass, error) { var storageClasses []v1.StorageClass classes, err := f.API.GetStorageClasses() @@ -64,7 +64,6 @@ func (f *StorageClassFinder) GetStorageClasses(ctx context.Context) ([]v1.Storag } func (f *StorageClassFinder) isMatch(class v1.StorageClass) bool { - for _, arrayID := range f.StorageArrayID { if !Contains(arrayID.DriverNames, class.Provisioner) { continue diff --git a/internal/k8s/storageclass_finder_test.go b/internal/k8s/storageclass_finder_test.go index 69ce044..d09e04c 100644 --- a/internal/k8s/storageclass_finder_test.go +++ b/internal/k8s/storageclass_finder_test.go @@ -55,7 +55,6 @@ func Test_K8sStorageClassFinder(t *testing.T) { tests := map[string]func(t *testing.T) (k8s.StorageClassFinder, []checkFn, *gomock.Controller){ "success not selecting storageclass that is not in config": func(*testing.T) (k8s.StorageClassFinder, []checkFn, *gomock.Controller) { - ctrl := gomock.NewController(t) api := mocks.NewMockStorageClassGetter(ctrl) @@ -102,7 +101,6 @@ func Test_K8sStorageClassFinder(t *testing.T) { return finder, check(hasNoError, checkExpectedOutput(expected.Items)), ctrl }, "success selecting the matching driver name with storage classes": func(*testing.T) (k8s.StorageClassFinder, []checkFn, *gomock.Controller) { - ctrl := gomock.NewController(t) api := mocks.NewMockStorageClassGetter(ctrl) @@ -131,7 +129,6 @@ func Test_K8sStorageClassFinder(t *testing.T) { return finder, check(hasNoError, checkExpectedOutput(storageClasses.Items)), ctrl }, "success selecting storage classes matching multiple driver names": func(*testing.T) (k8s.StorageClassFinder, []checkFn, *gomock.Controller) { - ctrl := gomock.NewController(t) api := mocks.NewMockStorageClassGetter(ctrl) @@ -173,7 +170,6 @@ func Test_K8sStorageClassFinder(t *testing.T) { return finder, check(hasNoError, checkExpectedOutput(storageClasses.Items)), ctrl }, "success matching storage classes without StorageArrayId based on a default cluster being used": func(*testing.T) (k8s.StorageClassFinder, []checkFn, *gomock.Controller) { - ctrl := gomock.NewController(t) api := mocks.NewMockStorageClassGetter(ctrl) @@ -240,7 +236,6 @@ func Test_K8sStorageClassFinder(t *testing.T) { )), ctrl }, "success selecting storage classes matching one of two driver names": func(*testing.T) (k8s.StorageClassFinder, []checkFn, *gomock.Controller) { - ctrl := gomock.NewController(t) api := mocks.NewMockStorageClassGetter(ctrl) diff --git a/internal/k8s/volume_finder.go b/internal/k8s/volume_finder.go index 3e47ce0..4433b02 100644 --- a/internal/k8s/volume_finder.go +++ b/internal/k8s/volume_finder.go @@ -18,6 +18,7 @@ package k8s import ( "context" + "github.com/sirupsen/logrus" corev1 "k8s.io/api/core/v1" @@ -56,7 +57,7 @@ type VolumeInfo struct { } // GetPersistentVolumes will return a list of persistent volume information -func (f VolumeFinder) GetPersistentVolumes(ctx context.Context) ([]VolumeInfo, error) { +func (f VolumeFinder) GetPersistentVolumes(_ context.Context) ([]VolumeInfo, error) { volumeInfo := make([]VolumeInfo, 0) volumes, err := f.API.GetPersistentVolumes() diff --git a/internal/k8s/volume_finder_test.go b/internal/k8s/volume_finder_test.go index cf0a32a..8f6a50d 100644 --- a/internal/k8s/volume_finder_test.go +++ b/internal/k8s/volume_finder_test.go @@ -58,7 +58,6 @@ func Test_K8sPersistentVolumeFinder(t *testing.T) { tests := map[string]func(t *testing.T) (k8s.VolumeFinder, []checkFn, *gomock.Controller){ "success selecting the matching driver name with multiple volumes": func(*testing.T) (k8s.VolumeFinder, []checkFn, *gomock.Controller) { - ctrl := gomock.NewController(t) api := mocks.NewMockVolumeGetter(ctrl) @@ -164,7 +163,6 @@ func Test_K8sPersistentVolumeFinder(t *testing.T) { })), ctrl }, "success selecting multiple volumes matching multiple driver names": func(*testing.T) (k8s.VolumeFinder, []checkFn, *gomock.Controller) { - ctrl := gomock.NewController(t) api := mocks.NewMockVolumeGetter(ctrl) diff --git a/internal/k8sutils/k8sutils.go b/internal/k8sutils/k8sutils.go index 23de311..60b5981 100644 --- a/internal/k8sutils/k8sutils.go +++ b/internal/k8sutils/k8sutils.go @@ -21,11 +21,11 @@ import ( "fmt" "os" "path/filepath" - - common "github.com/dell/csm-metrics-powermax/internal/reverseproxy/common" "strconv" "time" + common "github.com/dell/csm-metrics-powermax/internal/reverseproxy/common" + log "github.com/sirupsen/logrus" "k8s.io/client-go/tools/clientcmd" diff --git a/internal/reverseproxy/config/config.go b/internal/reverseproxy/config/config.go index 11ef847..6a2b3a8 100644 --- a/internal/reverseproxy/config/config.go +++ b/internal/reverseproxy/config/config.go @@ -19,10 +19,11 @@ package config import ( "crypto/subtle" "fmt" + "net/url" + k8sutils "github.com/dell/csm-metrics-powermax/internal/k8sutils" common "github.com/dell/csm-metrics-powermax/internal/reverseproxy/common" utils "github.com/dell/csm-metrics-powermax/internal/reverseproxy/utils" - "net/url" "github.com/spf13/viper" ) @@ -153,7 +154,7 @@ func (proxy *StandAloneProxyConfig) updateProxyCredentials(creds common.Credenti // GetManagementServers - Returns the list of management servers present in StandAloneProxyConfig func (proxy *StandAloneProxyConfig) GetManagementServers() []ManagementServer { - var mgmtServers = make([]ManagementServer, 0) + mgmtServers := make([]ManagementServer, 0) for _, v := range proxy.managementServers { mgmtServers = append(mgmtServers, *v) } @@ -186,7 +187,7 @@ func (proxy *StandAloneProxyConfig) GetManagedArraysAndServers() map[string]Stor // GetStorageArray - Returns a list of storage array given a storage array id func (proxy *StandAloneProxyConfig) GetStorageArray(storageArrayID string) []StorageArray { - var storageArrays = make([]StorageArray, 0) + storageArrays := make([]StorageArray, 0) if storageArrayID != "" { if storageArray, ok := proxy.managedArrays[storageArrayID]; ok { storageArrays = append(storageArrays, *storageArray) diff --git a/internal/reverseproxy/config/config_test.go b/internal/reverseproxy/config/config_test.go index 525f49c..f64f5d3 100644 --- a/internal/reverseproxy/config/config_test.go +++ b/internal/reverseproxy/config/config_test.go @@ -18,14 +18,15 @@ package config import ( "fmt" + "os" + "path/filepath" + "testing" + k8sutils "github.com/dell/csm-metrics-powermax/internal/k8sutils" common "github.com/dell/csm-metrics-powermax/internal/reverseproxy/common" k8smock "github.com/dell/csm-metrics-powermax/internal/reverseproxy/k8smock" utils "github.com/dell/csm-metrics-powermax/internal/reverseproxy/utils" "github.com/stretchr/testify/assert" - "os" - "path/filepath" - "testing" log "github.com/sirupsen/logrus" ) @@ -58,7 +59,6 @@ func TestMain(m *testing.M) { err := utils.RemoveTempFiles() if err != nil { log.Fatalf("Failed to cleanup temp files. (%s)", err.Error()) - status = 1 } os.Exit(status) } diff --git a/internal/reverseproxy/k8smock/k8smock.go b/internal/reverseproxy/k8smock/k8smock.go index ae7126f..117787c 100644 --- a/internal/reverseproxy/k8smock/k8smock.go +++ b/internal/reverseproxy/k8smock/k8smock.go @@ -19,15 +19,16 @@ package k8smock import ( "context" "fmt" - k8sutils "github.com/dell/csm-metrics-powermax/internal/k8sutils" - common "github.com/dell/csm-metrics-powermax/internal/reverseproxy/common" - utils "github.com/dell/csm-metrics-powermax/internal/reverseproxy/utils" "os" "path" "path/filepath" "strconv" "time" + k8sutils "github.com/dell/csm-metrics-powermax/internal/k8sutils" + common "github.com/dell/csm-metrics-powermax/internal/reverseproxy/common" + utils "github.com/dell/csm-metrics-powermax/internal/reverseproxy/utils" + corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/client-go/informers" @@ -143,7 +144,7 @@ func (mockUtils *MockUtils) GetCredentialsFromSecret(secret *corev1.Secret) (*co } // StartInformer - mock implementation for StartInformer -func (mockUtils *MockUtils) StartInformer(callback func(k8sutils.UtilsInterface, *corev1.Secret)) error { +func (mockUtils *MockUtils) StartInformer(_ func(k8sutils.UtilsInterface, *corev1.Secret)) error { return nil } diff --git a/internal/service/metric/base_metrics_test.go b/internal/service/metric/base_metrics_test.go index 1803984..7c0fbeb 100644 --- a/internal/service/metric/base_metrics_test.go +++ b/internal/service/metric/base_metrics_test.go @@ -19,11 +19,12 @@ package metric_test import ( "context" "encoding/json" - "github.com/stretchr/testify/assert" "os" "path/filepath" "testing" + "github.com/stretchr/testify/assert" + "github.com/dell/csm-metrics-powermax/internal/k8s" "github.com/dell/csm-metrics-powermax/internal/service" "github.com/dell/csm-metrics-powermax/internal/service/metric" diff --git a/internal/service/metric/capacity_metrics.go b/internal/service/metric/capacity_metrics.go index 338d5b5..332c988 100644 --- a/internal/service/metric/capacity_metrics.go +++ b/internal/service/metric/capacity_metrics.go @@ -62,7 +62,7 @@ func (m *CapacityMetrics) Collect(ctx context.Context) error { for range m.pushCapacityMetrics(ctx, m.gatherCapacityMetrics(ctx, pvs)) { // consume the channel until it is empty and closed - } + } // revive:disable-line:empty-block return nil } @@ -105,7 +105,6 @@ func (m *CapacityMetrics) gatherCapacityMetrics(ctx context.Context, pvs []k8s.V } vol, err := pmaxClient.GetVolumeByID(ctx, arrayID, volumeID) - if err != nil { m.Logger.WithError(err).WithField("arrayID", arrayID).WithField("volumeID", volumeID).Error("getting capacity metrics for volume") return @@ -164,7 +163,6 @@ func (m *CapacityMetrics) pushCapacityMetrics(ctx context.Context, volumeCapacit ch := make(chan string) go func() { - // Sum based on array id for total capacity metrics for array and storage class arrayIDMap := make(map[string]types.VolumeCapacityMetricsRecord) storageClassMap := make(map[string]types.VolumeCapacityMetricsRecord) diff --git a/internal/service/metric/metrics_recorder_wrapper.go b/internal/service/metric/metrics_recorder_wrapper.go index c7b10f3..2c521a5 100644 --- a/internal/service/metric/metrics_recorder_wrapper.go +++ b/internal/service/metric/metrics_recorder_wrapper.go @@ -18,6 +18,7 @@ package metric import ( "context" + "github.com/dell/csm-metrics-powermax/internal/service/types" ) diff --git a/internal/service/metric/performance_metrics.go b/internal/service/metric/performance_metrics.go index 6c19b08..961a98f 100644 --- a/internal/service/metric/performance_metrics.go +++ b/internal/service/metric/performance_metrics.go @@ -97,7 +97,7 @@ func (m *PerformanceMetrics) Collect(ctx context.Context) error { defer wg.Done() for range m.pushVolumePerformanceMetrics(ctx, m.gatherVolumePerformanceMetrics(ctx, array2Sgs, id2Volume)) { // consume the channel until it is empty and closed - } + } // revive:disable-line:empty-block }() // Collect storage group performance metric @@ -105,7 +105,7 @@ func (m *PerformanceMetrics) Collect(ctx context.Context) error { defer wg.Done() for range m.pushStorageGroupPerformanceMetrics(ctx, m.gatherStorageGroupPerformanceMetrics(ctx, array2Sgs)) { // consume the channel until it is empty and closed - } + } // revive:disable-line:empty-block }() wg.Wait() return nil @@ -167,8 +167,10 @@ func (m *PerformanceMetrics) gatherVolumePerformanceMetrics(ctx context.Context, for sgID := range sgs { querySgParams = querySgParams + sgID + "," } - volumesMetrics, err := pmaxClient.GetVolumesMetrics(ctx, arrayID, querySgParams, []string{"MBRead", "MBWritten", - "ReadResponseTime", "WriteResponseTime", "Reads", "Writes"}, + volumesMetrics, err := pmaxClient.GetVolumesMetrics(ctx, arrayID, querySgParams, []string{ + "MBRead", "MBWritten", + "ReadResponseTime", "WriteResponseTime", "Reads", "Writes", + }, array2LastAvailTime[arrayID], array2LastAvailTime[arrayID]) if err != nil { m.Logger.WithError(err).WithField("arrayID", arrayID).Warn("failed to get volume metrics") @@ -237,7 +239,6 @@ func (m *PerformanceMetrics) pushVolumePerformanceMetrics(ctx context.Context, v ch := make(chan string) go func() { - // for volume metrics for metric := range volumePerfMetrics { wg.Add(1) @@ -313,8 +314,10 @@ func (m *PerformanceMetrics) gatherStorageGroupPerformanceMetrics(ctx context.Co m.Logger.WithField("storageGroupID", storageGroupID).Warn("last available time for storage group is not found") continue } - sgMetrics, err := pmaxClient.GetStorageGroupMetrics(ctx, arrayID, storageGroupID, []string{"HostMBReads", "HostMBWritten", - "ReadResponseTime", "WriteResponseTime", "HostReads", "HostWrites", "AvgIOSize"}, + sgMetrics, err := pmaxClient.GetStorageGroupMetrics(ctx, arrayID, storageGroupID, []string{ + "HostMBReads", "HostMBWritten", + "ReadResponseTime", "WriteResponseTime", "HostReads", "HostWrites", "AvgIOSize", + }, storageGroup2LastAvailTime[arrayID+"="+storageGroupID], storageGroup2LastAvailTime[arrayID+"="+storageGroupID]) if err != nil { m.Logger.WithError(err).WithField("storageGroupID ID", storageGroupID).Warn("failed to get storage group metrics") diff --git a/internal/service/metric/performance_metrics_test.go b/internal/service/metric/performance_metrics_test.go index c7e6296..2cc201e 100644 --- a/internal/service/metric/performance_metrics_test.go +++ b/internal/service/metric/performance_metrics_test.go @@ -20,6 +20,10 @@ import ( "context" "encoding/json" "errors" + "os" + "path/filepath" + "testing" + "github.com/dell/csm-metrics-powermax/internal/k8s" "github.com/dell/csm-metrics-powermax/internal/service" "github.com/dell/csm-metrics-powermax/internal/service/metric" @@ -29,9 +33,6 @@ import ( "github.com/golang/mock/gomock" "github.com/sirupsen/logrus" "github.com/stretchr/testify/assert" - "os" - "path/filepath" - "testing" ) const mockDir = "mockdata" diff --git a/internal/service/service_test.go b/internal/service/service_test.go index 5b6b234..8ee362a 100644 --- a/internal/service/service_test.go +++ b/internal/service/service_test.go @@ -19,11 +19,12 @@ package service_test import ( "context" "encoding/json" - "github.com/stretchr/testify/assert" "os" "path/filepath" "testing" + "github.com/stretchr/testify/assert" + "github.com/dell/csm-metrics-powermax/internal/k8s" "github.com/dell/csm-metrics-powermax/internal/service" "github.com/dell/csm-metrics-powermax/internal/service/types" diff --git a/internal/service/types/types.go b/internal/service/types/types.go index 18c36a7..5f8d238 100644 --- a/internal/service/types/types.go +++ b/internal/service/types/types.go @@ -18,6 +18,7 @@ package types import ( "context" + pmax "github.com/dell/gopowermax/v2" "github.com/dell/csm-metrics-powermax/internal/k8s" diff --git a/utils/unit_converter_test.go b/utils/unit_converter_test.go index e3f176c..cc5e678 100644 --- a/utils/unit_converter_test.go +++ b/utils/unit_converter_test.go @@ -40,5 +40,4 @@ func Test_UnitsConvert(t *testing.T) { if got != 9029296.123/1024 { t.Errorf("Float64UnitsConvert() = %f, expect %f", got, 9029296.123/1024) } - }