Skip to content

Commit 40498ce

Browse files
authored
Merge pull request kubernetes#127224 from utam0k/test-qhint-csi
Add integration test for NodeVolumeLimits in requeueing scenarios
2 parents 48ead4e + e828a4b commit 40498ce

File tree

2 files changed

+177
-0
lines changed

2 files changed

+177
-0
lines changed

pkg/scheduler/testing/wrappers.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -985,6 +985,12 @@ func (p *PersistentVolumeWrapper) HostPathVolumeSource(src *v1.HostPathVolumeSou
985985
return p
986986
}
987987

988+
// PersistentVolumeSource sets `src` as the pv source of the inner
989+
func (p *PersistentVolumeWrapper) PersistentVolumeSource(src v1.PersistentVolumeSource) *PersistentVolumeWrapper {
990+
p.PersistentVolume.Spec.PersistentVolumeSource = src
991+
return p
992+
}
993+
988994
// NodeAffinityIn creates a HARD node affinity (with MatchExpressions and the operator In)
989995
// and injects into the pv.
990996
func (p *PersistentVolumeWrapper) NodeAffinityIn(key string, vals []string) *PersistentVolumeWrapper {

test/integration/scheduler/queue_test.go

Lines changed: 171 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2041,6 +2041,177 @@ func TestCoreResourceEnqueue(t *testing.T) {
20412041
wantRequeuedPods: sets.Set[string]{},
20422042
enableSchedulingQueueHint: []bool{true},
20432043
},
2044+
{
2045+
name: "Pod rejected the CSI plugin is requeued when the CSINode is added",
2046+
initialNodes: []*v1.Node{st.MakeNode().Name("fake-node").Label("node", "fake-node").Obj()},
2047+
initialPVs: []*v1.PersistentVolume{
2048+
st.MakePersistentVolume().Name("pv1").
2049+
AccessModes([]v1.PersistentVolumeAccessMode{v1.ReadWriteMany}).
2050+
Capacity(v1.ResourceList{v1.ResourceStorage: resource.MustParse("1Mi")}).
2051+
PersistentVolumeSource(v1.PersistentVolumeSource{CSI: &v1.CSIPersistentVolumeSource{Driver: "csidriver", VolumeHandle: "volumehandle"}}).
2052+
Obj()},
2053+
initialPVCs: []*v1.PersistentVolumeClaim{
2054+
st.MakePersistentVolumeClaim().
2055+
Name("pvc1").
2056+
Annotation(volume.AnnBindCompleted, "true").
2057+
VolumeName("pv1").
2058+
AccessModes([]v1.PersistentVolumeAccessMode{v1.ReadWriteMany}).
2059+
Resources(v1.VolumeResourceRequirements{Requests: v1.ResourceList{v1.ResourceStorage: resource.MustParse("1Mi")}}).
2060+
Obj(),
2061+
},
2062+
initialCSIDrivers: []*storagev1.CSIDriver{
2063+
st.MakeCSIDriver().Name("csidriver").StorageCapacity(ptr.To(true)).Obj(),
2064+
},
2065+
initialCSINodes: []*storagev1.CSINode{
2066+
st.MakeCSINode().Name("fake-node").Driver(storagev1.CSINodeDriver{Name: "csidriver", NodeID: "fake-node", Allocatable: &storagev1.VolumeNodeResources{
2067+
Count: ptr.To(int32(0)),
2068+
}}).Obj(),
2069+
},
2070+
pods: []*v1.Pod{
2071+
st.MakePod().Name("pod1").Container("image").PVC("pvc1").Obj(),
2072+
},
2073+
triggerFn: func(testCtx *testutils.TestContext) (map[framework.ClusterEvent]uint64, error) {
2074+
csinode1 := st.MakeCSINode().Name("csinode").Obj()
2075+
if _, err := testCtx.ClientSet.StorageV1().CSINodes().Create(testCtx.Ctx, csinode1, metav1.CreateOptions{}); err != nil {
2076+
return nil, fmt.Errorf("failed to create CSINode: %w", err)
2077+
}
2078+
return map[framework.ClusterEvent]uint64{{Resource: framework.CSINode, ActionType: framework.Add}: 1}, nil
2079+
},
2080+
wantRequeuedPods: sets.New("pod1"),
2081+
enableSchedulingQueueHint: []bool{true},
2082+
},
2083+
{
2084+
name: "Pod rejected with PVC by the CSI plugin is requeued when the pod having related PVC is deleted",
2085+
initialNodes: []*v1.Node{st.MakeNode().Name("fake-node").Label("node", "fake-node").Obj()},
2086+
initialPVs: []*v1.PersistentVolume{
2087+
st.MakePersistentVolume().Name("pv1").
2088+
AccessModes([]v1.PersistentVolumeAccessMode{v1.ReadWriteMany}).
2089+
Capacity(v1.ResourceList{v1.ResourceStorage: resource.MustParse("1Mi")}).
2090+
PersistentVolumeSource(v1.PersistentVolumeSource{CSI: &v1.CSIPersistentVolumeSource{Driver: "csidriver", VolumeHandle: "volumehandle1"}}).
2091+
Obj(),
2092+
st.MakePersistentVolume().Name("pv2").
2093+
AccessModes([]v1.PersistentVolumeAccessMode{v1.ReadWriteMany}).
2094+
Capacity(v1.ResourceList{v1.ResourceStorage: resource.MustParse("1Mi")}).
2095+
PersistentVolumeSource(v1.PersistentVolumeSource{CSI: &v1.CSIPersistentVolumeSource{Driver: "csidriver", VolumeHandle: "volumehandle2"}}).
2096+
Obj(),
2097+
},
2098+
initialPVCs: []*v1.PersistentVolumeClaim{
2099+
st.MakePersistentVolumeClaim().
2100+
Name("pvc1").
2101+
Annotation(volume.AnnBindCompleted, "true").
2102+
VolumeName("pv1").
2103+
AccessModes([]v1.PersistentVolumeAccessMode{v1.ReadWriteOncePod}).
2104+
Resources(v1.VolumeResourceRequirements{Requests: v1.ResourceList{v1.ResourceStorage: resource.MustParse("1Mi")}}).
2105+
Obj(),
2106+
st.MakePersistentVolumeClaim().
2107+
Name("pvc2").
2108+
Annotation(volume.AnnBindCompleted, "true").
2109+
VolumeName("pv2").
2110+
AccessModes([]v1.PersistentVolumeAccessMode{v1.ReadWriteOncePod}).
2111+
Resources(v1.VolumeResourceRequirements{Requests: v1.ResourceList{v1.ResourceStorage: resource.MustParse("1Mi")}}).
2112+
Obj(),
2113+
},
2114+
initialCSIDrivers: []*storagev1.CSIDriver{
2115+
st.MakeCSIDriver().Name("csidriver").StorageCapacity(ptr.To(true)).Obj(),
2116+
},
2117+
initialCSINodes: []*storagev1.CSINode{
2118+
st.MakeCSINode().Name("fake-node").Driver(storagev1.CSINodeDriver{Name: "csidriver", NodeID: "fake-node", Allocatable: &storagev1.VolumeNodeResources{
2119+
Count: ptr.To(int32(1)),
2120+
}}).Obj(),
2121+
},
2122+
initialPods: []*v1.Pod{
2123+
st.MakePod().Name("pod1").Container("image").PVC("pvc1").Node("fake-node").Obj(),
2124+
},
2125+
pods: []*v1.Pod{
2126+
st.MakePod().Name("pod2").Container("image").PVC("pvc2").Obj(),
2127+
},
2128+
triggerFn: func(testCtx *testutils.TestContext) (map[framework.ClusterEvent]uint64, error) {
2129+
if err := testCtx.ClientSet.CoreV1().Pods(testCtx.NS.Name).Delete(testCtx.Ctx, "pod1", metav1.DeleteOptions{GracePeriodSeconds: new(int64)}); err != nil {
2130+
return nil, fmt.Errorf("failed to delete Pod: %w", err)
2131+
}
2132+
return map[framework.ClusterEvent]uint64{framework.EventAssignedPodDelete: 1}, nil
2133+
},
2134+
wantRequeuedPods: sets.New("pod2"),
2135+
},
2136+
{
2137+
name: "Pod rejected with PVC by the CSI plugin is requeued when the related PVC is added",
2138+
initialNodes: []*v1.Node{st.MakeNode().Name("fake-node").Label("node", "fake-node").Obj()},
2139+
initialPVs: []*v1.PersistentVolume{
2140+
st.MakePersistentVolume().Name("pv1").
2141+
AccessModes([]v1.PersistentVolumeAccessMode{v1.ReadWriteMany}).
2142+
Capacity(v1.ResourceList{v1.ResourceStorage: resource.MustParse("1Mi")}).
2143+
PersistentVolumeSource(v1.PersistentVolumeSource{CSI: &v1.CSIPersistentVolumeSource{Driver: "csidriver", VolumeHandle: "volumehandle1"}}).
2144+
Obj(),
2145+
st.MakePersistentVolume().Name("pv2").
2146+
AccessModes([]v1.PersistentVolumeAccessMode{v1.ReadWriteMany}).
2147+
Capacity(v1.ResourceList{v1.ResourceStorage: resource.MustParse("1Mi")}).
2148+
PersistentVolumeSource(v1.PersistentVolumeSource{CSI: &v1.CSIPersistentVolumeSource{Driver: "csidriver", VolumeHandle: "volumehandle2"}}).
2149+
Obj(),
2150+
st.MakePersistentVolume().Name("pv3").
2151+
AccessModes([]v1.PersistentVolumeAccessMode{v1.ReadWriteMany}).
2152+
Capacity(v1.ResourceList{v1.ResourceStorage: resource.MustParse("1Mi")}).
2153+
PersistentVolumeSource(v1.PersistentVolumeSource{CSI: &v1.CSIPersistentVolumeSource{Driver: "csidriver", VolumeHandle: "volumehandle3"}}).
2154+
Obj(),
2155+
},
2156+
initialPVCs: []*v1.PersistentVolumeClaim{
2157+
st.MakePersistentVolumeClaim().
2158+
Name("pvc1").
2159+
Annotation(volume.AnnBindCompleted, "true").
2160+
VolumeName("pv1").
2161+
AccessModes([]v1.PersistentVolumeAccessMode{v1.ReadWriteOncePod}).
2162+
Resources(v1.VolumeResourceRequirements{Requests: v1.ResourceList{v1.ResourceStorage: resource.MustParse("1Mi")}}).
2163+
Obj(),
2164+
// If we don't have pvc2, it's filtered by the VolumeBinding pluging, so we should create it first and recreate it in a triggerFn.
2165+
st.MakePersistentVolumeClaim().
2166+
Name("pvc2").
2167+
Annotation(volume.AnnBindCompleted, "true").
2168+
VolumeName("pv2").
2169+
AccessModes([]v1.PersistentVolumeAccessMode{v1.ReadWriteOncePod}).
2170+
Resources(v1.VolumeResourceRequirements{Requests: v1.ResourceList{v1.ResourceStorage: resource.MustParse("1Mi")}}).
2171+
Obj(),
2172+
st.MakePersistentVolumeClaim().
2173+
Name("pvc3").
2174+
Annotation(volume.AnnBindCompleted, "true").
2175+
VolumeName("pv3").
2176+
AccessModes([]v1.PersistentVolumeAccessMode{v1.ReadWriteOncePod}).
2177+
Resources(v1.VolumeResourceRequirements{Requests: v1.ResourceList{v1.ResourceStorage: resource.MustParse("1Mi")}}).
2178+
Obj(),
2179+
},
2180+
initialCSIDrivers: []*storagev1.CSIDriver{
2181+
st.MakeCSIDriver().Name("csidriver").StorageCapacity(ptr.To(true)).Obj(),
2182+
},
2183+
initialCSINodes: []*storagev1.CSINode{
2184+
st.MakeCSINode().Name("fake-node").Driver(storagev1.CSINodeDriver{Name: "csidriver", NodeID: "fake-node", Allocatable: &storagev1.VolumeNodeResources{
2185+
Count: ptr.To(int32(1)),
2186+
}}).Obj(),
2187+
},
2188+
initialPods: []*v1.Pod{
2189+
st.MakePod().Name("pod1").Container("image").PVC("pvc1").Node("fake-node").Obj(),
2190+
},
2191+
pods: []*v1.Pod{
2192+
st.MakePod().Name("pod2").Container("image").PVC("pvc2").Obj(),
2193+
st.MakePod().Name("pod3").Container("image").PVC("pvc3").Obj(),
2194+
},
2195+
triggerFn: func(testCtx *testutils.TestContext) (map[framework.ClusterEvent]uint64, error) {
2196+
if err := testCtx.ClientSet.CoreV1().PersistentVolumeClaims(testCtx.NS.Name).Delete(testCtx.Ctx, "pvc2", metav1.DeleteOptions{}); err != nil {
2197+
return nil, fmt.Errorf("failed to delete pvc2: %w", err)
2198+
}
2199+
2200+
pvc := st.MakePersistentVolumeClaim().
2201+
Name("pvc2").
2202+
Annotation(volume.AnnBindCompleted, "true").
2203+
VolumeName("pv2").
2204+
AccessModes([]v1.PersistentVolumeAccessMode{v1.ReadWriteOncePod}).
2205+
Resources(v1.VolumeResourceRequirements{Requests: v1.ResourceList{v1.ResourceStorage: resource.MustParse("1Mi")}}).
2206+
Obj()
2207+
if _, err := testCtx.ClientSet.CoreV1().PersistentVolumeClaims(testCtx.NS.Name).Create(testCtx.Ctx, pvc, metav1.CreateOptions{}); err != nil {
2208+
return nil, fmt.Errorf("failed to add pvc2: %w", err)
2209+
}
2210+
return map[framework.ClusterEvent]uint64{{Resource: framework.PersistentVolumeClaim, ActionType: framework.Add}: 1}, nil
2211+
},
2212+
wantRequeuedPods: sets.New("pod2"),
2213+
enableSchedulingQueueHint: []bool{true},
2214+
},
20442215
}
20452216

20462217
for _, tt := range tests {

0 commit comments

Comments
 (0)