mirror of
https://github.com/ceph/ceph-csi.git
synced 2025-06-14 18:53:35 +00:00
nfs: make DeleteVolume (more) idempotent
Signed-off-by: Niels de Vos <ndevos@redhat.com>
This commit is contained in:
committed by
mergify[bot]
parent
a6cd56ae7e
commit
0a173a8a9e
@ -18,6 +18,7 @@ package controller
|
||||
|
||||
import (
|
||||
"context"
|
||||
"errors"
|
||||
"fmt"
|
||||
"strings"
|
||||
|
||||
@ -124,7 +125,7 @@ func (nv *NFSVolume) GetExportPath() string {
|
||||
// a new NFS-export for the volume on the Ceph managed NFS-server.
|
||||
func (nv *NFSVolume) CreateExport(backend *csi.Volume) error {
|
||||
if !nv.connected {
|
||||
return fmt.Errorf("can not created export for %q: not connected", nv)
|
||||
return fmt.Errorf("can not created export for %q: %w", nv, ErrNotConnected)
|
||||
}
|
||||
|
||||
fs := backend.VolumeContext["fsName"]
|
||||
@ -213,6 +214,8 @@ func (nv *NFSVolume) DeleteExport() error {
|
||||
return nil
|
||||
case strings.Contains(err.Error(), "API call not implemented"): // try with the old command
|
||||
break
|
||||
case strings.Contains(err.Error(), "Export does not exist"):
|
||||
return ErrExportNotFound
|
||||
default: // any other error
|
||||
return fmt.Errorf("failed to remove %q from NFS-cluster %q: "+
|
||||
"%w", nv, nfsCluster, err)
|
||||
@ -251,17 +254,21 @@ func (nv *NFSVolume) deleteExportCommand(cmd, nfsCluster string) []string {
|
||||
// getNFSCluster fetches the NFS-cluster name from the CephFS journal.
|
||||
func (nv *NFSVolume) getNFSCluster() (string, error) {
|
||||
if !nv.connected {
|
||||
return "", fmt.Errorf("can not get NFS-cluster for %q: not connected", nv)
|
||||
return "", fmt.Errorf("can not get NFS-cluster for %q: %w", nv, ErrNotConnected)
|
||||
}
|
||||
|
||||
fs := fscore.NewFileSystem(nv.conn)
|
||||
fsName, err := fs.GetFsName(nv.ctx, nv.fscID)
|
||||
if err != nil {
|
||||
if err != nil && errors.Is(err, util.ErrPoolNotFound) {
|
||||
return "", fmt.Errorf("%w for ID %x: %v", ErrFilesystemNotFound, nv.fscID, err)
|
||||
} else if err != nil {
|
||||
return "", fmt.Errorf("failed to get filesystem name for ID %x: %w", nv.fscID, err)
|
||||
}
|
||||
|
||||
mdPool, err := fs.GetMetadataPool(nv.ctx, fsName)
|
||||
if err != nil {
|
||||
if err != nil && errors.Is(err, util.ErrPoolNotFound) {
|
||||
return "", fmt.Errorf("metadata pool for %q %w: %v", fsName, ErrNotFound, err)
|
||||
} else if err != nil {
|
||||
return "", fmt.Errorf("failed to get metadata pool for %q: %w", fsName, err)
|
||||
}
|
||||
|
||||
@ -273,8 +280,10 @@ func (nv *NFSVolume) getNFSCluster() (string, error) {
|
||||
defer j.Destroy()
|
||||
|
||||
clusterName, err := j.FetchAttribute(nv.ctx, mdPool, nv.objectUUID, clusterNameKey)
|
||||
if err != nil {
|
||||
return "", fmt.Errorf("failed to get cluster name: %w", err)
|
||||
if err != nil && errors.Is(err, util.ErrPoolNotFound) || errors.Is(err, util.ErrKeyNotFound) {
|
||||
return "", fmt.Errorf("cluster name for %q %w: %v", nv.objectUUID, ErrNotFound, err)
|
||||
} else if err != nil {
|
||||
return "", fmt.Errorf("failed to get cluster name for %q: %w", nv.objectUUID, err)
|
||||
}
|
||||
|
||||
return clusterName, nil
|
||||
@ -283,17 +292,21 @@ func (nv *NFSVolume) getNFSCluster() (string, error) {
|
||||
// setNFSCluster stores the NFS-cluster name in the CephFS journal.
|
||||
func (nv *NFSVolume) setNFSCluster(clusterName string) error {
|
||||
if !nv.connected {
|
||||
return fmt.Errorf("can not set NFS-cluster for %q: not connected", nv)
|
||||
return fmt.Errorf("can not set NFS-cluster for %q: %w", nv, ErrNotConnected)
|
||||
}
|
||||
|
||||
fs := fscore.NewFileSystem(nv.conn)
|
||||
fsName, err := fs.GetFsName(nv.ctx, nv.fscID)
|
||||
if err != nil {
|
||||
if err != nil && errors.Is(err, util.ErrPoolNotFound) {
|
||||
return fmt.Errorf("%w for ID %x: %v", ErrFilesystemNotFound, nv.fscID, err)
|
||||
} else if err != nil {
|
||||
return fmt.Errorf("failed to get filesystem name for ID %x: %w", nv.fscID, err)
|
||||
}
|
||||
|
||||
mdPool, err := fs.GetMetadataPool(nv.ctx, fsName)
|
||||
if err != nil {
|
||||
if err != nil && errors.Is(err, util.ErrPoolNotFound) {
|
||||
return fmt.Errorf("metadata pool for %q %w: %v", fsName, ErrNotFound, err)
|
||||
} else if err != nil {
|
||||
return fmt.Errorf("failed to get metadata pool for %q: %w", fsName, err)
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user