From 654e76fa2ec341b9eaf9f7ba42f12e3305c7b993 Mon Sep 17 00:00:00 2001 From: Dmitry Pasiukevich Date: Tue, 26 Dec 2023 15:36:00 +0100 Subject: [PATCH] Print generated TLSRoutes, TCPRoutes and ReferenceGrants. (#110) --- cmd/print.go | 99 ++++++++++++++++++++++++++++++------- pkg/i2gw/ingress2gateway.go | 37 ++++++-------- 2 files changed, 97 insertions(+), 39 deletions(-) diff --git a/cmd/print.go b/cmd/print.go index 35451f11..4285b307 100644 --- a/cmd/print.go +++ b/cmd/print.go @@ -26,7 +26,6 @@ import ( "k8s.io/cli-runtime/pkg/genericclioptions" "k8s.io/cli-runtime/pkg/printers" "k8s.io/client-go/tools/clientcmd" - gatewayv1 "sigs.k8s.io/gateway-api/apis/v1" // Call init function for the providers _ "github.com/kubernetes-sigs/ingress2gateway/pkg/i2gw/providers/ingressnginx" @@ -73,39 +72,103 @@ func (pr *PrintRunner) PrintGatewaysAndHTTPRoutes(cmd *cobra.Command, _ []string return fmt.Errorf("failed to initialize namespace filter: %w", err) } - httpRoutes, gateways, err := i2gw.ToGatewayAPIResources(cmd.Context(), pr.namespaceFilter, pr.inputFile, pr.providers) + gatewayResources, err := i2gw.ToGatewayAPIResources(cmd.Context(), pr.namespaceFilter, pr.inputFile, pr.providers) if err != nil { return err } - pr.outputResult(httpRoutes, gateways) + pr.outputResult(gatewayResources) return nil } -func (pr *PrintRunner) outputResult(httpRoutes []gatewayv1.HTTPRoute, gateways []gatewayv1.Gateway) { - if len(httpRoutes)+len(gateways) == 0 { - msg := "No resources found" - if pr.namespaceFilter != "" { - msg = fmt.Sprintf("%s in %s namespace", msg, pr.namespaceFilter) +func (pr *PrintRunner) outputResult(gatewayResources []i2gw.GatewayResources) { + resourceCount := 0 + + for _, r := range gatewayResources { + resourceCount += len(r.GatewayClasses) + for _, gatewayClass := range r.GatewayClasses { + gatewayClass := gatewayClass + err := pr.resourcePrinter.PrintObj(&gatewayClass, os.Stdout) + if err != nil { + fmt.Printf("# Error printing %s GatewayClass: %v\n", gatewayClass.Name, err) + } + } + } + + for _, r := range gatewayResources { + resourceCount += len(r.Gateways) + for _, gateway := range r.Gateways { + gateway := gateway + err := pr.resourcePrinter.PrintObj(&gateway, os.Stdout) + if err != nil { + fmt.Printf("# Error printing %s Gateway: %v\n", gateway.Name, err) + } + } + } + + for _, r := range gatewayResources { + resourceCount += len(r.HTTPRoutes) + for _, httpRoute := range r.HTTPRoutes { + httpRoute := httpRoute + err := pr.resourcePrinter.PrintObj(&httpRoute, os.Stdout) + if err != nil { + fmt.Printf("# Error printing %s HTTPRoute: %v\n", httpRoute.Name, err) + } } - fmt.Println(msg) - return } - for i := range gateways { - err := pr.resourcePrinter.PrintObj(&gateways[i], os.Stdout) - if err != nil { - fmt.Printf("# Error printing %s Gateway: %v\n", gateways[i].Name, err) + for _, r := range gatewayResources { + resourceCount += len(r.TLSRoutes) + for _, tlsRoute := range r.TLSRoutes { + tlsRoute := tlsRoute + err := pr.resourcePrinter.PrintObj(&tlsRoute, os.Stdout) + if err != nil { + fmt.Printf("# Error printing %s TLSRoute: %v\n", tlsRoute.Name, err) + } } } - for i := range httpRoutes { - err := pr.resourcePrinter.PrintObj(&httpRoutes[i], os.Stdout) - if err != nil { - fmt.Printf("# Error printing %s HTTPRoute: %v\n", httpRoutes[i].Name, err) + for _, r := range gatewayResources { + resourceCount += len(r.TCPRoutes) + for _, tcpRoute := range r.TCPRoutes { + tcpRoute := tcpRoute + err := pr.resourcePrinter.PrintObj(&tcpRoute, os.Stdout) + if err != nil { + fmt.Printf("# Error printing %s TCPRoute: %v\n", tcpRoute.Name, err) + } } } + + for _, r := range gatewayResources { + resourceCount += len(r.UDPRoutes) + for _, udpRoute := range r.UDPRoutes { + udpRoute := udpRoute + err := pr.resourcePrinter.PrintObj(&udpRoute, os.Stdout) + if err != nil { + fmt.Printf("# Error printing %s UDPRoute: %v\n", udpRoute.Name, err) + } + } + } + + for _, r := range gatewayResources { + resourceCount += len(r.ReferenceGrants) + for _, referenceGrant := range r.ReferenceGrants { + referenceGrant := referenceGrant + err := pr.resourcePrinter.PrintObj(&referenceGrant, os.Stdout) + if err != nil { + fmt.Printf("# Error printing %s ReferenceGrant: %v\n", referenceGrant.Name, err) + } + } + } + + if resourceCount == 0 { + msg := "No resources found" + if pr.namespaceFilter != "" { + msg = fmt.Sprintf("%s in %s namespace", msg, pr.namespaceFilter) + } + fmt.Println(msg) + } } // initializeResourcePrinter assign a specific type of printers.ResourcePrinter diff --git a/pkg/i2gw/ingress2gateway.go b/pkg/i2gw/ingress2gateway.go index 41c9bb7c..13fa3daa 100644 --- a/pkg/i2gw/ingress2gateway.go +++ b/pkg/i2gw/ingress2gateway.go @@ -31,68 +31,63 @@ import ( kubeyaml "k8s.io/apimachinery/pkg/util/yaml" "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/client/config" - gatewayv1 "sigs.k8s.io/gateway-api/apis/v1" ) -func ToGatewayAPIResources(ctx context.Context, namespace string, inputFile string, providers []string) ([]gatewayv1.HTTPRoute, []gatewayv1.Gateway, error) { +func ToGatewayAPIResources(ctx context.Context, namespace string, inputFile string, providers []string) ([]GatewayResources, error) { conf, err := config.GetConfig() if err != nil { - return nil, nil, fmt.Errorf("failed to get client config: %w", err) + return nil, fmt.Errorf("failed to get client config: %w", err) } cl, err := client.New(conf, client.Options{}) if err != nil { - return nil, nil, fmt.Errorf("failed to create client: %w", err) + return nil, fmt.Errorf("failed to create client: %w", err) } cl = client.NewNamespacedClient(cl, namespace) var ingresses networkingv1.IngressList - var gateways []gatewayv1.Gateway - var httpRoutes []gatewayv1.HTTPRoute providerByName, err := constructProviders(&ProviderConf{ Client: cl, }, providers) if err != nil { - return nil, nil, err + return nil, err } resources := InputResources{} if inputFile != "" { if err = ConstructIngressesFromFile(&ingresses, inputFile, namespace); err != nil { - return nil, nil, fmt.Errorf("failed to read ingresses from file: %w", err) + return nil, fmt.Errorf("failed to read ingresses from file: %w", err) } resources.Ingresses = ingresses.Items if err = readProviderResourcesFromFile(ctx, providerByName, inputFile); err != nil { - return nil, nil, err + return nil, err } } else { if err = ConstructIngressesFromCluster(ctx, cl, &ingresses); err != nil { - return nil, nil, fmt.Errorf("failed to read ingresses from cluster: %w", err) + return nil, fmt.Errorf("failed to read ingresses from cluster: %w", err) } resources.Ingresses = ingresses.Items if err = readProviderResourcesFromCluster(ctx, providerByName); err != nil { - return nil, nil, err + return nil, err } } - var errs field.ErrorList + var ( + gatewayResources []GatewayResources + errs field.ErrorList + ) for _, provider := range providerByName { - gatewayResources, conversionErrs := provider.ToGatewayAPI(resources) + providerGatewayResources, conversionErrs := provider.ToGatewayAPI(resources) errs = append(errs, conversionErrs...) - for _, gateway := range gatewayResources.Gateways { - gateways = append(gateways, gateway) - } - for _, route := range gatewayResources.HTTPRoutes { - httpRoutes = append(httpRoutes, route) - } + gatewayResources = append(gatewayResources, providerGatewayResources) } if len(errs) > 0 { - return nil, nil, aggregatedErrs(errs) + return nil, aggregatedErrs(errs) } - return httpRoutes, gateways, nil + return gatewayResources, nil } func readProviderResourcesFromFile(ctx context.Context, providerByName map[ProviderName]Provider, inputFile string) error {