From 07229d6c51491fd7e60e8699691e19353e1daf3b Mon Sep 17 00:00:00 2001 From: Andrew Sy Kim Date: Wed, 28 Aug 2019 12:59:09 -0400 Subject: [PATCH] pkg/util/node: update GetZoneKey to check both beta and GA labels Signed-off-by: Andrew Sy Kim --- .../node_lifecycle_controller_test.go | 244 ++++++++++++------ .../internal/cache/node_tree_test.go | 35 ++- pkg/util/node/node.go | 22 +- pkg/util/node/node_test.go | 81 ++++++ 4 files changed, 294 insertions(+), 88 deletions(-) diff --git a/pkg/controller/nodelifecycle/node_lifecycle_controller_test.go b/pkg/controller/nodelifecycle/node_lifecycle_controller_test.go index 7d8a9e2eb99..ea0f75eaec2 100644 --- a/pkg/controller/nodelifecycle/node_lifecycle_controller_test.go +++ b/pkg/controller/nodelifecycle/node_lifecycle_controller_test.go @@ -197,8 +197,10 @@ func TestMonitorNodeHealthEvictPods(t *testing.T) { fakeNow := metav1.Date(2015, 1, 1, 12, 0, 0, 0, time.UTC) evictionTimeout := 10 * time.Minute labels := map[string]string{ - v1.LabelZoneRegion: "region1", - v1.LabelZoneFailureDomain: "zone1", + v1.LabelZoneRegionStable: "region1", + v1.LabelZoneFailureDomainStable: "zone1", + v1.LabelZoneRegion: "region1", + v1.LabelZoneFailureDomain: "zone1", } // Because of the logic that prevents NC from evicting anything when all Nodes are NotReady @@ -234,8 +236,10 @@ func TestMonitorNodeHealthEvictPods(t *testing.T) { Name: "node0", CreationTimestamp: fakeNow, Labels: map[string]string{ - v1.LabelZoneRegion: "region1", - v1.LabelZoneFailureDomain: "zone1", + v1.LabelZoneRegionStable: "region1", + v1.LabelZoneFailureDomainStable: "zone1", + v1.LabelZoneRegion: "region1", + v1.LabelZoneFailureDomain: "zone1", }, }, }, @@ -244,8 +248,10 @@ func TestMonitorNodeHealthEvictPods(t *testing.T) { Name: "node1", CreationTimestamp: metav1.Date(2012, 1, 1, 0, 0, 0, 0, time.UTC), Labels: map[string]string{ - v1.LabelZoneRegion: "region1", - v1.LabelZoneFailureDomain: "zone1", + v1.LabelZoneRegionStable: "region1", + v1.LabelZoneFailureDomainStable: "zone1", + v1.LabelZoneRegion: "region1", + v1.LabelZoneFailureDomain: "zone1", }, }, Status: v1.NodeStatus{ @@ -314,8 +320,10 @@ func TestMonitorNodeHealthEvictPods(t *testing.T) { Name: "node0", CreationTimestamp: metav1.Date(2012, 1, 1, 0, 0, 0, 0, time.UTC), Labels: map[string]string{ - v1.LabelZoneRegion: "region1", - v1.LabelZoneFailureDomain: "zone1", + v1.LabelZoneRegionStable: "region1", + v1.LabelZoneFailureDomainStable: "zone1", + v1.LabelZoneRegion: "region1", + v1.LabelZoneFailureDomain: "zone1", }, }, Status: v1.NodeStatus{ @@ -334,8 +342,10 @@ func TestMonitorNodeHealthEvictPods(t *testing.T) { Name: "node1", CreationTimestamp: metav1.Date(2012, 1, 1, 0, 0, 0, 0, time.UTC), Labels: map[string]string{ - v1.LabelZoneRegion: "region1", - v1.LabelZoneFailureDomain: "zone1", + v1.LabelZoneRegionStable: "region1", + v1.LabelZoneFailureDomainStable: "zone1", + v1.LabelZoneRegion: "region1", + v1.LabelZoneFailureDomain: "zone1", }, }, Status: v1.NodeStatus{ @@ -378,8 +388,10 @@ func TestMonitorNodeHealthEvictPods(t *testing.T) { Name: "node0", CreationTimestamp: metav1.Date(2012, 1, 1, 0, 0, 0, 0, time.UTC), Labels: map[string]string{ - v1.LabelZoneRegion: "region1", - v1.LabelZoneFailureDomain: "zone1", + v1.LabelZoneRegionStable: "region1", + v1.LabelZoneFailureDomainStable: "zone1", + v1.LabelZoneRegion: "region1", + v1.LabelZoneFailureDomain: "zone1", }, }, Status: v1.NodeStatus{ @@ -398,8 +410,10 @@ func TestMonitorNodeHealthEvictPods(t *testing.T) { Name: "node1", CreationTimestamp: metav1.Date(2012, 1, 1, 0, 0, 0, 0, time.UTC), Labels: map[string]string{ - v1.LabelZoneRegion: "region1", - v1.LabelZoneFailureDomain: "zone1", + v1.LabelZoneRegionStable: "region1", + v1.LabelZoneFailureDomainStable: "zone1", + v1.LabelZoneRegion: "region1", + v1.LabelZoneFailureDomain: "zone1", }, }, Status: v1.NodeStatus{ @@ -469,8 +483,10 @@ func TestMonitorNodeHealthEvictPods(t *testing.T) { Name: "node0", CreationTimestamp: metav1.Date(2012, 1, 1, 0, 0, 0, 0, time.UTC), Labels: map[string]string{ - v1.LabelZoneRegion: "region1", - v1.LabelZoneFailureDomain: "zone1", + v1.LabelZoneRegionStable: "region1", + v1.LabelZoneFailureDomainStable: "zone1", + v1.LabelZoneRegion: "region1", + v1.LabelZoneFailureDomain: "zone1", }, }, Status: v1.NodeStatus{ @@ -489,8 +505,10 @@ func TestMonitorNodeHealthEvictPods(t *testing.T) { Name: "node1", CreationTimestamp: metav1.Date(2012, 1, 1, 0, 0, 0, 0, time.UTC), Labels: map[string]string{ - v1.LabelZoneRegion: "region1", - v1.LabelZoneFailureDomain: "zone1", + v1.LabelZoneRegionStable: "region1", + v1.LabelZoneFailureDomainStable: "zone1", + v1.LabelZoneRegion: "region1", + v1.LabelZoneFailureDomain: "zone1", }, }, Status: v1.NodeStatus{ @@ -533,8 +551,10 @@ func TestMonitorNodeHealthEvictPods(t *testing.T) { Name: "node0", CreationTimestamp: metav1.Date(2012, 1, 1, 0, 0, 0, 0, time.UTC), Labels: map[string]string{ - v1.LabelZoneRegion: "region1", - v1.LabelZoneFailureDomain: "zone1", + v1.LabelZoneRegionStable: "region1", + v1.LabelZoneFailureDomainStable: "zone1", + v1.LabelZoneRegion: "region1", + v1.LabelZoneFailureDomain: "zone1", }, }, Status: v1.NodeStatus{ @@ -553,8 +573,10 @@ func TestMonitorNodeHealthEvictPods(t *testing.T) { Name: "node1", CreationTimestamp: metav1.Date(2012, 1, 1, 0, 0, 0, 0, time.UTC), Labels: map[string]string{ - v1.LabelZoneRegion: "region1", - v1.LabelZoneFailureDomain: "zone1", + v1.LabelZoneRegionStable: "region1", + v1.LabelZoneFailureDomainStable: "zone1", + v1.LabelZoneRegion: "region1", + v1.LabelZoneFailureDomain: "zone1", }, }, Status: v1.NodeStatus{ @@ -597,8 +619,10 @@ func TestMonitorNodeHealthEvictPods(t *testing.T) { Name: "node0", CreationTimestamp: metav1.Date(2012, 1, 1, 0, 0, 0, 0, time.UTC), Labels: map[string]string{ - v1.LabelZoneRegion: "region1", - v1.LabelZoneFailureDomain: "zone1", + v1.LabelZoneRegionStable: "region1", + v1.LabelZoneFailureDomainStable: "zone1", + v1.LabelZoneRegion: "region1", + v1.LabelZoneFailureDomain: "zone1", }, }, Status: v1.NodeStatus{ @@ -617,8 +641,10 @@ func TestMonitorNodeHealthEvictPods(t *testing.T) { Name: "node1", CreationTimestamp: metav1.Date(2012, 1, 1, 0, 0, 0, 0, time.UTC), Labels: map[string]string{ - v1.LabelZoneRegion: "region1", - v1.LabelZoneFailureDomain: "zone1", + v1.LabelZoneRegionStable: "region1", + v1.LabelZoneFailureDomainStable: "zone1", + v1.LabelZoneRegion: "region1", + v1.LabelZoneFailureDomain: "zone1", }, }, Status: v1.NodeStatus{ @@ -762,8 +788,10 @@ func TestPodStatusChange(t *testing.T) { Name: "node0", CreationTimestamp: metav1.Date(2012, 1, 1, 0, 0, 0, 0, time.UTC), Labels: map[string]string{ - v1.LabelZoneRegion: "region1", - v1.LabelZoneFailureDomain: "zone1", + v1.LabelZoneRegionStable: "region1", + v1.LabelZoneFailureDomainStable: "zone1", + v1.LabelZoneRegion: "region1", + v1.LabelZoneFailureDomain: "zone1", }, }, Status: v1.NodeStatus{ @@ -930,8 +958,10 @@ func TestMonitorNodeHealthEvictPodsWithDisruption(t *testing.T) { Name: "node0", CreationTimestamp: metav1.Date(2012, 1, 1, 0, 0, 0, 0, time.UTC), Labels: map[string]string{ - v1.LabelZoneRegion: "region1", - v1.LabelZoneFailureDomain: "zone1", + v1.LabelZoneRegionStable: "region1", + v1.LabelZoneFailureDomainStable: "zone1", + v1.LabelZoneRegion: "region1", + v1.LabelZoneFailureDomain: "zone1", }, }, Status: v1.NodeStatus{ @@ -950,8 +980,10 @@ func TestMonitorNodeHealthEvictPodsWithDisruption(t *testing.T) { Name: "node1", CreationTimestamp: metav1.Date(2012, 1, 1, 0, 0, 0, 0, time.UTC), Labels: map[string]string{ - v1.LabelZoneRegion: "region1", - v1.LabelZoneFailureDomain: "zone1", + v1.LabelZoneRegionStable: "region1", + v1.LabelZoneFailureDomainStable: "zone1", + v1.LabelZoneRegion: "region1", + v1.LabelZoneFailureDomain: "zone1", }, }, Status: v1.NodeStatus{ @@ -985,8 +1017,10 @@ func TestMonitorNodeHealthEvictPodsWithDisruption(t *testing.T) { Name: "node0", CreationTimestamp: metav1.Date(2012, 1, 1, 0, 0, 0, 0, time.UTC), Labels: map[string]string{ - v1.LabelZoneRegion: "region1", - v1.LabelZoneFailureDomain: "zone1", + v1.LabelZoneRegionStable: "region1", + v1.LabelZoneFailureDomainStable: "zone1", + v1.LabelZoneRegion: "region1", + v1.LabelZoneFailureDomain: "zone1", }, }, Status: v1.NodeStatus{ @@ -1005,8 +1039,10 @@ func TestMonitorNodeHealthEvictPodsWithDisruption(t *testing.T) { Name: "node1", CreationTimestamp: metav1.Date(2012, 1, 1, 0, 0, 0, 0, time.UTC), Labels: map[string]string{ - v1.LabelZoneRegion: "region2", - v1.LabelZoneFailureDomain: "zone2", + v1.LabelZoneRegionStable: "region2", + v1.LabelZoneFailureDomainStable: "zone2", + v1.LabelZoneRegion: "region2", + v1.LabelZoneFailureDomain: "zone2", }, }, Status: v1.NodeStatus{ @@ -1047,8 +1083,10 @@ func TestMonitorNodeHealthEvictPodsWithDisruption(t *testing.T) { Name: "node0", CreationTimestamp: metav1.Date(2012, 1, 1, 0, 0, 0, 0, time.UTC), Labels: map[string]string{ - v1.LabelZoneRegion: "region1", - v1.LabelZoneFailureDomain: "zone1", + v1.LabelZoneRegionStable: "region1", + v1.LabelZoneFailureDomainStable: "zone1", + v1.LabelZoneRegion: "region1", + v1.LabelZoneFailureDomain: "zone1", }, }, Status: v1.NodeStatus{ @@ -1067,8 +1105,10 @@ func TestMonitorNodeHealthEvictPodsWithDisruption(t *testing.T) { Name: "node1", CreationTimestamp: metav1.Date(2012, 1, 1, 0, 0, 0, 0, time.UTC), Labels: map[string]string{ - v1.LabelZoneRegion: "region1", - v1.LabelZoneFailureDomain: "zone2", + v1.LabelZoneRegionStable: "region1", + v1.LabelZoneFailureDomainStable: "zone2", + v1.LabelZoneRegion: "region1", + v1.LabelZoneFailureDomain: "zone2", }, }, Status: v1.NodeStatus{ @@ -1108,8 +1148,10 @@ func TestMonitorNodeHealthEvictPodsWithDisruption(t *testing.T) { Name: "node0", CreationTimestamp: metav1.Date(2012, 1, 1, 0, 0, 0, 0, time.UTC), Labels: map[string]string{ - v1.LabelZoneRegion: "region1", - v1.LabelZoneFailureDomain: "zone1", + v1.LabelZoneRegionStable: "region1", + v1.LabelZoneFailureDomainStable: "zone1", + v1.LabelZoneRegion: "region1", + v1.LabelZoneFailureDomain: "zone1", }, }, Status: v1.NodeStatus{ @@ -1128,8 +1170,10 @@ func TestMonitorNodeHealthEvictPodsWithDisruption(t *testing.T) { Name: "node-master", CreationTimestamp: metav1.Date(2012, 1, 1, 0, 0, 0, 0, time.UTC), Labels: map[string]string{ - v1.LabelZoneRegion: "region1", - v1.LabelZoneFailureDomain: "zone1", + v1.LabelZoneRegionStable: "region1", + v1.LabelZoneFailureDomainStable: "zone1", + v1.LabelZoneRegion: "region1", + v1.LabelZoneFailureDomain: "zone1", }, }, Status: v1.NodeStatus{ @@ -1167,8 +1211,10 @@ func TestMonitorNodeHealthEvictPodsWithDisruption(t *testing.T) { Name: "node0", CreationTimestamp: metav1.Date(2012, 1, 1, 0, 0, 0, 0, time.UTC), Labels: map[string]string{ - v1.LabelZoneRegion: "region1", - v1.LabelZoneFailureDomain: "zone1", + v1.LabelZoneRegionStable: "region1", + v1.LabelZoneFailureDomainStable: "zone1", + v1.LabelZoneRegion: "region1", + v1.LabelZoneFailureDomain: "zone1", }, }, Status: v1.NodeStatus{ @@ -1187,8 +1233,10 @@ func TestMonitorNodeHealthEvictPodsWithDisruption(t *testing.T) { Name: "node1", CreationTimestamp: metav1.Date(2012, 1, 1, 0, 0, 0, 0, time.UTC), Labels: map[string]string{ - v1.LabelZoneRegion: "region1", - v1.LabelZoneFailureDomain: "zone2", + v1.LabelZoneRegionStable: "region1", + v1.LabelZoneFailureDomainStable: "zone2", + v1.LabelZoneRegion: "region1", + v1.LabelZoneFailureDomain: "zone2", }, }, Status: v1.NodeStatus{ @@ -1229,8 +1277,10 @@ func TestMonitorNodeHealthEvictPodsWithDisruption(t *testing.T) { Name: "node0", CreationTimestamp: metav1.Date(2012, 1, 1, 0, 0, 0, 0, time.UTC), Labels: map[string]string{ - v1.LabelZoneRegion: "region1", - v1.LabelZoneFailureDomain: "zone1", + v1.LabelZoneRegionStable: "region1", + v1.LabelZoneFailureDomainStable: "zone1", + v1.LabelZoneRegion: "region1", + v1.LabelZoneFailureDomain: "zone1", }, }, Status: v1.NodeStatus{ @@ -1249,8 +1299,10 @@ func TestMonitorNodeHealthEvictPodsWithDisruption(t *testing.T) { Name: "node1", CreationTimestamp: metav1.Date(2012, 1, 1, 0, 0, 0, 0, time.UTC), Labels: map[string]string{ - v1.LabelZoneRegion: "region1", - v1.LabelZoneFailureDomain: "zone1", + v1.LabelZoneRegionStable: "region1", + v1.LabelZoneFailureDomainStable: "zone1", + v1.LabelZoneRegion: "region1", + v1.LabelZoneFailureDomain: "zone1", }, }, Status: v1.NodeStatus{ @@ -1269,8 +1321,10 @@ func TestMonitorNodeHealthEvictPodsWithDisruption(t *testing.T) { Name: "node2", CreationTimestamp: metav1.Date(2012, 1, 1, 0, 0, 0, 0, time.UTC), Labels: map[string]string{ - v1.LabelZoneRegion: "region1", - v1.LabelZoneFailureDomain: "zone1", + v1.LabelZoneRegionStable: "region1", + v1.LabelZoneFailureDomainStable: "zone1", + v1.LabelZoneRegion: "region1", + v1.LabelZoneFailureDomain: "zone1", }, }, Status: v1.NodeStatus{ @@ -1289,8 +1343,10 @@ func TestMonitorNodeHealthEvictPodsWithDisruption(t *testing.T) { Name: "node3", CreationTimestamp: metav1.Date(2012, 1, 1, 0, 0, 0, 0, time.UTC), Labels: map[string]string{ - v1.LabelZoneRegion: "region1", - v1.LabelZoneFailureDomain: "zone1", + v1.LabelZoneRegionStable: "region1", + v1.LabelZoneFailureDomainStable: "zone1", + v1.LabelZoneRegion: "region1", + v1.LabelZoneFailureDomain: "zone1", }, }, Status: v1.NodeStatus{ @@ -1309,8 +1365,10 @@ func TestMonitorNodeHealthEvictPodsWithDisruption(t *testing.T) { Name: "node4", CreationTimestamp: metav1.Date(2012, 1, 1, 0, 0, 0, 0, time.UTC), Labels: map[string]string{ - v1.LabelZoneRegion: "region1", - v1.LabelZoneFailureDomain: "zone1", + v1.LabelZoneRegionStable: "region1", + v1.LabelZoneFailureDomainStable: "zone1", + v1.LabelZoneRegion: "region1", + v1.LabelZoneFailureDomain: "zone1", }, }, Status: v1.NodeStatus{ @@ -2584,8 +2642,10 @@ func TestApplyNoExecuteTaints(t *testing.T) { Name: "node0", CreationTimestamp: metav1.Date(2012, 1, 1, 0, 0, 0, 0, time.UTC), Labels: map[string]string{ - v1.LabelZoneRegion: "region1", - v1.LabelZoneFailureDomain: "zone1", + v1.LabelZoneRegionStable: "region1", + v1.LabelZoneFailureDomainStable: "zone1", + v1.LabelZoneRegion: "region1", + v1.LabelZoneFailureDomain: "zone1", }, }, Status: v1.NodeStatus{ @@ -2606,8 +2666,10 @@ func TestApplyNoExecuteTaints(t *testing.T) { Name: "node1", CreationTimestamp: metav1.Date(2012, 1, 1, 0, 0, 0, 0, time.UTC), Labels: map[string]string{ - v1.LabelZoneRegion: "region1", - v1.LabelZoneFailureDomain: "zone1", + v1.LabelZoneRegionStable: "region1", + v1.LabelZoneFailureDomainStable: "zone1", + v1.LabelZoneRegion: "region1", + v1.LabelZoneFailureDomain: "zone1", }, }, Status: v1.NodeStatus{ @@ -2627,8 +2689,10 @@ func TestApplyNoExecuteTaints(t *testing.T) { Name: "node2", CreationTimestamp: metav1.Date(2012, 1, 1, 0, 0, 0, 0, time.UTC), Labels: map[string]string{ - v1.LabelZoneRegion: "region1", - v1.LabelZoneFailureDomain: "zone1", + v1.LabelZoneRegionStable: "region1", + v1.LabelZoneFailureDomainStable: "zone1", + v1.LabelZoneRegion: "region1", + v1.LabelZoneFailureDomain: "zone1", }, }, Status: v1.NodeStatus{ @@ -2731,8 +2795,10 @@ func TestSwapUnreachableNotReadyTaints(t *testing.T) { Name: "node0", CreationTimestamp: metav1.Date(2012, 1, 1, 0, 0, 0, 0, time.UTC), Labels: map[string]string{ - v1.LabelZoneRegion: "region1", - v1.LabelZoneFailureDomain: "zone1", + v1.LabelZoneRegionStable: "region1", + v1.LabelZoneFailureDomainStable: "zone1", + v1.LabelZoneRegion: "region1", + v1.LabelZoneFailureDomain: "zone1", }, }, Status: v1.NodeStatus{ @@ -2754,8 +2820,10 @@ func TestSwapUnreachableNotReadyTaints(t *testing.T) { Name: "node1", CreationTimestamp: metav1.Date(2012, 1, 1, 0, 0, 0, 0, time.UTC), Labels: map[string]string{ - v1.LabelZoneRegion: "region1", - v1.LabelZoneFailureDomain: "zone1", + v1.LabelZoneRegionStable: "region1", + v1.LabelZoneFailureDomainStable: "zone1", + v1.LabelZoneRegion: "region1", + v1.LabelZoneFailureDomain: "zone1", }, }, Status: v1.NodeStatus{ @@ -2880,8 +2948,10 @@ func TestTaintsNodeByCondition(t *testing.T) { Name: "node0", CreationTimestamp: metav1.Date(2012, 1, 1, 0, 0, 0, 0, time.UTC), Labels: map[string]string{ - v1.LabelZoneRegion: "region1", - v1.LabelZoneFailureDomain: "zone1", + v1.LabelZoneRegionStable: "region1", + v1.LabelZoneFailureDomainStable: "zone1", + v1.LabelZoneRegion: "region1", + v1.LabelZoneFailureDomain: "zone1", }, }, Status: v1.NodeStatus{ @@ -2939,8 +3009,10 @@ func TestTaintsNodeByCondition(t *testing.T) { Name: "node0", CreationTimestamp: metav1.Date(2012, 1, 1, 0, 0, 0, 0, time.UTC), Labels: map[string]string{ - v1.LabelZoneRegion: "region1", - v1.LabelZoneFailureDomain: "zone1", + v1.LabelZoneRegionStable: "region1", + v1.LabelZoneFailureDomainStable: "zone1", + v1.LabelZoneRegion: "region1", + v1.LabelZoneFailureDomain: "zone1", }, }, Status: v1.NodeStatus{ @@ -2969,8 +3041,10 @@ func TestTaintsNodeByCondition(t *testing.T) { Name: "node0", CreationTimestamp: metav1.Date(2012, 1, 1, 0, 0, 0, 0, time.UTC), Labels: map[string]string{ - v1.LabelZoneRegion: "region1", - v1.LabelZoneFailureDomain: "zone1", + v1.LabelZoneRegionStable: "region1", + v1.LabelZoneFailureDomainStable: "zone1", + v1.LabelZoneRegion: "region1", + v1.LabelZoneFailureDomain: "zone1", }, }, Status: v1.NodeStatus{ @@ -2999,8 +3073,10 @@ func TestTaintsNodeByCondition(t *testing.T) { Name: "node0", CreationTimestamp: metav1.Date(2012, 1, 1, 0, 0, 0, 0, time.UTC), Labels: map[string]string{ - v1.LabelZoneRegion: "region1", - v1.LabelZoneFailureDomain: "zone1", + v1.LabelZoneRegionStable: "region1", + v1.LabelZoneFailureDomainStable: "zone1", + v1.LabelZoneRegion: "region1", + v1.LabelZoneFailureDomain: "zone1", }, }, Status: v1.NodeStatus{ @@ -3023,8 +3099,10 @@ func TestTaintsNodeByCondition(t *testing.T) { Name: "node0", CreationTimestamp: metav1.Date(2012, 1, 1, 0, 0, 0, 0, time.UTC), Labels: map[string]string{ - v1.LabelZoneRegion: "region1", - v1.LabelZoneFailureDomain: "zone1", + v1.LabelZoneRegionStable: "region1", + v1.LabelZoneFailureDomainStable: "zone1", + v1.LabelZoneRegion: "region1", + v1.LabelZoneFailureDomain: "zone1", }, }, Status: v1.NodeStatus{ @@ -3145,8 +3223,10 @@ func TestReconcileNodeLabels(t *testing.T) { Name: "node0", CreationTimestamp: metav1.Date(2012, 1, 1, 0, 0, 0, 0, time.UTC), Labels: map[string]string{ - v1.LabelZoneRegion: "region1", - v1.LabelZoneFailureDomain: "zone1", + v1.LabelZoneRegionStable: "region1", + v1.LabelZoneFailureDomainStable: "zone1", + v1.LabelZoneRegion: "region1", + v1.LabelZoneFailureDomain: "zone1", }, }, Status: v1.NodeStatus{ @@ -3201,12 +3281,12 @@ func TestReconcileNodeLabels(t *testing.T) { Name: "node0", CreationTimestamp: metav1.Date(2012, 1, 1, 0, 0, 0, 0, time.UTC), Labels: map[string]string{ - v1.LabelZoneRegion: "region1", + v1.LabelZoneRegionStable: "region1", }, }, }, ExpectedLabels: map[string]string{ - v1.LabelZoneRegion: "region1", + v1.LabelZoneRegionStable: "region1", }, }, { diff --git a/pkg/scheduler/internal/cache/node_tree_test.go b/pkg/scheduler/internal/cache/node_tree_test.go index 726e3158a24..34d2d3af2e8 100644 --- a/pkg/scheduler/internal/cache/node_tree_test.go +++ b/pkg/scheduler/internal/cache/node_tree_test.go @@ -108,7 +108,30 @@ var allNodes = []*v1.Node{ v1.LabelZoneFailureDomain: "zone-2", }, }, - }} + }, + // Node 9: a node with zone + region label and the deprecated zone + region label + { + ObjectMeta: metav1.ObjectMeta{ + Name: "node-9", + Labels: map[string]string{ + v1.LabelZoneRegionStable: "region-2", + v1.LabelZoneFailureDomainStable: "zone-2", + v1.LabelZoneRegion: "region-2", + v1.LabelZoneFailureDomain: "zone-2", + }, + }, + }, + // Node 10: a node with only the deprecated zone + region labels + { + ObjectMeta: metav1.ObjectMeta{ + Name: "node-10", + Labels: map[string]string{ + v1.LabelZoneRegion: "region-2", + v1.LabelZoneFailureDomain: "zone-3", + }, + }, + }, +} func verifyNodeTree(t *testing.T, nt *nodeTree, expectedTree map[string]*nodeArray) { expectedNumNodes := int(0) @@ -164,6 +187,14 @@ func TestNodeTree_AddNode(t *testing.T) { "region-2:\x00:zone-2": {[]string{"node-6"}, 0}, }, }, + { + name: "nodes also using deprecated zone/region label", + nodesToAdd: allNodes[9:], + expectedTree: map[string]*nodeArray{ + "region-2:\x00:zone-2": {[]string{"node-9"}, 0}, + "region-2:\x00:zone-3": {[]string{"node-10"}, 0}, + }, + }, } for _, test := range tests { @@ -400,7 +431,7 @@ func TestNodeTreeMultiOperations(t *testing.T) { nodesToAdd: append(allNodes[4:9], allNodes[3]), nodesToRemove: nil, operations: []string{"add", "add", "add", "add", "add", "next", "next", "next", "next", "add", "next", "next", "next"}, - expectedOutput: []string{"node-4", "node-5", "node-6", "node-7", "node-3", "node-8", "node-4"}, + expectedOutput: []string{"node-4", "node-6", "node-7", "node-8", "node-3", "node-4", "node-6"}, }, { name: "remove zone and add new to ensure exhausted is reset correctly", diff --git a/pkg/util/node/node.go b/pkg/util/node/node.go index c31ad647513..9984380db81 100644 --- a/pkg/util/node/node.go +++ b/pkg/util/node/node.go @@ -139,23 +139,37 @@ func GetNodeIP(client clientset.Interface, hostname string) net.IP { // GetZoneKey is a helper function that builds a string identifier that is unique per failure-zone; // it returns empty-string for no zone. +// Since there are currently two separate zone keys: +// * "failure-domain.beta.kubernetes.io/zone" +// * "topology.kubernetes.io/zone" +// GetZoneKey will first check failure-domain.beta.kubernetes.io/zone and if not exists, will then check +// topology.kubernetes.io/zone func GetZoneKey(node *v1.Node) string { labels := node.Labels if labels == nil { return "" } - region, _ := labels[v1.LabelZoneRegion] - failureDomain, _ := labels[v1.LabelZoneFailureDomain] + // TODO: prefer stable labels for zone in v1.18 + zone, ok := labels[v1.LabelZoneFailureDomain] + if !ok { + zone, _ = labels[v1.LabelZoneFailureDomainStable] + } - if region == "" && failureDomain == "" { + // TODO: prefer stable labels for region in v1.18 + region, ok := labels[v1.LabelZoneRegion] + if !ok { + region, _ = labels[v1.LabelZoneRegionStable] + } + + if region == "" && zone == "" { return "" } // We include the null character just in case region or failureDomain has a colon // (We do assume there's no null characters in a region or failureDomain) // As a nice side-benefit, the null character is not printed by fmt.Print or glog - return region + ":\x00:" + failureDomain + return region + ":\x00:" + zone } type nodeForConditionPatch struct { diff --git a/pkg/util/node/node_test.go b/pkg/util/node/node_test.go index 2d7d2d62775..c02a8679a85 100644 --- a/pkg/util/node/node_test.go +++ b/pkg/util/node/node_test.go @@ -120,3 +120,84 @@ func TestGetHostname(t *testing.T) { } } + +func Test_GetZoneKey(t *testing.T) { + tests := []struct { + name string + node *v1.Node + zone string + }{ + { + name: "has no zone or region keys", + node: &v1.Node{ + ObjectMeta: metav1.ObjectMeta{ + Labels: map[string]string{}, + }, + }, + zone: "", + }, + { + name: "has beta zone and region keys", + node: &v1.Node{ + ObjectMeta: metav1.ObjectMeta{ + Labels: map[string]string{ + v1.LabelZoneFailureDomain: "zone1", + v1.LabelZoneRegion: "region1", + }, + }, + }, + zone: "region1:\x00:zone1", + }, + { + name: "has GA zone and region keys", + node: &v1.Node{ + ObjectMeta: metav1.ObjectMeta{ + Labels: map[string]string{ + v1.LabelZoneFailureDomainStable: "zone1", + v1.LabelZoneRegionStable: "region1", + }, + }, + }, + zone: "region1:\x00:zone1", + }, + { + name: "has both beta and GA zone and region keys", + node: &v1.Node{ + ObjectMeta: metav1.ObjectMeta{ + Labels: map[string]string{ + v1.LabelZoneFailureDomainStable: "zone1", + v1.LabelZoneRegionStable: "region1", + v1.LabelZoneFailureDomain: "zone1", + v1.LabelZoneRegion: "region1", + }, + }, + }, + zone: "region1:\x00:zone1", + }, + { + name: "has both beta and GA zone and region keys, beta labels take precedent", + node: &v1.Node{ + ObjectMeta: metav1.ObjectMeta{ + Labels: map[string]string{ + v1.LabelZoneFailureDomainStable: "zone1", + v1.LabelZoneRegionStable: "region1", + v1.LabelZoneFailureDomain: "zone2", + v1.LabelZoneRegion: "region2", + }, + }, + }, + zone: "region2:\x00:zone2", + }, + } + + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + zone := GetZoneKey(test.node) + if zone != test.zone { + t.Logf("actual zone key: %q", zone) + t.Logf("expected zone key: %q", test.zone) + t.Errorf("unexpected zone key") + } + }) + } +}