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 }