@@ -766,7 +766,7 @@ func TestCreateVolume(t *testing.T) {
766766 },
767767 resp : & csi.CreateVolumeResponse {
768768 Volume : & csi.Volume {
769- CapacityBytes : 1 * util .Tb ,
769+ CapacityBytes : 100 * util .Gb ,
770770 VolumeId : testVolumeID ,
771771 VolumeContext : map [string ]string {
772772 attrIP : testIP ,
@@ -931,8 +931,153 @@ func TestValidateVolumeCapabilities(t *testing.T) {
931931func TestControllerGetCapabilities (t * testing.T ) {
932932}
933933
934- // TODO:
935934func TestControllerExpandVolume (t * testing.T ) {
935+ type testCase struct {
936+ name string
937+ currentSize int64
938+ requiredCap int64
939+ tier string
940+ shouldError bool
941+ }
942+
943+ cases := []testCase {
944+ {
945+ name : "expand zonal small tier within bounds" ,
946+ currentSize : 2 * util .Tb ,
947+ requiredCap : 5 * util .Tb ,
948+ tier : zonalTier ,
949+ shouldError : false ,
950+ },
951+ {
952+ name : "expand zonal from small to large tier" ,
953+ currentSize : zonalSmallTierMaxSize ,
954+ requiredCap : 11 * util .Tb ,
955+ tier : zonalTier ,
956+ shouldError : true ,
957+ },
958+ {
959+ name : "expand zonal within large tier bounds" ,
960+ currentSize : 11 * util .Tb ,
961+ requiredCap : 50 * util .Tb ,
962+ tier : zonalTier ,
963+ shouldError : false ,
964+ },
965+ {
966+ name : "expand regional small tier within bounds" ,
967+ currentSize : 500 * util .Gb ,
968+ requiredCap : 2 * util .Tb ,
969+ tier : regionalTier ,
970+ shouldError : false ,
971+ },
972+ {
973+ name : "expand regional from 100 GB (new minimum) within bounds" ,
974+ currentSize : regionalSmallTierMinSize ,
975+ requiredCap : 500 * util .Gb ,
976+ tier : regionalTier ,
977+ shouldError : false ,
978+ },
979+ {
980+ name : "expand regional from small to large tier" ,
981+ currentSize : regionalSmallTierMaxSize ,
982+ requiredCap : 11 * util .Tb ,
983+ tier : regionalTier ,
984+ shouldError : true ,
985+ },
986+ {
987+ name : "expand regional within large tier bounds" ,
988+ currentSize : 11 * util .Tb ,
989+ requiredCap : 50 * util .Tb ,
990+ tier : regionalTier ,
991+ shouldError : false ,
992+ },
993+ {
994+ name : "expand regional small tier at new minimum boundary" ,
995+ currentSize : regionalSmallTierMinSize ,
996+ requiredCap : 3 * util .Tb ,
997+ tier : regionalTier ,
998+ shouldError : false ,
999+ },
1000+ {
1001+ name : "expand regional just below max small tier" ,
1002+ currentSize : 9 * util .Tb ,
1003+ requiredCap : 9500 * util .Gb ,
1004+ tier : regionalTier ,
1005+ shouldError : false ,
1006+ },
1007+ {
1008+ name : "expand regional at max small tier to large tier" ,
1009+ currentSize : regionalSmallTierMaxSize ,
1010+ requiredCap : regionalSmallTierMaxSize + 1 ,
1011+ tier : regionalTier ,
1012+ shouldError : true ,
1013+ },
1014+ }
1015+
1016+ for _ , tc := range cases {
1017+ t .Run (tc .name , func (t * testing.T ) {
1018+ // Create fake file service with an instance
1019+ fs , err := file .NewFakeService ()
1020+ if err != nil {
1021+ t .Fatalf ("failed to init fake file service: %v" , err )
1022+ }
1023+
1024+ instanceName := "test-expand-instance"
1025+ _ , err = fs .CreateInstance (context .Background (), & file.ServiceInstance {
1026+ Name : instanceName ,
1027+ Location : testZone ,
1028+ Tier : tc .tier ,
1029+ Volume : file.Volume {Name : newInstanceVolume , SizeBytes : tc .currentSize },
1030+ })
1031+ if err != nil {
1032+ t .Fatalf ("failed to create instance: %v" , err )
1033+ }
1034+
1035+ // Create controller
1036+ cloudProvider , err := cloud .NewFakeCloud ()
1037+ if err != nil {
1038+ t .Fatalf ("failed to create cloud provider: %v" , err )
1039+ }
1040+
1041+ ctrl := newControllerServer (& controllerServerConfig {
1042+ driver : initTestDriver (t ),
1043+ fileService : fs ,
1044+ cloud : cloudProvider ,
1045+ volumeLocks : util .NewVolumeLocks (),
1046+ features : & GCFSDriverFeatureOptions {FeatureLockRelease : & FeatureLockRelease {}},
1047+ tagManager : cloud .NewFakeTagManager (),
1048+ })
1049+
1050+ // Create volumeID from instance
1051+ volumeID := getVolumeIDFromFileInstance (& file.ServiceInstance {
1052+ Name : instanceName ,
1053+ Location : testZone ,
1054+ Volume : file.Volume {Name : newInstanceVolume },
1055+ }, modeInstance )
1056+
1057+ // Call ControllerExpandVolume
1058+ req := & csi.ControllerExpandVolumeRequest {
1059+ VolumeId : volumeID ,
1060+ CapacityRange : & csi.CapacityRange {
1061+ RequiredBytes : tc .requiredCap ,
1062+ },
1063+ }
1064+
1065+ resp , err := ctrl .ControllerExpandVolume (context .Background (), req )
1066+
1067+ if tc .shouldError {
1068+ if err == nil {
1069+ t .Errorf ("Test %q failed: expected error but got success" , tc .name )
1070+ }
1071+ } else {
1072+ if err != nil {
1073+ t .Errorf ("Test %q failed: expected success but got error: %v" , tc .name , err )
1074+ }
1075+ if resp == nil {
1076+ t .Errorf ("Test %q failed: expected non-nil response" , tc .name )
1077+ }
1078+ }
1079+ })
1080+ }
9361081}
9371082
9381083func TestControllerModifyVolume_EmptyVolumeID (t * testing.T ) {
@@ -1422,9 +1567,50 @@ func TestGetRequestCapacity(t *testing.T) {
14221567 bytes : 10 * util .Tb ,
14231568 },
14241569 {
1425- name : "required less than small REGIONAL minimum capacity" ,
1570+ name : "required equals small REGIONAL minimum capacity" ,
14261571 capRange : & csi.CapacityRange {
1427- RequiredBytes : 100 * util .Gb ,
1572+ RequiredBytes : regionalSmallTierMinSize ,
1573+ },
1574+ tier : regionalTier ,
1575+ bytes : regionalSmallTierMinSize ,
1576+ },
1577+ {
1578+ name : "required 50 GB below small REGIONAL minimum capacity" ,
1579+ capRange : & csi.CapacityRange {
1580+ RequiredBytes : 50 * util .Gb ,
1581+ },
1582+ tier : regionalTier ,
1583+ bytes : regionalSmallTierMinSize ,
1584+ },
1585+ {
1586+ name : "required 1 GB above small REGIONAL minimum capacity" ,
1587+ capRange : & csi.CapacityRange {
1588+ RequiredBytes : 101 * util .Gb ,
1589+ },
1590+ tier : regionalTier ,
1591+ bytes : 101 * util .Gb ,
1592+ },
1593+ {
1594+ name : "limit equals small REGIONAL minimum capacity" ,
1595+ capRange : & csi.CapacityRange {
1596+ LimitBytes : regionalSmallTierMinSize ,
1597+ },
1598+ tier : regionalTier ,
1599+ bytes : regionalSmallTierMinSize ,
1600+ },
1601+ {
1602+ name : "limit below small REGIONAL minimum capacity" ,
1603+ capRange : & csi.CapacityRange {
1604+ LimitBytes : 50 * util .Gb ,
1605+ },
1606+ tier : regionalTier ,
1607+ errorExpected : true ,
1608+ },
1609+ {
1610+ name : "required below min, limit equals min REGIONAL" ,
1611+ capRange : & csi.CapacityRange {
1612+ RequiredBytes : 50 * util .Gb ,
1613+ LimitBytes : regionalSmallTierMinSize ,
14281614 },
14291615 tier : regionalTier ,
14301616 bytes : regionalSmallTierMinSize ,
0 commit comments