Skip to content

Commit d372289

Browse files
authored
Merge pull request #77 from darkowlzz/ctrl-publish-vol-tests
sanity: Add more ControllerPublishVolume tests
2 parents 1bf94ed + f907fc4 commit d372289

File tree

2 files changed

+237
-2
lines changed

2 files changed

+237
-2
lines changed

mock/service/controller.go

Lines changed: 31 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import (
1616

1717
const (
1818
MaxStorageCapacity = tib
19+
ReadOnlyKey = "readonly"
1920
)
2021

2122
func (s *service) CreateVolume(
@@ -135,21 +136,48 @@ func (s *service) ControllerPublishVolume(
135136

136137
// Check to see if the volume is already published.
137138
if device := v.Attributes[devPathKey]; device != "" {
139+
var volRo bool
140+
var roVal string
141+
if ro, ok := v.Attributes[ReadOnlyKey]; ok {
142+
roVal = ro
143+
}
144+
145+
if roVal == "true" {
146+
volRo = true
147+
} else {
148+
volRo = false
149+
}
150+
151+
// Check if readonly flag is compatible with the publish request.
152+
if req.GetReadonly() != volRo {
153+
return nil, status.Error(codes.AlreadyExists, "Volume published but has incompatible readonly flag")
154+
}
155+
138156
return &csi.ControllerPublishVolumeResponse{
139157
PublishInfo: map[string]string{
140-
"device": device,
158+
"device": device,
159+
"readonly": roVal,
141160
},
142161
}, nil
143162
}
144163

164+
var roVal string
165+
if req.GetReadonly() {
166+
roVal = "true"
167+
} else {
168+
roVal = "false"
169+
}
170+
145171
// Publish the volume.
146172
device := "/dev/mock"
147173
v.Attributes[devPathKey] = device
174+
v.Attributes[ReadOnlyKey] = roVal
148175
s.vols[i] = v
149176

150177
return &csi.ControllerPublishVolumeResponse{
151178
PublishInfo: map[string]string{
152-
"device": device,
179+
"device": device,
180+
"readonly": roVal,
153181
},
154182
}, nil
155183
}
@@ -192,6 +220,7 @@ func (s *service) ControllerUnpublishVolume(
192220

193221
// Unpublish the volume.
194222
delete(v.Attributes, devPathKey)
223+
delete(v.Attributes, ReadOnlyKey)
195224
s.vols[i] = v
196225

197226
return &csi.ControllerUnpublishVolumeResponse{}, nil

pkg/sanity/controller.go

Lines changed: 206 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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

8111017
var _ = Describe("ControllerUnpublishVolume [Controller Server]", func() {

0 commit comments

Comments
 (0)