k8s.io/kubernetes@v1.29.3/pkg/api/node/util.go (about) 1 /* 2 Copyright 2022 The Kubernetes Authors. 3 4 Licensed under the Apache License, Version 2.0 (the "License"); 5 you may not use this file except in compliance with the License. 6 You may obtain a copy of the License at 7 8 http://www.apache.org/licenses/LICENSE-2.0 9 10 Unless required by applicable law or agreed to in writing, software 11 distributed under the License is distributed on an "AS IS" BASIS, 12 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 See the License for the specific language governing permissions and 14 limitations under the License. 15 */ 16 17 package node 18 19 import ( 20 "fmt" 21 22 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" 23 "k8s.io/apimachinery/pkg/util/validation/field" 24 api "k8s.io/kubernetes/pkg/apis/core" 25 "k8s.io/kubernetes/pkg/apis/node" 26 ) 27 28 var deprecatedNodeLabels = map[string]string{ 29 `beta.kubernetes.io/arch`: `deprecated since v1.14; use "kubernetes.io/arch" instead`, 30 `beta.kubernetes.io/os`: `deprecated since v1.14; use "kubernetes.io/os" instead`, 31 `failure-domain.beta.kubernetes.io/region`: `deprecated since v1.17; use "topology.kubernetes.io/region" instead`, 32 `failure-domain.beta.kubernetes.io/zone`: `deprecated since v1.17; use "topology.kubernetes.io/zone" instead`, 33 `beta.kubernetes.io/instance-type`: `deprecated since v1.17; use "node.kubernetes.io/instance-type" instead`, 34 } 35 36 // GetNodeLabelDeprecatedMessage returns the message for the deprecated node label 37 // and a bool indicating if the label is deprecated. 38 func GetNodeLabelDeprecatedMessage(key string) (string, bool) { 39 msg, ok := deprecatedNodeLabels[key] 40 return msg, ok 41 } 42 43 func GetWarningsForRuntimeClass(rc *node.RuntimeClass) []string { 44 var warnings []string 45 46 if rc != nil && rc.Scheduling != nil && rc.Scheduling.NodeSelector != nil { 47 // use of deprecated node labels in scheduling's node affinity 48 for key := range rc.Scheduling.NodeSelector { 49 if msg, deprecated := GetNodeLabelDeprecatedMessage(key); deprecated { 50 warnings = append(warnings, fmt.Sprintf("%s: %s", field.NewPath("scheduling", "nodeSelector"), msg)) 51 } 52 } 53 } 54 55 return warnings 56 } 57 58 // GetWarningsForNodeSelector tests if any of the node selector requirements in the template is deprecated. 59 // If there are deprecated node selector requirements in either match expressions or match labels, a warning is returned. 60 func GetWarningsForNodeSelector(nodeSelector *metav1.LabelSelector, fieldPath *field.Path) []string { 61 if nodeSelector == nil { 62 return nil 63 } 64 65 var warnings []string 66 // use of deprecated node labels in matchLabelExpressions 67 for i, expression := range nodeSelector.MatchExpressions { 68 if msg, deprecated := GetNodeLabelDeprecatedMessage(expression.Key); deprecated { 69 warnings = append( 70 warnings, 71 fmt.Sprintf( 72 "%s: %s is %s", 73 fieldPath.Child("matchExpressions").Index(i).Child("key"), 74 expression.Key, 75 msg, 76 ), 77 ) 78 } 79 } 80 81 // use of deprecated node labels in matchLabels 82 for label := range nodeSelector.MatchLabels { 83 if msg, deprecated := GetNodeLabelDeprecatedMessage(label); deprecated { 84 warnings = append(warnings, fmt.Sprintf("%s: %s", fieldPath.Child("matchLabels").Child(label), msg)) 85 } 86 } 87 return warnings 88 } 89 90 // GetWarningsForNodeSelectorTerm checks match expressions of node selector term 91 func GetWarningsForNodeSelectorTerm(nodeSelectorTerm api.NodeSelectorTerm, fieldPath *field.Path) []string { 92 var warnings []string 93 // use of deprecated node labels in matchLabelExpressions 94 for i, expression := range nodeSelectorTerm.MatchExpressions { 95 if msg, deprecated := GetNodeLabelDeprecatedMessage(expression.Key); deprecated { 96 warnings = append( 97 warnings, 98 fmt.Sprintf( 99 "%s: %s is %s", 100 fieldPath.Child("matchExpressions").Index(i).Child("key"), 101 expression.Key, 102 msg, 103 ), 104 ) 105 } 106 } 107 return warnings 108 }