diff --git a/mock/service/controller.go b/mock/service/controller.go index 545b2514..e2d802d7 100644 --- a/mock/service/controller.go +++ b/mock/service/controller.go @@ -32,6 +32,12 @@ func (s *service) CreateVolume( // Check to see if the volume already exists. if i, v := s.findVolByName(ctx, req.Name); i >= 0 { + // Requested volume name already exists, need to check if the existing volume's + // capacity is more or equal to new request's capacity. + if v.GetCapacityBytes() < req.GetCapacityRange().GetRequiredBytes() { + return nil, status.Error(codes.AlreadyExists, + fmt.Sprintf("Volume with name %s already exists", req.GetName())) + } return &csi.CreateVolumeResponse{Volume: &v}, nil } @@ -280,7 +286,7 @@ func (s *service) GetCapacity( *csi.GetCapacityResponse, error) { return &csi.GetCapacityResponse{ - AvailableCapacity: tib100, + AvailableCapacity: MaxStorageCapacity, }, nil } diff --git a/pkg/sanity/controller.go b/pkg/sanity/controller.go index 7a0fb964..e6c6ad9b 100644 --- a/pkg/sanity/controller.go +++ b/pkg/sanity/controller.go @@ -216,7 +216,6 @@ var _ = Describe("CreateVolume [Controller Server]", func() { Expect(err).NotTo(HaveOccurred()) }) - // Pending fix in mock file It("should return appropriate values SingleNodeWriter WithCapacity 1Gi Type:Mount", func() { By("creating a volume") @@ -240,12 +239,20 @@ var _ = Describe("CreateVolume [Controller Server]", func() { RequiredBytes: size, }, }) - Expect(err).NotTo(HaveOccurred()) - Expect(vol).NotTo(BeNil()) - Expect(vol.GetVolume()).NotTo(BeNil()) - Expect(vol.GetVolume().GetId()).NotTo(BeEmpty()) - Expect(vol.GetVolume().GetCapacityBytes()).To(Equal(size)) + if serverError, ok := status.FromError(err); ok { + if serverError.Code() == codes.OutOfRange || serverError.Code() == codes.Unimplemented { + Skip("Required bytes not supported") + } else { + Expect(err).NotTo(HaveOccurred()) + } + } else { + Expect(err).NotTo(HaveOccurred()) + Expect(vol).NotTo(BeNil()) + Expect(vol.GetVolume()).NotTo(BeNil()) + Expect(vol.GetVolume().GetId()).NotTo(BeEmpty()) + Expect(vol.GetVolume().GetCapacityBytes()).To(Equal(size)) + } By("cleaning up deleting the volume") _, err = c.DeleteVolume( context.Background(), @@ -254,6 +261,154 @@ var _ = Describe("CreateVolume [Controller Server]", func() { }) Expect(err).NotTo(HaveOccurred()) }) + It("should not fail when requesting to create a volume with already exisiting name and same capacity.", func() { + + By("creating a volume") + name := "sanity" + size := int64(1 * 1024 * 1024 * 1024) + vol1, err := c.CreateVolume( + context.Background(), + &csi.CreateVolumeRequest{ + Name: name, + VolumeCapabilities: []*csi.VolumeCapability{ + { + AccessType: &csi.VolumeCapability_Mount{ + Mount: &csi.VolumeCapability_MountVolume{}, + }, + AccessMode: &csi.VolumeCapability_AccessMode{ + Mode: csi.VolumeCapability_AccessMode_SINGLE_NODE_WRITER, + }, + }, + }, + CapacityRange: &csi.CapacityRange{ + RequiredBytes: size, + }, + }) + Expect(err).NotTo(HaveOccurred()) + Expect(vol1).NotTo(BeNil()) + Expect(vol1.GetVolume()).NotTo(BeNil()) + Expect(vol1.GetVolume().GetId()).NotTo(BeEmpty()) + Expect(vol1.GetVolume().GetCapacityBytes()).To(Equal(size)) + vol2, err := c.CreateVolume( + context.Background(), + &csi.CreateVolumeRequest{ + Name: name, + VolumeCapabilities: []*csi.VolumeCapability{ + { + AccessType: &csi.VolumeCapability_Mount{ + Mount: &csi.VolumeCapability_MountVolume{}, + }, + AccessMode: &csi.VolumeCapability_AccessMode{ + Mode: csi.VolumeCapability_AccessMode_SINGLE_NODE_WRITER, + }, + }, + }, + CapacityRange: &csi.CapacityRange{ + RequiredBytes: size, + }, + }) + Expect(err).NotTo(HaveOccurred()) + Expect(vol2).NotTo(BeNil()) + Expect(vol2.GetVolume()).NotTo(BeNil()) + Expect(vol2.GetVolume().GetId()).NotTo(BeEmpty()) + Expect(vol2.GetVolume().GetCapacityBytes()).To(Equal(size)) + Expect(vol1.GetVolume().GetId()).To(Equal(vol2.GetVolume().GetId())) + + By("cleaning up deleting the volume") + _, err = c.DeleteVolume( + context.Background(), + &csi.DeleteVolumeRequest{ + VolumeId: vol1.GetVolume().GetId(), + }) + Expect(err).NotTo(HaveOccurred()) + }) + It("should fail when requesting to create a volume with already exisiting name and different capacity.", func() { + + By("creating a volume") + name := "sanity" + size1 := int64(1 * 1024 * 1024 * 1024) + vol1, err := c.CreateVolume( + context.Background(), + &csi.CreateVolumeRequest{ + Name: name, + VolumeCapabilities: []*csi.VolumeCapability{ + { + AccessType: &csi.VolumeCapability_Mount{ + Mount: &csi.VolumeCapability_MountVolume{}, + }, + AccessMode: &csi.VolumeCapability_AccessMode{ + Mode: csi.VolumeCapability_AccessMode_SINGLE_NODE_WRITER, + }, + }, + }, + CapacityRange: &csi.CapacityRange{ + RequiredBytes: size1, + }, + }) + Expect(err).ToNot(HaveOccurred()) + Expect(vol1).NotTo(BeNil()) + Expect(vol1.GetVolume()).NotTo(BeNil()) + Expect(vol1.GetVolume().GetId()).NotTo(BeEmpty()) + size2 := int64(2 * 1024 * 1024 * 1024) + _, err = c.CreateVolume( + context.Background(), + &csi.CreateVolumeRequest{ + Name: name, + VolumeCapabilities: []*csi.VolumeCapability{ + { + AccessType: &csi.VolumeCapability_Mount{ + Mount: &csi.VolumeCapability_MountVolume{}, + }, + AccessMode: &csi.VolumeCapability_AccessMode{ + Mode: csi.VolumeCapability_AccessMode_SINGLE_NODE_WRITER, + }, + }, + }, + CapacityRange: &csi.CapacityRange{ + RequiredBytes: size2, + }, + }) + Expect(err).To(HaveOccurred()) + serverError, ok := status.FromError(err) + Expect(ok).To(BeTrue()) + Expect(serverError.Code()).To(Equal(codes.AlreadyExists)) + + By("cleaning up deleting the volume") + _, err = c.DeleteVolume( + context.Background(), + &csi.DeleteVolumeRequest{ + VolumeId: vol1.GetVolume().GetId(), + }) + Expect(err).NotTo(HaveOccurred()) + }) + It("should fail when requesting to create a volume exceeding Maximum Capacity", func() { + + By("creating a volume") + name := "sanity" + size := int64(10 * 1024 * 1024 * 1024 * 1024) + _, err := c.CreateVolume( + context.Background(), + &csi.CreateVolumeRequest{ + Name: name, + VolumeCapabilities: []*csi.VolumeCapability{ + { + AccessType: &csi.VolumeCapability_Mount{ + Mount: &csi.VolumeCapability_MountVolume{}, + }, + AccessMode: &csi.VolumeCapability_AccessMode{ + Mode: csi.VolumeCapability_AccessMode_SINGLE_NODE_WRITER, + }, + }, + }, + CapacityRange: &csi.CapacityRange{ + RequiredBytes: size, + }, + }) + Expect(err).To(HaveOccurred()) + serverError, ok := status.FromError(err) + Expect(ok).To(BeTrue()) + Expect(serverError.Code()).To(Equal(codes.OutOfRange)) + }) }) var _ = Describe("DeleteVolume [Controller Server]", func() {