Respect the "snapshot.storage.kubernetes.io/is-default-class: true" annotation of VolumeSnapshotClass when taking the CSI snapshot
Currently, Velero chooses the VolumeSnapshotClass with the annotation velero.io/csi-volumesnapshot-class: "true" added when taking CSI snapshot, there is an official annotation snapshot.storage.kubernetes.io/is-default-class: true introduced to specify a default VolumeSnapshotClass for VolumeSnapshot that don't request any particular class to bind to.
So we could refine the current VolumeSnapshotClass choosing logic as follows:
- Use the default
VolumeSnapshotClassannotated withsnapshot.storage.kubernetes.io/is-default-class: true - Else use the
VolumeSnapshotClassannotated withvelero.io/csi-volumesnapshot-class: "true"
Vote on this issue!
This is an invitation to the Velero community to vote on issues, you can see the project's top voted issues listed here.
Use the "reaction smiley face" up to the right of this comment to vote.
- :+1: for "I would like to see this bug fixed as soon as possible"
- :-1: for "There are more important bugs to focus on right now"
Is there any reason there isn't a third else for looping through drivers and picking one that works?
Is there any reason there isn't a third else for looping through drivers and picking one that works?
Is this what you expect? This also makes sense to me.
- Use the default
VolumeSnapshotClassannotated withsnapshot.storage.kubernetes.io/is-default-class: true - Else choose the
VolumeSnapshotClasswhosedriverfield matches the PVC'sStorageClass - Else use the
VolumeSnapshotClassannotated withvelero.io/csi-volumesnapshot-class: "true"
- Use the default VolumeSnapshotClass annotated with snapshot.storage.kubernetes.io/is-default-class: true
- Else choose the VolumeSnapshotClass whose driver field matches the PVC's StorageClass annotated with velero.io/csi-volumesnapshot-class: "true"
- since there can be multiple volumesnapshotclasses per driver, and you can add parameters in a different way for the same driver.
- Else choose the VolumeSnapshotClass whose driver field matches the PVC's StorageClass without annotation
- Else use the VolumeSnapshotClass annotated with velero.io/csi-volumesnapshot-class: "true" but driver does not match (not sure if this is even possible or not.. but last resort)
https://github.com/vmware-tanzu/velero-plugin-for-csi/pull/178/files#diff-0f38f067df1a3a5e5fb78bd16bfeb63f7c7c89524abc32b98a875b6152474bb4
I believe snapshot.storage.kubernetes.io/is-default-class: true should come after all these 3 if
Because if we put this above the velero annotation, the existing behaviour will break in some sense for users.
If this is breaking change we can add feature flag to enable the new behavior.
If this is breaking change we can add feature flag to enable the new behavior.
I don't think the feature flag is a good option because this will introduce another configuration.
We should try to avoid introducing the break change, so how about choosing the VolumeSnapshotClass as the following priority:
- The
VolumeSnapshotClassannotated withvelero.io/csi-volumesnapshot-class: "true" - The
VolumeSnapshotClassannotated withsnapshot.storage.kubernetes.io/is-default-class: true - The
VolumeSnapshotClasswhose driver field matches the PVC'sStorageClass
And report error if the above logic matches more than 1 VolumeSnapshotClass
// If a snapshot class is sent for provider in PVC annotations, use that
snapshotClass, err := GetVolumeSnapshotClassFromPVCAnnotationsForDriver(pvc, provisioner, snapshotClasses)
if err != nil {
log.Debugf("Didn't find VolumeSnapshotClass from PVC annotations: %v", err)
}
if snapshotClass != nil {
return snapshotClass, nil
}
// If there is no annotation in PVC, attempt to fetch it from backup annotations
snapshotClass, err = GetVolumeSnapshotClassFromBackupAnnotationsForDriver(backup, provisioner, snapshotClasses)
if err != nil {
log.Debugf("Didn't find VolumeSnapshotClass from Backup annotations: %v", err)
}
if snapshotClass != nil {
return snapshotClass, nil
}
// fallback to default behaviour of fetching snapshot class based on label on VSClass
// velero.io/csi-volumesnapshot-class: "true"
snapshotClass, err = GetVolumeSnapshotClassForStorageClass(provisioner, snapshotClasses)
if err != nil || snapshotClass == nil {
return nil, errors.Wrap(err, "error getting volumesnapshotclass")
}
// fallback to default behaviour of fetching snapshot class based on label on VSClass
// snapshot.storage.kubernetes.io/is-default-class: true
snapshotClass, err = GetVolumeSnapshotClassForStorageClass(provisioner, snapshotClasses)
if err != nil || snapshotClass == nil {
return nil, errors.Wrap(err, "error getting volumesnapshotclass")
}
@kaovilai / @ywk253100 how does above draft look?
Looks good, missing the third one from https://github.com/vmware-tanzu/velero/issues/8294#issuecomment-2421855002
I personally don't see a need for it at this point.
We should expect customer to put either of snapshot.storage.kubernetes.io/is-default-class: true
snapshot.storage.kubernetes.io/is-default-class: true
This keeps the behaviour deterministic. Let me know if there is any user ask for this.
It just removes a step from pre-requisite that's all. Many local/dev cluster like KinD or crc would most likely only have one. This would keep velero install scripts generic for several local cluster environments. But that can also be done outside of velero so I am ok skipping non-deterministic for velero.
IMHO, although this issue improves user experience, it may not be a high priority for v1.16.
I agree with you @reasonerjt But this might be a good candidate for newcomers.
Hi! I am new to Velero and this issue looks like a good start. Can I get this assigned?
I currently don’t have the time to work on this, so feel free to pick it up if anyone is available. Thanks
There is an implementation going in #8646 that could be relevant to some affected by this issue.
https://github.com/vmware-tanzu/velero-plugin-for-csi/pull/238
I encountered such volumeSnapshotClass in the project
Maybe label velero.io/csi-volumesnapshot-class not exist,but annotation snapshot.storage.kubernetes.io/is-default-class exist
please review @anshulahuja98 @ywk253100
@hu-keyu , the CSI plugin repo is not longer under use. CSI plugin code is merged in core velero, would suggest you to raise PR in main repo - https://github.com/vmware-tanzu/velero
@hu-keyu , the CSI plugin repo is not longer under use. CSI plugin code is merged in core velero, would suggest you to raise PR in main repo - https://github.com/vmware-tanzu/velero
ok
@anshulahuja98
https://github.com/vmware-tanzu/velero/pull/8719