github.com/kubewharf/katalyst-core@v0.5.3/pkg/util/kubelet/config/kubeletconfig.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 config
    18  
    19  import (
    20  	"fmt"
    21  
    22  	"k8s.io/apimachinery/pkg/api/resource"
    23  	"k8s.io/klog/v2"
    24  	kubeletconfigv1beta1 "k8s.io/kubelet/config/v1beta1"
    25  	"k8s.io/kubernetes/pkg/features"
    26  
    27  	"github.com/kubewharf/katalyst-api/pkg/consts"
    28  )
    29  
    30  // CheckFeatureGateEnable returns true if all the given features are enabled
    31  func CheckFeatureGateEnable(kubeletConfig *kubeletconfigv1beta1.KubeletConfiguration, features ...string) (bool, error) {
    32  	if kubeletConfig == nil {
    33  		return false, fmt.Errorf("nil KubeletConfiguration")
    34  	}
    35  	for _, feature := range features {
    36  		if enabled, ok := kubeletConfig.FeatureGates[feature]; !ok || !enabled {
    37  			return false, nil
    38  		}
    39  	}
    40  	return true, nil
    41  }
    42  
    43  // GetReservedQuantity the quantity for reserved resources defined in KubeletConfiguration
    44  func GetReservedQuantity(kubeletConfig *kubeletconfigv1beta1.KubeletConfiguration, resourceName string) (resource.Quantity, bool, error) {
    45  	if kubeletConfig == nil {
    46  		return resource.MustParse("0"), false, fmt.Errorf("nil KubeletConfiguration")
    47  	}
    48  
    49  	found := false
    50  	reservedQuantity := resource.NewQuantity(0, resource.DecimalSI)
    51  
    52  	if kubeReservedStr, ok := kubeletConfig.KubeReserved[resourceName]; ok {
    53  		kubeReserved, err := resource.ParseQuantity(kubeReservedStr)
    54  		if err != nil {
    55  			return resource.MustParse("0"), false,
    56  				fmt.Errorf("failed because parse cpu quantity for kube-reserved failed with error: %v", err)
    57  		}
    58  		reservedQuantity.Add(kubeReserved)
    59  		found = true
    60  	}
    61  	if systemReservedStr, ok := kubeletConfig.SystemReserved[resourceName]; ok {
    62  		systemReserved, err := resource.ParseQuantity(systemReservedStr)
    63  		if err != nil {
    64  			return resource.MustParse("0"), false,
    65  				fmt.Errorf("parse cpu quantity for system-reserved failed with error: %v", err)
    66  		}
    67  		reservedQuantity.Add(systemReserved)
    68  		found = true
    69  	}
    70  
    71  	return *reservedQuantity, found, nil
    72  }
    73  
    74  // GetInTreeProviderPolicies returns a map containing the policy for in-tree
    75  // topology-hint-provider, i.e. cpu-manager && memory-manager
    76  func GetInTreeProviderPolicies(kubeletConfig *kubeletconfigv1beta1.KubeletConfiguration) (map[string]string, error) {
    77  	if kubeletConfig == nil {
    78  		return map[string]string{}, fmt.Errorf("nil KubeletConfiguration")
    79  	}
    80  
    81  	klog.V(5).Infof("GetProviderPolicies featureGates: %v, cpuManagerPolicy: %v, memoryManagerPolicy: %v",
    82  		kubeletConfig.FeatureGates, features.CPUManager, features.MemoryManager)
    83  
    84  	res := map[string]string{
    85  		consts.KCNRAnnotationCPUManager:    string(consts.CPUManagerOff),
    86  		consts.KCNRAnnotationMemoryManager: string(consts.MemoryManagerOff),
    87  	}
    88  
    89  	on, ok := kubeletConfig.FeatureGates[string(features.CPUManager)]
    90  	if (ok && on) || (!ok) {
    91  		if kubeletConfig.CPUManagerPolicy != "" {
    92  			res[consts.KCNRAnnotationCPUManager] = kubeletConfig.CPUManagerPolicy
    93  		}
    94  	}
    95  
    96  	on, ok = kubeletConfig.FeatureGates[string(features.MemoryManager)]
    97  	if (ok && on) || (!ok) {
    98  		if kubeletConfig.MemoryManagerPolicy != "" {
    99  			res[consts.KCNRAnnotationMemoryManager] = kubeletConfig.MemoryManagerPolicy
   100  		}
   101  	}
   102  
   103  	return res, nil
   104  }