@@ -557,6 +557,51 @@ func (v *BackupVolumesInformation) getVolumeSnapshotClasses() (
557557 return vsClassList .Items , nil
558558}
559559
560+ func (v * BackupVolumesInformation ) getDriverFromVolumeSnapshot (
561+ vsName string ,
562+ namespace string ,
563+ ) (string , error ) {
564+ if vsName == "" {
565+ v .logger .Debugf ("vsName is empty. Return early." )
566+ return "" , nil
567+ }
568+
569+ vs := new (snapshotv1api.VolumeSnapshot )
570+ if err := v .crClient .Get (
571+ context .TODO (),
572+ kbclient.ObjectKey {Namespace : namespace , Name : vsName },
573+ vs ,
574+ ); err != nil {
575+ v .logger .Infof ("Fail to get VolumeSnapshot %s: %s" , namespace + "/" + vsName , err .Error ())
576+ return "" , errors .Errorf ("fail to get VolumeSnapshot %s: %s" ,
577+ namespace + "/" + vsName , err .Error ())
578+ }
579+
580+ if vs .Status == nil || vs .Status .BoundVolumeSnapshotContentName == nil {
581+ v .logger .Infof ("VolumeSnapshot %s doesn't have a bound VolumeSnapshotContent" ,
582+ namespace + "/" + vsName )
583+ return "" , errors .Errorf ("volumeSnapshot %s doesn't have a bound VolumeSnapshotContent" , namespace + "/" + vsName )
584+ }
585+
586+ vsc := new (snapshotv1api.VolumeSnapshotContent )
587+ if err := v .crClient .Get (
588+ context .TODO (),
589+ kbclient.ObjectKey {Name : * vs .Status .BoundVolumeSnapshotContentName },
590+ vsc ,
591+ ); err != nil {
592+ v .logger .Infof ("Fail to get VolumeSnapshotContent %s: %s" ,
593+ * vs .Status .BoundVolumeSnapshotContentName , err .Error ())
594+ return "" ,
595+ errors .Errorf ("fail to get VolumeSnapshotContent %s: %s" ,
596+ * vs .Status .BoundVolumeSnapshotContentName ,
597+ err .Error (),
598+ )
599+ }
600+
601+ v .logger .Debugf ("Found driver %s for VolumeSnapshot %s." , vsc .Spec .Driver , namespace + "/" + vsName )
602+ return vsc .Spec .Driver , nil
603+ }
604+
560605// generateVolumeInfoFromDataUpload generate BackupVolumeInfo for DataUpload.
561606func (v * BackupVolumesInformation ) generateVolumeInfoFromDataUpload () {
562607 if ! features .IsEnabled (velerov1api .CSIFeatureFlag ) {
@@ -581,14 +626,7 @@ func (v *BackupVolumesInformation) generateVolumeInfoFromDataUpload() {
581626 }
582627 }
583628
584- var vsClassList []snapshotv1api.VolumeSnapshotClass
585- if len (duOperationMap ) > 0 {
586- var err error
587- vsClassList , err = v .getVolumeSnapshotClasses ()
588- if err != nil {
589- return
590- }
591- } else {
629+ if len (duOperationMap ) <= 0 {
592630 // No DataUpload is found. Return early.
593631 return
594632 }
@@ -609,11 +647,16 @@ func (v *BackupVolumesInformation) generateVolumeInfoFromDataUpload() {
609647 continue
610648 }
611649
612- driverUsedByVSClass := ""
613- for index := range vsClassList {
614- if vsClassList [index ].Name == dataUpload .Spec .CSISnapshot .SnapshotClass {
615- driverUsedByVSClass = vsClassList [index ].Driver
616- }
650+ driver , driverErr := v .getDriverFromVolumeSnapshot (
651+ dataUpload .Spec .CSISnapshot .VolumeSnapshot ,
652+ dataUpload .Namespace ,
653+ )
654+ if driverErr != nil {
655+ v .logger .Warnf ("Fail to get driver for VolumeSnapshot %s: %s" ,
656+ dataUpload .Namespace + "/" + dataUpload .Spec .CSISnapshot .VolumeSnapshot ,
657+ driverErr .Error (),
658+ )
659+ continue
617660 }
618661
619662 if pvcPVInfo := v .pvMap .retrieve (
@@ -637,7 +680,7 @@ func (v *BackupVolumesInformation) generateVolumeInfoFromDataUpload() {
637680 SnapshotHandle : FieldValueIsUnknown ,
638681 VSCName : FieldValueIsUnknown ,
639682 OperationID : FieldValueIsUnknown ,
640- Driver : driverUsedByVSClass ,
683+ Driver : driver ,
641684 },
642685 SnapshotDataMovementInfo : & SnapshotDataMovementInfo {
643686 DataMover : dataMover ,
0 commit comments