github.com/gocrane/crane@v0.11.0/pkg/recommendation/recommender/replicas/filter.go (about)

     1  package replicas
     2  
     3  import (
     4  	"fmt"
     5  
     6  	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
     7  
     8  	"github.com/gocrane/crane/pkg/recommendation/framework"
     9  	"github.com/gocrane/crane/pkg/utils"
    10  )
    11  
    12  // Filter out k8s resources that are not supported by the recommender.
    13  func (rr *ReplicasRecommender) Filter(ctx *framework.RecommendationContext) error {
    14  	var err error
    15  
    16  	// filter resource that not match objectIdentity
    17  	if err = rr.BaseRecommender.Filter(ctx); err != nil {
    18  		return err
    19  	}
    20  
    21  	if err = framework.RetrievePodTemplate(ctx); err != nil {
    22  		return err
    23  	}
    24  
    25  	if err = framework.RetrieveScale(ctx); err != nil {
    26  		return err
    27  	}
    28  
    29  	if err = framework.RetrievePods(ctx); err != nil {
    30  		return err
    31  	}
    32  
    33  	if ctx.Scale != nil && ctx.Scale.Spec.Replicas < int32(rr.WorkloadMinReplicas) {
    34  		return fmt.Errorf("workload replicas %d should be larger than %d ", ctx.Scale.Spec.Replicas, int32(rr.WorkloadMinReplicas))
    35  	}
    36  
    37  	if len(ctx.Pods) == 0 {
    38  		return fmt.Errorf("existing pods should be larger than 0 ")
    39  	}
    40  
    41  	readyPods := 0
    42  	for _, pod := range ctx.Pods {
    43  		if utils.IsPodAvailable(&pod, int32(rr.PodMinReadySeconds), metav1.Now()) {
    44  			readyPods++
    45  		}
    46  	}
    47  
    48  	if readyPods == 0 {
    49  		return fmt.Errorf("pod available number must larger than zero. ")
    50  	}
    51  
    52  	availableRatio := float64(readyPods) / float64(len(ctx.Pods))
    53  	if availableRatio < rr.PodAvailableRatio {
    54  		return fmt.Errorf("pod available ratio is %.3f less than %.3f ", availableRatio, rr.PodAvailableRatio)
    55  	}
    56  
    57  	return nil
    58  }