66 "strings"
77
88 corev1 "k8s.io/api/core/v1"
9+ "golang.org/x/sync/errgroup"
910 "sigs.k8s.io/controller-runtime/pkg/client"
1011 gatewayv1 "sigs.k8s.io/gateway-api/apis/v1"
1112)
@@ -20,15 +21,26 @@ import (
2021// - HTTPRoutes and GRPCRoutes (namespace/name, rules, backendRefs).
2122// - Available Services (namespace/name, ports).
2223func BuildRAGContext (ctx context.Context , cl client.Client , controllerName string ) (string , error ) {
23- var b strings.Builder
24-
25- // 1. GatewayClasses controlled by this controller.
26- gcList := & gatewayv1.GatewayClassList {}
27- if err := cl .List (ctx , gcList ); err != nil {
28- return "" , fmt .Errorf ("rag: list GatewayClasses: %w" , err )
24+ var (
25+ gcList gatewayv1.GatewayClassList
26+ gwList gatewayv1.GatewayList
27+ httpList gatewayv1.HTTPRouteList
28+ grpcList gatewayv1.GRPCRouteList
29+ svcList corev1.ServiceList
30+ )
31+
32+ g , ctx := errgroup .WithContext (ctx )
33+ g .Go (func () error { return cl .List (ctx , & gcList ) })
34+ g .Go (func () error { return cl .List (ctx , & gwList ) })
35+ g .Go (func () error { return cl .List (ctx , & httpList ) })
36+ g .Go (func () error { return cl .List (ctx , & grpcList ) })
37+ g .Go (func () error { return cl .List (ctx , & svcList ) })
38+
39+ if err := g .Wait (); err != nil {
40+ return "" , fmt .Errorf ("rag: list resources: %w" , err )
2941 }
3042
31- managedClasses := make (map [string ]bool )
43+ managedClasses := make (map [string ]bool , len ( gcList . Items ) )
3244 for _ , gc := range gcList .Items {
3345 if string (gc .Spec .ControllerName ) == controllerName {
3446 managedClasses [gc .Name ] = true
@@ -39,39 +51,17 @@ func BuildRAGContext(ctx context.Context, cl client.Client, controllerName strin
3951 return "No managed GatewayClasses found for controller " + controllerName , nil
4052 }
4153
42- // 2. Gateways.
43- gwList := & gatewayv1.GatewayList {}
44- if err := cl .List (ctx , gwList ); err != nil {
45- return "" , fmt .Errorf ("rag: list Gateways: %w" , err )
46- }
47-
4854 var managedGateways []gatewayv1.Gateway
4955 for _ , gw := range gwList .Items {
5056 if managedClasses [string (gw .Spec .GatewayClassName )] {
5157 managedGateways = append (managedGateways , gw )
5258 }
5359 }
5460
55- // 3. HTTPRoutes.
56- httpList := & gatewayv1.HTTPRouteList {}
57- if err := cl .List (ctx , httpList ); err != nil {
58- return "" , fmt .Errorf ("rag: list HTTPRoutes: %w" , err )
59- }
60-
61- // 4. GRPCRoutes.
62- grpcList := & gatewayv1.GRPCRouteList {}
63- if err := cl .List (ctx , grpcList ); err != nil {
64- return "" , fmt .Errorf ("rag: list GRPCRoutes: %w" , err )
65- }
66-
67- // 5. Services.
68- svcList := & corev1.ServiceList {}
69- if err := cl .List (ctx , svcList ); err != nil {
70- return "" , fmt .Errorf ("rag: list Services: %w" , err )
71- }
72-
7361 // ── Format output ────────────────────────────────────────────
7462
63+ var b strings.Builder
64+
7565 b .WriteString ("## Current Gateway API Topology\n \n " )
7666
7767 // Gateways
@@ -182,36 +172,37 @@ func BuildRAGContext(ctx context.Context, cl client.Client, controllerName strin
182172 // Services
183173 b .WriteString ("### Services\n \n " )
184174 if len (svcList .Items ) == 0 {
185- b .WriteString ("(none)\n " )
175+ b .WriteString ("(none)\n \n " )
186176 } else {
187177 for _ , svc := range svcList .Items {
188- fmt .Fprintf (& b , "- **%s/%s**" , svc .Namespace , svc .Name )
178+ fmt .Fprintf (& b , "- **%s/%s** (type=%s) " , svc .Namespace , svc .Name , svc . Spec . Type )
189179 if len (svc .Spec .Ports ) > 0 {
190- ports := make ([]string , 0 , len (svc .Spec .Ports ))
191- for _ , p := range svc .Spec .Ports {
192- ports = append (ports , fmt .Sprintf ("%s:%d/%s" , p .Name , p .Port , p .Protocol ))
180+ b .WriteString (" [" )
181+ for j , port := range svc .Spec .Ports {
182+ if j > 0 {
183+ b .WriteString (", " )
184+ }
185+ fmt .Fprintf (& b , "%d/%s" , port .Port , port .Protocol )
193186 }
194- fmt . Fprintf ( & b , " ports=[%s]" , strings . Join ( ports , ", " ) )
187+ b . WriteString ( "]" )
195188 }
196189 b .WriteString ("\n " )
197190 }
191+ b .WriteString ("\n " )
198192 }
199193
200194 return b .String (), nil
201195}
202196
203197func fmtRouteParents (b * strings.Builder , refs []gatewayv1.ParentReference , defaultNS string ) {
204- if len (refs ) == 0 {
205- return
206- }
207- parts := make ([]string , 0 , len (refs ))
208- for _ , pr := range refs {
198+ for j , ref := range refs {
199+ if j > 0 {
200+ b .WriteString (", " )
201+ }
209202 ns := defaultNS
210- if pr .Namespace != nil {
211- ns = string (* pr .Namespace )
203+ if ref .Namespace != nil {
204+ ns = string (* ref .Namespace )
212205 }
213- parts = append ( parts , fmt .Sprintf ( " %s/%s" , ns , pr .Name ) )
206+ fmt .Fprintf ( b , " → %s/%s" , ns , ref .Name )
214207 }
215- fmt .Fprintf (b , " → gateways: [%s]" , strings .Join (parts , ", " ))
216208}
217-
0 commit comments