diff --git a/pkg/blob/azure.go b/pkg/blob/azure.go index 2424ab641..1d5ab6f86 100644 --- a/pkg/blob/azure.go +++ b/pkg/blob/azure.go @@ -52,7 +52,7 @@ func IsAzureStackCloud(cloud *azure.Cloud) bool { } // getCloudProvider get Azure Cloud Provider -func getCloudProvider(kubeconfig, nodeID, secretName, secretNamespace, userAgent string, allowEmptyCloudConfig bool, kubeAPIQPS float64, kubeAPIBurst int) (*azure.Cloud, error) { +func GetCloudProvider(kubeconfig, nodeID, secretName, secretNamespace, userAgent string, allowEmptyCloudConfig bool, kubeAPIQPS float64, kubeAPIBurst int) (*azure.Cloud, error) { var ( config *azure.Config kubeClient *clientset.Clientset diff --git a/pkg/blob/azure_test.go b/pkg/blob/azure_test.go index 86b0e36b6..dce7b6f35 100644 --- a/pkg/blob/azure_test.go +++ b/pkg/blob/azure_test.go @@ -168,7 +168,7 @@ users: } os.Setenv(DefaultAzureCredentialFileEnv, fakeCredFile) } - cloud, err := getCloudProvider(test.kubeconfig, test.nodeID, "", "", test.userAgent, test.allowEmptyCloudConfig, 25.0, 50) + cloud, err := GetCloudProvider(test.kubeconfig, test.nodeID, "", "", test.userAgent, test.allowEmptyCloudConfig, 25.0, 50) if !reflect.DeepEqual(err, test.expectedErr) && test.expectedErr != nil && !strings.Contains(err.Error(), test.expectedErr.Error()) { t.Errorf("desc: %s,\n input: %q, GetCloudProvider err: %v, expectedErr: %v", test.desc, test.kubeconfig, err, test.expectedErr) } diff --git a/pkg/blob/blob.go b/pkg/blob/blob.go index ec038106a..d591fbbdc 100644 --- a/pkg/blob/blob.go +++ b/pkg/blob/blob.go @@ -153,22 +153,15 @@ var ( type DriverOptions struct { NodeID string DriverName string - CloudConfigSecretName string - CloudConfigSecretNamespace string - CustomUserAgent string - UserAgentSuffix string BlobfuseProxyEndpoint string EnableBlobfuseProxy bool BlobfuseProxyConnTimout int EnableBlobMockMount bool - AllowEmptyCloudConfig bool AllowInlineVolumeKeyAccessWithIdentity bool EnableGetVolumeStats bool AppendTimeStampInCacheDir bool AppendMountErrorHelpLink bool MountPermissions uint64 - KubeAPIQPS float64 - KubeAPIBurst int EnableAznfsMount bool VolStatsCacheExpireInMinutes int SasTokenExpirationMinutes int @@ -178,24 +171,17 @@ type DriverOptions struct { type Driver struct { csicommon.CSIDriver - cloud *azure.Cloud - cloudConfigSecretName string - cloudConfigSecretNamespace string - customUserAgent string - userAgentSuffix string - blobfuseProxyEndpoint string + cloud *azure.Cloud + blobfuseProxyEndpoint string // enableBlobMockMount is only for testing, DO NOT set as true in non-testing scenario enableBlobMockMount bool enableBlobfuseProxy bool - allowEmptyCloudConfig bool enableGetVolumeStats bool allowInlineVolumeKeyAccessWithIdentity bool appendTimeStampInCacheDir bool appendMountErrorHelpLink bool blobfuseProxyConnTimout int mountPermissions uint64 - kubeAPIQPS float64 - kubeAPIBurst int enableAznfsMount bool mounter *mount.SafeFormatAndMount volLockMap *util.LockMap @@ -220,26 +206,19 @@ type Driver struct { // NewDriver Creates a NewCSIDriver object. Assumes vendor version is equal to driver version & // does not support optional driver plugin info manifest field. Refer to CSI spec for more details. -func NewDriver(options *DriverOptions) *Driver { +func NewDriver(options *DriverOptions, cloud *azure.Cloud) *Driver { d := Driver{ volLockMap: util.NewLockMap(), subnetLockMap: util.NewLockMap(), volumeLocks: newVolumeLocks(), - cloudConfigSecretName: options.CloudConfigSecretName, - cloudConfigSecretNamespace: options.CloudConfigSecretNamespace, - customUserAgent: options.CustomUserAgent, - userAgentSuffix: options.UserAgentSuffix, blobfuseProxyEndpoint: options.BlobfuseProxyEndpoint, enableBlobfuseProxy: options.EnableBlobfuseProxy, allowInlineVolumeKeyAccessWithIdentity: options.AllowInlineVolumeKeyAccessWithIdentity, blobfuseProxyConnTimout: options.BlobfuseProxyConnTimout, enableBlobMockMount: options.EnableBlobMockMount, - allowEmptyCloudConfig: options.AllowEmptyCloudConfig, enableGetVolumeStats: options.EnableGetVolumeStats, appendMountErrorHelpLink: options.AppendMountErrorHelpLink, mountPermissions: options.MountPermissions, - kubeAPIQPS: options.KubeAPIQPS, - kubeAPIBurst: options.KubeAPIBurst, enableAznfsMount: options.EnableAznfsMount, sasTokenExpirationMinutes: options.SasTokenExpirationMinutes, azcopy: &util.Azcopy{}, @@ -263,25 +242,7 @@ func NewDriver(options *DriverOptions) *Driver { if d.volStatsCache, err = azcache.NewTimedCache(time.Duration(options.VolStatsCacheExpireInMinutes)*time.Minute, getter, false); err != nil { klog.Fatalf("%v", err) } - return &d -} - -// Run driver initialization -func (d *Driver) Run(endpoint, kubeconfig string, testBool bool) { - versionMeta, err := GetVersionYAML(d.Name) - if err != nil { - klog.Fatalf("%v", err) - } - klog.Infof("\nDRIVER INFORMATION:\n-------------------\n%s\n\nStreaming logs below:", versionMeta) - - userAgent := GetUserAgent(d.Name, d.customUserAgent, d.userAgentSuffix) - klog.V(2).Infof("driver userAgent: %s", userAgent) - d.cloud, err = getCloudProvider(kubeconfig, d.NodeID, d.cloudConfigSecretName, d.cloudConfigSecretNamespace, userAgent, d.allowEmptyCloudConfig, d.kubeAPIQPS, d.kubeAPIBurst) - if err != nil { - klog.Fatalf("failed to get Azure Cloud Provider, error: %v", err) - } - klog.V(2).Infof("cloud: %s, location: %s, rg: %s, VnetName: %s, VnetResourceGroup: %s, SubnetName: %s", d.cloud.Cloud, d.cloud.Location, d.cloud.ResourceGroup, d.cloud.VnetName, d.cloud.VnetResourceGroup, d.cloud.SubnetName) - + d.cloud = cloud d.mounter = &mount.SafeFormatAndMount{ Interface: mount.New(""), Exec: utilexec.New(), @@ -316,6 +277,17 @@ func (d *Driver) Run(endpoint, kubeconfig string, testBool bool) { } d.AddNodeServiceCapabilities(nodeCap) + return &d +} + +// Run driver initialization +func (d *Driver) Run(endpoint string, testBool bool) { + versionMeta, err := GetVersionYAML(d.Name) + if err != nil { + klog.Fatalf("%v", err) + } + klog.Infof("\nDRIVER INFORMATION:\n-------------------\n%s\n\nStreaming logs below:", versionMeta) + s := csicommon.NewNonBlockingGRPCServer() // Driver d act as IdentityServer, ControllerServer and NodeServer s.Start(endpoint, d, d, d, testBool) diff --git a/pkg/blob/blob_test.go b/pkg/blob/blob_test.go index 61a5929f8..2645ce50e 100644 --- a/pkg/blob/blob_test.go +++ b/pkg/blob/blob_test.go @@ -56,11 +56,10 @@ func NewFakeDriver() *Driver { BlobfuseProxyConnTimout: 5, EnableBlobMockMount: false, } - driver := NewDriver(&driverOptions) + driver := NewDriver(&driverOptions, &azure.Cloud{}) driver.Name = fakeDriverName driver.Version = vendorVersion driver.subnetLockMap = util.NewLockMap() - driver.cloud = &azure.Cloud{} return driver } @@ -73,7 +72,7 @@ func TestNewFakeDriver(t *testing.T) { BlobfuseProxyConnTimout: 5, EnableBlobMockMount: false, } - d := NewDriver(&driverOptions) + d := NewDriver(&driverOptions, &azure.Cloud{}) assert.NotNil(t, d) } @@ -86,7 +85,7 @@ func TestNewDriver(t *testing.T) { BlobfuseProxyConnTimout: 5, EnableBlobMockMount: false, } - driver := NewDriver(&driverOptions) + driver := NewDriver(&driverOptions, &azure.Cloud{}) fakedriver := NewFakeDriver() fakedriver.Name = DefaultDriverName fakedriver.Version = driverVersion @@ -134,7 +133,7 @@ func TestRun(t *testing.T) { os.Setenv(DefaultAzureCredentialFileEnv, fakeCredFile) d := NewFakeDriver() - d.Run("tcp://127.0.0.1:0", "", true) + d.Run("tcp://127.0.0.1:0", true) }, }, { @@ -161,7 +160,7 @@ func TestRun(t *testing.T) { d := NewFakeDriver() d.cloud = &azure.Cloud{} d.NodeID = "" - d.Run("tcp://127.0.0.1:0", "", true) + d.Run("tcp://127.0.0.1:0", true) }, }, } diff --git a/pkg/blob/controllerserver_test.go b/pkg/blob/controllerserver_test.go index 6cb3952f3..86869d3c0 100644 --- a/pkg/blob/controllerserver_test.go +++ b/pkg/blob/controllerserver_test.go @@ -163,18 +163,6 @@ func TestCreateVolume(t *testing.T) { name string testFunc func(t *testing.T) }{ - { - name: "invalid create volume req", - testFunc: func(t *testing.T) { - d := NewFakeDriver() - req := &csi.CreateVolumeRequest{} - _, err := d.CreateVolume(context.Background(), req) - expectedErr := status.Error(codes.InvalidArgument, "CREATE_DELETE_VOLUME") - if !reflect.DeepEqual(err, expectedErr) { - t.Errorf("actualErr: (%v), expectedErr: (%v)", err, expectedErr) - } - }, - }, { name: "volume Name missing", testFunc: func(t *testing.T) { @@ -893,20 +881,6 @@ func TestDeleteVolume(t *testing.T) { } }, }, - { - name: "invalid delete volume req", - testFunc: func(t *testing.T) { - d := NewFakeDriver() - req := &csi.DeleteVolumeRequest{ - VolumeId: "unit-test", - } - _, err := d.DeleteVolume(context.Background(), req) - expectedErr := status.Errorf(codes.Internal, "invalid delete volume req: volume_id:\"unit-test\" ") - if !reflect.DeepEqual(err, expectedErr) { - t.Errorf("actualErr: (%v), expectedErr: (%v)", err, expectedErr) - } - }, - }, { name: "invalid volume Id", testFunc: func(t *testing.T) { @@ -1298,21 +1272,6 @@ func TestControllerExpandVolume(t *testing.T) { } }, }, - { - name: "invalid expand volume req", - testFunc: func(t *testing.T) { - d := NewFakeDriver() - req := &csi.ControllerExpandVolumeRequest{ - VolumeId: "unit-test", - CapacityRange: &csi.CapacityRange{}, - } - _, err := d.ControllerExpandVolume(context.Background(), req) - expectedErr := status.Errorf(codes.Internal, "invalid expand volume req: volume_id:\"unit-test\" capacity_range:<> ") - if !reflect.DeepEqual(err, expectedErr) { - t.Errorf("actualErr: (%v), expectedErr: (%v)", err, expectedErr) - } - }, - }, { name: "Volume Size exceeds Max Container Size", testFunc: func(t *testing.T) { diff --git a/pkg/blobplugin/main.go b/pkg/blobplugin/main.go index d9f8e0e1d..13f41bad2 100644 --- a/pkg/blobplugin/main.go +++ b/pkg/blobplugin/main.go @@ -81,31 +81,34 @@ func handle() { driverOptions := blob.DriverOptions{ NodeID: *nodeID, DriverName: *driverName, - CloudConfigSecretName: *cloudConfigSecretName, - CloudConfigSecretNamespace: *cloudConfigSecretNamespace, BlobfuseProxyEndpoint: *blobfuseProxyEndpoint, EnableBlobfuseProxy: *enableBlobfuseProxy, BlobfuseProxyConnTimout: *blobfuseProxyConnTimout, EnableBlobMockMount: *enableBlobMockMount, - CustomUserAgent: *customUserAgent, - UserAgentSuffix: *userAgentSuffix, - AllowEmptyCloudConfig: *allowEmptyCloudConfig, EnableGetVolumeStats: *enableGetVolumeStats, AppendTimeStampInCacheDir: *appendTimeStampInCacheDir, MountPermissions: *mountPermissions, AllowInlineVolumeKeyAccessWithIdentity: *allowInlineVolumeKeyAccessWithIdentity, AppendMountErrorHelpLink: *appendMountErrorHelpLink, - KubeAPIQPS: *kubeAPIQPS, - KubeAPIBurst: *kubeAPIBurst, EnableAznfsMount: *enableAznfsMount, VolStatsCacheExpireInMinutes: *volStatsCacheExpireInMinutes, SasTokenExpirationMinutes: *sasTokenExpirationMinutes, } - driver := blob.NewDriver(&driverOptions) + + userAgent := blob.GetUserAgent(driverOptions.DriverName, *customUserAgent, *userAgentSuffix) + klog.V(2).Infof("driver userAgent: %s", userAgent) + + cloud, err := blob.GetCloudProvider(*kubeconfig, driverOptions.NodeID, *cloudConfigSecretName, *cloudConfigSecretNamespace, userAgent, *allowEmptyCloudConfig, *kubeAPIQPS, *kubeAPIBurst) + if err != nil { + klog.Fatalf("failed to get Azure Cloud Provider, error: %v", err) + } + klog.V(2).Infof("cloud: %s, location: %s, rg: %s, VnetName: %s, VnetResourceGroup: %s, SubnetName: %s", cloud.Cloud, cloud.Location, cloud.ResourceGroup, cloud.VnetName, cloud.VnetResourceGroup, cloud.SubnetName) + + driver := blob.NewDriver(&driverOptions, cloud) if driver == nil { klog.Fatalln("Failed to initialize Azure Blob Storage CSI driver") } - driver.Run(*endpoint, *kubeconfig, false) + driver.Run(*endpoint, false) } func exportMetrics() { diff --git a/test/e2e/suite_test.go b/test/e2e/suite_test.go index 1335bcfe2..865d2e338 100644 --- a/test/e2e/suite_test.go +++ b/test/e2e/suite_test.go @@ -142,6 +142,7 @@ var _ = ginkgo.SynchronizedBeforeSuite(func(ctx ginkgo.SpecContext) []byte { // spin up a blob driver locally to make use of the azure client and controller service kubeconfig := os.Getenv(kubeconfigEnvVar) _, useBlobfuseProxy := os.LookupEnv("ENABLE_BLOBFUSE_PROXY") + os.Setenv("AZURE_CREDENTIAL_FILE", credentials.TempAzureCredentialFilePath) driverOptions := blob.DriverOptions{ NodeID: os.Getenv("nodeid"), DriverName: blob.DefaultDriverName, @@ -150,10 +151,11 @@ var _ = ginkgo.SynchronizedBeforeSuite(func(ctx ginkgo.SpecContext) []byte { BlobfuseProxyConnTimout: 5, EnableBlobMockMount: false, } - blobDriver = blob.NewDriver(&driverOptions) + cloud, err := blob.GetCloudProvider(kubeconfig, driverOptions.NodeID, "", "", "", false, 0, 0) + gomega.Expect(err).NotTo(gomega.HaveOccurred()) + blobDriver = blob.NewDriver(&driverOptions, cloud) go func() { - os.Setenv("AZURE_CREDENTIAL_FILE", credentials.TempAzureCredentialFilePath) - blobDriver.Run(fmt.Sprintf("unix:///tmp/csi-%s.sock", uuid.NewUUID().String()), kubeconfig, false) + blobDriver.Run(fmt.Sprintf("unix:///tmp/csi-%s.sock", uuid.NewUUID().String()), false) }() })