rbd: use rbd.Manager within ControllerServer.DeleteVolume()

Signed-off-by: Niels de Vos <ndevos@ibm.com>
This commit is contained in:
Niels de Vos 2025-01-20 18:14:10 +01:00
parent 7d3eb74880
commit b7b3962437
3 changed files with 29 additions and 11 deletions

View File

@ -957,12 +957,30 @@ func (cs *ControllerServer) DeleteVolume(
return &csi.DeleteVolumeResponse{}, nil return &csi.DeleteVolumeResponse{}, nil
} }
rbdVol, err := GenVolFromVolID(ctx, volumeID, cr, req.GetSecrets()) // secrets can be different for volumes created with in-tree drivers
defer func() { secrets := req.GetSecrets()
if rbdVol != nil { if util.IsMigrationSecret(secrets) {
rbdVol.Destroy(ctx) secrets, err = util.ParseAndSetSecretMapFromMigSecret(secrets)
if err != nil {
return nil, status.Error(codes.Internal, err.Error())
}
}
mgr := NewManager(cs.Driver.GetInstanceID(), nil, secrets)
defer mgr.Destroy(ctx)
var rbdVol *rbdVolume
vol, err := mgr.GetVolumeByID(ctx, volumeID)
if vol != nil {
defer vol.Destroy(ctx)
var ok bool
rbdVol, ok = vol.(*rbdVolume) // FIXME: temporary cast until rbdVolume is cleaned up
if !ok {
// this can never happen, mgr.GetVolumeByID() returns a *rbdVolume on success
log.ErrorLog(ctx, "failed to cast %q of type %T to %T", vol, vol, rbdVol)
}
} }
}()
if err != nil { if err != nil {
return cs.checkErrAndUndoReserve(ctx, err, volumeID, rbdVol, cr) return cs.checkErrAndUndoReserve(ctx, err, volumeID, rbdVol, cr)
} }

View File

@ -135,7 +135,7 @@ func GetMonValFromSecret(secrets map[string]string) (string, error) {
func ParseAndSetSecretMapFromMigSecret(secretmap map[string]string) (map[string]string, error) { func ParseAndSetSecretMapFromMigSecret(secretmap map[string]string) (map[string]string, error) {
newSecretMap := make(map[string]string) newSecretMap := make(map[string]string)
// parse and set userKey // parse and set userKey
if !isMigrationSecret(secretmap) { if !IsMigrationSecret(secretmap) {
return nil, errors.New("passed secret map does not contain user key or it is nil") return nil, errors.New("passed secret map does not contain user key or it is nil")
} }
newSecretMap[credUserKey] = secretmap[migUserKey] newSecretMap[credUserKey] = secretmap[migUserKey]
@ -148,11 +148,11 @@ func ParseAndSetSecretMapFromMigSecret(secretmap map[string]string) (map[string]
return newSecretMap, nil return newSecretMap, nil
} }
// isMigrationSecret validates if the passed in secretmap is a secret // IsMigrationSecret validates if the passed in secretmap is a secret
// of a migration volume request. The migration secret carry a field // of a migration volume request. The migration secret carry a field
// called `key` which is the equivalent of `userKey` which is what we // called `key` which is the equivalent of `userKey` which is what we
// check here for identifying the secret. // check here for identifying the secret.
func isMigrationSecret(secrets map[string]string) bool { func IsMigrationSecret(secrets map[string]string) bool {
// the below 'nil' check is an extra measure as the request validators like // the below 'nil' check is an extra measure as the request validators like
// ValidateNodeStageVolumeRequest() already does the nil check, however considering // ValidateNodeStageVolumeRequest() already does the nil check, however considering
// this function can be called independently with a map of secret values // this function can be called independently with a map of secret values
@ -166,7 +166,7 @@ func isMigrationSecret(secrets map[string]string) bool {
// secret. If it is not a migration it will continue the attempt to create credentials from it // secret. If it is not a migration it will continue the attempt to create credentials from it
// without parsing the secret. This function returns credentials and error. // without parsing the secret. This function returns credentials and error.
func NewUserCredentialsWithMigration(secrets map[string]string) (*Credentials, error) { func NewUserCredentialsWithMigration(secrets map[string]string) (*Credentials, error) {
if isMigrationSecret(secrets) { if IsMigrationSecret(secrets) {
migSecret, err := ParseAndSetSecretMapFromMigSecret(secrets) migSecret, err := ParseAndSetSecretMapFromMigSecret(secrets)
if err != nil { if err != nil {
return nil, err return nil, err

View File

@ -41,8 +41,8 @@ func TestIsMigrationSecret(t *testing.T) {
for _, tt := range tests { for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) { t.Run(tt.name, func(t *testing.T) {
t.Parallel() t.Parallel()
if got := isMigrationSecret(tt.vc); got != tt.want { if got := IsMigrationSecret(tt.vc); got != tt.want {
t.Errorf("isMigrationSecret() = %v, want %v", got, tt.want) t.Errorf("IsMigrationSecret() = %v, want %v", got, tt.want)
} }
}) })
} }