mirror of
https://github.com/ceph/ceph-csi.git
synced 2024-11-25 07:40:19 +00:00
rbd: set metadata on the snapshot
Set snapshot-name/snapshot-namespace/snapshotcontent-name details on RBD backend snapshot image as metadata on snapshot Signed-off-by: Prasanna Kumar Kalever <prasanna.kalever@redhat.com>
This commit is contained in:
parent
463990c999
commit
41fe2c7dda
@ -963,6 +963,7 @@ func (cs *ControllerServer) ValidateVolumeCapabilities(
|
|||||||
}
|
}
|
||||||
|
|
||||||
// CreateSnapshot creates the snapshot in backend and stores metadata in store.
|
// CreateSnapshot creates the snapshot in backend and stores metadata in store.
|
||||||
|
// nolint:cyclop // TODO: reduce complexity
|
||||||
func (cs *ControllerServer) CreateSnapshot(
|
func (cs *ControllerServer) CreateSnapshot(
|
||||||
ctx context.Context,
|
ctx context.Context,
|
||||||
req *csi.CreateSnapshotRequest) (*csi.CreateSnapshotResponse, error) {
|
req *csi.CreateSnapshotRequest) (*csi.CreateSnapshotResponse, error) {
|
||||||
@ -1036,7 +1037,7 @@ func (cs *ControllerServer) CreateSnapshot(
|
|||||||
return nil, status.Errorf(codes.Internal, err.Error())
|
return nil, status.Errorf(codes.Internal, err.Error())
|
||||||
}
|
}
|
||||||
if found {
|
if found {
|
||||||
return cloneFromSnapshot(ctx, rbdVol, rbdSnap, cr)
|
return cloneFromSnapshot(ctx, rbdVol, rbdSnap, cr, req.GetParameters())
|
||||||
}
|
}
|
||||||
|
|
||||||
err = flattenTemporaryClonedImages(ctx, rbdVol, cr)
|
err = flattenTemporaryClonedImages(ctx, rbdVol, cr)
|
||||||
@ -1062,6 +1063,16 @@ func (cs *ControllerServer) CreateSnapshot(
|
|||||||
return nil, status.Error(codes.Internal, err.Error())
|
return nil, status.Error(codes.Internal, err.Error())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Update the metadata on snapshot not on the original image
|
||||||
|
rbdVol.RbdImageName = rbdSnap.RbdSnapName
|
||||||
|
|
||||||
|
// Set snapshot-name/snapshot-namespace/snapshotcontent-name details
|
||||||
|
// on RBD backend image as metadata on create
|
||||||
|
err = rbdVol.setSnapshotMetadata(req.GetParameters())
|
||||||
|
if err != nil {
|
||||||
|
return nil, status.Error(codes.Internal, err.Error())
|
||||||
|
}
|
||||||
|
|
||||||
return &csi.CreateSnapshotResponse{
|
return &csi.CreateSnapshotResponse{
|
||||||
Snapshot: &csi.Snapshot{
|
Snapshot: &csi.Snapshot{
|
||||||
SizeBytes: vol.VolSize,
|
SizeBytes: vol.VolSize,
|
||||||
@ -1079,7 +1090,8 @@ func cloneFromSnapshot(
|
|||||||
ctx context.Context,
|
ctx context.Context,
|
||||||
rbdVol *rbdVolume,
|
rbdVol *rbdVolume,
|
||||||
rbdSnap *rbdSnapshot,
|
rbdSnap *rbdSnapshot,
|
||||||
cr *util.Credentials) (*csi.CreateSnapshotResponse, error) {
|
cr *util.Credentials,
|
||||||
|
parameters map[string]string) (*csi.CreateSnapshotResponse, error) {
|
||||||
vol := generateVolFromSnap(rbdSnap)
|
vol := generateVolFromSnap(rbdSnap)
|
||||||
err := vol.Connect(cr)
|
err := vol.Connect(cr)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -1112,6 +1124,15 @@ func cloneFromSnapshot(
|
|||||||
return nil, status.Errorf(codes.Internal, err.Error())
|
return nil, status.Errorf(codes.Internal, err.Error())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Update snapshot-name/snapshot-namespace/snapshotcontent-name details on
|
||||||
|
// RBD backend image as metadata on restart of provisioner pod when image exist
|
||||||
|
if len(parameters) != 0 {
|
||||||
|
err = rbdVol.setSnapshotMetadata(parameters)
|
||||||
|
if err != nil {
|
||||||
|
return nil, status.Error(codes.Internal, err.Error())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return &csi.CreateSnapshotResponse{
|
return &csi.CreateSnapshotResponse{
|
||||||
Snapshot: &csi.Snapshot{
|
Snapshot: &csi.Snapshot{
|
||||||
SizeBytes: rbdSnap.VolSize,
|
SizeBytes: rbdSnap.VolSize,
|
||||||
|
@ -1933,3 +1933,16 @@ func (rv *rbdVolume) setVolumeMetadata(parameters map[string]string) error {
|
|||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// setSnapshotMetadata Set snapshot-name/snapshot-namespace/snapshotcontent-name metadata
|
||||||
|
// on RBD image.
|
||||||
|
func (rv *rbdVolume) setSnapshotMetadata(parameters map[string]string) error {
|
||||||
|
for k, v := range k8s.GetSnapshotMetadata(parameters) {
|
||||||
|
err := rv.SetMetadata(k, v)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("failed to set metadata key %q, value %q on image: %w", k, v, err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
@ -29,6 +29,11 @@ const (
|
|||||||
pvcNameKey = "csi.storage.k8s.io/pvc/name"
|
pvcNameKey = "csi.storage.k8s.io/pvc/name"
|
||||||
pvcNamespaceKey = "csi.storage.k8s.io/pvc/namespace"
|
pvcNamespaceKey = "csi.storage.k8s.io/pvc/namespace"
|
||||||
pvNameKey = "csi.storage.k8s.io/pv/name"
|
pvNameKey = "csi.storage.k8s.io/pv/name"
|
||||||
|
|
||||||
|
// snapshot metadata keys.
|
||||||
|
volSnapNameKey = "csi.storage.k8s.io/volumesnapshot/name"
|
||||||
|
volSnapNamespaceKey = "csi.storage.k8s.io/volumesnapshot/namespace"
|
||||||
|
volSnapContentNameKey = "csi.storage.k8s.io/volumesnapshotcontent/name"
|
||||||
)
|
)
|
||||||
|
|
||||||
// RemoveCSIPrefixedParameters removes parameters prefixed with csiParameterPrefix.
|
// RemoveCSIPrefixedParameters removes parameters prefixed with csiParameterPrefix.
|
||||||
@ -79,3 +84,19 @@ func PrepareVolumeMetadata(pvcName, pvcNamespace, pvName string) map[string]stri
|
|||||||
|
|
||||||
return newParam
|
return newParam
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// GetSnapshotMetadata filter parameters, only return
|
||||||
|
// snapshot-name/snapshot-namespace/snapshotcontent-name metadata.
|
||||||
|
func GetSnapshotMetadata(parameters map[string]string) map[string]string {
|
||||||
|
keys := []string{volSnapNameKey, volSnapNamespaceKey, volSnapContentNameKey}
|
||||||
|
newParam := map[string]string{}
|
||||||
|
for k, v := range parameters {
|
||||||
|
for _, key := range keys {
|
||||||
|
if strings.Contains(k, key) {
|
||||||
|
newParam[k] = v
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return newParam
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user