diff --git a/internal/rbd/controllerserver.go b/internal/rbd/controllerserver.go index e3796b6611d2..9037e1c23710 100644 --- a/internal/rbd/controllerserver.go +++ b/internal/rbd/controllerserver.go @@ -1173,6 +1173,7 @@ func (cs *ControllerServer) CreateSnapshot( // Update the metadata on snapshot not on the original image rbdVol.RbdImageName = rbdSnap.RbdSnapName + rbdVol.ImageID = vol.ImageID rbdVol.ClusterName = cs.ClusterName defer func() { diff --git a/internal/rbd/rbd_util.go b/internal/rbd/rbd_util.go index f273d40ab812..2dbb7d5fe674 100644 --- a/internal/rbd/rbd_util.go +++ b/internal/rbd/rbd_util.go @@ -114,6 +114,8 @@ type rbdImage struct { NamePrefix string // ParentName represents the parent image name of the image. ParentName string + // ParentID represents the parent image ID of the image. + ParentID string // Parent Pool is the pool that contains the parent image. ParentPool string // Cluster name @@ -711,6 +713,7 @@ func (ri *rbdImage) getCloneDepth(ctx context.Context) (uint, error) { vol.Pool = ri.Pool vol.Monitors = ri.Monitors vol.RbdImageName = ri.RbdImageName + vol.ImageID = ri.ImageID vol.RadosNamespace = ri.RadosNamespace vol.conn = ri.conn.Copy() @@ -743,6 +746,7 @@ func (ri *rbdImage) getCloneDepth(ctx context.Context) (uint, error) { depth++ } vol.RbdImageName = vol.ParentName + vol.ImageID = vol.ParentID vol.Pool = vol.ParentPool } } @@ -882,6 +886,9 @@ func (ri *rbdImage) getParentName() (string, error) { return "", err } + ri.ParentName = parentInfo.Image.ImageName + ri.ParentID = parentInfo.Image.ImageID + return parentInfo.Image.ImageName, nil } @@ -1595,6 +1602,11 @@ func (ri *rbdImage) getImageInfo() error { // TODO: can rv.VolSize not be a uint64? Or initialize it to -1? ri.VolSize = int64(imageInfo.Size) + ri.ImageID, err = image.GetId() + if err != nil { + return err + } + features, err := image.GetFeatures() if err != nil { return err @@ -1608,11 +1620,13 @@ func (ri *rbdImage) getImageInfo() error { // the parent is an error or not. if errors.Is(err, librbd.ErrNotFound) { ri.ParentName = "" + ri.ParentID = "" } else { return err } } else { ri.ParentName = parentInfo.Image.ImageName + ri.ParentID = parentInfo.Image.ImageID ri.ParentPool = parentInfo.Image.PoolName } // Get image creation time @@ -1643,6 +1657,7 @@ func (ri *rbdImage) getParent() (*rbdImage, error) { parentImage.Pool = ri.ParentPool parentImage.RadosNamespace = ri.RadosNamespace parentImage.RbdImageName = ri.ParentName + parentImage.ImageID = ri.ParentID err = parentImage.getImageInfo() if err != nil { @@ -1699,6 +1714,7 @@ type rbdImageMetadataStash struct { Pool string `json:"pool"` RadosNamespace string `json:"radosNamespace"` ImageName string `json:"image"` + ImageID string `json:"imageID"` UnmapOptions string `json:"unmapOptions"` NbdAccess bool `json:"accessType"` Encrypted bool `json:"encrypted"` @@ -1728,6 +1744,7 @@ func stashRBDImageMetadata(volOptions *rbdVolume, metaDataPath string) error { Pool: volOptions.Pool, RadosNamespace: volOptions.RadosNamespace, ImageName: volOptions.RbdImageName, + ImageID: volOptions.ImageID, Encrypted: volOptions.isBlockEncrypted(), UnmapOptions: volOptions.UnmapOptions, } diff --git a/internal/rbd/snapshot.go b/internal/rbd/snapshot.go index 92823e40ef97..85e5c08b00e8 100644 --- a/internal/rbd/snapshot.go +++ b/internal/rbd/snapshot.go @@ -107,6 +107,8 @@ func generateVolFromSnap(rbdSnap *rbdSnapshot) *rbdVolume { vol.JournalPool = rbdSnap.JournalPool vol.RadosNamespace = rbdSnap.RadosNamespace vol.RbdImageName = rbdSnap.RbdSnapName + vol.ParentName = rbdSnap.ParentName + vol.ParentID = rbdSnap.ParentID // /!\ WARNING /!\ //