Open ywk253100 opened 3 weeks ago
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.
VolumeSnapshotClass
annotated with snapshot.storage.kubernetes.io/is-default-class: true
VolumeSnapshotClass
whose driver
field matches the PVC's StorageClass
VolumeSnapshotClass
annotated with velero.io/csi-volumesnapshot-class: "true"
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:
VolumeSnapshotClass
annotated with velero.io/csi-volumesnapshot-class: "true"
VolumeSnapshotClass
annotated with snapshot.storage.kubernetes.io/is-default-class: true
VolumeSnapshotClass
whose driver field matches the PVC's StorageClass
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.
Currently, Velero chooses the
VolumeSnapshotClass
with the annotationvelero.io/csi-volumesnapshot-class: "true"
added when taking CSI snapshot, there is an official annotationsnapshot.storage.kubernetes.io/is-default-class: true
introduced to specify a defaultVolumeSnapshotClass
forVolumeSnapshot
that don't request any particular class to bind to.So we could refine the current
VolumeSnapshotClass
choosing logic as follows:VolumeSnapshotClass
annotated withsnapshot.storage.kubernetes.io/is-default-class: true
VolumeSnapshotClass
annotated 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.