Cleanup: Pass context to client calls in scheduler/volumebinding tests

Signed-off-by: kerthcet <kerthcet@gmail.com>
This commit is contained in:
kerthcet 2022-06-13 23:53:23 +08:00
parent cc71683fda
commit e54ce7c0c6
2 changed files with 28 additions and 30 deletions

View File

@ -333,9 +333,9 @@ func (env *testEnv) initVolumes(cachedPVs []*v1.PersistentVolume, apiPVs []*v1.P
} }
func (env *testEnv) updateVolumes(pvs []*v1.PersistentVolume) error { func (env *testEnv) updateVolumes(ctx context.Context, pvs []*v1.PersistentVolume) error {
for i, pv := range pvs { for i, pv := range pvs {
newPv, err := env.client.CoreV1().PersistentVolumes().Update(context.TODO(), pv, metav1.UpdateOptions{}) newPv, err := env.client.CoreV1().PersistentVolumes().Update(ctx, pv, metav1.UpdateOptions{})
if err != nil { if err != nil {
return err return err
} }
@ -359,9 +359,9 @@ func (env *testEnv) updateVolumes(pvs []*v1.PersistentVolume) error {
}) })
} }
func (env *testEnv) updateClaims(pvcs []*v1.PersistentVolumeClaim) error { func (env *testEnv) updateClaims(ctx context.Context, pvcs []*v1.PersistentVolumeClaim) error {
for i, pvc := range pvcs { for i, pvc := range pvcs {
newPvc, err := env.client.CoreV1().PersistentVolumeClaims(pvc.Namespace).Update(context.TODO(), pvc, metav1.UpdateOptions{}) newPvc, err := env.client.CoreV1().PersistentVolumeClaims(pvc.Namespace).Update(ctx, pvc, metav1.UpdateOptions{})
if err != nil { if err != nil {
return err return err
} }
@ -1711,7 +1711,6 @@ func TestCheckBindings(t *testing.T) {
run := func(t *testing.T, scenario scenarioType) { run := func(t *testing.T, scenario scenarioType) {
ctx, cancel := context.WithCancel(context.Background()) ctx, cancel := context.WithCancel(context.Background())
defer cancel() defer cancel()
// Setup // Setup
pod := makePod("test-pod"). pod := makePod("test-pod").
withNamespace("testns"). withNamespace("testns").
@ -1727,14 +1726,14 @@ func TestCheckBindings(t *testing.T) {
if scenario.deletePVs { if scenario.deletePVs {
testEnv.deleteVolumes(scenario.initPVs) testEnv.deleteVolumes(scenario.initPVs)
} else { } else {
if err := testEnv.updateVolumes(scenario.apiPVs); err != nil { if err := testEnv.updateVolumes(ctx, scenario.apiPVs); err != nil {
t.Errorf("Failed to update PVs: %v", err) t.Errorf("Failed to update PVs: %v", err)
} }
} }
if scenario.deletePVCs { if scenario.deletePVCs {
testEnv.deleteClaims(scenario.initPVCs) testEnv.deleteClaims(scenario.initPVCs)
} else { } else {
if err := testEnv.updateClaims(scenario.apiPVCs); err != nil { if err := testEnv.updateClaims(ctx, scenario.apiPVCs); err != nil {
t.Errorf("Failed to update PVCs: %v", err) t.Errorf("Failed to update PVCs: %v", err)
} }
} }
@ -1860,10 +1859,10 @@ func TestCheckBindingsWithCSIMigration(t *testing.T) {
testEnv.assumeVolumes(t, "node1", pod, scenario.bindings, scenario.provisionedPVCs) testEnv.assumeVolumes(t, "node1", pod, scenario.bindings, scenario.provisionedPVCs)
// Before execute // Before execute
if err := testEnv.updateVolumes(scenario.apiPVs); err != nil { if err := testEnv.updateVolumes(ctx, scenario.apiPVs); err != nil {
t.Errorf("Failed to update PVs: %v", err) t.Errorf("Failed to update PVs: %v", err)
} }
if err := testEnv.updateClaims(scenario.apiPVCs); err != nil { if err := testEnv.updateClaims(ctx, scenario.apiPVCs); err != nil {
t.Errorf("Failed to update PVCs: %v", err) t.Errorf("Failed to update PVCs: %v", err)
} }
@ -1909,7 +1908,7 @@ func TestBindPodVolumes(t *testing.T) {
apiPVC *v1.PersistentVolumeClaim apiPVC *v1.PersistentVolumeClaim
// This function runs with a delay of 5 seconds // This function runs with a delay of 5 seconds
delayFunc func(t *testing.T, testEnv *testEnv, pod *v1.Pod, pvs []*v1.PersistentVolume, pvcs []*v1.PersistentVolumeClaim) delayFunc func(t *testing.T, ctx context.Context, testEnv *testEnv, pod *v1.Pod, pvs []*v1.PersistentVolume, pvcs []*v1.PersistentVolumeClaim)
// Expected return values // Expected return values
shouldFail bool shouldFail bool
@ -1930,14 +1929,14 @@ func TestBindPodVolumes(t *testing.T) {
initPVCs: []*v1.PersistentVolumeClaim{unboundPVC}, initPVCs: []*v1.PersistentVolumeClaim{unboundPVC},
binding: makeBinding(unboundPVC, pvNode1aBound), binding: makeBinding(unboundPVC, pvNode1aBound),
shouldFail: false, // Will succeed after PVC is fully bound to this PV by pv controller. shouldFail: false, // Will succeed after PVC is fully bound to this PV by pv controller.
delayFunc: func(t *testing.T, testEnv *testEnv, pod *v1.Pod, pvs []*v1.PersistentVolume, pvcs []*v1.PersistentVolumeClaim) { delayFunc: func(t *testing.T, ctx context.Context, testEnv *testEnv, pod *v1.Pod, pvs []*v1.PersistentVolume, pvcs []*v1.PersistentVolumeClaim) {
pvc := pvcs[0] pvc := pvcs[0]
pv := pvs[0] pv := pvs[0]
// Update PVC to be fully bound to PV // Update PVC to be fully bound to PV
newPVC := pvc.DeepCopy() newPVC := pvc.DeepCopy()
newPVC.Spec.VolumeName = pv.Name newPVC.Spec.VolumeName = pv.Name
metav1.SetMetaDataAnnotation(&newPVC.ObjectMeta, volume.AnnBindCompleted, "yes") metav1.SetMetaDataAnnotation(&newPVC.ObjectMeta, volume.AnnBindCompleted, "yes")
if _, err := testEnv.client.CoreV1().PersistentVolumeClaims(newPVC.Namespace).Update(context.TODO(), newPVC, metav1.UpdateOptions{}); err != nil { if _, err := testEnv.client.CoreV1().PersistentVolumeClaims(newPVC.Namespace).Update(ctx, newPVC, metav1.UpdateOptions{}); err != nil {
t.Errorf("failed to update PVC %q: %v", newPVC.Name, err) t.Errorf("failed to update PVC %q: %v", newPVC.Name, err)
} }
}, },
@ -1945,23 +1944,23 @@ func TestBindPodVolumes(t *testing.T) {
"binding-dynamic-pv-succeeds-after-time": { "binding-dynamic-pv-succeeds-after-time": {
claimToProvision: pvcSetSelectedNode(provisionedPVC, "node1"), claimToProvision: pvcSetSelectedNode(provisionedPVC, "node1"),
initPVCs: []*v1.PersistentVolumeClaim{provisionedPVC}, initPVCs: []*v1.PersistentVolumeClaim{provisionedPVC},
delayFunc: func(t *testing.T, testEnv *testEnv, pod *v1.Pod, pvs []*v1.PersistentVolume, pvcs []*v1.PersistentVolumeClaim) { delayFunc: func(t *testing.T, ctx context.Context, testEnv *testEnv, pod *v1.Pod, pvs []*v1.PersistentVolume, pvcs []*v1.PersistentVolumeClaim) {
pvc := pvcs[0] pvc := pvcs[0]
// Update PVC to be fully bound to PV // Update PVC to be fully bound to PV
newPVC, err := testEnv.client.CoreV1().PersistentVolumeClaims(pvc.Namespace).Get(context.TODO(), pvc.Name, metav1.GetOptions{}) newPVC, err := testEnv.client.CoreV1().PersistentVolumeClaims(pvc.Namespace).Get(ctx, pvc.Name, metav1.GetOptions{})
if err != nil { if err != nil {
t.Errorf("failed to get PVC %q: %v", pvc.Name, err) t.Errorf("failed to get PVC %q: %v", pvc.Name, err)
return return
} }
dynamicPV := makeTestPV("dynamic-pv", "node1", "1G", "1", newPVC, waitClass) dynamicPV := makeTestPV("dynamic-pv", "node1", "1G", "1", newPVC, waitClass)
dynamicPV, err = testEnv.client.CoreV1().PersistentVolumes().Create(context.TODO(), dynamicPV, metav1.CreateOptions{}) dynamicPV, err = testEnv.client.CoreV1().PersistentVolumes().Create(ctx, dynamicPV, metav1.CreateOptions{})
if err != nil { if err != nil {
t.Errorf("failed to create PV %q: %v", dynamicPV.Name, err) t.Errorf("failed to create PV %q: %v", dynamicPV.Name, err)
return return
} }
newPVC.Spec.VolumeName = dynamicPV.Name newPVC.Spec.VolumeName = dynamicPV.Name
metav1.SetMetaDataAnnotation(&newPVC.ObjectMeta, volume.AnnBindCompleted, "yes") metav1.SetMetaDataAnnotation(&newPVC.ObjectMeta, volume.AnnBindCompleted, "yes")
if _, err := testEnv.client.CoreV1().PersistentVolumeClaims(newPVC.Namespace).Update(context.TODO(), newPVC, metav1.UpdateOptions{}); err != nil { if _, err := testEnv.client.CoreV1().PersistentVolumeClaims(newPVC.Namespace).Update(ctx, newPVC, metav1.UpdateOptions{}); err != nil {
t.Errorf("failed to update PVC %q: %v", newPVC.Name, err) t.Errorf("failed to update PVC %q: %v", newPVC.Name, err)
} }
}, },
@ -1978,8 +1977,8 @@ func TestBindPodVolumes(t *testing.T) {
binding: makeBinding(unboundPVC, pvNode1aBound), binding: makeBinding(unboundPVC, pvNode1aBound),
initPVs: []*v1.PersistentVolume{pvNode1a}, initPVs: []*v1.PersistentVolume{pvNode1a},
initPVCs: []*v1.PersistentVolumeClaim{unboundPVC}, initPVCs: []*v1.PersistentVolumeClaim{unboundPVC},
delayFunc: func(t *testing.T, testEnv *testEnv, pod *v1.Pod, pvs []*v1.PersistentVolume, pvcs []*v1.PersistentVolumeClaim) { delayFunc: func(t *testing.T, ctx context.Context, testEnv *testEnv, pod *v1.Pod, pvs []*v1.PersistentVolume, pvcs []*v1.PersistentVolumeClaim) {
testEnv.client.CoreV1().Pods(pod.Namespace).Delete(context.Background(), pod.Name, metav1.DeleteOptions{}) testEnv.client.CoreV1().Pods(pod.Namespace).Delete(ctx, pod.Name, metav1.DeleteOptions{})
}, },
shouldFail: true, shouldFail: true,
}, },
@ -1999,10 +1998,10 @@ func TestBindPodVolumes(t *testing.T) {
binding: makeBinding(unboundPVC, pvNode1aBound), binding: makeBinding(unboundPVC, pvNode1aBound),
initPVs: []*v1.PersistentVolume{pvNode1a}, initPVs: []*v1.PersistentVolume{pvNode1a},
initPVCs: []*v1.PersistentVolumeClaim{unboundPVC}, initPVCs: []*v1.PersistentVolumeClaim{unboundPVC},
delayFunc: func(t *testing.T, testEnv *testEnv, pod *v1.Pod, pvs []*v1.PersistentVolume, pvcs []*v1.PersistentVolumeClaim) { delayFunc: func(t *testing.T, ctx context.Context, testEnv *testEnv, pod *v1.Pod, pvs []*v1.PersistentVolume, pvcs []*v1.PersistentVolumeClaim) {
pvc := pvcs[0] pvc := pvcs[0]
// Delete PVC will fail check // Delete PVC will fail check
if err := testEnv.client.CoreV1().PersistentVolumeClaims(pvc.Namespace).Delete(context.TODO(), pvc.Name, metav1.DeleteOptions{}); err != nil { if err := testEnv.client.CoreV1().PersistentVolumeClaims(pvc.Namespace).Delete(ctx, pvc.Name, metav1.DeleteOptions{}); err != nil {
t.Errorf("failed to delete PVC %q: %v", pvc.Name, err) t.Errorf("failed to delete PVC %q: %v", pvc.Name, err)
} }
}, },
@ -2020,12 +2019,12 @@ func TestBindPodVolumes(t *testing.T) {
initPVCs: []*v1.PersistentVolumeClaim{selectedNodePVC}, initPVCs: []*v1.PersistentVolumeClaim{selectedNodePVC},
claimToProvision: selectedNodePVC, claimToProvision: selectedNodePVC,
nodes: []*v1.Node{node1, node2}, nodes: []*v1.Node{node1, node2},
delayFunc: func(t *testing.T, testEnv *testEnv, pod *v1.Pod, pvs []*v1.PersistentVolume, pvcs []*v1.PersistentVolumeClaim) { delayFunc: func(t *testing.T, ctx context.Context, testEnv *testEnv, pod *v1.Pod, pvs []*v1.PersistentVolume, pvcs []*v1.PersistentVolumeClaim) {
// Update PVC to be fully bound to a PV with a different node // Update PVC to be fully bound to a PV with a different node
newPVC := pvcs[0].DeepCopy() newPVC := pvcs[0].DeepCopy()
newPVC.Spec.VolumeName = pvNode2.Name newPVC.Spec.VolumeName = pvNode2.Name
metav1.SetMetaDataAnnotation(&newPVC.ObjectMeta, volume.AnnBindCompleted, "yes") metav1.SetMetaDataAnnotation(&newPVC.ObjectMeta, volume.AnnBindCompleted, "yes")
if _, err := testEnv.client.CoreV1().PersistentVolumeClaims(newPVC.Namespace).Update(context.TODO(), newPVC, metav1.UpdateOptions{}); err != nil { if _, err := testEnv.client.CoreV1().PersistentVolumeClaims(newPVC.Namespace).Update(ctx, newPVC, metav1.UpdateOptions{}); err != nil {
t.Errorf("failed to update PVC %q: %v", newPVC.Name, err) t.Errorf("failed to update PVC %q: %v", newPVC.Name, err)
} }
}, },
@ -2036,7 +2035,6 @@ func TestBindPodVolumes(t *testing.T) {
run := func(t *testing.T, scenario scenarioType) { run := func(t *testing.T, scenario scenarioType) {
ctx, cancel := context.WithCancel(context.Background()) ctx, cancel := context.WithCancel(context.Background())
defer cancel() defer cancel()
// Setup // Setup
pod := makePod("test-pod"). pod := makePod("test-pod").
withNamespace("testns"). withNamespace("testns").
@ -2063,13 +2061,13 @@ func TestBindPodVolumes(t *testing.T) {
// Before Execute // Before Execute
if scenario.apiPV != nil { if scenario.apiPV != nil {
_, err := testEnv.client.CoreV1().PersistentVolumes().Update(context.TODO(), scenario.apiPV, metav1.UpdateOptions{}) _, err := testEnv.client.CoreV1().PersistentVolumes().Update(ctx, scenario.apiPV, metav1.UpdateOptions{})
if err != nil { if err != nil {
t.Fatalf("failed to update PV %q", scenario.apiPV.Name) t.Fatalf("failed to update PV %q", scenario.apiPV.Name)
} }
} }
if scenario.apiPVC != nil { if scenario.apiPVC != nil {
_, err := testEnv.client.CoreV1().PersistentVolumeClaims(scenario.apiPVC.Namespace).Update(context.TODO(), scenario.apiPVC, metav1.UpdateOptions{}) _, err := testEnv.client.CoreV1().PersistentVolumeClaims(scenario.apiPVC.Namespace).Update(ctx, scenario.apiPVC, metav1.UpdateOptions{})
if err != nil { if err != nil {
t.Fatalf("failed to update PVC %q", getPVCName(scenario.apiPVC)) t.Fatalf("failed to update PVC %q", getPVCName(scenario.apiPVC))
} }
@ -2080,7 +2078,7 @@ func TestBindPodVolumes(t *testing.T) {
time.Sleep(5 * time.Second) time.Sleep(5 * time.Second)
// Sleep a while to run after bindAPIUpdate in BindPodVolumes // Sleep a while to run after bindAPIUpdate in BindPodVolumes
klog.V(5).InfoS("Running delay function") klog.V(5).InfoS("Running delay function")
scenario.delayFunc(t, testEnv, pod, scenario.initPVs, scenario.initPVCs) scenario.delayFunc(t, ctx, testEnv, pod, scenario.initPVs, scenario.initPVCs)
}(scenario) }(scenario)
} }

View File

@ -333,8 +333,8 @@ func TestDefaultErrorFunc_NodeNotFound(t *testing.T) {
for _, tt := range tests { for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) { t.Run(tt.name, func(t *testing.T) {
stopCh := make(chan struct{}) ctx, cancel := context.WithCancel(context.Background())
defer close(stopCh) defer cancel()
client := fake.NewSimpleClientset(&v1.PodList{Items: []v1.Pod{*testPod}}, &v1.NodeList{Items: tt.nodes}) client := fake.NewSimpleClientset(&v1.PodList{Items: []v1.Pod{*testPod}}, &v1.NodeList{Items: tt.nodes})
informerFactory := informers.NewSharedInformerFactory(client, 0) informerFactory := informers.NewSharedInformerFactory(client, 0)
@ -343,14 +343,14 @@ func TestDefaultErrorFunc_NodeNotFound(t *testing.T) {
podInformer.Informer().GetStore().Add(testPod) podInformer.Informer().GetStore().Add(testPod)
queue := internalqueue.NewPriorityQueue(nil, informerFactory, internalqueue.WithClock(testingclock.NewFakeClock(time.Now()))) queue := internalqueue.NewPriorityQueue(nil, informerFactory, internalqueue.WithClock(testingclock.NewFakeClock(time.Now())))
schedulerCache := internalcache.New(30*time.Second, stopCh) schedulerCache := internalcache.New(30*time.Second, ctx.Done())
for i := range tt.nodes { for i := range tt.nodes {
node := tt.nodes[i] node := tt.nodes[i]
// Add node to schedulerCache no matter it's deleted in API server or not. // Add node to schedulerCache no matter it's deleted in API server or not.
schedulerCache.AddNode(&node) schedulerCache.AddNode(&node)
if node.Name == tt.nodeNameToDelete { if node.Name == tt.nodeNameToDelete {
client.CoreV1().Nodes().Delete(context.TODO(), node.Name, metav1.DeleteOptions{}) client.CoreV1().Nodes().Delete(ctx, node.Name, metav1.DeleteOptions{})
} }
} }