@@ -792,6 +792,179 @@ func TestCSILimitsAddedPVCQHint(t *testing.T) {
792
792
}
793
793
}
794
794
795
+ func TestCSILimitsDeletedVolumeAttachmentQHint (t * testing.T ) {
796
+ tests := []struct {
797
+ test string
798
+ newPod * v1.Pod
799
+ existingPVC * v1.PersistentVolumeClaim
800
+ deletedVA * storagev1.VolumeAttachment
801
+ wantQHint framework.QueueingHint
802
+ }{
803
+ {
804
+ test : "a pod has PVC when VolumeAttachment is deleting" ,
805
+ newPod : st .MakePod ().Namespace ("ns1" ).Volume (
806
+ v1.Volume {
807
+ VolumeSource : v1.VolumeSource {
808
+ PersistentVolumeClaim : & v1.PersistentVolumeClaimVolumeSource {
809
+ ClaimName : "pvc1" ,
810
+ },
811
+ },
812
+ },
813
+ ).Obj (),
814
+ existingPVC : st .MakePersistentVolumeClaim ().Name ("pvc1" ).Namespace ("ns1" ).
815
+ VolumeName ("pv1" ).Obj (),
816
+ deletedVA : st .MakeVolumeAttachment ().Name ("volumeattachment1" ).
817
+ NodeName ("fake-node" ).
818
+ Attacher ("test.storage.gke.io" ).
819
+ Source (storagev1.VolumeAttachmentSource {PersistentVolumeName : ptr .To ("pv1" )}).Obj (),
820
+ wantQHint : framework .Queue ,
821
+ },
822
+ {
823
+ test : "a pod has an Inline Migratable volume (AWSEBSDriver) when VolumeAttachment (AWSEBSDriver) is deleting (match)" ,
824
+ newPod : st .MakePod ().Namespace ("ns1" ).Volume (
825
+ v1.Volume {
826
+ VolumeSource : v1.VolumeSource {
827
+ AWSElasticBlockStore : & v1.AWSElasticBlockStoreVolumeSource {
828
+ VolumeID : "test" ,
829
+ },
830
+ },
831
+ },
832
+ ).Obj (),
833
+ deletedVA : st .MakeVolumeAttachment ().Name ("volumeattachment1" ).
834
+ NodeName ("fake-node" ).
835
+ Attacher ("ebs.csi.aws.com" ).
836
+ Source (storagev1.VolumeAttachmentSource {
837
+ InlineVolumeSpec : & v1.PersistentVolumeSpec {
838
+ PersistentVolumeSource : v1.PersistentVolumeSource {
839
+ CSI : & v1.CSIPersistentVolumeSource {
840
+ Driver : "ebs.csi.aws.com" ,
841
+ },
842
+ },
843
+ },
844
+ }).Obj (),
845
+ wantQHint : framework .Queue ,
846
+ },
847
+ {
848
+ test : "a pod has an Inline Migratable volume (GCEPDDriver) when VolumeAttachment (AWSEBSDriver) is deleting (no match)" ,
849
+ newPod : st .MakePod ().Namespace ("ns1" ).Volume (
850
+ v1.Volume {
851
+ VolumeSource : v1.VolumeSource {
852
+ GCEPersistentDisk : & v1.GCEPersistentDiskVolumeSource {
853
+ PDName : "test" ,
854
+ },
855
+ },
856
+ },
857
+ ).Obj (),
858
+ deletedVA : st .MakeVolumeAttachment ().Name ("volumeattachment1" ).
859
+ NodeName ("fake-node" ).
860
+ Attacher ("ebs.csi.aws.com" ).
861
+ Source (storagev1.VolumeAttachmentSource {
862
+ InlineVolumeSpec : & v1.PersistentVolumeSpec {
863
+ PersistentVolumeSource : v1.PersistentVolumeSource {
864
+ CSI : & v1.CSIPersistentVolumeSource {
865
+ Driver : "ebs.csi.aws.com" ,
866
+ },
867
+ },
868
+ },
869
+ }).Obj (),
870
+ wantQHint : framework .QueueSkip ,
871
+ },
872
+ {
873
+ test : "a pod has an Inline Migratable volume (AWSEBSDriver) and PVC when VolumeAttachment (AWSEBSDriver) is deleting" ,
874
+ newPod : st .MakePod ().Namespace ("ns1" ).Volume (
875
+ v1.Volume {
876
+ VolumeSource : v1.VolumeSource {
877
+ AWSElasticBlockStore : & v1.AWSElasticBlockStoreVolumeSource {
878
+ VolumeID : "test" ,
879
+ },
880
+ },
881
+ },
882
+ ).Volume (
883
+ v1.Volume {
884
+ VolumeSource : v1.VolumeSource {
885
+ PersistentVolumeClaim : & v1.PersistentVolumeClaimVolumeSource {
886
+ ClaimName : "pvc1" ,
887
+ },
888
+ },
889
+ },
890
+ ).Obj (),
891
+ existingPVC : st .MakePersistentVolumeClaim ().Name ("pvc1" ).Namespace ("ns1" ).
892
+ VolumeName ("pv1" ).Obj (),
893
+ deletedVA : st .MakeVolumeAttachment ().Name ("volumeattachment1" ).
894
+ NodeName ("fake-node" ).
895
+ Attacher ("ebs.csi.aws.com" ).
896
+ Source (storagev1.VolumeAttachmentSource {
897
+ InlineVolumeSpec : & v1.PersistentVolumeSpec {
898
+ PersistentVolumeSource : v1.PersistentVolumeSource {
899
+ CSI : & v1.CSIPersistentVolumeSource {
900
+ Driver : "ebs.csi.aws.com" ,
901
+ },
902
+ },
903
+ },
904
+ }).Obj (),
905
+ wantQHint : framework .Queue ,
906
+ },
907
+ {
908
+ test : "a pod has an Inline Migratable volume (AWSEBSDriver) and PVC when VolumeAttachment (AWSEBSDriver) is deleting" ,
909
+ newPod : st .MakePod ().Namespace ("ns1" ).Volume (
910
+ v1.Volume {
911
+ VolumeSource : v1.VolumeSource {
912
+ AWSElasticBlockStore : & v1.AWSElasticBlockStoreVolumeSource {
913
+ VolumeID : "test" ,
914
+ },
915
+ },
916
+ },
917
+ ).Volume (
918
+ v1.Volume {
919
+ VolumeSource : v1.VolumeSource {
920
+ PersistentVolumeClaim : & v1.PersistentVolumeClaimVolumeSource {
921
+ ClaimName : "pvc1" ,
922
+ },
923
+ },
924
+ },
925
+ ).Obj (),
926
+ existingPVC : st .MakePersistentVolumeClaim ().Name ("pvc1" ).Namespace ("ns1" ).
927
+ VolumeName ("pv1" ).Obj (),
928
+ deletedVA : st .MakeVolumeAttachment ().Name ("volumeattachment1" ).
929
+ NodeName ("fake-node" ).
930
+ Attacher ("test.storage.gke.io" ).
931
+ Source (storagev1.VolumeAttachmentSource {PersistentVolumeName : ptr .To ("pv1" )}).Obj (),
932
+ wantQHint : framework .Queue ,
933
+ },
934
+ {
935
+ test : "a pod has no PVC when VolumeAttachment is deleting" ,
936
+ newPod : st .MakePod ().Namespace ("ns1" ).Obj (),
937
+ deletedVA : st .MakeVolumeAttachment ().Name ("volumeattachment1" ).
938
+ NodeName ("fake-node" ).
939
+ Attacher ("test.storage.gke.io" ).
940
+ Source (storagev1.VolumeAttachmentSource {PersistentVolumeName : ptr .To ("pv1" )}).Obj (),
941
+ wantQHint : framework .QueueSkip ,
942
+ },
943
+ }
944
+
945
+ for _ , test := range tests {
946
+ t .Run (test .test , func (t * testing.T ) {
947
+ var pvcList tf.PersistentVolumeClaimLister
948
+ if test .existingPVC != nil {
949
+ pvcList = append (pvcList , * test .existingPVC )
950
+ }
951
+ p := & CSILimits {
952
+ pvcLister : pvcList ,
953
+ translator : csitrans .New (),
954
+ }
955
+ logger , _ := ktesting .NewTestContext (t )
956
+
957
+ qhint , err := p .isSchedulableAfterVolumeAttachmentDeleted (logger , test .newPod , test .deletedVA , nil )
958
+ if err != nil {
959
+ t .Errorf ("isSchedulableAfterVolumeAttachmentDeleted failed: %v" , err )
960
+ }
961
+ if qhint != test .wantQHint {
962
+ t .Errorf ("QHint does not match: %v, want: %v" , qhint , test .wantQHint )
963
+ }
964
+ })
965
+ }
966
+ }
967
+
795
968
func getFakeVolumeAttachmentLister (count int , driverNames ... string ) tf.VolumeAttachmentLister {
796
969
vaLister := tf.VolumeAttachmentLister {}
797
970
for _ , driver := range driverNames {
0 commit comments