github.com/gocrane/crane@v0.11.0/pkg/recommendation/config/config.go (about) 1 package config 2 3 import ( 4 "fmt" 5 "io/ioutil" 6 7 "k8s.io/klog/v2" 8 "sigs.k8s.io/yaml" 9 10 analysisv1alph1 "github.com/gocrane/api/analysis/v1alpha1" 11 "github.com/gocrane/crane/pkg/recommendation/recommender/apis" 12 ) 13 14 func MergeRecommenderConfigFromRule(recommender apis.Recommender, recommendationRule analysisv1alph1.RecommendationRule) apis.Recommender { 15 if recommender.Config == nil { 16 recommender.Config = map[string]string{} 17 } 18 19 for _, ruleRecommender := range recommendationRule.Spec.Recommenders { 20 if recommender.Name == ruleRecommender.Name { 21 if ruleRecommender.Config == nil { 22 ruleRecommender.Config = map[string]string{} 23 } 24 // merge config in configmap and config in RecommendationRule. 25 // if conflicted, use the config value in RecommendationRule(has the highest priority). 26 for configKey, configValue := range ruleRecommender.Config { 27 recommender.Config[configKey] = configValue 28 } 29 } 30 } 31 32 return recommender 33 } 34 35 func LoadRecommenderConfigFromFile(filePath string) (*apis.RecommenderConfiguration, error) { 36 if filePath == "" { 37 return nil, fmt.Errorf("file path not specified") 38 } 39 configSetBytes, err := ioutil.ReadFile(filePath) 40 if err != nil { 41 return nil, fmt.Errorf("failed to read file path %q: %+v", filePath, err) 42 } 43 44 ret, err := loadConfigFromBytes(configSetBytes) 45 if err != nil { 46 return nil, fmt.Errorf("%v: from file %v", err.Error(), filePath) 47 } 48 49 return ret, nil 50 } 51 52 func loadConfigFromBytes(buf []byte) (*apis.RecommenderConfiguration, error) { 53 config := &apis.RecommenderConfiguration{} 54 err := yaml.Unmarshal(buf, config) 55 if err != nil { 56 return nil, fmt.Errorf("failed unmarshal the byte array: %v", err) 57 } 58 59 klog.V(4).Info("Load recommendation framework configuration set successfully.") 60 return config, nil 61 } 62 63 func GetRecommendersFromConfiguration(file string) (map[string]apis.Recommender, error) { 64 config, err := LoadRecommenderConfigFromFile(file) 65 if err != nil { 66 klog.Errorf("load recommender configuration failed, %v", err) 67 return nil, err 68 } 69 recommenders := make(map[string]apis.Recommender, len(config.Recommenders)) 70 for _, recommender := range config.Recommenders { 71 recommenders[recommender.Name] = recommender 72 } 73 return recommenders, nil 74 } 75 76 func GetKeysOfMap(m map[string]string) (keys []string) { 77 for k := range m { 78 keys = append(keys, k) 79 } 80 return 81 } 82 83 func SlicesContainSlice(src []string, target []string) bool { 84 contain := true 85 for _, value := range target { 86 if !contains(src, value) { 87 contain = false 88 } 89 } 90 return contain 91 } 92 93 func contains(s []string, str string) bool { 94 for _, v := range s { 95 if v == str { 96 return true 97 } 98 } 99 100 return false 101 }