mirror of
https://github.com/ceph/ceph-csi.git
synced 2024-12-18 02:50:30 +00:00
journal: move voljournal.go to a new package
This new journal package isolates journal logic from the rest of util and helps draw bright lines between what is a generic utility function and what is csi journal logic. Done partly as preparation for making use of go-ceph in journal. No functional changes are made except to update references to allow the code to compile. Signed-off-by: John Mulligan <jmulligan@redhat.com>
This commit is contained in:
parent
22d1476bba
commit
c8271fe64c
@ -20,6 +20,7 @@ import (
|
|||||||
"k8s.io/klog"
|
"k8s.io/klog"
|
||||||
|
|
||||||
csicommon "github.com/ceph/ceph-csi/internal/csi-common"
|
csicommon "github.com/ceph/ceph-csi/internal/csi-common"
|
||||||
|
"github.com/ceph/ceph-csi/internal/journal"
|
||||||
"github.com/ceph/ceph-csi/internal/util"
|
"github.com/ceph/ceph-csi/internal/util"
|
||||||
|
|
||||||
"github.com/container-storage-interface/spec/lib/go/csi"
|
"github.com/container-storage-interface/spec/lib/go/csi"
|
||||||
@ -55,7 +56,7 @@ var (
|
|||||||
|
|
||||||
// volJournal is used to maintain RADOS based journals for CO generated
|
// volJournal is used to maintain RADOS based journals for CO generated
|
||||||
// VolumeName to backing CephFS subvolumes
|
// VolumeName to backing CephFS subvolumes
|
||||||
volJournal *util.CSIJournal
|
volJournal *journal.CSIJournal
|
||||||
)
|
)
|
||||||
|
|
||||||
// NewDriver returns new ceph driver
|
// NewDriver returns new ceph driver
|
||||||
@ -109,7 +110,7 @@ func (fs *Driver) Run(conf *util.Config, cachePersister util.CachePersister) {
|
|||||||
CSIInstanceID = conf.InstanceID
|
CSIInstanceID = conf.InstanceID
|
||||||
}
|
}
|
||||||
// Get an instance of the volume journal
|
// Get an instance of the volume journal
|
||||||
volJournal = util.NewCSIVolumeJournal()
|
volJournal = journal.NewCSIVolumeJournal()
|
||||||
|
|
||||||
// Update keys with CSI instance suffix
|
// Update keys with CSI instance suffix
|
||||||
volJournal.SetCSIDirectorySuffix(CSIInstanceID)
|
volJournal.SetCSIDirectorySuffix(CSIInstanceID)
|
||||||
|
@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
|
|||||||
limitations under the License.
|
limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package util
|
package journal
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
@ -23,6 +23,8 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
|
"github.com/ceph/ceph-csi/internal/util"
|
||||||
|
|
||||||
"github.com/pborman/uuid"
|
"github.com/pborman/uuid"
|
||||||
"github.com/pkg/errors"
|
"github.com/pkg/errors"
|
||||||
"k8s.io/klog"
|
"k8s.io/klog"
|
||||||
@ -219,13 +221,13 @@ Return values:
|
|||||||
there was no reservation found
|
there was no reservation found
|
||||||
- error: non-nil in case of any errors
|
- error: non-nil in case of any errors
|
||||||
*/
|
*/
|
||||||
func (cj *CSIJournal) CheckReservation(ctx context.Context, monitors string, cr *Credentials,
|
func (cj *CSIJournal) CheckReservation(ctx context.Context, monitors string, cr *util.Credentials,
|
||||||
journalPool, reqName, namePrefix, parentName, kmsConfig string) (*ImageData, error) {
|
journalPool, reqName, namePrefix, parentName, kmsConfig string) (*ImageData, error) {
|
||||||
var (
|
var (
|
||||||
snapSource bool
|
snapSource bool
|
||||||
objUUID string
|
objUUID string
|
||||||
savedImagePool string
|
savedImagePool string
|
||||||
savedImagePoolID int64 = InvalidPoolID
|
savedImagePoolID int64 = util.InvalidPoolID
|
||||||
)
|
)
|
||||||
|
|
||||||
if parentName != "" {
|
if parentName != "" {
|
||||||
@ -237,13 +239,13 @@ func (cj *CSIJournal) CheckReservation(ctx context.Context, monitors string, cr
|
|||||||
}
|
}
|
||||||
|
|
||||||
// check if request name is already part of the directory omap
|
// check if request name is already part of the directory omap
|
||||||
objUUIDAndPool, err := GetOMapValue(ctx, monitors, cr, journalPool, cj.namespace, cj.csiDirectory,
|
objUUIDAndPool, err := util.GetOMapValue(ctx, monitors, cr, journalPool, cj.namespace, cj.csiDirectory,
|
||||||
cj.csiNameKeyPrefix+reqName)
|
cj.csiNameKeyPrefix+reqName)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
// error should specifically be not found, for volume to be absent, any other error
|
// error should specifically be not found, for volume to be absent, any other error
|
||||||
// is not conclusive, and we should not proceed
|
// is not conclusive, and we should not proceed
|
||||||
switch err.(type) {
|
switch err.(type) {
|
||||||
case ErrKeyNotFound, ErrPoolNotFound:
|
case util.ErrKeyNotFound, util.ErrPoolNotFound:
|
||||||
return nil, nil
|
return nil, nil
|
||||||
}
|
}
|
||||||
return nil, err
|
return nil, err
|
||||||
@ -265,9 +267,9 @@ func (cj *CSIJournal) CheckReservation(ctx context.Context, monitors string, cr
|
|||||||
}
|
}
|
||||||
savedImagePoolID = int64(binary.BigEndian.Uint64(buf64))
|
savedImagePoolID = int64(binary.BigEndian.Uint64(buf64))
|
||||||
|
|
||||||
savedImagePool, err = GetPoolName(ctx, monitors, cr, savedImagePoolID)
|
savedImagePool, err = util.GetPoolName(ctx, monitors, cr, savedImagePoolID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if _, ok := err.(ErrPoolNotFound); ok {
|
if _, ok := err.(util.ErrPoolNotFound); ok {
|
||||||
err = cj.UndoReservation(ctx, monitors, cr, journalPool, "", "", reqName)
|
err = cj.UndoReservation(ctx, monitors, cr, journalPool, "", "", reqName)
|
||||||
}
|
}
|
||||||
return nil, err
|
return nil, err
|
||||||
@ -279,7 +281,7 @@ func (cj *CSIJournal) CheckReservation(ctx context.Context, monitors string, cr
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
// error should specifically be not found, for image to be absent, any other error
|
// error should specifically be not found, for image to be absent, any other error
|
||||||
// is not conclusive, and we should not proceed
|
// is not conclusive, and we should not proceed
|
||||||
if _, ok := err.(ErrKeyNotFound); ok {
|
if _, ok := err.(util.ErrKeyNotFound); ok {
|
||||||
err = cj.UndoReservation(ctx, monitors, cr, journalPool, savedImagePool,
|
err = cj.UndoReservation(ctx, monitors, cr, journalPool, savedImagePool,
|
||||||
cj.GetNameForUUID(namePrefix, objUUID, snapSource), reqName)
|
cj.GetNameForUUID(namePrefix, objUUID, snapSource), reqName)
|
||||||
}
|
}
|
||||||
@ -315,7 +317,7 @@ func (cj *CSIJournal) CheckReservation(ctx context.Context, monitors string, cr
|
|||||||
err = fmt.Errorf("snapname points to different volume, request name (%s)"+
|
err = fmt.Errorf("snapname points to different volume, request name (%s)"+
|
||||||
" source name (%s) saved source name (%s)",
|
" source name (%s) saved source name (%s)",
|
||||||
reqName, parentName, savedImageAttributes.SourceName)
|
reqName, parentName, savedImageAttributes.SourceName)
|
||||||
return nil, ErrSnapNameConflict{reqName, err}
|
return nil, util.NewErrSnapNameConflict(reqName, err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -344,7 +346,7 @@ Input arguments:
|
|||||||
- volJournalPool: Pool name that holds the image/subvolume and the per-image journal (may be
|
- volJournalPool: Pool name that holds the image/subvolume and the per-image journal (may be
|
||||||
different if image is created in a topology constrained pool)
|
different if image is created in a topology constrained pool)
|
||||||
*/
|
*/
|
||||||
func (cj *CSIJournal) UndoReservation(ctx context.Context, monitors string, cr *Credentials,
|
func (cj *CSIJournal) UndoReservation(ctx context.Context, monitors string, cr *util.Credentials,
|
||||||
csiJournalPool, volJournalPool, volName, reqName string) error {
|
csiJournalPool, volJournalPool, volName, reqName string) error {
|
||||||
// delete volume UUID omap (first, inverse of create order)
|
// delete volume UUID omap (first, inverse of create order)
|
||||||
|
|
||||||
@ -358,20 +360,20 @@ func (cj *CSIJournal) UndoReservation(ctx context.Context, monitors string, cr *
|
|||||||
return fmt.Errorf("failed parsing UUID in %s", volName)
|
return fmt.Errorf("failed parsing UUID in %s", volName)
|
||||||
}
|
}
|
||||||
|
|
||||||
err := RemoveObject(ctx, monitors, cr, volJournalPool, cj.namespace, cj.cephUUIDDirectoryPrefix+imageUUID)
|
err := util.RemoveObject(ctx, monitors, cr, volJournalPool, cj.namespace, cj.cephUUIDDirectoryPrefix+imageUUID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if _, ok := err.(ErrObjectNotFound); !ok {
|
if _, ok := err.(util.ErrObjectNotFound); !ok {
|
||||||
klog.Errorf(Log(ctx, "failed removing oMap %s (%s)"), cj.cephUUIDDirectoryPrefix+imageUUID, err)
|
klog.Errorf(util.Log(ctx, "failed removing oMap %s (%s)"), cj.cephUUIDDirectoryPrefix+imageUUID, err)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// delete the request name key (last, inverse of create order)
|
// delete the request name key (last, inverse of create order)
|
||||||
err := RemoveOMapKey(ctx, monitors, cr, csiJournalPool, cj.namespace, cj.csiDirectory,
|
err := util.RemoveOMapKey(ctx, monitors, cr, csiJournalPool, cj.namespace, cj.csiDirectory,
|
||||||
cj.csiNameKeyPrefix+reqName)
|
cj.csiNameKeyPrefix+reqName)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
klog.Errorf(Log(ctx, "failed removing oMap key %s (%s)"), cj.csiNameKeyPrefix+reqName, err)
|
klog.Errorf(util.Log(ctx, "failed removing oMap key %s (%s)"), cj.csiNameKeyPrefix+reqName, err)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -381,7 +383,7 @@ func (cj *CSIJournal) UndoReservation(ctx context.Context, monitors string, cr *
|
|||||||
// reserveOMapName creates an omap with passed in oMapNamePrefix and a generated <uuid>.
|
// reserveOMapName creates an omap with passed in oMapNamePrefix and a generated <uuid>.
|
||||||
// It ensures generated omap name does not already exist and if conflicts are detected, a set
|
// It ensures generated omap name does not already exist and if conflicts are detected, a set
|
||||||
// number of retires with newer uuids are attempted before returning an error
|
// number of retires with newer uuids are attempted before returning an error
|
||||||
func reserveOMapName(ctx context.Context, monitors string, cr *Credentials, pool, namespace, oMapNamePrefix string) (string, error) {
|
func reserveOMapName(ctx context.Context, monitors string, cr *util.Credentials, pool, namespace, oMapNamePrefix string) (string, error) {
|
||||||
var iterUUID string
|
var iterUUID string
|
||||||
|
|
||||||
maxAttempts := 5
|
maxAttempts := 5
|
||||||
@ -390,12 +392,12 @@ func reserveOMapName(ctx context.Context, monitors string, cr *Credentials, pool
|
|||||||
// generate a uuid for the image name
|
// generate a uuid for the image name
|
||||||
iterUUID = uuid.NewUUID().String()
|
iterUUID = uuid.NewUUID().String()
|
||||||
|
|
||||||
err := CreateObject(ctx, monitors, cr, pool, namespace, oMapNamePrefix+iterUUID)
|
err := util.CreateObject(ctx, monitors, cr, pool, namespace, oMapNamePrefix+iterUUID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if _, ok := err.(ErrObjectExists); ok {
|
if _, ok := err.(util.ErrObjectExists); ok {
|
||||||
attempt++
|
attempt++
|
||||||
// try again with a different uuid, for maxAttempts tries
|
// try again with a different uuid, for maxAttempts tries
|
||||||
klog.V(4).Infof(Log(ctx, "uuid (%s) conflict detected, retrying (attempt %d of %d)"),
|
klog.V(4).Infof(util.Log(ctx, "uuid (%s) conflict detected, retrying (attempt %d of %d)"),
|
||||||
iterUUID, attempt, maxAttempts)
|
iterUUID, attempt, maxAttempts)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
@ -433,7 +435,7 @@ Return values:
|
|||||||
- string: Contains the image name that was reserved for the passed in reqName
|
- string: Contains the image name that was reserved for the passed in reqName
|
||||||
- error: non-nil in case of any errors
|
- error: non-nil in case of any errors
|
||||||
*/
|
*/
|
||||||
func (cj *CSIJournal) ReserveName(ctx context.Context, monitors string, cr *Credentials,
|
func (cj *CSIJournal) ReserveName(ctx context.Context, monitors string, cr *util.Credentials,
|
||||||
journalPool string, journalPoolID int64,
|
journalPool string, journalPoolID int64,
|
||||||
imagePool string, imagePoolID int64,
|
imagePool string, imagePoolID int64,
|
||||||
reqName, namePrefix, parentName, kmsConf string) (string, string, error) {
|
reqName, namePrefix, parentName, kmsConf string) (string, string, error) {
|
||||||
@ -464,7 +466,7 @@ func (cj *CSIJournal) ReserveName(ctx context.Context, monitors string, cr *Cred
|
|||||||
|
|
||||||
// Create request name (csiNameKey) key in csiDirectory and store the UUID based
|
// Create request name (csiNameKey) key in csiDirectory and store the UUID based
|
||||||
// volume name and optionally the image pool location into it
|
// volume name and optionally the image pool location into it
|
||||||
if journalPool != imagePool && imagePoolID != InvalidPoolID {
|
if journalPool != imagePool && imagePoolID != util.InvalidPoolID {
|
||||||
buf64 := make([]byte, 8)
|
buf64 := make([]byte, 8)
|
||||||
binary.BigEndian.PutUint64(buf64, uint64(imagePoolID))
|
binary.BigEndian.PutUint64(buf64, uint64(imagePoolID))
|
||||||
poolIDEncodedHex := hex.EncodeToString(buf64)
|
poolIDEncodedHex := hex.EncodeToString(buf64)
|
||||||
@ -473,17 +475,17 @@ func (cj *CSIJournal) ReserveName(ctx context.Context, monitors string, cr *Cred
|
|||||||
nameKeyVal = volUUID
|
nameKeyVal = volUUID
|
||||||
}
|
}
|
||||||
|
|
||||||
err = SetOMapKeyValue(ctx, monitors, cr, journalPool, cj.namespace, cj.csiDirectory,
|
err = util.SetOMapKeyValue(ctx, monitors, cr, journalPool, cj.namespace, cj.csiDirectory,
|
||||||
cj.csiNameKeyPrefix+reqName, nameKeyVal)
|
cj.csiNameKeyPrefix+reqName, nameKeyVal)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", "", err
|
return "", "", err
|
||||||
}
|
}
|
||||||
defer func() {
|
defer func() {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
klog.Warningf(Log(ctx, "reservation failed for volume: %s"), reqName)
|
klog.Warningf(util.Log(ctx, "reservation failed for volume: %s"), reqName)
|
||||||
errDefer := cj.UndoReservation(ctx, monitors, cr, imagePool, journalPool, imageName, reqName)
|
errDefer := cj.UndoReservation(ctx, monitors, cr, imagePool, journalPool, imageName, reqName)
|
||||||
if errDefer != nil {
|
if errDefer != nil {
|
||||||
klog.Warningf(Log(ctx, "failed undoing reservation of volume: %s (%v)"), reqName, errDefer)
|
klog.Warningf(util.Log(ctx, "failed undoing reservation of volume: %s (%v)"), reqName, errDefer)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
@ -492,14 +494,14 @@ func (cj *CSIJournal) ReserveName(ctx context.Context, monitors string, cr *Cred
|
|||||||
// and also CSI journal pool, when only the VolumeID is passed in (e.g DeleteVolume/DeleteSnapshot,
|
// and also CSI journal pool, when only the VolumeID is passed in (e.g DeleteVolume/DeleteSnapshot,
|
||||||
// VolID during CreateSnapshot).
|
// VolID during CreateSnapshot).
|
||||||
// Update UUID directory to store CSI request name
|
// Update UUID directory to store CSI request name
|
||||||
err = SetOMapKeyValue(ctx, monitors, cr, imagePool, cj.namespace, cj.cephUUIDDirectoryPrefix+volUUID,
|
err = util.SetOMapKeyValue(ctx, monitors, cr, imagePool, cj.namespace, cj.cephUUIDDirectoryPrefix+volUUID,
|
||||||
cj.csiNameKey, reqName)
|
cj.csiNameKey, reqName)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", "", err
|
return "", "", err
|
||||||
}
|
}
|
||||||
|
|
||||||
// Update UUID directory to store image name
|
// Update UUID directory to store image name
|
||||||
err = SetOMapKeyValue(ctx, monitors, cr, imagePool, cj.namespace, cj.cephUUIDDirectoryPrefix+volUUID,
|
err = util.SetOMapKeyValue(ctx, monitors, cr, imagePool, cj.namespace, cj.cephUUIDDirectoryPrefix+volUUID,
|
||||||
cj.csiImageKey, imageName)
|
cj.csiImageKey, imageName)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", "", err
|
return "", "", err
|
||||||
@ -507,20 +509,20 @@ func (cj *CSIJournal) ReserveName(ctx context.Context, monitors string, cr *Cred
|
|||||||
|
|
||||||
// Update UUID directory to store encryption values
|
// Update UUID directory to store encryption values
|
||||||
if kmsConf != "" {
|
if kmsConf != "" {
|
||||||
err = SetOMapKeyValue(ctx, monitors, cr, imagePool, cj.namespace, cj.cephUUIDDirectoryPrefix+volUUID,
|
err = util.SetOMapKeyValue(ctx, monitors, cr, imagePool, cj.namespace, cj.cephUUIDDirectoryPrefix+volUUID,
|
||||||
cj.encryptKMSKey, kmsConf)
|
cj.encryptKMSKey, kmsConf)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", "", err
|
return "", "", err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if journalPool != imagePool && journalPoolID != InvalidPoolID {
|
if journalPool != imagePool && journalPoolID != util.InvalidPoolID {
|
||||||
buf64 := make([]byte, 8)
|
buf64 := make([]byte, 8)
|
||||||
binary.BigEndian.PutUint64(buf64, uint64(journalPoolID))
|
binary.BigEndian.PutUint64(buf64, uint64(journalPoolID))
|
||||||
journalPoolIDStr := hex.EncodeToString(buf64)
|
journalPoolIDStr := hex.EncodeToString(buf64)
|
||||||
|
|
||||||
// Update UUID directory to store CSI journal pool name (prefer ID instead of name to be pool rename proof)
|
// Update UUID directory to store CSI journal pool name (prefer ID instead of name to be pool rename proof)
|
||||||
err = SetOMapKeyValue(ctx, monitors, cr, imagePool, cj.namespace, cj.cephUUIDDirectoryPrefix+volUUID,
|
err = util.SetOMapKeyValue(ctx, monitors, cr, imagePool, cj.namespace, cj.cephUUIDDirectoryPrefix+volUUID,
|
||||||
cj.csiJournalPool, journalPoolIDStr)
|
cj.csiJournalPool, journalPoolIDStr)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", "", err
|
return "", "", err
|
||||||
@ -529,7 +531,7 @@ func (cj *CSIJournal) ReserveName(ctx context.Context, monitors string, cr *Cred
|
|||||||
|
|
||||||
if snapSource {
|
if snapSource {
|
||||||
// Update UUID directory to store source volume UUID in case of snapshots
|
// Update UUID directory to store source volume UUID in case of snapshots
|
||||||
err = SetOMapKeyValue(ctx, monitors, cr, imagePool, cj.namespace, cj.cephUUIDDirectoryPrefix+volUUID,
|
err = util.SetOMapKeyValue(ctx, monitors, cr, imagePool, cj.namespace, cj.cephUUIDDirectoryPrefix+volUUID,
|
||||||
cj.cephSnapSourceKey, parentName)
|
cj.cephSnapSourceKey, parentName)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", "", err
|
return "", "", err
|
||||||
@ -549,7 +551,7 @@ type ImageAttributes struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// GetImageAttributes fetches all keys and their values, from a UUID directory, returning ImageAttributes structure
|
// GetImageAttributes fetches all keys and their values, from a UUID directory, returning ImageAttributes structure
|
||||||
func (cj *CSIJournal) GetImageAttributes(ctx context.Context, monitors string, cr *Credentials, pool, objectUUID string, snapSource bool) (*ImageAttributes, error) {
|
func (cj *CSIJournal) GetImageAttributes(ctx context.Context, monitors string, cr *util.Credentials, pool, objectUUID string, snapSource bool) (*ImageAttributes, error) {
|
||||||
var (
|
var (
|
||||||
err error
|
err error
|
||||||
imageAttributes *ImageAttributes = &ImageAttributes{}
|
imageAttributes *ImageAttributes = &ImageAttributes{}
|
||||||
@ -561,7 +563,7 @@ func (cj *CSIJournal) GetImageAttributes(ctx context.Context, monitors string, c
|
|||||||
}
|
}
|
||||||
|
|
||||||
// TODO: fetch all omap vals in one call, than make multiple listomapvals
|
// TODO: fetch all omap vals in one call, than make multiple listomapvals
|
||||||
imageAttributes.RequestName, err = GetOMapValue(ctx, monitors, cr, pool, cj.namespace,
|
imageAttributes.RequestName, err = util.GetOMapValue(ctx, monitors, cr, pool, cj.namespace,
|
||||||
cj.cephUUIDDirectoryPrefix+objectUUID, cj.csiNameKey)
|
cj.cephUUIDDirectoryPrefix+objectUUID, cj.csiNameKey)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
@ -569,7 +571,7 @@ func (cj *CSIJournal) GetImageAttributes(ctx context.Context, monitors string, c
|
|||||||
|
|
||||||
// image key was added at some point, so not all volumes will have this key set
|
// image key was added at some point, so not all volumes will have this key set
|
||||||
// when ceph-csi was upgraded
|
// when ceph-csi was upgraded
|
||||||
imageAttributes.ImageName, err = GetOMapValue(ctx, monitors, cr, pool, cj.namespace,
|
imageAttributes.ImageName, err = util.GetOMapValue(ctx, monitors, cr, pool, cj.namespace,
|
||||||
cj.cephUUIDDirectoryPrefix+objectUUID, cj.csiImageKey)
|
cj.cephUUIDDirectoryPrefix+objectUUID, cj.csiImageKey)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
// if the key was not found, assume the default key + UUID
|
// if the key was not found, assume the default key + UUID
|
||||||
@ -577,7 +579,7 @@ func (cj *CSIJournal) GetImageAttributes(ctx context.Context, monitors string, c
|
|||||||
switch err.(type) {
|
switch err.(type) {
|
||||||
default:
|
default:
|
||||||
return nil, err
|
return nil, err
|
||||||
case ErrKeyNotFound, ErrPoolNotFound:
|
case util.ErrKeyNotFound, util.ErrPoolNotFound:
|
||||||
}
|
}
|
||||||
|
|
||||||
if snapSource {
|
if snapSource {
|
||||||
@ -587,7 +589,7 @@ func (cj *CSIJournal) GetImageAttributes(ctx context.Context, monitors string, c
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
imageAttributes.KmsID, err = GetOMapValue(ctx, monitors, cr, pool, cj.namespace,
|
imageAttributes.KmsID, err = util.GetOMapValue(ctx, monitors, cr, pool, cj.namespace,
|
||||||
cj.cephUUIDDirectoryPrefix+objectUUID, cj.encryptKMSKey)
|
cj.cephUUIDDirectoryPrefix+objectUUID, cj.encryptKMSKey)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
// ErrKeyNotFound means no encryption KMS was used
|
// ErrKeyNotFound means no encryption KMS was used
|
||||||
@ -595,17 +597,17 @@ func (cj *CSIJournal) GetImageAttributes(ctx context.Context, monitors string, c
|
|||||||
default:
|
default:
|
||||||
return nil, fmt.Errorf("OMapVal for %s/%s failed to get encryption KMS value: %s",
|
return nil, fmt.Errorf("OMapVal for %s/%s failed to get encryption KMS value: %s",
|
||||||
pool, cj.cephUUIDDirectoryPrefix+objectUUID, err)
|
pool, cj.cephUUIDDirectoryPrefix+objectUUID, err)
|
||||||
case ErrKeyNotFound, ErrPoolNotFound:
|
case util.ErrKeyNotFound, util.ErrPoolNotFound:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
journalPoolIDStr, err := GetOMapValue(ctx, monitors, cr, pool, cj.namespace,
|
journalPoolIDStr, err := util.GetOMapValue(ctx, monitors, cr, pool, cj.namespace,
|
||||||
cj.cephUUIDDirectoryPrefix+objectUUID, cj.csiJournalPool)
|
cj.cephUUIDDirectoryPrefix+objectUUID, cj.csiJournalPool)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if _, ok := err.(ErrKeyNotFound); !ok {
|
if _, ok := err.(util.ErrKeyNotFound); !ok {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
imageAttributes.JournalPoolID = InvalidPoolID
|
imageAttributes.JournalPoolID = util.InvalidPoolID
|
||||||
} else {
|
} else {
|
||||||
var buf64 []byte
|
var buf64 []byte
|
||||||
buf64, err = hex.DecodeString(journalPoolIDStr)
|
buf64, err = hex.DecodeString(journalPoolIDStr)
|
||||||
@ -616,7 +618,7 @@ func (cj *CSIJournal) GetImageAttributes(ctx context.Context, monitors string, c
|
|||||||
}
|
}
|
||||||
|
|
||||||
if snapSource {
|
if snapSource {
|
||||||
imageAttributes.SourceName, err = GetOMapValue(ctx, monitors, cr, pool, cj.namespace,
|
imageAttributes.SourceName, err = util.GetOMapValue(ctx, monitors, cr, pool, cj.namespace,
|
||||||
cj.cephUUIDDirectoryPrefix+objectUUID, cj.cephSnapSourceKey)
|
cj.cephUUIDDirectoryPrefix+objectUUID, cj.cephSnapSourceKey)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
@ -18,6 +18,7 @@ package rbd
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
csicommon "github.com/ceph/ceph-csi/internal/csi-common"
|
csicommon "github.com/ceph/ceph-csi/internal/csi-common"
|
||||||
|
"github.com/ceph/ceph-csi/internal/journal"
|
||||||
"github.com/ceph/ceph-csi/internal/util"
|
"github.com/ceph/ceph-csi/internal/util"
|
||||||
|
|
||||||
"github.com/container-storage-interface/spec/lib/go/csi"
|
"github.com/container-storage-interface/spec/lib/go/csi"
|
||||||
@ -50,8 +51,8 @@ var (
|
|||||||
|
|
||||||
// volJournal and snapJournal are used to maintain RADOS based journals for CO generated
|
// volJournal and snapJournal are used to maintain RADOS based journals for CO generated
|
||||||
// VolumeName to backing RBD images
|
// VolumeName to backing RBD images
|
||||||
volJournal *util.CSIJournal
|
volJournal *journal.CSIJournal
|
||||||
snapJournal *util.CSIJournal
|
snapJournal *journal.CSIJournal
|
||||||
)
|
)
|
||||||
|
|
||||||
// NewDriver returns new rbd driver
|
// NewDriver returns new rbd driver
|
||||||
@ -103,8 +104,8 @@ func (r *Driver) Run(conf *util.Config, cachePersister util.CachePersister) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Get an instance of the volume and snapshot journal keys
|
// Get an instance of the volume and snapshot journal keys
|
||||||
volJournal = util.NewCSIVolumeJournal()
|
volJournal = journal.NewCSIVolumeJournal()
|
||||||
snapJournal = util.NewCSISnapshotJournal()
|
snapJournal = journal.NewCSISnapshotJournal()
|
||||||
|
|
||||||
// Update keys with CSI instance suffix
|
// Update keys with CSI instance suffix
|
||||||
volJournal.SetCSIDirectorySuffix(CSIInstanceID)
|
volJournal.SetCSIDirectorySuffix(CSIInstanceID)
|
||||||
|
@ -24,6 +24,7 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
csicommon "github.com/ceph/ceph-csi/internal/csi-common"
|
csicommon "github.com/ceph/ceph-csi/internal/csi-common"
|
||||||
|
"github.com/ceph/ceph-csi/internal/journal"
|
||||||
"github.com/ceph/ceph-csi/internal/util"
|
"github.com/ceph/ceph-csi/internal/util"
|
||||||
|
|
||||||
"github.com/container-storage-interface/spec/lib/go/csi"
|
"github.com/container-storage-interface/spec/lib/go/csi"
|
||||||
@ -145,7 +146,7 @@ func (ns *NodeServer) NodeStageVolume(ctx context.Context, req *csi.NodeStageVol
|
|||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
var vi util.CSIIdentifier
|
var vi util.CSIIdentifier
|
||||||
var imageAttributes *util.ImageAttributes
|
var imageAttributes *journal.ImageAttributes
|
||||||
err = vi.DecomposeCSIID(volID)
|
err = vi.DecomposeCSIID(volID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
err = fmt.Errorf("error decoding volume ID (%s) (%s)", err, volID)
|
err = fmt.Errorf("error decoding volume ID (%s) (%s)", err, volID)
|
||||||
|
Loading…
Reference in New Issue
Block a user