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  }