Skip to content

Commit 8b5db5b

Browse files
committed
feat: add accountQuota parameter
1 parent 8b4b557 commit 8b5db5b

File tree

3 files changed

+32
-6
lines changed

3 files changed

+32
-6
lines changed

pkg/azurefile/azurefile.go

+14
Original file line numberDiff line numberDiff line change
@@ -870,6 +870,20 @@ func (d *Driver) ResizeFileShare(ctx context.Context, subsID, resourceGroup, acc
870870
})
871871
}
872872

873+
func (d *Driver) GetTotalQuotaGB(ctx context.Context, subsID, resourceGroup, accountName string) (int32, int32, error) {
874+
fileshares, err := d.cloud.FileClient.WithSubscriptionID(subsID).ListFileShare(ctx, resourceGroup, accountName, "", "")
875+
if err != nil {
876+
return -1, -1, err
877+
}
878+
var totalQuotaGB int32
879+
for _, fs := range fileshares {
880+
if fs.ShareQuota != nil {
881+
totalQuotaGB += *fs.ShareQuota
882+
}
883+
}
884+
return totalQuotaGB, int32(len(fileshares)), nil
885+
}
886+
873887
// RemoveStorageAccountTag remove tag from storage account
874888
func (d *Driver) RemoveStorageAccountTag(ctx context.Context, subsID, resourceGroup, account, key string) error {
875889
// search in cache first

pkg/azurefile/controllerserver.go

+17-5
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@ var (
7777
Mode: csi.VolumeCapability_AccessMode_MULTI_NODE_MULTI_WRITER,
7878
},
7979
}
80+
skipMatchingTag = map[string]*string{azure.SkipMatchingTag: pointer.String("")}
8081
)
8182

8283
// CreateVolume provisions an azure file
@@ -452,6 +453,20 @@ func (d *Driver) CreateVolume(ctx context.Context, req *csi.CreateVolumeRequest)
452453
if err != nil {
453454
return nil, status.Errorf(codes.Internal, "failed to ensure storage account: %v", err)
454455
}
456+
totalQuotaGB, fileshareNum, err := d.GetTotalQuotaGB(ctx, subsID, resourceGroup, accountName)
457+
if err != nil {
458+
return nil, status.Errorf(codes.Internal, "failed to get total quota on account(%s), error: %v", accountName, err)
459+
}
460+
klog.V(2).Infof("total used quota on account(%s) is %d GB, file share number: %d", accountName, totalQuotaGB, fileshareNum)
461+
if totalQuotaGB > 81920 {
462+
klog.Warningf("account(%s) used quota(%d GB) is over 81920 GB, skip matching current account", accountName, totalQuotaGB)
463+
if rerr := d.cloud.AddStorageAccountTags(ctx, subsID, resourceGroup, accountName, skipMatchingTag); rerr != nil {
464+
klog.Warningf("AddStorageAccountTags(%v) on account(%s) subsID(%s) rg(%s) failed with error: %v", tags, accountName, subsID, resourceGroup, rerr.Error())
465+
}
466+
// release volume lock first to prevent deadlock
467+
d.volumeLocks.Release(volName)
468+
return d.CreateVolume(ctx, req)
469+
}
455470
d.accountSearchCache.Set(lockKey, accountName)
456471
d.volMap.Store(volName, accountName)
457472
if accountKey != "" {
@@ -502,10 +517,7 @@ func (d *Driver) CreateVolume(ctx context.Context, req *csi.CreateVolumeRequest)
502517
if err := d.CreateFileShare(ctx, accountOptions, shareOptions, secret); err != nil {
503518
if strings.Contains(err.Error(), accountLimitExceedManagementAPI) || strings.Contains(err.Error(), accountLimitExceedDataPlaneAPI) {
504519
klog.Warningf("create file share(%s) on account(%s) type(%s) subID(%s) rg(%s) location(%s) size(%d), error: %v, skip matching current account", validFileShareName, accountName, sku, subsID, resourceGroup, location, fileShareSize, err)
505-
tags := map[string]*string{
506-
azure.SkipMatchingTag: pointer.String(""),
507-
}
508-
if rerr := d.cloud.AddStorageAccountTags(ctx, subsID, resourceGroup, accountName, tags); rerr != nil {
520+
if rerr := d.cloud.AddStorageAccountTags(ctx, subsID, resourceGroup, accountName, skipMatchingTag); rerr != nil {
509521
klog.Warningf("AddStorageAccountTags(%v) on account(%s) subsID(%s) rg(%s) failed with error: %v", tags, accountName, subsID, resourceGroup, rerr.Error())
510522
}
511523
// release volume lock first to prevent deadlock
@@ -514,7 +526,7 @@ func (d *Driver) CreateVolume(ctx context.Context, req *csi.CreateVolumeRequest)
514526
if err := d.accountSearchCache.Delete(lockKey); err != nil {
515527
return nil, status.Errorf(codes.Internal, err.Error())
516528
}
517-
// remove the volName from the volMap to stop it matching the same storage account
529+
// remove the volName from the volMap to stop matching the same storage account
518530
d.volMap.Delete(volName)
519531
return d.CreateVolume(ctx, req)
520532
}

pkg/azurefile/controllerserver_test.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -895,7 +895,7 @@ func TestCreateVolume(t *testing.T) {
895895
mockStorageAccountsClient.EXPECT().ListByResourceGroup(gomock.Any(), gomock.Any(), gomock.Any()).Return(accounts, nil).AnyTimes()
896896
mockStorageAccountsClient.EXPECT().Create(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(nil).AnyTimes()
897897
mockFileClient.EXPECT().GetFileShare(context.TODO(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(storage.FileShare{FileShareProperties: &storage.FileShareProperties{ShareQuota: nil}}, fmt.Errorf("test error")).AnyTimes()
898-
898+
mockFileClient.EXPECT().ListFileShare(context.TODO(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return([]storage.FileShareItem{}, nil).AnyTimes()
899899
d.AddControllerServiceCapabilities(
900900
[]csi.ControllerServiceCapability_RPC_Type{
901901
csi.ControllerServiceCapability_RPC_CREATE_DELETE_VOLUME,

0 commit comments

Comments
 (0)