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 }