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 }