From 7966d2e5c127b2d716732fa7cacf2b90d5921e9a Mon Sep 17 00:00:00 2001 From: Madhu Rajanna Date: Thu, 17 Jun 2021 11:45:29 +0530 Subject: [PATCH] rbd: add validation for thick restore/clone added validation to allow only Restore of Thick PVC snapshot to a thick clone and creation of thick clone from thick PVC. Signed-off-by: Madhu Rajanna --- internal/rbd/controllerserver.go | 10 ++++++++++ internal/rbd/rbd_util.go | 16 ++++++++++++++++ 2 files changed, 26 insertions(+) diff --git a/internal/rbd/controllerserver.go b/internal/rbd/controllerserver.go index b20c439de..4f9d535ac 100644 --- a/internal/rbd/controllerserver.go +++ b/internal/rbd/controllerserver.go @@ -222,11 +222,21 @@ func checkValidCreateVolumeRequest(rbdVol, parentVol *rbdVolume, rbdSnap *rbdSna if err != nil { return status.Errorf(codes.InvalidArgument, "cannot restore from snapshot %s: %s", rbdSnap, err.Error()) } + + err = rbdSnap.isCompatibleThickProvision(rbdVol) + if err != nil { + return status.Errorf(codes.InvalidArgument, "cannot restore from snapshot %s: %s", rbdSnap, err.Error()) + } case parentVol != nil: err = parentVol.isCompatibleEncryption(&rbdVol.rbdImage) if err != nil { return status.Errorf(codes.InvalidArgument, "cannot clone from volume %s: %s", parentVol, err.Error()) } + + err = parentVol.isCompatibleThickProvision(rbdVol) + if err != nil { + return status.Errorf(codes.InvalidArgument, "cannot clone from volume %s: %s", parentVol, err.Error()) + } } return nil } diff --git a/internal/rbd/rbd_util.go b/internal/rbd/rbd_util.go index 2276862b7..ae6c769bc 100644 --- a/internal/rbd/rbd_util.go +++ b/internal/rbd/rbd_util.go @@ -1613,3 +1613,19 @@ func (ri *rbdImage) isCompatibleEncryption(dst *rbdImage) error { return nil } + +func (ri *rbdImage) isCompatibleThickProvision(dst *rbdVolume) error { + thick, err := ri.isThickProvisioned() + if err != nil { + return err + } + switch { + case thick && !dst.ThickProvision: + return fmt.Errorf("cannot create thin volume from thick volume %q", ri) + + case !thick && dst.ThickProvision: + return fmt.Errorf("cannot create thick volume from thin volume %q", ri) + } + + return nil +}