@@ -17,6 +17,7 @@ limitations under the License.
1717package controller
1818
1919import (
20+ "context"
2021 "errors"
2122 "fmt"
2223 "reflect"
@@ -820,6 +821,7 @@ func TestProvision(t *testing.T) {
820821 expectedPVSpec * pvSpec
821822 withSecretRefs bool
822823 expectErr bool
824+ expectCreateVolDo interface {}
823825 }{
824826 "normal provision" : {
825827 volOpts : controller.VolumeOptions {
@@ -846,7 +848,103 @@ func TestProvision(t *testing.T) {
846848 },
847849 },
848850 },
849- "provision with access modes" : {
851+ "provision with access mode multi node multi writer" : {
852+ volOpts : controller.VolumeOptions {
853+ PersistentVolumeReclaimPolicy : v1 .PersistentVolumeReclaimDelete ,
854+ PVName : "test-name" ,
855+ PVC : & v1.PersistentVolumeClaim {
856+ ObjectMeta : metav1.ObjectMeta {
857+ UID : "testid" ,
858+ },
859+ Spec : v1.PersistentVolumeClaimSpec {
860+ Selector : nil ,
861+ Resources : v1.ResourceRequirements {
862+ Requests : v1.ResourceList {
863+ v1 .ResourceName (v1 .ResourceStorage ): resource .MustParse (strconv .FormatInt (requestedBytes , 10 )),
864+ },
865+ },
866+ AccessModes : []v1.PersistentVolumeAccessMode {v1 .ReadWriteMany },
867+ },
868+ },
869+ Parameters : map [string ]string {},
870+ },
871+ expectedPVSpec : & pvSpec {
872+ Name : "test-testi" ,
873+ ReclaimPolicy : v1 .PersistentVolumeReclaimDelete ,
874+ AccessModes : []v1.PersistentVolumeAccessMode {v1 .ReadWriteMany },
875+ Capacity : v1.ResourceList {
876+ v1 .ResourceName (v1 .ResourceStorage ): bytesToGiQuantity (requestedBytes ),
877+ },
878+ CSIPVS : & v1.CSIPersistentVolumeSource {
879+ Driver : "test-driver" ,
880+ VolumeHandle : "test-volume-id" ,
881+ FSType : "ext4" ,
882+ VolumeAttributes : map [string ]string {
883+ "storage.kubernetes.io/csiProvisionerIdentity" : "test-provisioner" ,
884+ },
885+ },
886+ },
887+ expectCreateVolDo : func (ctx context.Context , req * csi.CreateVolumeRequest ) {
888+ if len (req .GetVolumeCapabilities ()) != 1 {
889+ t .Errorf ("Incorrect length in volume capabilities" )
890+ }
891+ if req .GetVolumeCapabilities ()[0 ].GetAccessMode () == nil {
892+ t .Errorf ("Expected access mode to be set" )
893+ }
894+ if req .GetVolumeCapabilities ()[0 ].GetAccessMode ().GetMode () != csi .VolumeCapability_AccessMode_MULTI_NODE_MULTI_WRITER {
895+ t .Errorf ("Expected multi_node_multi_writer" )
896+ }
897+ },
898+ },
899+ "provision with access mode multi node multi readonly" : {
900+ volOpts : controller.VolumeOptions {
901+ PersistentVolumeReclaimPolicy : v1 .PersistentVolumeReclaimDelete ,
902+ PVName : "test-name" ,
903+ PVC : & v1.PersistentVolumeClaim {
904+ ObjectMeta : metav1.ObjectMeta {
905+ UID : "testid" ,
906+ },
907+ Spec : v1.PersistentVolumeClaimSpec {
908+ Selector : nil ,
909+ Resources : v1.ResourceRequirements {
910+ Requests : v1.ResourceList {
911+ v1 .ResourceName (v1 .ResourceStorage ): resource .MustParse (strconv .FormatInt (requestedBytes , 10 )),
912+ },
913+ },
914+ AccessModes : []v1.PersistentVolumeAccessMode {v1 .ReadOnlyMany },
915+ },
916+ },
917+ Parameters : map [string ]string {},
918+ },
919+ expectedPVSpec : & pvSpec {
920+ Name : "test-testi" ,
921+ ReclaimPolicy : v1 .PersistentVolumeReclaimDelete ,
922+ AccessModes : []v1.PersistentVolumeAccessMode {v1 .ReadOnlyMany },
923+ Capacity : v1.ResourceList {
924+ v1 .ResourceName (v1 .ResourceStorage ): bytesToGiQuantity (requestedBytes ),
925+ },
926+ CSIPVS : & v1.CSIPersistentVolumeSource {
927+ Driver : "test-driver" ,
928+ VolumeHandle : "test-volume-id" ,
929+ FSType : "ext4" ,
930+ VolumeAttributes : map [string ]string {
931+ "storage.kubernetes.io/csiProvisionerIdentity" : "test-provisioner" ,
932+ },
933+ },
934+ },
935+ expectCreateVolDo : func (ctx context.Context , req * csi.CreateVolumeRequest ) {
936+ if len (req .GetVolumeCapabilities ()) != 1 {
937+ t .Errorf ("Incorrect length in volume capabilities" )
938+ }
939+ if req .GetVolumeCapabilities ()[0 ].GetAccessMode () == nil {
940+ t .Errorf ("Expected access mode to be set" )
941+ }
942+ if req .GetVolumeCapabilities ()[0 ].GetAccessMode ().GetMode () != csi .VolumeCapability_AccessMode_MULTI_NODE_READER_ONLY {
943+ t .Errorf ("Expected multi_node_reader_only" )
944+ }
945+ },
946+ },
947+ "provision with access mode single writer" : {
850948 volOpts : controller.VolumeOptions {
851949 PersistentVolumeReclaimPolicy : v1 .PersistentVolumeReclaimDelete ,
852950 PVName : "test-name" ,
@@ -882,6 +980,71 @@ func TestProvision(t *testing.T) {
882980 },
883981 },
884982 },
983+ expectCreateVolDo : func (ctx context.Context , req * csi.CreateVolumeRequest ) {
984+ if len (req .GetVolumeCapabilities ()) != 1 {
985+ t .Errorf ("Incorrect length in volume capabilities" )
986+ }
987+ if req .GetVolumeCapabilities ()[0 ].GetAccessMode () == nil {
988+ t .Errorf ("Expected access mode to be set" )
989+ }
990+ if req .GetVolumeCapabilities ()[0 ].GetAccessMode ().GetMode () != csi .VolumeCapability_AccessMode_SINGLE_NODE_WRITER {
991+ t .Errorf ("Expected single_node_writer" )
992+ }
993+ },
994+ },
995+ "provision with multiple access modes" : {
996+ volOpts : controller.VolumeOptions {
997+ PersistentVolumeReclaimPolicy : v1 .PersistentVolumeReclaimDelete ,
998+ PVName : "test-name" ,
999+ PVC : & v1.PersistentVolumeClaim {
1000+ ObjectMeta : metav1.ObjectMeta {
1001+ UID : "testid" ,
1002+ },
1003+ Spec : v1.PersistentVolumeClaimSpec {
1004+ Selector : nil ,
1005+ Resources : v1.ResourceRequirements {
1006+ Requests : v1.ResourceList {
1007+ v1 .ResourceName (v1 .ResourceStorage ): resource .MustParse (strconv .FormatInt (requestedBytes , 10 )),
1008+ },
1009+ },
1010+ AccessModes : []v1.PersistentVolumeAccessMode {v1 .ReadOnlyMany , v1 .ReadWriteOnce },
1011+ },
1012+ },
1013+ Parameters : map [string ]string {},
1014+ },
1015+ expectedPVSpec : & pvSpec {
1016+ Name : "test-testi" ,
1017+ ReclaimPolicy : v1 .PersistentVolumeReclaimDelete ,
1018+ AccessModes : []v1.PersistentVolumeAccessMode {v1 .ReadOnlyMany , v1 .ReadWriteOnce },
1019+ Capacity : v1.ResourceList {
1020+ v1 .ResourceName (v1 .ResourceStorage ): bytesToGiQuantity (requestedBytes ),
1021+ },
1022+ CSIPVS : & v1.CSIPersistentVolumeSource {
1023+ Driver : "test-driver" ,
1024+ VolumeHandle : "test-volume-id" ,
1025+ FSType : "ext4" ,
1026+ VolumeAttributes : map [string ]string {
1027+ "storage.kubernetes.io/csiProvisionerIdentity" : "test-provisioner" ,
1028+ },
1029+ },
1030+ },
1031+ expectCreateVolDo : func (ctx context.Context , req * csi.CreateVolumeRequest ) {
1032+ if len (req .GetVolumeCapabilities ()) != 2 {
1033+ t .Errorf ("Incorrect length in volume capabilities" )
1034+ }
1035+ if req .GetVolumeCapabilities ()[0 ].GetAccessMode () == nil {
1036+ t .Errorf ("Expected access mode to be set" )
1037+ }
1038+ if req .GetVolumeCapabilities ()[0 ].GetAccessMode ().GetMode () != csi .VolumeCapability_AccessMode_MULTI_NODE_READER_ONLY {
1039+ t .Errorf ("Expected multi reade only" )
1040+ }
1041+ if req .GetVolumeCapabilities ()[1 ].GetAccessMode () == nil {
1042+ t .Errorf ("Expected access mode to be set" )
1043+ }
1044+ if req .GetVolumeCapabilities ()[1 ].GetAccessMode ().GetMode () != csi .VolumeCapability_AccessMode_SINGLE_NODE_WRITER {
1045+ t .Errorf ("Expected single_node_writer" )
1046+ }
1047+ },
8851048 },
8861049 "provision with secrets" : {
8871050 volOpts : controller.VolumeOptions {
@@ -1038,6 +1201,9 @@ func TestProvision(t *testing.T) {
10381201 provisionMockServerSetupExpectations (identityServer , controllerServer )
10391202 controllerServer .EXPECT ().CreateVolume (gomock .Any (), gomock .Any ()).Return (out , nil ).Times (1 )
10401203 controllerServer .EXPECT ().DeleteVolume (gomock .Any (), gomock .Any ()).Return (& csi.DeleteVolumeResponse {}, nil ).Times (1 )
1204+ } else if tc .expectCreateVolDo != nil {
1205+ provisionMockServerSetupExpectations (identityServer , controllerServer )
1206+ controllerServer .EXPECT ().CreateVolume (gomock .Any (), gomock .Any ()).Do (tc .expectCreateVolDo ).Return (out , nil ).Times (1 )
10411207 } else {
10421208 // Setup regular mock call expectations.
10431209 provisionMockServerSetupExpectations (identityServer , controllerServer )
0 commit comments