mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-24 12:15:52 +00:00
Merge pull request #97818 from damemi/remove-util-node-dep
Scheduler: remove direct dependency for k8s.io/kubernetes/pkg/util/node
This commit is contained in:
commit
9067b5691d
@ -51,11 +51,11 @@ import (
|
||||
"k8s.io/client-go/util/flowcontrol"
|
||||
"k8s.io/client-go/util/workqueue"
|
||||
"k8s.io/component-base/metrics/prometheus/ratelimiter"
|
||||
utilnode "k8s.io/component-helpers/node/topology"
|
||||
kubeletapis "k8s.io/kubelet/pkg/apis"
|
||||
"k8s.io/kubernetes/pkg/controller"
|
||||
"k8s.io/kubernetes/pkg/controller/nodelifecycle/scheduler"
|
||||
nodeutil "k8s.io/kubernetes/pkg/controller/util/node"
|
||||
utilnode "k8s.io/kubernetes/pkg/util/node"
|
||||
taintutils "k8s.io/kubernetes/pkg/util/taints"
|
||||
)
|
||||
|
||||
|
@ -40,10 +40,10 @@ import (
|
||||
v1core "k8s.io/client-go/kubernetes/typed/core/v1"
|
||||
"k8s.io/client-go/tools/cache"
|
||||
ref "k8s.io/client-go/tools/reference"
|
||||
utilnode "k8s.io/component-helpers/node/topology"
|
||||
"k8s.io/klog/v2"
|
||||
"k8s.io/kubernetes/pkg/api/legacyscheme"
|
||||
api "k8s.io/kubernetes/pkg/apis/core"
|
||||
utilnode "k8s.io/kubernetes/pkg/util/node"
|
||||
|
||||
jsonpatch "github.com/evanphx/json-patch"
|
||||
)
|
||||
|
@ -25,9 +25,9 @@ import (
|
||||
"k8s.io/apimachinery/pkg/runtime"
|
||||
appslisters "k8s.io/client-go/listers/apps/v1"
|
||||
corelisters "k8s.io/client-go/listers/core/v1"
|
||||
utilnode "k8s.io/component-helpers/node/topology"
|
||||
"k8s.io/kubernetes/pkg/scheduler/framework"
|
||||
"k8s.io/kubernetes/pkg/scheduler/framework/plugins/helper"
|
||||
utilnode "k8s.io/kubernetes/pkg/util/node"
|
||||
)
|
||||
|
||||
// SelectorSpread is a plugin that calculates selector spread priority.
|
||||
|
2
pkg/scheduler/internal/cache/node_tree.go
vendored
2
pkg/scheduler/internal/cache/node_tree.go
vendored
@ -21,8 +21,8 @@ import (
|
||||
"fmt"
|
||||
|
||||
v1 "k8s.io/api/core/v1"
|
||||
utilnode "k8s.io/component-helpers/node/topology"
|
||||
"k8s.io/klog/v2"
|
||||
utilnode "k8s.io/kubernetes/pkg/util/node"
|
||||
)
|
||||
|
||||
// nodeTree is a tree-like data structure that holds node names in each zone. Zone names are
|
||||
|
@ -174,42 +174,6 @@ func GetNodeIP(client clientset.Interface, name string) net.IP {
|
||||
return nodeIP
|
||||
}
|
||||
|
||||
// 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 ""
|
||||
}
|
||||
|
||||
// TODO: "failure-domain.beta..." names are deprecated, but will
|
||||
// stick around a long time due to existing on old extant objects like PVs.
|
||||
// Maybe one day we can stop considering them (see #88493).
|
||||
zone, ok := labels[v1.LabelFailureDomainBetaZone]
|
||||
if !ok {
|
||||
zone, _ = labels[v1.LabelTopologyZone]
|
||||
}
|
||||
|
||||
region, ok := labels[v1.LabelFailureDomainBetaRegion]
|
||||
if !ok {
|
||||
region, _ = labels[v1.LabelTopologyRegion]
|
||||
}
|
||||
|
||||
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:" + zone
|
||||
}
|
||||
|
||||
type nodeForConditionPatch struct {
|
||||
Status nodeStatusForPatch `json:"status"`
|
||||
}
|
||||
|
@ -266,84 +266,3 @@ 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.LabelFailureDomainBetaZone: "zone1",
|
||||
v1.LabelFailureDomainBetaRegion: "region1",
|
||||
},
|
||||
},
|
||||
},
|
||||
zone: "region1:\x00:zone1",
|
||||
},
|
||||
{
|
||||
name: "has GA zone and region keys",
|
||||
node: &v1.Node{
|
||||
ObjectMeta: metav1.ObjectMeta{
|
||||
Labels: map[string]string{
|
||||
v1.LabelTopologyZone: "zone1",
|
||||
v1.LabelTopologyRegion: "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.LabelTopologyZone: "zone1",
|
||||
v1.LabelTopologyRegion: "region1",
|
||||
v1.LabelFailureDomainBetaZone: "zone1",
|
||||
v1.LabelFailureDomainBetaRegion: "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.LabelTopologyZone: "zone1",
|
||||
v1.LabelTopologyRegion: "region1",
|
||||
v1.LabelFailureDomainBetaZone: "zone2",
|
||||
v1.LabelFailureDomainBetaRegion: "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")
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
8
staging/src/k8s.io/component-helpers/node/OWNERS
Normal file
8
staging/src/k8s.io/component-helpers/node/OWNERS
Normal file
@ -0,0 +1,8 @@
|
||||
# See the OWNERS docs at https://go.k8s.io/owners
|
||||
|
||||
approvers:
|
||||
- sig-node-approvers
|
||||
reviewers:
|
||||
- sig-node-reviewers
|
||||
labels:
|
||||
- sig/node
|
@ -0,0 +1,57 @@
|
||||
/*
|
||||
Copyright 2020 The Kubernetes Authors.
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
package topology
|
||||
|
||||
import (
|
||||
"k8s.io/api/core/v1"
|
||||
)
|
||||
|
||||
// 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 ""
|
||||
}
|
||||
|
||||
// TODO: "failure-domain.beta..." names are deprecated, but will
|
||||
// stick around a long time due to existing on old extant objects like PVs.
|
||||
// Maybe one day we can stop considering them (see #88493).
|
||||
zone, ok := labels[v1.LabelFailureDomainBetaZone]
|
||||
if !ok {
|
||||
zone, _ = labels[v1.LabelTopologyZone]
|
||||
}
|
||||
|
||||
region, ok := labels[v1.LabelFailureDomainBetaRegion]
|
||||
if !ok {
|
||||
region, _ = labels[v1.LabelTopologyRegion]
|
||||
}
|
||||
|
||||
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:" + zone
|
||||
}
|
@ -0,0 +1,104 @@
|
||||
/*
|
||||
Copyright 2020 The Kubernetes Authors.
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
package topology
|
||||
|
||||
import (
|
||||
"k8s.io/api/core/v1"
|
||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||
"testing"
|
||||
)
|
||||
|
||||
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.LabelFailureDomainBetaZone: "zone1",
|
||||
v1.LabelFailureDomainBetaRegion: "region1",
|
||||
},
|
||||
},
|
||||
},
|
||||
zone: "region1:\x00:zone1",
|
||||
},
|
||||
{
|
||||
name: "has GA zone and region keys",
|
||||
node: &v1.Node{
|
||||
ObjectMeta: metav1.ObjectMeta{
|
||||
Labels: map[string]string{
|
||||
v1.LabelTopologyZone: "zone1",
|
||||
v1.LabelTopologyRegion: "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.LabelTopologyZone: "zone1",
|
||||
v1.LabelTopologyRegion: "region1",
|
||||
v1.LabelFailureDomainBetaZone: "zone1",
|
||||
v1.LabelFailureDomainBetaRegion: "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.LabelTopologyZone: "zone1",
|
||||
v1.LabelTopologyRegion: "region1",
|
||||
v1.LabelFailureDomainBetaZone: "zone2",
|
||||
v1.LabelFailureDomainBetaRegion: "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")
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
1
vendor/modules.txt
vendored
1
vendor/modules.txt
vendored
@ -2244,6 +2244,7 @@ k8s.io/component-helpers/apimachinery/lease
|
||||
k8s.io/component-helpers/apps/poddisruptionbudget
|
||||
k8s.io/component-helpers/auth/rbac/reconciliation
|
||||
k8s.io/component-helpers/auth/rbac/validation
|
||||
k8s.io/component-helpers/node/topology
|
||||
k8s.io/component-helpers/scheduling/corev1
|
||||
k8s.io/component-helpers/scheduling/corev1/nodeaffinity
|
||||
k8s.io/component-helpers/storage/volume
|
||||
|
Loading…
Reference in New Issue
Block a user