Skip to content

Commit 2e1042f

Browse files
committed
Use NodeWrapper to directly initialize node with labels
Using NodeWrapper in the integration tests gives more flexibility when creating nodes. For instance, tests can create nodes with labels or with a specific sets of resources. Also, NodeWrapper initialises a node with a capacity of 32 pods, which can be overridden by the caller. This makes sure that a node is usable as soon as it is created.
1 parent 908847c commit 2e1042f

File tree

9 files changed

+132
-175
lines changed

9 files changed

+132
-175
lines changed

pkg/scheduler/testing/BUILD

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ go_library(
1919
"//pkg/scheduler/framework/v1alpha1:go_default_library",
2020
"//pkg/scheduler/util:go_default_library",
2121
"//staging/src/k8s.io/api/core/v1:go_default_library",
22+
"//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library",
2223
"//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
2324
"//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library",
2425
"//staging/src/k8s.io/apimachinery/pkg/types:go_default_library",

pkg/scheduler/testing/wrappers.go

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,8 @@ package testing
1919
import (
2020
"fmt"
2121

22-
"k8s.io/api/core/v1"
22+
v1 "k8s.io/api/core/v1"
23+
"k8s.io/apimachinery/pkg/api/resource"
2324
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2425
"k8s.io/apimachinery/pkg/types"
2526
)
@@ -362,7 +363,8 @@ type NodeWrapper struct{ v1.Node }
362363

363364
// MakeNode creates a Node wrapper.
364365
func MakeNode() *NodeWrapper {
365-
return &NodeWrapper{v1.Node{}}
366+
w := &NodeWrapper{v1.Node{}}
367+
return w.Capacity(nil)
366368
}
367369

368370
// Obj returns the inner Node.
@@ -390,3 +392,28 @@ func (n *NodeWrapper) Label(k, v string) *NodeWrapper {
390392
n.Labels[k] = v
391393
return n
392394
}
395+
396+
// Capacity sets the capacity and the allocatable resources of the inner node.
397+
// Each entry in `resources` corresponds to a resource name and its quantity.
398+
// By default, the capacity and allocatable number of pods are set to 32.
399+
func (n *NodeWrapper) Capacity(resources map[v1.ResourceName]string) *NodeWrapper {
400+
res := v1.ResourceList{
401+
v1.ResourcePods: resource.MustParse("32"),
402+
}
403+
for name, value := range resources {
404+
res[name] = resource.MustParse(value)
405+
}
406+
n.Status.Capacity, n.Status.Allocatable = res, res
407+
return n
408+
}
409+
410+
// Images sets the images of the inner node. Each entry in `images` corresponds
411+
// to an image name and its size in bytes.
412+
func (n *NodeWrapper) Images(images map[string]int64) *NodeWrapper {
413+
var containerImages []v1.ContainerImage
414+
for name, size := range images {
415+
containerImages = append(containerImages, v1.ContainerImage{Names: []string{name}, SizeBytes: size})
416+
}
417+
n.Status.Images = containerImages
418+
return n
419+
}

test/integration/scheduler/BUILD

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,10 +86,10 @@ go_library(
8686
"//pkg/api/v1/pod:go_default_library",
8787
"//pkg/controller/disruption:go_default_library",
8888
"//pkg/scheduler:go_default_library",
89+
"//pkg/scheduler/testing:go_default_library",
8990
"//staging/src/k8s.io/api/core/v1:go_default_library",
9091
"//staging/src/k8s.io/api/policy/v1beta1:go_default_library",
9192
"//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library",
92-
"//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library",
9393
"//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
9494
"//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library",
9595
"//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library",

test/integration/scheduler/framework_test.go

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ import (
2222
"testing"
2323
"time"
2424

25-
"k8s.io/api/core/v1"
25+
v1 "k8s.io/api/core/v1"
2626
"k8s.io/apimachinery/pkg/api/resource"
2727
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2828
"k8s.io/apimachinery/pkg/runtime"
@@ -33,6 +33,7 @@ import (
3333
"k8s.io/kubernetes/pkg/scheduler/framework/plugins/defaultbinder"
3434
frameworkruntime "k8s.io/kubernetes/pkg/scheduler/framework/runtime"
3535
framework "k8s.io/kubernetes/pkg/scheduler/framework/v1alpha1"
36+
st "k8s.io/kubernetes/pkg/scheduler/testing"
3637
testutils "k8s.io/kubernetes/test/integration/util"
3738
)
3839

@@ -1130,7 +1131,7 @@ func TestBindPlugin(t *testing.T) {
11301131
defer testutils.CleanupTest(t, testCtx)
11311132

11321133
// Add a few nodes.
1133-
_, err := createNodes(testCtx.ClientSet, "test-node", nil, 2)
1134+
_, err := createNodes(testCtx.ClientSet, "test-node", st.MakeNode(), 2)
11341135
if err != nil {
11351136
t.Fatalf("Cannot create nodes: %v", err)
11361137
}
@@ -1776,12 +1777,12 @@ func TestPreemptWithPermitPlugin(t *testing.T) {
17761777
defer testutils.CleanupTest(t, testCtx)
17771778

17781779
// Add one node.
1779-
nodeRes := &v1.ResourceList{
1780-
v1.ResourcePods: *resource.NewQuantity(32, resource.DecimalSI),
1781-
v1.ResourceCPU: *resource.NewMilliQuantity(500, resource.DecimalSI),
1782-
v1.ResourceMemory: *resource.NewQuantity(500, resource.DecimalSI),
1780+
nodeRes := map[v1.ResourceName]string{
1781+
v1.ResourcePods: "32",
1782+
v1.ResourceCPU: "500m",
1783+
v1.ResourceMemory: "500",
17831784
}
1784-
_, err := createNodes(testCtx.ClientSet, "test-node", nodeRes, 1)
1785+
_, err := createNodes(testCtx.ClientSet, "test-node", st.MakeNode().Capacity(nodeRes), 1)
17851786
if err != nil {
17861787
t.Fatalf("Cannot create nodes: %v", err)
17871788
}
@@ -1841,7 +1842,7 @@ func initTestSchedulerForFrameworkTest(t *testing.T, testCtx *testutils.TestCont
18411842
go testCtx.Scheduler.Run(testCtx.Ctx)
18421843

18431844
if nodeCount > 0 {
1844-
_, err := createNodes(testCtx.ClientSet, "test-node", nil, nodeCount)
1845+
_, err := createNodes(testCtx.ClientSet, "test-node", st.MakeNode(), nodeCount)
18451846
if err != nil {
18461847
t.Fatalf("Cannot create nodes: %v", err)
18471848
}

test/integration/scheduler/predicates_test.go

Lines changed: 10 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@ import (
2424

2525
v1 "k8s.io/api/core/v1"
2626
apierrors "k8s.io/apimachinery/pkg/api/errors"
27-
"k8s.io/apimachinery/pkg/api/resource"
2827
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2928
"k8s.io/apimachinery/pkg/util/wait"
3029
"k8s.io/client-go/kubernetes"
@@ -43,25 +42,12 @@ const pollInterval = 100 * time.Millisecond
4342
func TestInterPodAffinity(t *testing.T) {
4443
testCtx := initTest(t, "inter-pod-affinity")
4544
defer testutils.CleanupTest(t, testCtx)
46-
// Add a few nodes.
47-
nodes, err := createNodes(testCtx.ClientSet, "testnode", nil, 2)
45+
46+
// Add a few nodes with labels
47+
nodes, err := createNodes(testCtx.ClientSet, "testnode", st.MakeNode().Label("region", "r1").Label("zone", "z11"), 2)
4848
if err != nil {
4949
t.Fatalf("Cannot create nodes: %v", err)
5050
}
51-
// Add labels to the nodes.
52-
labels1 := map[string]string{
53-
"region": "r1",
54-
"zone": "z11",
55-
}
56-
for _, node := range nodes {
57-
// TODO(nodo): Use PodWrapper to directly initialize node with labels.
58-
if err = utils.AddLabelsToNode(testCtx.ClientSet, node.Name, labels1); err != nil {
59-
t.Fatalf("Cannot add labels to node: %v", err)
60-
}
61-
if err = waitForNodeLabels(testCtx.ClientSet, node.Name, labels1); err != nil {
62-
t.Fatalf("Adding labels to node didn't succeed: %v", err)
63-
}
64-
}
6551

6652
cs := testCtx.ClientSet
6753
podLabel := map[string]string{"service": "securityscan"}
@@ -886,7 +872,7 @@ func TestEvenPodsSpreadPredicate(t *testing.T) {
886872
ns := testCtx.NS.Name
887873
defer testutils.CleanupTest(t, testCtx)
888874
// Add 4 nodes.
889-
nodes, err := createNodes(cs, "node", nil, 4)
875+
nodes, err := createNodes(cs, "node", st.MakeNode(), 4)
890876
if err != nil {
891877
t.Fatalf("Cannot create nodes: %v", err)
892878
}
@@ -896,7 +882,6 @@ func TestEvenPodsSpreadPredicate(t *testing.T) {
896882
"zone": fmt.Sprintf("zone-%d", i/2),
897883
"node": node.Name,
898884
}
899-
// TODO(nodo): Use PodWrapper to directly initialize node with labels.
900885
if err = utils.AddLabelsToNode(cs, node.Name, labels); err != nil {
901886
t.Fatalf("Cannot add labels to node: %v", err)
902887
}
@@ -1051,7 +1036,7 @@ func TestUnschedulablePodBecomesSchedulable(t *testing.T) {
10511036
Name: "pod-1",
10521037
},
10531038
update: func(cs kubernetes.Interface, _ string) error {
1054-
_, err := createNode(cs, "node-added", nil)
1039+
_, err := createNode(cs, st.MakeNode().Name("node-added").Obj())
10551040
if err != nil {
10561041
return fmt.Errorf("cannot create node: %v", err)
10571042
}
@@ -1061,7 +1046,7 @@ func TestUnschedulablePodBecomesSchedulable(t *testing.T) {
10611046
{
10621047
name: "node gets taint removed",
10631048
init: func(cs kubernetes.Interface, _ string) error {
1064-
node, err := createNode(cs, "node-tainted", nil)
1049+
node, err := createNode(cs, st.MakeNode().Name("node-tainted").Obj())
10651050
if err != nil {
10661051
return fmt.Errorf("cannot create node: %v", err)
10671052
}
@@ -1085,10 +1070,8 @@ func TestUnschedulablePodBecomesSchedulable(t *testing.T) {
10851070
{
10861071
name: "other pod gets deleted",
10871072
init: func(cs kubernetes.Interface, ns string) error {
1088-
nodeResources := &v1.ResourceList{
1089-
v1.ResourcePods: *resource.NewQuantity(1, resource.DecimalSI),
1090-
}
1091-
_, err := createNode(cs, "node-scheduler-integration-test", nodeResources)
1073+
nodeObject := st.MakeNode().Name("node-scheduler-integration-test").Capacity(map[v1.ResourceName]string{v1.ResourcePods: "1"}).Obj()
1074+
_, err := createNode(cs, nodeObject)
10921075
if err != nil {
10931076
return fmt.Errorf("cannot create node: %v", err)
10941077
}
@@ -1111,14 +1094,10 @@ func TestUnschedulablePodBecomesSchedulable(t *testing.T) {
11111094
{
11121095
name: "pod with pod-affinity gets added",
11131096
init: func(cs kubernetes.Interface, _ string) error {
1114-
node, err := createNode(cs, "node-1", nil)
1097+
_, err := createNode(cs, st.MakeNode().Name("node-1").Label("region", "test").Obj())
11151098
if err != nil {
11161099
return fmt.Errorf("cannot create node: %v", err)
11171100
}
1118-
// TODO(nodo): Use PodWrapper to directly initialize node with labels.
1119-
if err := utils.AddLabelsToNode(cs, node.Name, map[string]string{"region": "test"}); err != nil {
1120-
return fmt.Errorf("cannot add labels to node: %v", err)
1121-
}
11221101
return nil
11231102
},
11241103
pod: &pausePodConfig{
@@ -1155,14 +1134,10 @@ func TestUnschedulablePodBecomesSchedulable(t *testing.T) {
11551134
{
11561135
name: "scheduled pod gets updated to match affinity",
11571136
init: func(cs kubernetes.Interface, ns string) error {
1158-
node, err := createNode(cs, "node-1", nil)
1137+
_, err := createNode(cs, st.MakeNode().Name("node-1").Label("region", "test").Obj())
11591138
if err != nil {
11601139
return fmt.Errorf("cannot create node: %v", err)
11611140
}
1162-
// TODO(nodo): Use PodWrapper to directly initialize node with labels.
1163-
if err := utils.AddLabelsToNode(cs, node.Name, map[string]string{"region": "test"}); err != nil {
1164-
return fmt.Errorf("cannot add labels to node: %v", err)
1165-
}
11661141
if _, err := createPausePod(cs, initPausePod(&pausePodConfig{Name: "pod-to-be-updated", Namespace: ns})); err != nil {
11671142
return fmt.Errorf("cannot create pod: %v", err)
11681143
}

0 commit comments

Comments
 (0)