@@ -806,6 +806,212 @@ var _ = Describe("ControllerPublishVolume [Controller Server]", func() {
806806 _ , err = c .DeleteVolume (context .Background (), delReq )
807807 Expect (err ).NotTo (HaveOccurred ())
808808 })
809+
810+ It ("should fail when the volume does not exist" , func () {
811+
812+ By ("calling controller publish on a non-existent volume" )
813+
814+ pubReq := & csi.ControllerPublishVolumeRequest {
815+ VolumeId : "some-vol-id" ,
816+ NodeId : "some-node-id" ,
817+ VolumeCapability : & csi.VolumeCapability {
818+ AccessType : & csi.VolumeCapability_Mount {
819+ Mount : & csi.VolumeCapability_MountVolume {},
820+ },
821+ AccessMode : & csi.VolumeCapability_AccessMode {
822+ Mode : csi .VolumeCapability_AccessMode_SINGLE_NODE_WRITER ,
823+ },
824+ },
825+ Readonly : false ,
826+ }
827+
828+ if secrets != nil {
829+ pubReq .ControllerPublishSecrets = secrets .ControllerPublishVolumeSecret
830+ }
831+
832+ conpubvol , err := c .ControllerPublishVolume (context .Background (), pubReq )
833+ Expect (err ).To (HaveOccurred ())
834+ Expect (conpubvol ).To (BeNil ())
835+
836+ serverError , ok := status .FromError (err )
837+ Expect (ok ).To (BeTrue ())
838+ Expect (serverError .Code ()).To (Equal (codes .NotFound ))
839+ })
840+
841+ It ("should fail when the node does not exist" , func () {
842+
843+ // Create Volume First
844+ By ("creating a single node writer volume" )
845+ name := "sanity"
846+ req := & csi.CreateVolumeRequest {
847+ Name : name ,
848+ VolumeCapabilities : []* csi.VolumeCapability {
849+ {
850+ AccessType : & csi.VolumeCapability_Mount {
851+ Mount : & csi.VolumeCapability_MountVolume {},
852+ },
853+ AccessMode : & csi.VolumeCapability_AccessMode {
854+ Mode : csi .VolumeCapability_AccessMode_SINGLE_NODE_WRITER ,
855+ },
856+ },
857+ },
858+ }
859+
860+ if secrets != nil {
861+ req .ControllerCreateSecrets = secrets .CreateVolumeSecret
862+ }
863+
864+ vol , err := c .CreateVolume (context .Background (), req )
865+ Expect (err ).NotTo (HaveOccurred ())
866+ Expect (vol ).NotTo (BeNil ())
867+ Expect (vol .GetVolume ()).NotTo (BeNil ())
868+ Expect (vol .GetVolume ().GetId ()).NotTo (BeEmpty ())
869+
870+ // ControllerPublishVolume
871+ By ("calling controllerpublish on that volume" )
872+
873+ pubReq := & csi.ControllerPublishVolumeRequest {
874+ VolumeId : vol .GetVolume ().GetId (),
875+ NodeId : "some-fake-node-id" ,
876+ VolumeCapability : & csi.VolumeCapability {
877+ AccessType : & csi.VolumeCapability_Mount {
878+ Mount : & csi.VolumeCapability_MountVolume {},
879+ },
880+ AccessMode : & csi.VolumeCapability_AccessMode {
881+ Mode : csi .VolumeCapability_AccessMode_SINGLE_NODE_WRITER ,
882+ },
883+ },
884+ Readonly : false ,
885+ }
886+
887+ if secrets != nil {
888+ pubReq .ControllerPublishSecrets = secrets .ControllerPublishVolumeSecret
889+ }
890+
891+ conpubvol , err := c .ControllerPublishVolume (context .Background (), pubReq )
892+ Expect (err ).To (HaveOccurred ())
893+ Expect (conpubvol ).To (BeNil ())
894+
895+ serverError , ok := status .FromError (err )
896+ Expect (ok ).To (BeTrue ())
897+ Expect (serverError .Code ()).To (Equal (codes .NotFound ))
898+
899+ By ("cleaning up deleting the volume" )
900+
901+ delReq := & csi.DeleteVolumeRequest {
902+ VolumeId : vol .GetVolume ().GetId (),
903+ }
904+
905+ if secrets != nil {
906+ delReq .ControllerDeleteSecrets = secrets .DeleteVolumeSecret
907+ }
908+
909+ _ , err = c .DeleteVolume (context .Background (), delReq )
910+ Expect (err ).NotTo (HaveOccurred ())
911+ })
912+
913+ It ("should fail when the volume is already published but is incompatible" , func () {
914+
915+ // Create Volume First
916+ By ("creating a single node writer volume" )
917+ name := "sanity"
918+ req := & csi.CreateVolumeRequest {
919+ Name : name ,
920+ VolumeCapabilities : []* csi.VolumeCapability {
921+ {
922+ AccessType : & csi.VolumeCapability_Mount {
923+ Mount : & csi.VolumeCapability_MountVolume {},
924+ },
925+ AccessMode : & csi.VolumeCapability_AccessMode {
926+ Mode : csi .VolumeCapability_AccessMode_SINGLE_NODE_WRITER ,
927+ },
928+ },
929+ },
930+ }
931+
932+ if secrets != nil {
933+ req .ControllerCreateSecrets = secrets .CreateVolumeSecret
934+ }
935+
936+ vol , err := c .CreateVolume (context .Background (), req )
937+ Expect (err ).NotTo (HaveOccurred ())
938+ Expect (vol ).NotTo (BeNil ())
939+ Expect (vol .GetVolume ()).NotTo (BeNil ())
940+ Expect (vol .GetVolume ().GetId ()).NotTo (BeEmpty ())
941+
942+ By ("getting a node id" )
943+ nid , err := n .NodeGetId (
944+ context .Background (),
945+ & csi.NodeGetIdRequest {})
946+ Expect (err ).NotTo (HaveOccurred ())
947+ Expect (nid ).NotTo (BeNil ())
948+ Expect (nid .GetNodeId ()).NotTo (BeEmpty ())
949+
950+ // ControllerPublishVolume
951+ By ("calling controllerpublish on that volume" )
952+
953+ pubReq := & csi.ControllerPublishVolumeRequest {
954+ VolumeId : vol .GetVolume ().GetId (),
955+ NodeId : nid .GetNodeId (),
956+ VolumeCapability : & csi.VolumeCapability {
957+ AccessType : & csi.VolumeCapability_Mount {
958+ Mount : & csi.VolumeCapability_MountVolume {},
959+ },
960+ AccessMode : & csi.VolumeCapability_AccessMode {
961+ Mode : csi .VolumeCapability_AccessMode_SINGLE_NODE_WRITER ,
962+ },
963+ },
964+ Readonly : false ,
965+ }
966+
967+ if secrets != nil {
968+ pubReq .ControllerPublishSecrets = secrets .ControllerPublishVolumeSecret
969+ }
970+
971+ conpubvol , err := c .ControllerPublishVolume (context .Background (), pubReq )
972+ Expect (err ).NotTo (HaveOccurred ())
973+ Expect (conpubvol ).NotTo (BeNil ())
974+
975+ // Publish again with different attributes.
976+ pubReq .Readonly = true
977+
978+ conpubvol , err = c .ControllerPublishVolume (context .Background (), pubReq )
979+ Expect (err ).To (HaveOccurred ())
980+ Expect (conpubvol ).To (BeNil ())
981+
982+ serverError , ok := status .FromError (err )
983+ Expect (ok ).To (BeTrue ())
984+ Expect (serverError .Code ()).To (Equal (codes .AlreadyExists ))
985+
986+ By ("cleaning up unpublishing the volume" )
987+
988+ unpubReq := & csi.ControllerUnpublishVolumeRequest {
989+ VolumeId : vol .GetVolume ().GetId (),
990+ // NodeID is optional in ControllerUnpublishVolume
991+ NodeId : nid .GetNodeId (),
992+ }
993+
994+ if secrets != nil {
995+ unpubReq .ControllerUnpublishSecrets = secrets .ControllerUnpublishVolumeSecret
996+ }
997+
998+ conunpubvol , err := c .ControllerUnpublishVolume (context .Background (), unpubReq )
999+ Expect (err ).NotTo (HaveOccurred ())
1000+ Expect (conunpubvol ).NotTo (BeNil ())
1001+
1002+ By ("cleaning up deleting the volume" )
1003+
1004+ delReq := & csi.DeleteVolumeRequest {
1005+ VolumeId : vol .GetVolume ().GetId (),
1006+ }
1007+
1008+ if secrets != nil {
1009+ delReq .ControllerDeleteSecrets = secrets .DeleteVolumeSecret
1010+ }
1011+
1012+ _ , err = c .DeleteVolume (context .Background (), delReq )
1013+ Expect (err ).NotTo (HaveOccurred ())
1014+ })
8091015})
8101016
8111017var _ = Describe ("ControllerUnpublishVolume [Controller Server]" , func () {
0 commit comments