diff --git a/internal/csi-addons/rbd/reclaimspace.go b/internal/csi-addons/rbd/reclaimspace.go index 1d3f4bbfa..7e7fbcc6a 100644 --- a/internal/csi-addons/rbd/reclaimspace.go +++ b/internal/csi-addons/rbd/reclaimspace.go @@ -37,13 +37,18 @@ import ( // of CSI-addons reclaimspace controller service spec. type ReclaimSpaceControllerServer struct { *rs.UnimplementedReclaimSpaceControllerServer + + driver string volumeLocks *util.VolumeLocks } // NewReclaimSpaceControllerServer creates a new ReclaimSpaceControllerServer which handles // the ReclaimSpace Service requests from the CSI-Addons specification. -func NewReclaimSpaceControllerServer(volumeLocks *util.VolumeLocks) *ReclaimSpaceControllerServer { - return &ReclaimSpaceControllerServer{volumeLocks: volumeLocks} +func NewReclaimSpaceControllerServer(driver string, volumeLocks *util.VolumeLocks) *ReclaimSpaceControllerServer { + return &ReclaimSpaceControllerServer{ + driver: driver, + volumeLocks: volumeLocks, + } } func (rscs *ReclaimSpaceControllerServer) RegisterService(server grpc.ServiceRegistrar) { @@ -59,12 +64,6 @@ func (rscs *ReclaimSpaceControllerServer) ControllerReclaimSpace( return nil, status.Error(codes.InvalidArgument, "empty volume ID in request") } - cr, err := util.NewUserCredentials(req.GetSecrets()) - if err != nil { - return nil, status.Error(codes.Internal, err.Error()) - } - defer cr.DeleteCredentials() - if acquired := rscs.volumeLocks.TryAcquire(volumeID); !acquired { log.ErrorLog(ctx, util.VolumeOperationAlreadyExistsFmt, volumeID) @@ -72,13 +71,16 @@ func (rscs *ReclaimSpaceControllerServer) ControllerReclaimSpace( } defer rscs.volumeLocks.Release(volumeID) - rbdVol, err := rbdutil.GenVolFromVolID(ctx, volumeID, cr, req.GetSecrets()) + mgr := rbdutil.NewManager(rscs.driver, nil, req.GetSecrets()) + defer mgr.Destroy(ctx) + + rbdVol, err := mgr.GetVolumeByID(ctx, volumeID) if err != nil { return nil, status.Errorf(codes.Aborted, "failed to find volume with ID %q: %s", volumeID, err.Error()) } defer rbdVol.Destroy(ctx) - err = rbdVol.Sparsify() + err = rbdVol.Sparsify(ctx) if errors.Is(err, rbdutil.ErrImageInUse) { // FIXME: https://github.com/csi-addons/kubernetes-csi-addons/issues/406. // treat sparsify call as no-op if volume is in use. diff --git a/internal/csi-addons/rbd/reclaimspace_test.go b/internal/csi-addons/rbd/reclaimspace_test.go index d9649f22a..2ad51f9a2 100644 --- a/internal/csi-addons/rbd/reclaimspace_test.go +++ b/internal/csi-addons/rbd/reclaimspace_test.go @@ -32,7 +32,7 @@ import ( func TestControllerReclaimSpace(t *testing.T) { t.Parallel() - controller := NewReclaimSpaceControllerServer(util.NewVolumeLocks()) + controller := NewReclaimSpaceControllerServer("test.driver", util.NewVolumeLocks()) req := &rs.ControllerReclaimSpaceRequest{ VolumeId: "", diff --git a/internal/rbd/diskusage.go b/internal/rbd/diskusage.go index 444a5a604..9e97ad148 100644 --- a/internal/rbd/diskusage.go +++ b/internal/rbd/diskusage.go @@ -17,6 +17,7 @@ limitations under the License. package rbd import ( + "context" "fmt" ) @@ -25,7 +26,7 @@ import ( // of the image. // This function will return ErrImageInUse if the image is in use, since // sparsifying an image on which i/o is in progress is not optimal. -func (ri *rbdImage) Sparsify() error { +func (ri *rbdImage) Sparsify(_ context.Context) error { inUse, err := ri.isInUse() if err != nil { return fmt.Errorf("failed to check if image is in use: %w", err) diff --git a/internal/rbd/driver/driver.go b/internal/rbd/driver/driver.go index 8afaa55f8..64ca52bff 100644 --- a/internal/rbd/driver/driver.go +++ b/internal/rbd/driver/driver.go @@ -229,7 +229,7 @@ func (r *Driver) setupCSIAddonsServer(conf *util.Config) error { r.cas.RegisterService(is) if conf.IsControllerServer { - rs := casrbd.NewReclaimSpaceControllerServer(r.cs.VolumeLocks) + rs := casrbd.NewReclaimSpaceControllerServer(conf.InstanceID, r.cs.VolumeLocks) r.cas.RegisterService(rs) fcs := casrbd.NewFenceControllerServer() diff --git a/internal/rbd/types/volume.go b/internal/rbd/types/volume.go index 2b9dfd698..3e5d8ab94 100644 --- a/internal/rbd/types/volume.go +++ b/internal/rbd/types/volume.go @@ -45,6 +45,9 @@ type csiAddonsVolume interface { // RotateEncryptionKey processes the key rotation for the RBD Volume. RotateEncryptionKey(ctx context.Context) error + // Sparsify tries to free unused blocks of the volume from the CSI-Addons Controller. + Sparsify(ctx context.Context) error + // HandleParentImageExistence checks the image's parent. // if the parent image does not exist and is not in trash, it returns nil. // if the flattenMode is FlattenModeForce, it flattens the image itself.