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  }