Skip to content

Commit 110f531

Browse files
authored
Make ANF volumes a multiple of 1 GiB
1 parent 6b50554 commit 110f531

File tree

3 files changed

+86
-12
lines changed

3 files changed

+86
-12
lines changed

pkg/capacity/capacity.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,10 @@ import (
1414
"github.com/netapp/trident/pkg/maths"
1515
)
1616

17+
const (
18+
OneGiB = uint64(1073741824)
19+
)
20+
1721
// ///////////////////////////////////////////////////////////////////////////
1822
//
1923
// Binary units

storage_drivers/azure/azure_anf.go

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -38,18 +38,17 @@ import (
3838
)
3939

4040
const (
41-
MinimumVolumeSizeBytes = uint64(1000000000) // 1 GB
42-
MinimumANFVolumeSizeBytes = uint64(53687091200) // 50 GiB
41+
MinimumANFVolumeSizeBytes = capacity.OneGiB * 50 // 50 GiB
4342

4443
defaultUnixPermissions = "" // TODO (cknight): change to "0777" when whitelisted permissions feature reaches GA
4544
defaultNfsMountOptions = "nfsvers=3"
4645
defaultKerberosNfsMountOptions = "nfsvers=4.1"
4746
defaultSnapshotDir = ""
4847
defaultLimitVolumeSize = ""
4948
defaultExportRule = "0.0.0.0/0"
50-
defaultVolumeSizeStr = "53687091200"
51-
defaultNetworkFeatures = "" // Leave empty, some regions may never support this
52-
defaultMaxThroughput = "4"
49+
defaultVolumeSizeStr = "53687091200" // 50 GiB
50+
defaultNetworkFeatures = "" // Leave empty, some regions may never support this
51+
defaultMaxThroughput = "4" // MiB/s
5352
defaultQOSType = api.QOSAuto
5453

5554
// Constants for internal pool attributes
@@ -858,10 +857,8 @@ func (d *NASStorageDriver) Create(
858857
defaultSize, _ := capacity.ToBytes(pool.InternalAttributes()[Size])
859858
sizeBytes, _ = strconv.ParseUint(defaultSize, 10, 64)
860859
}
861-
if err = drivers.CheckMinVolumeSize(sizeBytes, MinimumVolumeSizeBytes); err != nil {
862-
return err
863-
}
864860

861+
// Enforce minimum volume size
865862
if sizeBytes < MinimumANFVolumeSizeBytes {
866863

867864
Logc(ctx).WithFields(LogFields{
@@ -872,6 +869,11 @@ func (d *NASStorageDriver) Create(
872869
sizeBytes = MinimumANFVolumeSizeBytes
873870
}
874871

872+
// Ensure sizeBytes is a multiple of 1 GiB
873+
if remainder := sizeBytes % capacity.OneGiB; remainder != 0 {
874+
sizeBytes = ((sizeBytes / capacity.OneGiB) + 1) * capacity.OneGiB
875+
}
876+
875877
if _, _, err = drivers.CheckVolumeSizeLimits(ctx, sizeBytes, d.Config.CommonStorageDriverConfig); err != nil {
876878
return err
877879
}
@@ -2222,6 +2224,11 @@ func (d *NASStorageDriver) Resize(ctx context.Context, volConfig *storage.Volume
22222224
return err
22232225
}
22242226

2227+
// Ensure sizeBytes is a multiple of 1 GiB
2228+
if remainder := sizeBytes % capacity.OneGiB; remainder != 0 {
2229+
sizeBytes = ((sizeBytes / capacity.OneGiB) + 1) * capacity.OneGiB
2230+
}
2231+
22252232
// Resize the volume
22262233
if err = d.SDK.ResizeVolume(ctx, volume, int64(sizeBytes)); err != nil {
22272234
return err

storage_drivers/azure/azure_anf_test.go

Lines changed: 67 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import (
2222
. "github.com/netapp/trident/logging"
2323
mockacp "github.com/netapp/trident/mocks/mock_acp"
2424
mockapi "github.com/netapp/trident/mocks/mock_storage_drivers/mock_azure"
25+
"github.com/netapp/trident/pkg/capacity"
2526
"github.com/netapp/trident/pkg/convert"
2627
"github.com/netapp/trident/storage"
2728
storagefake "github.com/netapp/trident/storage/fake"
@@ -2632,7 +2633,7 @@ func TestCreate_ZeroSize(t *testing.T) {
26322633
assert.Equal(t, filesystem.ID, volConfig.InternalID, "internal ID not set on volConfig")
26332634
}
26342635

2635-
func TestCreate_BelowAbsoluteMinimumSize(t *testing.T) {
2636+
func TestCreate_BelowMinimumSize(t *testing.T) {
26362637
mockAPI, driver := newMockANFDriver(t)
26372638
driver.Config.BackendName = "anf"
26382639
driver.Config.ServiceLevel = api.ServiceLevelUltra
@@ -2643,16 +2644,58 @@ func TestCreate_BelowAbsoluteMinimumSize(t *testing.T) {
26432644

26442645
storagePool := driver.pools["anf_pool"]
26452646

2646-
volConfig, _, _, _, _ := getStructsForCreateNFSVolume(ctx, driver, storagePool)
2647+
volConfig, capacityPool, subnet, createRequest, filesystem := getStructsForCreateNFSVolume(ctx, driver, storagePool)
26472648
volConfig.Size = "1k"
26482649

26492650
mockAPI.EXPECT().RefreshAzureResources(ctx).Return(nil).Times(1)
26502651
mockAPI.EXPECT().VolumeExists(ctx, volConfig).Return(false, nil, nil).Times(1)
2652+
mockAPI.EXPECT().HasFeature(api.FeatureUnixPermissions).Return(false).Times(1)
2653+
mockAPI.EXPECT().RandomSubnetForStoragePool(ctx, storagePool).Return(subnet).Times(1)
2654+
mockAPI.EXPECT().CapacityPoolsForStoragePool(ctx, storagePool,
2655+
api.ServiceLevelUltra, api.QOSAuto).Return([]*api.CapacityPool{capacityPool}).Times(1)
2656+
mockAPI.EXPECT().CreateVolume(ctx, createRequest).Return(filesystem, nil).Times(1)
2657+
mockAPI.EXPECT().WaitForVolumeState(ctx, filesystem, api.StateAvailable, []string{api.StateError},
2658+
driver.volumeCreateTimeout, api.Create).Return(api.StateAvailable, nil).Times(1)
26512659

26522660
result := driver.Create(ctx, volConfig, storagePool, nil)
26532661

2654-
assert.Error(t, result, "create did not fail")
2655-
assert.Equal(t, "", volConfig.InternalID, "internal ID set on volConfig")
2662+
assert.NoError(t, result, "create failed")
2663+
assert.Equal(t, createRequest.QuotaInBytes, DefaultVolumeSize, "request size mismatch")
2664+
assert.Equal(t, volConfig.Size, defaultVolumeSizeStr, "config size mismatch")
2665+
assert.Equal(t, filesystem.ID, volConfig.InternalID, "internal ID not set on volConfig")
2666+
}
2667+
2668+
func TestCreate_SizeNotGibMultiple(t *testing.T) {
2669+
mockAPI, driver := newMockANFDriver(t)
2670+
driver.Config.BackendName = "anf"
2671+
driver.Config.ServiceLevel = api.ServiceLevelUltra
2672+
2673+
driver.populateConfigurationDefaults(ctx, &driver.Config)
2674+
driver.initializeStoragePools(ctx)
2675+
driver.initializeTelemetry(ctx, BackendUUID)
2676+
2677+
storagePool := driver.pools["anf_pool"]
2678+
2679+
volConfig, capacityPool, subnet, createRequest, filesystem := getStructsForCreateNFSVolume(ctx, driver, storagePool)
2680+
volConfig.Size = "107374182401" // 100 GiB + 1 byte
2681+
createRequest.QuotaInBytes = int64(capacity.OneGiB * 101) // 101 GiB
2682+
2683+
mockAPI.EXPECT().RefreshAzureResources(ctx).Return(nil).Times(1)
2684+
mockAPI.EXPECT().VolumeExists(ctx, volConfig).Return(false, nil, nil).Times(1)
2685+
mockAPI.EXPECT().HasFeature(api.FeatureUnixPermissions).Return(false).Times(1)
2686+
mockAPI.EXPECT().RandomSubnetForStoragePool(ctx, storagePool).Return(subnet).Times(1)
2687+
mockAPI.EXPECT().CapacityPoolsForStoragePool(ctx, storagePool,
2688+
api.ServiceLevelUltra, api.QOSAuto).Return([]*api.CapacityPool{capacityPool}).Times(1)
2689+
mockAPI.EXPECT().CreateVolume(ctx, createRequest).Return(filesystem, nil).Times(1)
2690+
mockAPI.EXPECT().WaitForVolumeState(ctx, filesystem, api.StateAvailable, []string{api.StateError},
2691+
driver.volumeCreateTimeout, api.Create).Return(api.StateAvailable, nil).Times(1)
2692+
2693+
result := driver.Create(ctx, volConfig, storagePool, nil)
2694+
2695+
assert.NoError(t, result, "create failed")
2696+
assert.Equal(t, createRequest.QuotaInBytes, int64(108447924224), "request size mismatch")
2697+
assert.Equal(t, volConfig.Size, "108447924224", "config size mismatch") // 101 GiB
2698+
assert.Equal(t, filesystem.ID, volConfig.InternalID, "internal ID not set on volConfig")
26562699
}
26572700

26582701
func TestCreate_AboveMaximumSize(t *testing.T) {
@@ -7552,6 +7595,26 @@ func TestResize(t *testing.T) {
75527595
assert.Equal(t, filesystem.ID, volConfig.InternalID, "internal ID not set on volConfig")
75537596
}
75547597

7598+
func TestResize_SizeNotGibMultiple(t *testing.T) {
7599+
mockAPI, driver := newMockANFDriver(t)
7600+
driver.initializeTelemetry(ctx, BackendUUID)
7601+
7602+
volConfig, filesystem, _, _ := getStructsForDestroyNFSVolume(ctx, driver)
7603+
volConfig.InternalID = ""
7604+
newSize := (capacity.OneGiB * 100) + 1 // 100 GiB + 1 byte
7605+
expectedSize := capacity.OneGiB * 101 // 101 GiB
7606+
7607+
mockAPI.EXPECT().RefreshAzureResources(ctx).Return(nil).Times(1)
7608+
mockAPI.EXPECT().Volume(ctx, volConfig).Return(filesystem, nil).Times(1)
7609+
mockAPI.EXPECT().ResizeVolume(ctx, filesystem, int64(expectedSize)).Return(nil).Times(1)
7610+
7611+
result := driver.Resize(ctx, volConfig, newSize)
7612+
7613+
assert.Nil(t, result, "not nil")
7614+
assert.Equal(t, strconv.FormatUint(expectedSize, 10), volConfig.Size, "size mismatch")
7615+
assert.Equal(t, filesystem.ID, volConfig.InternalID, "internal ID not set on volConfig")
7616+
}
7617+
75557618
func TestResize_DiscoveryFailed(t *testing.T) {
75567619
mockAPI, driver := newMockANFDriver(t)
75577620
driver.initializeTelemetry(ctx, BackendUUID)

0 commit comments

Comments
 (0)