Skip to content

Commit 94471a5

Browse files
committed
feature(scheduler): add more requeue case for CSI plugin when the VolumeAttachment is deleted
1 parent ef54ac8 commit 94471a5

File tree

1 file changed

+143
-3
lines changed
  • test/integration/scheduler/queueing

1 file changed

+143
-3
lines changed

test/integration/scheduler/queueing/queue.go

Lines changed: 143 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,8 @@ type CoreResourceEnqueueTestCase struct {
6666
InitialCSIDrivers []*storagev1.CSIDriver
6767
// InitialStorageCapacities are the list of CSIStorageCapacity to be created at first.
6868
InitialStorageCapacities []*storagev1.CSIStorageCapacity
69+
// InitialVolumeAttachment is the list of VolumeAttachment to be created at first.
70+
InitialVolumeAttachment []*storagev1.VolumeAttachment
6971
// Pods are the list of Pods to be created.
7072
// All of them are expected to be unschedulable at first.
7173
Pods []*v1.Pod
@@ -1977,7 +1979,7 @@ var CoreResourceEnqueueTestCases = []*CoreResourceEnqueueTestCase{
19771979
EnableSchedulingQueueHint: sets.New(true),
19781980
},
19791981
{
1980-
Name: "Pod rejected the CSI plugin is requeued when the CSINode is added",
1982+
Name: "Pod rejected the CSI NodeVolumeLimits plugin is requeued when the CSINode is added",
19811983
InitialNodes: []*v1.Node{st.MakeNode().Name("fake-node").Label("node", "fake-node").Obj()},
19821984
InitialPVs: []*v1.PersistentVolume{
19831985
st.MakePersistentVolume().Name("pv1").
@@ -2016,7 +2018,7 @@ var CoreResourceEnqueueTestCases = []*CoreResourceEnqueueTestCase{
20162018
EnableSchedulingQueueHint: sets.New(true),
20172019
},
20182020
{
2019-
Name: "Pod rejected with PVC by the CSI plugin is requeued when the pod having related PVC is deleted",
2021+
Name: "Pod rejected with PVC by the CSI NodeVolumeLimits plugin is requeued when the pod having related PVC is deleted",
20202022
InitialNodes: []*v1.Node{st.MakeNode().Name("fake-node").Label("node", "fake-node").Obj()},
20212023
InitialPVs: []*v1.PersistentVolume{
20222024
st.MakePersistentVolume().Name("pv1").
@@ -2069,7 +2071,7 @@ var CoreResourceEnqueueTestCases = []*CoreResourceEnqueueTestCase{
20692071
WantRequeuedPods: sets.New("pod2"),
20702072
},
20712073
{
2072-
Name: "Pod rejected with PVC by the CSI plugin is requeued when the related PVC is added",
2074+
Name: "Pod rejected with PVC by the CSI NodeVolumeLimits plugin is requeued when the related PVC is added",
20732075
InitialNodes: []*v1.Node{st.MakeNode().Name("fake-node").Label("node", "fake-node").Obj()},
20742076
EnablePlugins: []string{"VolumeBinding"},
20752077
InitialPVs: []*v1.PersistentVolume{
@@ -2123,6 +2125,138 @@ var CoreResourceEnqueueTestCases = []*CoreResourceEnqueueTestCase{
21232125
WantRequeuedPods: sets.New("pod2"),
21242126
EnableSchedulingQueueHint: sets.New(true),
21252127
},
2128+
{
2129+
Name: "Pod with PVC rejected the CSI NodeVolumeLimits plugin is requeued when the VolumeAttachment is deleted",
2130+
InitialNodes: []*v1.Node{st.MakeNode().Name("fake-node").Label("node", "fake-node").Obj()},
2131+
InitialPVs: []*v1.PersistentVolume{
2132+
st.MakePersistentVolume().Name("pv1").
2133+
AccessModes([]v1.PersistentVolumeAccessMode{v1.ReadWriteMany}).
2134+
Capacity(v1.ResourceList{v1.ResourceStorage: resource.MustParse("1Mi")}).
2135+
PersistentVolumeSource(v1.PersistentVolumeSource{CSI: &v1.CSIPersistentVolumeSource{Driver: "csidriver", VolumeHandle: "volumehandle"}}).
2136+
Obj()},
2137+
InitialPVCs: []*v1.PersistentVolumeClaim{
2138+
st.MakePersistentVolumeClaim().
2139+
Name("pvc1").
2140+
Annotation(volume.AnnBindCompleted, "true").
2141+
VolumeName("pv1").
2142+
AccessModes([]v1.PersistentVolumeAccessMode{v1.ReadWriteMany}).
2143+
Resources(v1.VolumeResourceRequirements{Requests: v1.ResourceList{v1.ResourceStorage: resource.MustParse("1Mi")}}).
2144+
Obj(),
2145+
},
2146+
InitialVolumeAttachment: []*storagev1.VolumeAttachment{
2147+
st.MakeVolumeAttachment().Name("volumeattachment1").
2148+
NodeName("fake-node").
2149+
Attacher("test.storage.gke.io").
2150+
Source(storagev1.VolumeAttachmentSource{PersistentVolumeName: ptr.To("pv1")}).
2151+
Attached(true).
2152+
Obj(),
2153+
},
2154+
InitialCSIDrivers: []*storagev1.CSIDriver{
2155+
st.MakeCSIDriver().Name("csidriver").StorageCapacity(ptr.To(true)).Obj(),
2156+
},
2157+
InitialCSINodes: []*storagev1.CSINode{
2158+
st.MakeCSINode().Name("fake-node").Driver(storagev1.CSINodeDriver{Name: "csidriver", NodeID: "fake-node", Allocatable: &storagev1.VolumeNodeResources{
2159+
Count: ptr.To(int32(0)),
2160+
}}).Obj(),
2161+
},
2162+
Pods: []*v1.Pod{
2163+
st.MakePod().Name("pod1").Container("image").PVC("pvc1").Obj(),
2164+
},
2165+
TriggerFn: func(testCtx *testutils.TestContext) (map[framework.ClusterEvent]uint64, error) {
2166+
if err := testCtx.ClientSet.StorageV1().VolumeAttachments().Delete(testCtx.Ctx, "volumeattachment1", metav1.DeleteOptions{}); err != nil {
2167+
return nil, fmt.Errorf("failed to delete VolumeAttachment: %w", err)
2168+
}
2169+
return map[framework.ClusterEvent]uint64{{Resource: framework.VolumeAttachment, ActionType: framework.Delete}: 1}, nil
2170+
},
2171+
WantRequeuedPods: sets.New("pod1"),
2172+
EnableSchedulingQueueHint: sets.New(true),
2173+
},
2174+
{
2175+
Name: "Pod with Inline Migratable volume (AWSEBSDriver and GCEPDDriver) rejected the CSI NodeVolumeLimits plugin is requeued (only AWSEBSDriver) when the VolumeAttachment is deleted",
2176+
InitialNodes: []*v1.Node{
2177+
st.MakeNode().Name("fake-node").Label("node", "fake-node").Obj(),
2178+
},
2179+
InitialPVs: []*v1.PersistentVolume{
2180+
st.MakePersistentVolume().Name("pv1").
2181+
AccessModes([]v1.PersistentVolumeAccessMode{v1.ReadWriteMany}).
2182+
Capacity(v1.ResourceList{v1.ResourceStorage: resource.MustParse("1Mi")}).
2183+
PersistentVolumeSource(v1.PersistentVolumeSource{CSI: &v1.CSIPersistentVolumeSource{Driver: "ebs.csi.aws.com", VolumeHandle: "volumehandle"}}).
2184+
Obj(),
2185+
st.MakePersistentVolume().Name("pv2").
2186+
AccessModes([]v1.PersistentVolumeAccessMode{v1.ReadWriteMany}).
2187+
Capacity(v1.ResourceList{v1.ResourceStorage: resource.MustParse("1Mi")}).
2188+
PersistentVolumeSource(v1.PersistentVolumeSource{CSI: &v1.CSIPersistentVolumeSource{Driver: "pd.csi.storage.gke.io", VolumeHandle: "volumehandle"}}).
2189+
Obj(),
2190+
},
2191+
InitialPVCs: []*v1.PersistentVolumeClaim{
2192+
st.MakePersistentVolumeClaim().
2193+
Name("pvc1").
2194+
Annotation(volume.AnnBindCompleted, "true").
2195+
VolumeName("pv1").
2196+
AccessModes([]v1.PersistentVolumeAccessMode{v1.ReadWriteMany}).
2197+
Resources(v1.VolumeResourceRequirements{Requests: v1.ResourceList{v1.ResourceStorage: resource.MustParse("1Mi")}}).
2198+
Obj(),
2199+
st.MakePersistentVolumeClaim().
2200+
Name("pvc2").
2201+
Annotation(volume.AnnBindCompleted, "true").
2202+
VolumeName("pv2").
2203+
AccessModes([]v1.PersistentVolumeAccessMode{v1.ReadWriteMany}).
2204+
Resources(v1.VolumeResourceRequirements{Requests: v1.ResourceList{v1.ResourceStorage: resource.MustParse("1Mi")}}).
2205+
Obj(),
2206+
},
2207+
InitialVolumeAttachment: []*storagev1.VolumeAttachment{
2208+
st.MakeVolumeAttachment().Name("volumeattachment1").
2209+
NodeName("fake-node").
2210+
Attacher("ebs.csi.aws.com").
2211+
Source(storagev1.VolumeAttachmentSource{PersistentVolumeName: ptr.To("pv1")}).
2212+
Attached(true).
2213+
Obj(),
2214+
st.MakeVolumeAttachment().Name("volumeattachment2").
2215+
NodeName("fake-node").
2216+
Attacher("pd.csi.storage.gke.io").
2217+
Source(storagev1.VolumeAttachmentSource{PersistentVolumeName: ptr.To("pv2")}).
2218+
Attached(true).
2219+
Obj(),
2220+
},
2221+
InitialCSINodes: []*storagev1.CSINode{
2222+
st.MakeCSINode().Name("fake-node").
2223+
Driver(storagev1.CSINodeDriver{Name: "ebs.csi.aws.com", NodeID: "fake-node", Allocatable: &storagev1.VolumeNodeResources{
2224+
Count: ptr.To(int32(0))}}).
2225+
Driver(storagev1.CSINodeDriver{Name: "pd.csi.storage.gke.io", NodeID: "fake-node", Allocatable: &storagev1.VolumeNodeResources{
2226+
Count: ptr.To(int32(0))}}).
2227+
Obj(),
2228+
},
2229+
Pods: []*v1.Pod{
2230+
st.MakePod().Name("pod1").Container("image").Volume(
2231+
v1.Volume{
2232+
Name: "vol1",
2233+
VolumeSource: v1.VolumeSource{
2234+
AWSElasticBlockStore: &v1.AWSElasticBlockStoreVolumeSource{
2235+
VolumeID: "pv1",
2236+
},
2237+
},
2238+
},
2239+
).Obj(),
2240+
st.MakePod().Name("pod2").Container("image").Volume(
2241+
v1.Volume{
2242+
Name: "vol2",
2243+
VolumeSource: v1.VolumeSource{
2244+
GCEPersistentDisk: &v1.GCEPersistentDiskVolumeSource{
2245+
PDName: "pv2",
2246+
},
2247+
},
2248+
},
2249+
).Obj(),
2250+
},
2251+
TriggerFn: func(testCtx *testutils.TestContext) (map[framework.ClusterEvent]uint64, error) {
2252+
if err := testCtx.ClientSet.StorageV1().VolumeAttachments().Delete(testCtx.Ctx, "volumeattachment1", metav1.DeleteOptions{}); err != nil {
2253+
return nil, fmt.Errorf("failed to delete VolumeAttachment: %w", err)
2254+
}
2255+
return map[framework.ClusterEvent]uint64{{Resource: framework.VolumeAttachment, ActionType: framework.Delete}: 1}, nil
2256+
},
2257+
WantRequeuedPods: sets.New("pod1"),
2258+
EnableSchedulingQueueHint: sets.New(true),
2259+
},
21262260
}
21272261

21282262
// TestCoreResourceEnqueue verify Pods failed by in-tree default plugins can be
@@ -2191,6 +2325,12 @@ func RunTestCoreResourceEnqueue(t *testing.T, tt *CoreResourceEnqueueTestCase) {
21912325
}
21922326
}
21932327

2328+
for _, va := range tt.InitialVolumeAttachment {
2329+
if _, err := cs.StorageV1().VolumeAttachments().Create(ctx, va, metav1.CreateOptions{}); err != nil {
2330+
t.Fatalf("Failed to create a VolumeAttachment %q: %v", va.Name, err)
2331+
}
2332+
}
2333+
21942334
for _, csidriver := range tt.InitialCSIDrivers {
21952335
if _, err := cs.StorageV1().CSIDrivers().Create(ctx, csidriver, metav1.CreateOptions{}); err != nil {
21962336
t.Fatalf("Failed to create a CSIDriver %q: %v", csidriver.Name, err)

0 commit comments

Comments
 (0)