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

     1  package hpa
     2  
     3  import (
     4  	"context"
     5  
     6  	autoscalingv2 "k8s.io/api/autoscaling/v2beta2"
     7  	"sigs.k8s.io/controller-runtime/pkg/client"
     8  
     9  	autoscalingapi "github.com/gocrane/api/autoscaling/v1alpha1"
    10  
    11  	"github.com/gocrane/crane/pkg/known"
    12  	"github.com/gocrane/crane/pkg/recommendation/framework"
    13  )
    14  
    15  // Filter out k8s resources that are not supported by the recommender.
    16  func (rr *HPARecommender) Filter(ctx *framework.RecommendationContext) error {
    17  	if err := rr.ReplicasRecommender.Filter(ctx); err != nil {
    18  		return err
    19  	}
    20  
    21  	hpaList := &autoscalingv2.HorizontalPodAutoscalerList{}
    22  	opts := []client.ListOption{
    23  		client.InNamespace(ctx.Recommendation.Spec.TargetRef.Namespace),
    24  	}
    25  	err := ctx.Client.List(context.TODO(), hpaList, opts...)
    26  	if err != nil {
    27  		return err
    28  	}
    29  
    30  	for _, hpa := range hpaList.Items {
    31  		// bypass hpa that controller by ehpa
    32  		if hpa.Labels != nil && hpa.Labels["app.kubernetes.io/managed-by"] == known.EffectiveHorizontalPodAutoscalerManagedBy {
    33  			continue
    34  		}
    35  
    36  		if hpa.Spec.ScaleTargetRef.Name == ctx.Recommendation.Spec.TargetRef.Name &&
    37  			hpa.Spec.ScaleTargetRef.Kind == ctx.Recommendation.Spec.TargetRef.Kind &&
    38  			hpa.Spec.ScaleTargetRef.APIVersion == ctx.Recommendation.Spec.TargetRef.APIVersion {
    39  			ctx.HPA = &hpa
    40  			break
    41  		}
    42  	}
    43  
    44  	ehpaList := &autoscalingapi.EffectiveHorizontalPodAutoscalerList{}
    45  	opts = []client.ListOption{
    46  		client.InNamespace(ctx.Recommendation.Spec.TargetRef.Namespace),
    47  	}
    48  	err = ctx.Client.List(context.TODO(), ehpaList, opts...)
    49  	if err != nil {
    50  		return err
    51  	}
    52  
    53  	for _, ehpa := range ehpaList.Items {
    54  		if ehpa.Spec.ScaleTargetRef.Name == ctx.Recommendation.Spec.TargetRef.Name &&
    55  			ehpa.Spec.ScaleTargetRef.Kind == ctx.Recommendation.Spec.TargetRef.Kind &&
    56  			ehpa.Spec.ScaleTargetRef.APIVersion == ctx.Recommendation.Spec.TargetRef.APIVersion {
    57  			ctx.EHPA = &ehpa
    58  			break
    59  		}
    60  	}
    61  
    62  	return nil
    63  }