@@ -22,6 +22,7 @@ import (
22
22
"testing"
23
23
24
24
"github.com/google/go-cmp/cmp"
25
+
25
26
v1 "k8s.io/api/core/v1"
26
27
storagev1 "k8s.io/api/storage/v1"
27
28
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@@ -539,6 +540,93 @@ func TestWithBinding(t *testing.T) {
539
540
}
540
541
}
541
542
543
+ func TestIsSchedulableAfterPersistentVolumeClaimAdded (t * testing.T ) {
544
+ testcases := map [string ]struct {
545
+ pod * v1.Pod
546
+ oldObj , newObj interface {}
547
+ expectedHint framework.QueueingHint
548
+ expectedErr bool
549
+ }{
550
+ "error-wrong-new-object" : {
551
+ pod : createPodWithVolume ("pod_1" , "PVC_1" ),
552
+ newObj : "not-a-pvc" ,
553
+ expectedHint : framework .Queue ,
554
+ expectedErr : true ,
555
+ },
556
+ "pvc-was-added-but-pod-refers-no-pvc" : {
557
+ pod : st .MakePod ().Name ("pod_1" ).Namespace ("default" ).Obj (),
558
+ newObj : & v1.PersistentVolumeClaim {
559
+ ObjectMeta : metav1.ObjectMeta {Name : "PVC_1" , Namespace : "default" },
560
+ Spec : v1.PersistentVolumeClaimSpec {VolumeName : "Vol_1" },
561
+ },
562
+ expectedHint : framework .QueueSkip ,
563
+ },
564
+ "pvc-was-added-and-pod-was-bound-to-different-pvc" : {
565
+ pod : createPodWithVolume ("pod_1" , "PVC_2" ),
566
+ newObj : & v1.PersistentVolumeClaim {
567
+ ObjectMeta : metav1.ObjectMeta {Name : "PVC_1" , Namespace : "default" },
568
+ Spec : v1.PersistentVolumeClaimSpec {VolumeName : "Vol_1" },
569
+ },
570
+ expectedHint : framework .QueueSkip ,
571
+ },
572
+ "pvc-was-added-and-pod-was-bound-to-pvc-but-different-ns" : {
573
+ pod : createPodWithVolume ("pod_1" , "PVC_1" ),
574
+ newObj : & v1.PersistentVolumeClaim {
575
+ ObjectMeta : metav1.ObjectMeta {Name : "PVC_1" , Namespace : "ns1" },
576
+ Spec : v1.PersistentVolumeClaimSpec {VolumeName : "Vol_1" },
577
+ },
578
+ expectedHint : framework .QueueSkip ,
579
+ },
580
+ "pvc-was-added-and-pod-was-bound-to-the-pvc" : {
581
+ pod : createPodWithVolume ("pod_1" , "PVC_1" ),
582
+ newObj : & v1.PersistentVolumeClaim {
583
+ ObjectMeta : metav1.ObjectMeta {Name : "PVC_1" , Namespace : "default" },
584
+ Spec : v1.PersistentVolumeClaimSpec {VolumeName : "Vol_1" },
585
+ },
586
+ expectedHint : framework .Queue ,
587
+ },
588
+ "pvc-was-updated-and-pod-was-bound-to-the-pvc" : {
589
+ pod : createPodWithVolume ("pod_1" , "PVC_1" ),
590
+ oldObj : & v1.PersistentVolumeClaim {
591
+ ObjectMeta : metav1.ObjectMeta {Name : "PVC_1" , Namespace : "default" },
592
+ Spec : v1.PersistentVolumeClaimSpec {VolumeName : "" },
593
+ },
594
+ newObj : & v1.PersistentVolumeClaim {
595
+ ObjectMeta : metav1.ObjectMeta {Name : "PVC_1" , Namespace : "default" },
596
+ Spec : v1.PersistentVolumeClaimSpec {VolumeName : "Vol_1" },
597
+ },
598
+ expectedHint : framework .Queue ,
599
+ },
600
+ "pvc-was-updated-but-pod-refers-no-pvc" : {
601
+ pod : st .MakePod ().Name ("pod_1" ).Namespace (metav1 .NamespaceDefault ).Obj (),
602
+ oldObj : & v1.PersistentVolumeClaim {
603
+ ObjectMeta : metav1.ObjectMeta {Name : "PVC_1" , Namespace : "default" },
604
+ Spec : v1.PersistentVolumeClaimSpec {VolumeName : "" },
605
+ },
606
+ newObj : & v1.PersistentVolumeClaim {
607
+ ObjectMeta : metav1.ObjectMeta {Name : "PVC_1" , Namespace : "default" },
608
+ Spec : v1.PersistentVolumeClaimSpec {VolumeName : "Vol_1" },
609
+ },
610
+ expectedHint : framework .QueueSkip ,
611
+ },
612
+ }
613
+
614
+ for name , tc := range testcases {
615
+ t .Run (name , func (t * testing.T ) {
616
+ logger , _ := ktesting .NewTestContext (t )
617
+ p := & VolumeZone {}
618
+
619
+ got , err := p .isSchedulableAfterPersistentVolumeClaimChange (logger , tc .pod , tc .oldObj , tc .newObj )
620
+ if err != nil && ! tc .expectedErr {
621
+ t .Errorf ("unexpected error: %v" , err )
622
+ }
623
+ if got != tc .expectedHint {
624
+ t .Errorf ("isSchedulableAfterPersistentVolumeClaimChange() = %v, want %v" , got , tc .expectedHint )
625
+ }
626
+ })
627
+ }
628
+ }
629
+
542
630
func BenchmarkVolumeZone (b * testing.B ) {
543
631
tests := []struct {
544
632
Name string
@@ -572,7 +660,7 @@ func BenchmarkVolumeZone(b *testing.B) {
572
660
defer cancel ()
573
661
nodes := makeNodesWithTopologyZone (tt .NumNodes )
574
662
pl := newPluginWithListers (ctx , b , []* v1.Pod {tt .Pod }, nodes , makePVCsWithPV (tt .NumPVC ), makePVsWithZoneLabel (tt .NumPV ))
575
- nodeInfos := make ([]* framework.NodeInfo , len (nodes ), len ( nodes ) )
663
+ nodeInfos := make ([]* framework.NodeInfo , len (nodes ))
576
664
for i := 0 ; i < len (nodes ); i ++ {
577
665
nodeInfo := & framework.NodeInfo {}
578
666
nodeInfo .SetNode (nodes [i ])
@@ -609,7 +697,7 @@ func newPluginWithListers(ctx context.Context, tb testing.TB, pods []*v1.Pod, no
609
697
}
610
698
611
699
func makePVsWithZoneLabel (num int ) []* v1.PersistentVolume {
612
- pvList := make ([]* v1.PersistentVolume , num , num )
700
+ pvList := make ([]* v1.PersistentVolume , num )
613
701
for i := 0 ; i < len (pvList ); i ++ {
614
702
pvName := fmt .Sprintf ("Vol_Stable_%d" , i )
615
703
zone := fmt .Sprintf ("us-west-%d" , i )
@@ -621,7 +709,7 @@ func makePVsWithZoneLabel(num int) []*v1.PersistentVolume {
621
709
}
622
710
623
711
func makePVCsWithPV (num int ) []* v1.PersistentVolumeClaim {
624
- pvcList := make ([]* v1.PersistentVolumeClaim , num , num )
712
+ pvcList := make ([]* v1.PersistentVolumeClaim , num )
625
713
for i := 0 ; i < len (pvcList ); i ++ {
626
714
pvcName := fmt .Sprintf ("PVC_Stable_%d" , i )
627
715
pvName := fmt .Sprintf ("Vol_Stable_%d" , i )
@@ -634,10 +722,10 @@ func makePVCsWithPV(num int) []*v1.PersistentVolumeClaim {
634
722
}
635
723
636
724
func makeNodesWithTopologyZone (num int ) []* v1.Node {
637
- nodeList := make ([]* v1.Node , num , num )
725
+ nodeList := make ([]* v1.Node , num )
638
726
for i := 0 ; i < len (nodeList ); i ++ {
639
727
nodeName := fmt .Sprintf ("host_%d" , i )
640
- zone := fmt . Sprintf ( "us-west-0" )
728
+ zone := "us-west-0"
641
729
nodeList [i ] = & v1.Node {
642
730
ObjectMeta : metav1.ObjectMeta {
643
731
Name : nodeName ,
0 commit comments