github.com/kubewharf/katalyst-core@v0.5.3/pkg/controller/tide/nodepool_wrapper.go (about) 1 /* 2 Copyright 2022 The Katalyst 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 tide 18 19 import ( 20 corev1 "k8s.io/api/core/v1" 21 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" 22 "k8s.io/apimachinery/pkg/labels" 23 "k8s.io/apimachinery/pkg/selection" 24 25 apis "github.com/kubewharf/katalyst-api/pkg/apis/tide/v1alpha1" 26 ) 27 28 var ( 29 labelPrefix = apis.SchemeGroupVersion.Group 30 31 AnnotationNodePoolUpdate = labelPrefix + "/" + "update" 32 33 LabelPodTypeKey = labelPrefix + "/" + "pod-type" 34 LabelOnlinePodValue = "online" 35 36 LabelNodePoolKey = labelPrefix + "/" + "node-pool" 37 38 LabelNodeTypeKey = labelPrefix + "/" + "node-type" 39 LabelOnlineNodeValue = "online" 40 LabelOfflineNodeValue = "offline" 41 LabelTideNode = labelPrefix + "/" + "tide" 42 LabelReserveNode = labelPrefix + "/" + "reserve" 43 44 TaintEvictOnlinePodKey = labelPrefix + "/" + "online-not-used" 45 TaintEvictOfflinePodKey = labelPrefix + "/" + "offline-not-used" 46 47 // NodePoolFinalizer is the finalizer name for LogRule operator 48 NodePoolFinalizer = labelPrefix + "/" + "finalizer" 49 ) 50 51 type NodePoolWrapper interface { 52 GetOnlineReserveNodeSelector() labels.Selector 53 GetOfflineReserveNodeSelector() labels.Selector 54 GetOnlineTideNodeSelector() labels.Selector 55 GetOfflineTideNodeSelector() labels.Selector 56 GetTideNodeSelector() labels.Selector 57 GetNodePoolSelector() *labels.Requirement 58 59 SetNodeToOnlineReserve(node *corev1.Node) 60 SetNodeToOfflineReserve(node *corev1.Node) 61 SetNodeToTide(node *corev1.Node) 62 SetNodeToTideOnline(node *corev1.Node) 63 64 GetEvictOnlinePodTaint() apis.TaintOption 65 GetEvictOfflinePodTaint() apis.TaintOption 66 GetOnlineLabel() apis.LabelOption 67 GetOfflineLabel() apis.LabelOption 68 GetTideLabel() apis.LabelOption 69 GetNodeSelector() map[string]string 70 71 metav1.Object 72 } 73 74 type nodePoolWrapperImpl struct { 75 *apis.TideNodePool 76 } 77 78 func (n nodePoolWrapperImpl) GetNodeSelector() map[string]string { 79 return n.Spec.NodeConfigs.NodeSelector 80 } 81 82 func (n nodePoolWrapperImpl) GetOnlineReserveNodeSelector() labels.Selector { 83 return labels.SelectorFromSet(map[string]string{ 84 n.GetOnlineLabel().Key: n.GetOnlineLabel().Value, 85 LabelNodePoolKey: n.GetName(), 86 LabelReserveNode: "true", 87 }) 88 } 89 90 func (n nodePoolWrapperImpl) GetOfflineReserveNodeSelector() labels.Selector { 91 return labels.SelectorFromSet(map[string]string{ 92 n.GetOfflineLabel().Key: n.GetOfflineLabel().Value, 93 LabelNodePoolKey: n.GetName(), 94 LabelReserveNode: "true", 95 }) 96 } 97 98 func (n nodePoolWrapperImpl) GetOnlineTideNodeSelector() labels.Selector { 99 return labels.SelectorFromSet(map[string]string{ 100 LabelNodePoolKey: n.GetName(), 101 n.GetOnlineLabel().Key: n.GetOnlineLabel().Value, 102 n.GetTideLabel().Key: n.GetTideLabel().Value, 103 }) 104 } 105 106 func (n nodePoolWrapperImpl) GetOfflineTideNodeSelector() labels.Selector { 107 return labels.SelectorFromSet(map[string]string{ 108 LabelNodePoolKey: n.GetName(), 109 n.GetOfflineLabel().Key: n.GetOfflineLabel().Value, 110 n.GetTideLabel().Key: n.GetTideLabel().Value, 111 }) 112 } 113 114 func (n nodePoolWrapperImpl) GetTideNodeSelector() labels.Selector { 115 return labels.SelectorFromSet(map[string]string{ 116 LabelNodePoolKey: n.GetName(), 117 n.GetTideLabel().Key: n.GetTideLabel().Value, 118 }) 119 } 120 121 func (n nodePoolWrapperImpl) GetNodePoolSelector() *labels.Requirement { 122 nodePoolSelector, _ := labels.NewRequirement(LabelNodePoolKey, selection.Exists, nil) 123 return nodePoolSelector 124 } 125 126 func (n nodePoolWrapperImpl) SetNodeToOnlineReserve(node *corev1.Node) { 127 if node.Labels == nil { 128 node.Labels = make(map[string]string) 129 } 130 node.Labels[LabelNodePoolKey] = n.GetName() 131 node.Labels[n.GetOnlineLabel().Key] = n.GetOnlineLabel().Value 132 node.Labels[LabelReserveNode] = "true" 133 delete(node.Labels, n.GetTideLabel().Key) 134 } 135 136 func (n nodePoolWrapperImpl) SetNodeToOfflineReserve(node *corev1.Node) { 137 if node.Labels == nil { 138 node.Labels = make(map[string]string) 139 } 140 node.Labels[LabelNodePoolKey] = n.GetName() 141 node.Labels[n.GetOfflineLabel().Key] = n.GetOfflineLabel().Value 142 node.Labels[LabelReserveNode] = "true" 143 delete(node.Labels, n.GetTideLabel().Key) 144 } 145 146 func (n nodePoolWrapperImpl) SetNodeToTide(node *corev1.Node) { 147 if node.Labels == nil { 148 node.Labels = make(map[string]string) 149 } 150 node.Labels[LabelNodePoolKey] = n.GetName() 151 node.Labels[LabelReserveNode] = "false" 152 node.Labels[n.GetTideLabel().Key] = n.GetTideLabel().Value 153 } 154 155 func (n nodePoolWrapperImpl) SetNodeToTideOnline(node *corev1.Node) { 156 if node.Labels == nil { 157 node.Labels = make(map[string]string) 158 } 159 node.Labels[LabelReserveNode] = "false" 160 node.Labels[LabelNodePoolKey] = n.GetName() 161 node.Labels[n.GetOnlineLabel().Key] = n.GetOnlineLabel().Value 162 node.Labels[n.GetTideLabel().Key] = n.GetTideLabel().Value 163 } 164 165 func (n nodePoolWrapperImpl) GetEvictOnlinePodTaint() apis.TaintOption { 166 if n.Spec.EvictStrategy.Watermark.EvictOnlinePodTaint == nil { 167 return apis.TaintOption{ 168 Key: TaintEvictOnlinePodKey, 169 Value: "true", 170 Effect: string(corev1.TaintEffectNoExecute), 171 } 172 } 173 return *n.Spec.EvictStrategy.Watermark.EvictOnlinePodTaint 174 } 175 176 func (n nodePoolWrapperImpl) GetEvictOfflinePodTaint() apis.TaintOption { 177 if n.Spec.EvictStrategy.Watermark.EvictOfflinePodTaint == nil { 178 return apis.TaintOption{ 179 Key: TaintEvictOfflinePodKey, 180 Value: "true", 181 Effect: string(corev1.TaintEffectNoExecute), 182 } 183 } 184 return *n.Spec.EvictStrategy.Watermark.EvictOfflinePodTaint 185 } 186 187 func (n nodePoolWrapperImpl) GetOnlineLabel() apis.LabelOption { 188 if n.Spec.NodeConfigs.OnlineLabel == nil { 189 return apis.LabelOption{ 190 Key: LabelNodeTypeKey, 191 Value: LabelOnlineNodeValue, 192 } 193 } 194 return *n.Spec.NodeConfigs.OnlineLabel 195 } 196 197 func (n nodePoolWrapperImpl) GetOfflineLabel() apis.LabelOption { 198 if n.Spec.NodeConfigs.OfflineLabel == nil { 199 return apis.LabelOption{ 200 Key: LabelNodeTypeKey, 201 Value: LabelOfflineNodeValue, 202 } 203 } 204 return *n.Spec.NodeConfigs.OfflineLabel 205 } 206 207 func (n nodePoolWrapperImpl) GetTideLabel() apis.LabelOption { 208 if n.Spec.NodeConfigs.TideLabel == nil { 209 return apis.LabelOption{ 210 Key: LabelTideNode, 211 Value: "true", 212 } 213 } 214 return *n.Spec.NodeConfigs.TideLabel 215 } 216 217 func NewNodePoolWrapper(nodePool *apis.TideNodePool) NodePoolWrapper { 218 return &nodePoolWrapperImpl{TideNodePool: nodePool} 219 }