func New() Service {
	return &service{}
}
New returns a new CSI Service.
package service
import (
	"context"
	"errors"
	"fmt"
	"io/ioutil"
	"net"
	"path/filepath"
	"strconv"
	"strings"
	"regexp"
	"sync"
	"sync/atomic"
	"time"
	"os"
	"github.com/dell/dell-csi-extensions/podmon"
	"google.golang.org/grpc"
	v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
	"github.com/container-storage-interface/spec/lib/go/csi"
	"github.com/dell/csi-unity/common"
	"github.com/dell/csi-unity/core"
	"github.com/dell/csi-unity/k8sutils"
	"github.com/dell/csi-unity/service/utils"
	"github.com/dell/gobrick"
	"github.com/dell/gocsi"
	csictx "github.com/dell/gocsi/context"
	"github.com/dell/goiscsi"
	"github.com/dell/gounity"
	"github.com/dell/gounity/util"
	"github.com/fsnotify/fsnotify"
	"github.com/sirupsen/logrus"
	"github.com/spf13/viper"
	"google.golang.org/grpc/codes"
	"google.golang.org/grpc/metadata"
	"google.golang.org/grpc/status"
	"gopkg.in/yaml.v3"
)
const (
	VendorVersion = "0.0.0"
	TcpDialTimeout = 1000
	IScsiPort = "3260"
)
var Name string
var DriverConfig string
var DriverSecret string
var runid int64
var Manifest = map[string]string{
	"url":    "http://github.com/dell/csi-unity",
	"semver": core.SemVer,
	"commit": core.CommitSha32,
	"formed": core.CommitTime.Format(time.RFC1123),
}
type StorageArrayList struct {
	StorageArrayList []StorageArrayConfig `yaml:"storageArrayList"`
}
type StorageArrayConfig struct {
	ArrayId                   string `yaml:"arrayId"`
	Username                  string `yaml:"username"`
	Password                  string `yaml:"password"`
	Endpoint                  string `yaml:"endpoint"`
	IsDefault                 *bool  `yaml:"isDefault,omitempty"`
	SkipCertificateValidation *bool  `yaml:"skipCertificateValidation,omitempty"`
	IsProbeSuccess            bool
	IsHostAdded               bool
	IsDefaultArray            bool
	UnityClient               *gounity.Client
}
type Service interface {
	csi.ControllerServer
	csi.IdentityServer
	csi.NodeServer
	BeforeServe(context.Context, *gocsi.StoragePlugin, net.Listener) error
	RegisterAdditionalServers(*grpc.Server)
}
type Opts struct {
	NodeName                      string
	LongNodeName                  string
	Chroot                        string
	Thick                         bool
	AutoProbe                     bool
	AllowRWOMultiPodAccess        bool
	PvtMountDir                   string
	Debug                         bool
	SyncNodeInfoTimeInterval      int64
	EnvEphemeralStagingTargetPath string
	KubeConfigPath                string
	MaxVolumesPerNode             int64
	LogLevel                      string
}
type service struct {
	opts           Opts
	arrays         *sync.Map
	mode           string
	iscsiClient    goiscsi.ISCSIinterface
	fcConnector    fcConnector  
	iscsiConnector iSCSIConnector
}
type iSCSIConnector interface {
	ConnectVolume(ctx context.Context, info gobrick.ISCSIVolumeInfo) (gobrick.Device, error)
	DisconnectVolumeByDeviceName(ctx context.Context, name string) error
	GetInitiatorName(ctx context.Context) ([]string, error)
}
type fcConnector interface {
	ConnectVolume(ctx context.Context, info gobrick.FCVolumeInfo) (gobrick.Device, error)
	DisconnectVolumeByDeviceName(ctx context.Context, name string) error
	GetInitiatorPorts(ctx context.Context) ([]string, error)
}