github.com/gocrane/crane@v0.11.0/pkg/utils/recommend.go (about)

     1  package utils
     2  
     3  import (
     4  	"fmt"
     5  	"strconv"
     6  	"time"
     7  
     8  	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
     9  	"k8s.io/apimachinery/pkg/runtime/schema"
    10  	"k8s.io/client-go/discovery"
    11  
    12  	analysisv1alpha1 "github.com/gocrane/api/analysis/v1alpha1"
    13  
    14  	"github.com/gocrane/crane/pkg/known"
    15  )
    16  
    17  func GetGroupVersionResource(discoveryClient discovery.DiscoveryInterface, apiVersion string, kind string) (*schema.GroupVersionResource, error) {
    18  	resList, err := discoveryClient.ServerResourcesForGroupVersion(apiVersion)
    19  	if err != nil {
    20  		return nil, err
    21  	}
    22  
    23  	var resName string
    24  	for _, res := range resList.APIResources {
    25  		if kind == res.Kind {
    26  			resName = res.Name
    27  			break
    28  		}
    29  	}
    30  	if resName == "" {
    31  		return nil, fmt.Errorf("invalid kind %s", kind)
    32  	}
    33  
    34  	gv, err := schema.ParseGroupVersion(apiVersion)
    35  	if err != nil {
    36  		return nil, err
    37  	}
    38  	gvr := gv.WithResource(resName)
    39  	return &gvr, nil
    40  }
    41  
    42  func IsRecommendationControlledByRule(recommend *analysisv1alpha1.Recommendation) bool {
    43  	for _, ownerReference := range recommend.OwnerReferences {
    44  		if ownerReference.Kind == "RecommendationRule" {
    45  			return true
    46  		}
    47  	}
    48  	return false
    49  }
    50  
    51  func SetRunNumber(recommendation *analysisv1alpha1.Recommendation, runNumber int32) {
    52  	if recommendation.Annotations == nil {
    53  		recommendation.Annotations = map[string]string{}
    54  	}
    55  	recommendation.Annotations[known.RunNumberAnnotation] = strconv.Itoa(int(runNumber))
    56  }
    57  
    58  func GetRunNumber(recommendation *analysisv1alpha1.Recommendation) (int32, error) {
    59  	val, ok := recommendation.Annotations[known.RunNumberAnnotation]
    60  	if ok && len(val) != 0 {
    61  		runNumberInt, err := strconv.ParseInt(val, 10, 32)
    62  		return int32(runNumberInt), err
    63  	}
    64  
    65  	return 0, fmt.Errorf("get runNumber failed")
    66  }
    67  
    68  func GetRecommendationRuleOwnerReference(recommend *analysisv1alpha1.Recommendation) *metav1.OwnerReference {
    69  	for _, ownerReference := range recommend.OwnerReferences {
    70  		if ownerReference.Kind == "RecommendationRule" || ownerReference.Kind == "Analytics" {
    71  			return &ownerReference
    72  		}
    73  	}
    74  	return nil
    75  }
    76  
    77  func GetLastStartTime(recommendation *analysisv1alpha1.Recommendation) (time.Time, error) {
    78  	if recommendation != nil && recommendation.Annotations != nil {
    79  		val, ok := recommendation.Annotations[known.LastStartTimeAnnotation]
    80  		if ok && len(val) != 0 {
    81  			return time.Parse("2006-01-02 15:04:05", val)
    82  		}
    83  	}
    84  
    85  	return time.Now(), fmt.Errorf("get lastStartTime failed")
    86  }
    87  
    88  func SetLastStartTime(recommendation *analysisv1alpha1.Recommendation) {
    89  	if recommendation != nil && recommendation.Annotations != nil {
    90  		if recommendation.Annotations == nil {
    91  			recommendation.Annotations = map[string]string{}
    92  		}
    93  
    94  		now := time.Now()
    95  		loc, _ := time.LoadLocation("UTC")
    96  		recommendation.Annotations[known.LastStartTimeAnnotation] = now.In(loc).Format("2006-01-02 15:04:05")
    97  	}
    98  }