rbd: make VolumeGroup Create/Delete/AddVolume/RemoveVolume idempotent

Add extra error checking to make sure trying to create an existing
volume group does not result in a failure. The same counts for deleting
a non-existing volume group, and adding/removing volumes to/from the
volume group.

Signed-off-by: Niels de Vos <ndevos@ibm.com>
This commit is contained in:
Niels de Vos
2024-07-22 16:59:07 +02:00
committed by mergify[bot]
parent 382d70893d
commit 4acffb5548
4 changed files with 25 additions and 22 deletions

View File

@ -132,7 +132,7 @@ func GetVolumeGroup(
volumes = append(volumes, vol)
}
return &volumeGroup{
vg := &volumeGroup{
journal: j,
credentials: creds,
id: id,
@ -144,7 +144,11 @@ func GetVolumeGroup(
volumes: volumes,
// all allocated volumes need to be free'd at Destroy() time
volumesToFree: volumes,
}, nil
}
log.DebugLog(ctx, "GetVolumeGroup(%s) returns %+v", id, *vg)
return vg, nil
}
// String makes it easy to include the volumeGroup object in log and error
@ -303,8 +307,12 @@ func (vg *volumeGroup) Destroy(ctx context.Context) {
log.DebugLog(ctx, "destroyed volume group instance with id %q", vg.id)
}
func (vg *volumeGroup) Create(ctx context.Context, name string) error {
// TODO: if the group already exists, resolve details and use that
func (vg *volumeGroup) Create(ctx context.Context) error {
name, err := vg.GetName(ctx)
if err != nil {
return fmt.Errorf("missing name to create volume group: %w", err)
}
ioctx, err := vg.GetIOContext(ctx)
if err != nil {
return err
@ -319,7 +327,6 @@ func (vg *volumeGroup) Create(ctx context.Context, name string) error {
log.DebugLog(ctx, "ignoring error while creating volume group %q: %v", vg, err)
}
vg.name = name
log.DebugLog(ctx, "volume group %q has been created", vg)
return nil
@ -401,6 +408,10 @@ func (vg *volumeGroup) RemoveVolume(ctx context.Context, vol types.Volume) error
err := vol.RemoveFromGroup(ctx, vg)
if err != nil {
if errors.Is(librbd.ErrNotExist, err) {
return nil
}
return fmt.Errorf("failed to remove volume %q from volume group %q: %w", vol, vg, err)
}

View File

@ -237,16 +237,9 @@ func (mgr *rbdManager) CreateVolumeGroup(ctx context.Context, name string) (type
}
}()
// check if the volume group exists in the backend
existingName, err := vg.GetName(ctx)
err = vg.Create(ctx)
if err != nil {
// the volume group does not exist yet
err = vg.Create(ctx, vgName)
if err != nil {
return nil, fmt.Errorf("failed to create volume group %q: %w", name, err)
}
} else if existingName != vgName {
return nil, fmt.Errorf("volume group id %q has a name mismatch, expected %q, not %q", name, vgName, existingName)
return nil, fmt.Errorf("failed to create volume group %q: %w", name, err)
}
return vg, nil

View File

@ -53,7 +53,7 @@ type VolumeGroup interface {
ToCSI(ctx context.Context) (*volumegroup.VolumeGroup, error)
// Create makes a new group in the backend storage.
Create(ctx context.Context, name string) error
Create(ctx context.Context) error
// Delete removes the VolumeGroup from the backend storage.
Delete(ctx context.Context) error