Skip to content

Commit 824242a

Browse files
committed
feat: support provisionedBandwidth, provisionedIops parameter for share v2
revert
1 parent 415a480 commit 824242a

File tree

5 files changed

+84
-44
lines changed

5 files changed

+84
-44
lines changed

pkg/azurefile/azurefile.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,8 @@ const (
133133
mountOptionsField = "mountoptions"
134134
mountPermissionsField = "mountpermissions"
135135
encryptInTransitField = "encryptintransit"
136+
provisionedBandwidthField = "provisionedbandwidth"
137+
provisionedIopsField = "provisionediops"
136138
falseValue = "false"
137139
trueValue = "true"
138140
defaultSecretAccountName = "azurestorageaccountname"

pkg/azurefile/azurefile_interface.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,11 @@ type ShareOptions struct {
3838
RootSquash string
3939
// Metadata - A name-value pair to associate with the share as metadata.
4040
Metadata map[string]*string
41+
// The provisioned bandwidth of the share, in mebibytes per second. This property is only for file shares created under Files
42+
// Provisioned v2 account type
43+
ProvisionedBandwidthMibps *int32
44+
// The provisioned IOPS of the share. This property is only for file shares created under Files Provisioned v2 account type.
45+
ProvisionedIops *int32
4146
}
4247

4348
type azureFileClient interface {

pkg/azurefile/azurefile_mgmt_client.go

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,8 +62,11 @@ func (az *azureFileMgmtClient) CreateFileShare(ctx context.Context, shareOptions
6262
az.accountOptions.EnableHTTPSTrafficOnly = false
6363
}
6464
shareOps := armstorage.FileShare{
65-
Name: to.Ptr(shareOptions.Name),
66-
FileShareProperties: &armstorage.FileShareProperties{},
65+
Name: to.Ptr(shareOptions.Name),
66+
FileShareProperties: &armstorage.FileShareProperties{
67+
ProvisionedBandwidthMibps: shareOptions.ProvisionedBandwidthMibps,
68+
ProvisionedIops: shareOptions.ProvisionedIops,
69+
},
6770
}
6871
if shareOptions.RequestGiB > 0 {
6972
quota := int32(shareOptions.RequestGiB)

pkg/azurefile/controllerserver.go

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,7 @@ func (d *Driver) CreateVolume(ctx context.Context, req *csi.CreateVolumeRequest)
120120
var createAccount, useSeretCache, matchTags, selectRandomMatchingAccount, getLatestAccountKey, encryptInTransit bool
121121
var vnetResourceGroup, vnetName, vnetLinkName, publicNetworkAccess, subnetName, shareNamePrefix, fsGroupChangePolicy, useDataPlaneAPI string
122122
var requireInfraEncryption, disableDeleteRetentionPolicy, enableLFS, isMultichannelEnabled, allowSharedKeyAccess *bool
123+
var provisionedBandwidthMibps, provisionedIops *int32
123124
// set allowBlobPublicAccess as false by default
124125
allowBlobPublicAccess := ptr.To(false)
125126

@@ -279,6 +280,18 @@ func (d *Driver) CreateVolume(ctx context.Context, req *csi.CreateVolumeRequest)
279280
if err != nil {
280281
return nil, status.Errorf(codes.InvalidArgument, "invalid %s: %s in storage class", encryptInTransitField, v)
281282
}
283+
case provisionedBandwidthField:
284+
value, err := strconv.ParseInt(v, 10, 32)
285+
if err != nil || value < 0 {
286+
return nil, status.Errorf(codes.InvalidArgument, "invalid provisionedBandwidth %s in storage class", v)
287+
}
288+
provisionedBandwidthMibps = to.Ptr(int32(value))
289+
case provisionedIopsField:
290+
value, err := strconv.ParseInt(v, 10, 32)
291+
if err != nil || value < 0 {
292+
return nil, status.Errorf(codes.InvalidArgument, "invalid provisionedIops %s in storage class", v)
293+
}
294+
provisionedIops = to.Ptr(int32(value))
282295
default:
283296
return nil, status.Errorf(codes.InvalidArgument, "invalid parameter %q in storage class", k)
284297
}
@@ -598,12 +611,14 @@ func (d *Driver) CreateVolume(ctx context.Context, req *csi.CreateVolumeRequest)
598611
}
599612

600613
shareOptions := &ShareOptions{
601-
Name: validFileShareName,
602-
Protocol: shareProtocol,
603-
RequestGiB: fileShareSize,
604-
AccessTier: shareAccessTier,
605-
RootSquash: rootSquashType,
606-
Metadata: map[string]*string{createdByMetadata: ptr.To(d.Name)},
614+
Name: validFileShareName,
615+
Protocol: shareProtocol,
616+
RequestGiB: fileShareSize,
617+
AccessTier: shareAccessTier,
618+
RootSquash: rootSquashType,
619+
ProvisionedBandwidthMibps: provisionedBandwidthMibps,
620+
ProvisionedIops: provisionedIops,
621+
Metadata: map[string]*string{createdByMetadata: ptr.To(d.Name)},
607622
}
608623

609624
klog.V(2).Infof("begin to create file share(%s) on account(%s) type(%s) subID(%s) rg(%s) location(%s) size(%d) protocol(%s)", validFileShareName, accountName, sku, subsID, resourceGroup, location, fileShareSize, shareProtocol)

pkg/azurefile/controllerserver_test.go

Lines changed: 51 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -906,20 +906,22 @@ var _ = ginkgo.Describe("TestCreateVolume", func() {
906906
}
907907

908908
allParam := map[string]string{
909-
skuNameField: "premium",
910-
storageAccountTypeField: "stoacctype",
911-
locationField: "loc",
912-
storageAccountField: "stoacc",
913-
resourceGroupField: "rg",
914-
shareNameField: "",
915-
diskNameField: "diskname.vhd",
916-
fsTypeField: "",
917-
storeAccountKeyField: "storeaccountkey",
918-
secretNamespaceField: "default",
919-
mountPermissionsField: "0755",
920-
accountQuotaField: "1000",
921-
useDataPlaneAPIField: "oauth",
922-
clientIDField: "client-id",
909+
skuNameField: "premium",
910+
storageAccountTypeField: "stoacctype",
911+
locationField: "loc",
912+
storageAccountField: "stoacc",
913+
resourceGroupField: "rg",
914+
shareNameField: "",
915+
diskNameField: "diskname.vhd",
916+
fsTypeField: "",
917+
storeAccountKeyField: "storeaccountkey",
918+
secretNamespaceField: "default",
919+
mountPermissionsField: "0755",
920+
accountQuotaField: "1000",
921+
useDataPlaneAPIField: "oauth",
922+
clientIDField: "client-id",
923+
provisionedBandwidthField: "100",
924+
provisionedIopsField: "800",
923925
}
924926

925927
req := &csi.CreateVolumeRequest{
@@ -1005,42 +1007,55 @@ var _ = ginkgo.Describe("TestCreateVolume", func() {
10051007

10061008
ginkgo.When("invalid mountPermissions", func() {
10071009
ginkgo.It("should fail", func(ctx context.Context) {
1008-
name := "baz"
1009-
SKU := "SKU"
1010-
kind := "StorageV2"
1011-
location := "centralus"
1012-
value := "foo bar"
1013-
accounts := []*armstorage.Account{
1014-
{Name: &name, SKU: &armstorage.SKU{Name: to.Ptr(armstorage.SKUName(SKU))}, Kind: to.Ptr(armstorage.Kind(kind)), Location: &location},
1015-
}
1016-
keys := []*armstorage.AccountKey{
1017-
{Value: &value},
1010+
req := &csi.CreateVolumeRequest{
1011+
Name: "random-vol-name-valid-request",
1012+
VolumeCapabilities: stdVolCap,
1013+
CapacityRange: lessThanPremCapRange,
1014+
Parameters: map[string]string{
1015+
mountPermissionsField: "0abc",
1016+
},
10181017
}
10191018

1020-
allParam := map[string]string{
1021-
mountPermissionsField: "0abc",
1022-
}
1019+
expectedErr := status.Errorf(codes.InvalidArgument, "invalid %s %s in storage class", "mountPermissions", "0abc")
1020+
_, err := d.CreateVolume(ctx, req)
1021+
gomega.Expect(err).To(gomega.Equal(expectedErr))
1022+
})
1023+
})
10231024

1025+
ginkgo.When("invalid provisionedBandwidth", func() {
1026+
ginkgo.It("should fail", func(ctx context.Context) {
10241027
req := &csi.CreateVolumeRequest{
1025-
Name: "random-vol-name-valid-request",
1028+
Name: "invalid-provisionedBandwidth",
10261029
VolumeCapabilities: stdVolCap,
10271030
CapacityRange: lessThanPremCapRange,
1028-
Parameters: allParam,
1031+
Parameters: map[string]string{
1032+
provisionedBandwidthField: "abc",
1033+
},
10291034
}
10301035

1031-
mockStorageAccountsClient := d.cloud.ComputeClientFactory.GetAccountClient().(*mock_accountclient.MockInterface)
1036+
expectedErr := status.Errorf(codes.InvalidArgument, "invalid %s %s in storage class", "provisionedBandwidth", "abc")
1037+
_, err := d.CreateVolume(ctx, req)
1038+
gomega.Expect(err).To(gomega.Equal(expectedErr))
1039+
})
1040+
})
10321041

1033-
mockFileClient.EXPECT().Create(ctx, gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(&armstorage.FileShare{FileShareProperties: &armstorage.FileShareProperties{ShareQuota: nil}}, nil).AnyTimes()
1034-
mockStorageAccountsClient.EXPECT().ListKeys(gomock.Any(), gomock.Any(), gomock.Any()).Return(keys, nil).AnyTimes()
1035-
mockStorageAccountsClient.EXPECT().List(gomock.Any(), gomock.Any()).Return(accounts, nil).AnyTimes()
1036-
mockStorageAccountsClient.EXPECT().Create(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(nil, nil).AnyTimes()
1037-
mockFileClient.EXPECT().Get(ctx, gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(&armstorage.FileShare{FileShareProperties: &armstorage.FileShareProperties{ShareQuota: &fakeShareQuota}}, nil).AnyTimes()
1042+
ginkgo.When("invalid provisionedIops", func() {
1043+
ginkgo.It("should fail", func(ctx context.Context) {
1044+
req := &csi.CreateVolumeRequest{
1045+
Name: "invalid-provisionedIops",
1046+
VolumeCapabilities: stdVolCap,
1047+
CapacityRange: lessThanPremCapRange,
1048+
Parameters: map[string]string{
1049+
provisionedIopsField: "abc",
1050+
},
1051+
}
10381052

1039-
expectedErr := status.Errorf(codes.InvalidArgument, "invalid %s %s in storage class", "mountPermissions", "0abc")
1053+
expectedErr := status.Errorf(codes.InvalidArgument, "invalid %s %s in storage class", "provisionedIops", "abc")
10401054
_, err := d.CreateVolume(ctx, req)
10411055
gomega.Expect(err).To(gomega.Equal(expectedErr))
10421056
})
10431057
})
1058+
10441059
ginkgo.When("invalid parameter", func() {
10451060
ginkgo.It("should fail", func(ctx context.Context) {
10461061
name := "baz"

0 commit comments

Comments
 (0)