diff --git a/cmd/metrics-powerstore/main.go b/cmd/metrics-powerstore/main.go index 8eecd4f..bb16d2f 100644 --- a/cmd/metrics-powerstore/main.go +++ b/cmd/metrics-powerstore/main.go @@ -20,14 +20,12 @@ import ( _ "net/http/pprof" - "github.com/dell/csi-powerstore/pkg/array" - "github.com/dell/csi-powerstore/pkg/common/fs" + "github.com/dell/csm-metrics-powerstore/internal/common" "github.com/dell/csm-metrics-powerstore/internal/entrypoint" "github.com/dell/csm-metrics-powerstore/internal/k8s" "github.com/dell/csm-metrics-powerstore/internal/service" otlexporters "github.com/dell/csm-metrics-powerstore/opentelemetry/exporters" tracer "github.com/dell/csm-metrics-powerstore/opentelemetry/tracers" - "github.com/dell/gofsutil" "github.com/sirupsen/logrus" "os" @@ -197,8 +195,7 @@ func updateTracing(logger *logrus.Logger) { } func updatePowerStoreConnection(powerStoreSvc *service.PowerStoreService, logger *logrus.Logger) { - f := &fs.Fs{Util: &gofsutil.FS{}} - arrays, _, _, err := array.GetPowerStoreArrays(f, defaultStorageSystemConfigFile) + arrays, _, _, err := common.GetPowerStoreArrays(defaultStorageSystemConfigFile, logger) if err != nil { logger.WithError(err).Fatal("initialize arrays in controller service") } diff --git a/go.mod b/go.mod index f7129b4..803b387 100644 --- a/go.mod +++ b/go.mod @@ -3,12 +3,13 @@ module github.com/dell/csm-metrics-powerstore go 1.14 require ( - github.com/dell/csi-powerstore v0.0.0-20210923102620-2b6d0e23ab2e - github.com/dell/gofsutil v1.6.0 - github.com/dell/gopowerstore v1.5.0 + github.com/dell/gocsi v1.5.0 + github.com/dell/gopowerstore v1.6.0 github.com/fsnotify/fsnotify v1.4.9 github.com/golang/mock v1.4.3 github.com/jarcoal/httpmock v1.0.6 // indirect + github.com/onsi/ginkgo v1.14.2 // indirect + github.com/onsi/gomega v1.10.4 // indirect github.com/sirupsen/logrus v1.6.0 github.com/spf13/viper v1.7.1 github.com/stretchr/testify v1.7.0 @@ -17,6 +18,8 @@ require ( go.opentelemetry.io/otel/exporters/trace/zipkin v0.7.0 golang.org/x/crypto v0.0.0-20201216223049-8b5274cf687f // indirect google.golang.org/grpc v1.38.0 + google.golang.org/protobuf v1.27.1 // indirect + gopkg.in/yaml.v2 v2.3.0 k8s.io/api v0.20.0 k8s.io/apimachinery v0.20.0 k8s.io/client-go v0.20.0 diff --git a/go.sum b/go.sum index 7cabde5..ff1ec76 100644 --- a/go.sum +++ b/go.sum @@ -36,8 +36,6 @@ github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03 github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/DataDog/sketches-go v0.0.0-20190923095040-43f19ad77ff7 h1:qELHH0AWCvf98Yf+CNIJx9vOZOfHFDDzgDRYsnNk/vs= github.com/DataDog/sketches-go v0.0.0-20190923095040-43f19ad77ff7/go.mod h1:Q5DbzQ+3AkgGwymQO7aZFNP7ns2lZKGtvRBzRXfdi60= -github.com/HdrHistogram/hdrhistogram-go v1.0.1 h1:GX8GAYDuhlFQnI2fRDHQhTlkHMz8bEn0jTI6LJU0mpw= -github.com/HdrHistogram/hdrhistogram-go v1.0.1/go.mod h1:BWJ+nMSHY3L41Zj7CA3uXnloDp7xxV0YvstAE7nKTaM= github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= @@ -76,9 +74,7 @@ github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMn github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/container-storage-interface/spec v1.3.0/go.mod h1:6URME8mwIBbpVyZV93Ce5St17xBiQJQY67NDsuohiy4= -github.com/container-storage-interface/spec v1.4.0 h1:ozAshSKxpJnYUfmkpZCTYyF/4MYeYlhdXbAvPvfGmkg= -github.com/container-storage-interface/spec v1.4.0/go.mod h1:6URME8mwIBbpVyZV93Ce5St17xBiQJQY67NDsuohiy4= +github.com/container-storage-interface/spec v1.5.0/go.mod h1:8K96oQNkJ7pFcC2R9Z1ynGGBB1I93kcS6PGg3SsOk8s= github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= @@ -89,21 +85,10 @@ github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ3 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/csi-powerstore v0.0.0-20210923102620-2b6d0e23ab2e h1:r+zcottpsZXA/LOZ8m957vTwl6ZEmYFm1c5YUO+01w8= -github.com/dell/csi-powerstore v0.0.0-20210923102620-2b6d0e23ab2e/go.mod h1:Kql3zyUSC5aRCKAlmxY0jVZkpdrtftxpYy+t8J4cx8E= -github.com/dell/dell-csi-extensions/replication v1.0.0 h1:fLcn4xhVO7Xt5t8ZIwDu57vAtL3LWbdYF94W9bpWS/Y= -github.com/dell/dell-csi-extensions/replication v1.0.0/go.mod h1:DbHqsh4vpC+SajnrDSAwWE8n556GSSyzOAEBX7tcCUg= -github.com/dell/gobrick v1.2.0 h1:dlgWgonXG7qoa+SXlek/NkdFBnfxgqSv+8tsHIBIEDg= -github.com/dell/gobrick v1.2.0/go.mod h1:pYN9r3XvIjct/QkEg5mEM+k2L3QBLVaHUZeAMzQgwRg= -github.com/dell/gocsi v1.3.1 h1:YA99j6+kMKiQX/3ERHjKStkAnXWu5sqtk6RE/saMRQk= -github.com/dell/gocsi v1.3.1/go.mod h1:doJru1XfPHSmROXxtAey6eQ8QseoFKaMtA8YaWCb0mU= -github.com/dell/gofsutil v1.6.0 h1:u5PiMJIyecAWpSlPloov1/3LF5OWrcjJwoFF8dWkjcA= -github.com/dell/gofsutil v1.6.0/go.mod h1:98Wpcg7emz4iGgY16fd4MKpnal2SX2hBiwP5ghHlvhg= -github.com/dell/goiscsi v1.1.0/go.mod h1:MfuMjbKWsh/MOb0VDW20C+LFYRIOfWKGiAxWkeM5TKo= -github.com/dell/goiscsi v1.2.0 h1:ocQs4pz2Fw2vr73RVAQBKwpN468SK4TZHPLhU7/FB9A= -github.com/dell/goiscsi v1.2.0/go.mod h1:MfuMjbKWsh/MOb0VDW20C+LFYRIOfWKGiAxWkeM5TKo= -github.com/dell/gopowerstore v1.5.0 h1:Hm4uRaNcCugaWItly38BOlOIxEql28Z8VqC7VIAio7s= -github.com/dell/gopowerstore v1.5.0/go.mod h1:0ziQJ1iuZYDV+P53ua+VeH+rIylYT9WNjGSI/7aPly0= +github.com/dell/gocsi v1.5.0 h1:qi2T6H6JHDo9sJEw24jo6Z88fJszBXfQc3lxOBaUijo= +github.com/dell/gocsi v1.5.0/go.mod h1:nIsIXXB5JpAvOQ0//gtPGULC2+NUddpi5qwpBeMhiLs= +github.com/dell/gopowerstore v1.6.0 h1:CoHJ4DSTGuUEsB0+EBSBoW1EWslrATH0p6YPSSDWaZw= +github.com/dell/gopowerstore v1.6.0/go.mod h1:0ziQJ1iuZYDV+P53ua+VeH+rIylYT9WNjGSI/7aPly0= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM= @@ -375,8 +360,6 @@ github.com/onsi/gomega v1.10.4/go.mod h1:g/HbgYopi++010VEqkFgJHKC09uJiW9UkXvMUuK github.com/open-telemetry/opentelemetry-proto v0.4.0 h1:7EGs7QkdnR039zcQv71/wPLeeUUzqpH855VEWN4IHTE= github.com/open-telemetry/opentelemetry-proto v0.4.0/go.mod h1:PMR5GI0F7BSpio+rBGFxNm6SLzg3FypDTcFuQZnO+F8= github.com/opentracing/opentracing-go v1.1.1-0.20190913142402-a7454ce5950e/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+1B0VhjKrZUs= -github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= github.com/openzipkin/zipkin-go v0.2.2 h1:nY8Hti+WKaP0cRsSeQ026wU03QsM762XBeCXBb9NAWI= github.com/openzipkin/zipkin-go v0.2.2/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= @@ -421,7 +404,6 @@ github.com/rogpeppe/go-internal v1.2.2/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFR github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= -github.com/sirupsen/logrus v0.0.0-20170822132746-89742aefa4b2/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= @@ -453,7 +435,6 @@ github.com/spf13/viper v1.7.1/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5q github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.2.0 h1:Hbg2NidpLE8veEBkEZTL3CvlkUIVzuU9jDplZO54c48= github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= @@ -468,10 +449,6 @@ github.com/thecodeteam/gosync v0.1.0/go.mod h1:43QHsngcnWc8GE1aCmi7PEypslflHjCzX github.com/tidwall/pretty v1.0.0 h1:HsD+QiTn7sK6flMKIvNmpqz1qrpP3Ps6jOKIKMooyg4= github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/uber/jaeger-client-go v2.25.0+incompatible h1:IxcNZ7WRY1Y3G4poYlx24szfsn/3LvK9QHCq9oQw8+U= -github.com/uber/jaeger-client-go v2.25.0+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= -github.com/uber/jaeger-lib v2.4.0+incompatible h1:fY7QsGQWiCt8pajv4r7JEvmATdCVaWxXbjwyYwsNaLQ= -github.com/uber/jaeger-lib v2.4.0+incompatible/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U= github.com/xdg/scram v0.0.0-20180814205039-7eeb5667e42c/go.mod h1:lB8K/P019DLNhemzwFU4jHLhdvlE6uDZjXFejJXr49I= github.com/xdg/stringprep v0.0.0-20180714160509-73f8eece6fdc/go.mod h1:Jhud4/sHMO4oL310DaZAKk9ZaJ08SJfe+sJh0HrGL1Y= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= @@ -495,13 +472,11 @@ go.opentelemetry.io/otel/exporters/otlp v0.7.0/go.mod h1:Qxj/DhsAynmsutiEbuDpDtE go.opentelemetry.io/otel/exporters/trace/zipkin v0.7.0 h1:8lDisbKLgupie3gB+ZgNZv7kP08vBBjoEb8LvDJSqAg= go.opentelemetry.io/otel/exporters/trace/zipkin v0.7.0/go.mod h1:IvpoNJ3w0jB5u2fkPVxu8fIf+aX2AkAWgQVHduc8CwQ= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= -golang.org/x/crypto v0.0.0-20171023145632-2509b142fb2b/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= @@ -596,9 +571,7 @@ golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20171028101351-661970f62f58/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= diff --git a/internal/common/common.go b/internal/common/common.go new file mode 100644 index 0000000..c7a02be --- /dev/null +++ b/internal/common/common.go @@ -0,0 +1,121 @@ +// Copyright (c) 2021 Dell Inc., or its subsidiaries. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 + +package common + +import ( + "context" + "errors" + "fmt" + "io/ioutil" + "path/filepath" + "regexp" + "strconv" + + csictx "github.com/dell/gocsi/context" + + "github.com/dell/csm-metrics-powerstore/internal/service" + "github.com/dell/gopowerstore" + "github.com/sirupsen/logrus" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" + "gopkg.in/yaml.v2" +) + +const ( + // EnvThrottlingRateLimit sets a number of concurrent requests to APi + EnvThrottlingRateLimit = "X_CSI_POWERSTORE_THROTTLING_RATE_LIMIT" +) + +// GetPowerStoreArrays parses config.yaml file, initializes gopowerstore Clients and composes map of arrays for ease of access. +// It will return array that can be used as default as a second return parameter. +// If config does not have any array as a default then the first will be returned as a default. +func GetPowerStoreArrays(filePath string, logger *logrus.Logger) (map[string]*service.PowerStoreArray, map[string]string, *service.PowerStoreArray, error) { + type config struct { + Arrays []*service.PowerStoreArray `yaml:"arrays"` + } + + data, err := ioutil.ReadFile(filepath.Clean(filePath)) + if err != nil { + logger.WithError(err).Errorf("cannot read file %s", filePath) + return nil, nil, nil, err + } + + var cfg config + err = yaml.Unmarshal(data, &cfg) + if err != nil { + logger.WithError(err).Errorf("cannot unmarshal data") + return nil, nil, nil, err + } + + arrayMap := make(map[string]*service.PowerStoreArray) + mapper := make(map[string]string) + var defaultArray *service.PowerStoreArray + foundDefault := false + + if len(cfg.Arrays) == 0 { + return arrayMap, mapper, defaultArray, nil + } + + // Safeguard if user doesn't set any array as default, we just use first one + defaultArray = cfg.Arrays[0] + + // Convert to map for convenience and init gopowerstore.Client + for _, array := range cfg.Arrays { + array := array + if array == nil { + return arrayMap, mapper, defaultArray, nil + } + if array.GlobalID == "" { + return nil, nil, nil, errors.New("no GlobalID field found in config.yaml, update config.yaml according to the documentation") + } + clientOptions := gopowerstore.NewClientOptions() + clientOptions.SetInsecure(array.Insecure) + + if throttlingRateLimit, ok := csictx.LookupEnv(context.Background(), EnvThrottlingRateLimit); ok { + rateLimit, err := strconv.Atoi(throttlingRateLimit) + if err != nil { + logger.Errorf("can't get throttling rate limit, using default") + } else { + clientOptions.SetRateLimit(uint64(rateLimit)) + } + } + + c, err := gopowerstore.NewClientWithArgs( + array.Endpoint, array.Username, array.Password, clientOptions) + if err != nil { + return nil, nil, nil, status.Errorf(codes.FailedPrecondition, + "unable to create PowerStore client: %s", err.Error()) + } + array.Client = c + + ips := GetIPListFromString(array.Endpoint) + if ips == nil { + return nil, nil, nil, fmt.Errorf("can't get ips from endpoint: %s", array.Endpoint) + } + + ip := ips[0] + array.IP = ip + logger.Infof("%s,%s,%s,%s,%t,%t,%s", array.Endpoint, array.GlobalID, array.Username, array.NasName, array.Insecure, array.IsDefault, array.BlockProtocol) + arrayMap[array.GlobalID] = array + mapper[ip] = array.GlobalID + if array.IsDefault && !foundDefault { + defaultArray = array + foundDefault = true + } + } + + return arrayMap, mapper, defaultArray, nil +} + +// GetIPListFromString returns list of ips in string form found in input string +// A return value of nil indicates no match +func GetIPListFromString(input string) []string { + re := regexp.MustCompile(`(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}`) + return re.FindAllString(input, -1) +} diff --git a/internal/common/common_test.go b/internal/common/common_test.go new file mode 100644 index 0000000..fe38e9b --- /dev/null +++ b/internal/common/common_test.go @@ -0,0 +1,68 @@ +// Copyright (c) 2021 Dell Inc., or its subsidiaries. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 + +package common_test + +import ( + "context" + "testing" + + "github.com/dell/csm-metrics-powerstore/internal/common" + csictx "github.com/dell/gocsi/context" + "github.com/sirupsen/logrus" + "github.com/stretchr/testify/assert" +) + +func Test_Run(t *testing.T) { + + tests := map[string]func(t *testing.T) (filePath string, env map[string]string, expectError bool){ + + "success": func(*testing.T) (string, map[string]string, bool) { + return "testdata/sample-config.yaml", map[string]string{common.EnvThrottlingRateLimit: "123"}, false + }, + "invalid throttling value": func(*testing.T) (string, map[string]string, bool) { + return "testdata/sample-config.yaml", map[string]string{common.EnvThrottlingRateLimit: "abc"}, false + }, + "file doesn't exist": func(*testing.T) (string, map[string]string, bool) { + return "testdata/no-file.yaml", nil, true + }, + "file format": func(*testing.T) (string, map[string]string, bool) { + return "testdata/invalid-format.yaml", nil, true + }, + "no global id": func(*testing.T) (string, map[string]string, bool) { + return "testdata/no-global-id.yaml", nil, true + }, + } + + for name, test := range tests { + t.Run(name, func(t *testing.T) { + + logger := logrus.New() + filePath, envs, expectError := test(t) + + for k, v := range envs { + csictx.Setenv(context.Background(), k, v) + } + + arrays, mapper, defaultArray, err := common.GetPowerStoreArrays(filePath, logger) + + if expectError { + assert.Nil(t, arrays) + assert.Nil(t, mapper) + assert.Nil(t, defaultArray) + assert.NotNil(t, err) + } else { + assert.NotNil(t, arrays) + assert.NotNil(t, mapper) + assert.NotNil(t, defaultArray) + assert.Nil(t, err) + } + + }) + } +} diff --git a/internal/common/testdata/invalid-format.yaml b/internal/common/testdata/invalid-format.yaml new file mode 100644 index 0000000..06a35be --- /dev/null +++ b/internal/common/testdata/invalid-format.yaml @@ -0,0 +1,2 @@ +invalid_format + diff --git a/internal/common/testdata/no-global-id.yaml b/internal/common/testdata/no-global-id.yaml new file mode 100644 index 0000000..62b3615 --- /dev/null +++ b/internal/common/testdata/no-global-id.yaml @@ -0,0 +1,9 @@ +arrays: + - endpoint: "https://10.0.0.1/api/rest" + username: "user" + password: "password" + skipCertificateValidation: true + isDefault: true + blockProtocol: "auto" + nasName: "nas-server" + diff --git a/internal/common/testdata/sample-config.yaml b/internal/common/testdata/sample-config.yaml new file mode 100644 index 0000000..5cf4fe6 --- /dev/null +++ b/internal/common/testdata/sample-config.yaml @@ -0,0 +1,17 @@ +arrays: + - endpoint: "https://10.0.0.1/api/rest" + globalID: "unique" + username: "user" + password: "password" + skipCertificateValidation: true + isDefault: true + blockProtocol: "auto" + nasName: "nas-server" + + - endpoint: "https://11.0.0.1/api/rest" + globalID: "unique" + username: "user" + password: "password" + skipCertificateValidation: true + blockProtocol: "FC" + diff --git a/internal/service/service.go b/internal/service/service.go index 5164388..8e9f19e 100644 --- a/internal/service/service.go +++ b/internal/service/service.go @@ -17,7 +17,6 @@ import ( tracer "github.com/dell/csm-metrics-powerstore/opentelemetry/tracers" - "github.com/dell/csi-powerstore/pkg/array" "github.com/dell/gopowerstore" "github.com/dell/csm-metrics-powerstore/internal/k8s" @@ -59,7 +58,7 @@ type PowerStoreService struct { MaxPowerStoreConnections int Logger *logrus.Logger PowerStoreClients map[string]PowerStoreClient - DefaultPowerStoreArray *array.PowerStoreArray + DefaultPowerStoreArray *PowerStoreArray VolumeFinder VolumeFinder } diff --git a/internal/service/types.go b/internal/service/types.go index 876d0a4..7279dcf 100644 --- a/internal/service/types.go +++ b/internal/service/types.go @@ -8,6 +8,10 @@ package service +import ( + "github.com/dell/gopowerstore" +) + // VolumeMeta is the details of a volume in an SDC type VolumeMeta struct { ID string @@ -25,3 +29,23 @@ type SpaceVolumeMeta struct { Driver string Protocol string } + +// TransportType differentiates different SCSI transport protocols (FC, iSCSI, Auto, None) +type TransportType string + +// PowerStoreArray is a struct that stores all PowerStore connection information. +// It stores gopowerstore client that can be directly used to invoke PowerStore API calls. +// This structure is supposed to be parsed from config and mainly is created by GetPowerStoreArrays function. +type PowerStoreArray struct { + Endpoint string `yaml:"endpoint"` + GlobalID string `yaml:"globalID"` + Username string `yaml:"username"` + Password string `yaml:"password"` + NasName string `yaml:"nasName"` + BlockProtocol TransportType `yaml:"blockProtocol"` + Insecure bool `yaml:"skipCertificateValidation"` + IsDefault bool `yaml:"isDefault"` + + Client gopowerstore.Client + IP string +}