} } <del> func TestGCEDiskConflicts(t *testing.T) { volState := v1.PodSpec{ Volumes: []v1.Volume{ { VolumeSource: v1.VolumeSource{ GCEPersistentDisk: &v1.GCEPersistentDiskVolumeSource{ PDName: "foo", }, }, }, }, } volState2 := v1.PodSpec{ Volumes: []v1.Volume{ { VolumeSource: v1.VolumeSource{ GCEPersistentDisk: &v1.GCEPersistentDiskVolumeSource{ PDName: "bar", }, }, }, }, } tests := []struct { pod      *v1.Pod nodeInfo *schedulernodeinfo.NodeInfo isOk     bool name     string }{ {&v1.Pod{}, schedulernodeinfo.NewNodeInfo(), true, "nothing"}, {&v1.Pod{}, schedulernodeinfo.NewNodeInfo(&v1.Pod{Spec: volState}), true, "one state"}, {&v1.Pod{Spec: volState}, schedulernodeinfo.NewNodeInfo(&v1.Pod{Spec: volState}), false, "same state"}, {&v1.Pod{Spec: volState2}, schedulernodeinfo.NewNodeInfo(&v1.Pod{Spec: volState}), true, "different state"}, } expectedFailureReasons := []PredicateFailureReason{ErrDiskConflict} for _, test := range tests { t.Run(test.name, func(t *testing.T) { ok, reasons, err := NoDiskConflict(test.pod, nil, test.nodeInfo) if err != nil { t.Errorf("unexpected error: %v", err) } if !ok && !reflect.DeepEqual(reasons, expectedFailureReasons) { t.Errorf("unexpected failure reasons: %v, want: %v", reasons, expectedFailureReasons) } if test.isOk && !ok { t.Errorf("expected ok, got none.  %v %s", test.pod, test.nodeInfo) } if !test.isOk && ok { t.Errorf("expected no ok, got one.  %v %s", test.pod, test.nodeInfo) } }) } } func TestAWSDiskConflicts(t *testing.T) { volState := v1.PodSpec{ Volumes: []v1.Volume{ { VolumeSource: v1.VolumeSource{ AWSElasticBlockStore: &v1.AWSElasticBlockStoreVolumeSource{ VolumeID: "foo", }, }, }, }, } volState2 := v1.PodSpec{ Volumes: []v1.Volume{ { VolumeSource: v1.VolumeSource{ AWSElasticBlockStore: &v1.AWSElasticBlockStoreVolumeSource{ VolumeID: "bar", }, }, }, }, } tests := []struct { pod      *v1.Pod nodeInfo *schedulernodeinfo.NodeInfo isOk     bool name     string }{ {&v1.Pod{}, schedulernodeinfo.NewNodeInfo(), true, "nothing"}, {&v1.Pod{}, schedulernodeinfo.NewNodeInfo(&v1.Pod{Spec: volState}), true, "one state"}, {&v1.Pod{Spec: volState}, schedulernodeinfo.NewNodeInfo(&v1.Pod{Spec: volState}), false, "same state"}, {&v1.Pod{Spec: volState2}, schedulernodeinfo.NewNodeInfo(&v1.Pod{Spec: volState}), true, "different state"}, } expectedFailureReasons := []PredicateFailureReason{ErrDiskConflict} for _, test := range tests { t.Run(test.name, func(t *testing.T) { ok, reasons, err := NoDiskConflict(test.pod, nil, test.nodeInfo) if err != nil { t.Errorf("unexpected error: %v", err) } if !ok && !reflect.DeepEqual(reasons, expectedFailureReasons) { t.Errorf("unexpected failure reasons: %v, want: %v", reasons, expectedFailureReasons) } if test.isOk && !ok { t.Errorf("expected ok, got none.  %v %s", test.pod, test.nodeInfo) } if !test.isOk && ok { t.Errorf("expected no ok, got one.  %v %s", test.pod, test.nodeInfo) } }) } } func TestRBDDiskConflicts(t *testing.T) { volState := v1.PodSpec{ Volumes: []v1.Volume{ { VolumeSource: v1.VolumeSource{ RBD: &v1.RBDVolumeSource{ CephMonitors: []string{"a", "b"}, RBDPool:      "foo", RBDImage:     "bar", FSType:       "ext4", }, }, }, }, } volState2 := v1.PodSpec{ Volumes: []v1.Volume{ { VolumeSource: v1.VolumeSource{ RBD: &v1.RBDVolumeSource{ CephMonitors: []string{"c", "d"}, RBDPool:      "foo", RBDImage:     "bar", FSType:       "ext4", }, }, }, }, } tests := []struct { pod      *v1.Pod nodeInfo *schedulernodeinfo.NodeInfo isOk     bool name     string }{ {&v1.Pod{}, schedulernodeinfo.NewNodeInfo(), true, "nothing"}, {&v1.Pod{}, schedulernodeinfo.NewNodeInfo(&v1.Pod{Spec: volState}), true, "one state"}, {&v1.Pod{Spec: volState}, schedulernodeinfo.NewNodeInfo(&v1.Pod{Spec: volState}), false, "same state"}, {&v1.Pod{Spec: volState2}, schedulernodeinfo.NewNodeInfo(&v1.Pod{Spec: volState}), true, "different state"}, } expectedFailureReasons := []PredicateFailureReason{ErrDiskConflict} for _, test := range tests { t.Run(test.name, func(t *testing.T) { ok, reasons, err := NoDiskConflict(test.pod, nil, test.nodeInfo) if err != nil { t.Errorf("unexpected error: %v", err) } if !ok && !reflect.DeepEqual(reasons, expectedFailureReasons) { t.Errorf("unexpected failure reasons: %v, want: %v", reasons, expectedFailureReasons) } if test.isOk && !ok { t.Errorf("expected ok, got none.  %v %s", test.pod, test.nodeInfo) } if !test.isOk && ok { t.Errorf("expected no ok, got one.  %v %s", test.pod, test.nodeInfo) } }) } } func TestISCSIDiskConflicts(t *testing.T) { volState := v1.PodSpec{ Volumes: []v1.Volume{ { VolumeSource: v1.VolumeSource{ ISCSI: &v1.ISCSIVolumeSource{ TargetPortal: "127.0.0.1:3260", IQN:          "iqn.2016-12.server:storage.target01", FSType:       "ext4", Lun:          0, }, }, }, }, } volState2 := v1.PodSpec{ Volumes: []v1.Volume{ { VolumeSource: v1.VolumeSource{ ISCSI: &v1.ISCSIVolumeSource{ TargetPortal: "127.0.0.1:3260", IQN:          "iqn.2017-12.server:storage.target01", FSType:       "ext4", Lun:          0, }, }, }, }, } tests := []struct { pod      *v1.Pod nodeInfo *schedulernodeinfo.NodeInfo isOk     bool name     string }{ {&v1.Pod{}, schedulernodeinfo.NewNodeInfo(), true, "nothing"}, {&v1.Pod{}, schedulernodeinfo.NewNodeInfo(&v1.Pod{Spec: volState}), true, "one state"}, {&v1.Pod{Spec: volState}, schedulernodeinfo.NewNodeInfo(&v1.Pod{Spec: volState}), false, "same state"}, {&v1.Pod{Spec: volState2}, schedulernodeinfo.NewNodeInfo(&v1.Pod{Spec: volState}), true, "different state"}, } expectedFailureReasons := []PredicateFailureReason{ErrDiskConflict} for _, test := range tests { t.Run(test.name, func(t *testing.T) { ok, reasons, err := NoDiskConflict(test.pod, nil, test.nodeInfo) if err != nil { t.Errorf("unexpected error: %v", err) } if !ok && !reflect.DeepEqual(reasons, expectedFailureReasons) { t.Errorf("unexpected failure reasons: %v, want: %v", reasons, expectedFailureReasons) } if test.isOk && !ok { t.Errorf("expected ok, got none.  %v %s", test.pod, test.nodeInfo) } if !test.isOk && ok { t.Errorf("expected no ok, got one.  %v %s", test.pod, test.nodeInfo) } }) } } </del> // TODO: Add test case for RequiredDuringSchedulingRequiredDuringExecution after it's implemented. func TestPodFitsSelector(t *testing.T) { tests := []struct {