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

     1  package service
     2  
     3  import (
     4  	"fmt"
     5  
     6  	corev1 "k8s.io/api/core/v1"
     7  	"sigs.k8s.io/controller-runtime/pkg/client"
     8  
     9  	"github.com/gocrane/crane/pkg/recommendation/framework"
    10  )
    11  
    12  // Filter out k8s resources that are not supported by the recommender.
    13  func (s *ServiceRecommender) Filter(ctx *framework.RecommendationContext) error {
    14  	var err error
    15  
    16  	// filter resource that not match objectIdentity
    17  	if err = s.BaseRecommender.Filter(ctx); err != nil {
    18  		return err
    19  	}
    20  	var svc corev1.Service
    21  	if err = framework.ObjectConversion(ctx.Object, &svc); err != nil {
    22  		return err
    23  	}
    24  
    25  	if svc.Spec.Type != corev1.ServiceTypeLoadBalancer {
    26  		return fmt.Errorf("service: %v type: %s is not a LoadBalancer", ctx.Object.GetName(), svc.Spec.Type)
    27  	}
    28  
    29  	// filter Endpoints not empty
    30  	var ep corev1.Endpoints
    31  	if err = ctx.Client.Get(ctx.Context, client.ObjectKeyFromObject(ctx.Object), &ep); client.IgnoreNotFound(err) != nil {
    32  		return err
    33  	}
    34  	for _, ss := range ep.Subsets {
    35  		if len(ss.Addresses) != 0 {
    36  			return fmt.Errorf("service: %v addresses: %v not empty", ctx.Object.GetName(), ss.Addresses)
    37  		}
    38  		if len(ss.NotReadyAddresses) != 0 {
    39  			return fmt.Errorf("service: %v NotReadyAddresses: %v not empty", ctx.Object.GetName(), ss.NotReadyAddresses)
    40  		}
    41  	}
    42  
    43  	if err = framework.RetrievePods(ctx); err != nil {
    44  		return err
    45  	}
    46  
    47  	return nil
    48  }