diff --git a/pkg/cli/client/client.go b/pkg/cli/client/client.go index 1af7f4bad..6eb8163f5 100644 --- a/pkg/cli/client/client.go +++ b/pkg/cli/client/client.go @@ -11,6 +11,7 @@ import ( "github.com/tektoncd/results/pkg/cli/config" pb "github.com/tektoncd/results/proto/v1alpha2/results_go_proto" + pb3 "github.com/tektoncd/results/proto/v1alpha3/results_go_proto" "golang.org/x/oauth2" "google.golang.org/grpc" "google.golang.org/grpc/credentials" @@ -200,6 +201,63 @@ func (f *Factory) certs() (*x509.CertPool, error) { return certs, nil } +// PluginLogsClient creates a new Results gRPC client for the given factory settings. +func (f *Factory) PluginLogsClient(ctx context.Context, overrideAPIAddr string) (pb3.LogsClient, error) { + token, err := f.token(ctx) + if err != nil { + return nil, err + } + + var creds credentials.TransportCredentials + if f.cfg.Insecure { + creds = credentials.NewTLS(&tls.Config{ + //nolint:gosec // needed for --insecure flag + InsecureSkipVerify: true, + }) + } else { + certs, err := f.certs() + if err != nil { + return nil, err + } + creds = credentials.NewClientTLSFromCert(certs, f.cfg.SSL.ServerNameOverride) + } + + ctx, cancel := context.WithTimeout(ctx, 10*time.Second) + defer cancel() + addr := f.cfg.Address + if overrideAPIAddr != "" { + addr = overrideAPIAddr + } + conn, err := grpc.DialContext(ctx, addr, grpc.WithBlock(), //nolint:staticcheck + grpc.WithTransportCredentials(creds), + grpc.WithDefaultCallOptions(grpc.PerRPCCredentials(oauth.TokenSource{ + TokenSource: oauth2.StaticTokenSource(&oauth2.Token{AccessToken: token}), + })), + ) + if err != nil { + fmt.Printf("Dial: %v\n", err) + return nil, err + } + return pb3.NewLogsClient(conn), nil +} + +// DefaultPluginLogsClient creates a new default logs client. +func DefaultPluginLogsClient(ctx context.Context, overrideAPIAddr string) (pb3.LogsClient, error) { + f, err := NewDefaultFactory() + + if err != nil { + return nil, err + } + + client, err := f.PluginLogsClient(ctx, overrideAPIAddr) + + if err != nil { + return nil, err + } + + return client, nil +} + func (f *Factory) token(ctx context.Context) (string, error) { if f.cfg == nil { return "", nil diff --git a/pkg/cli/cmd/logs/get.go b/pkg/cli/cmd/logs/get.go index 1fdde4e8c..893ad7eb2 100644 --- a/pkg/cli/cmd/logs/get.go +++ b/pkg/cli/cmd/logs/get.go @@ -18,10 +18,15 @@ import ( "fmt" "os" + httpbody "google.golang.org/genproto/googleapis/api/httpbody" + grpc "google.golang.org/grpc" + "github.com/spf13/cobra" + "github.com/tektoncd/results/pkg/cli/config" "github.com/tektoncd/results/pkg/cli/flags" "github.com/tektoncd/results/pkg/cli/format" pb "github.com/tektoncd/results/proto/v1alpha2/results_go_proto" + pb3 "github.com/tektoncd/results/proto/v1alpha3/results_go_proto" ) // GetLogCommand returns a cobra sub command that will fetch a log by name @@ -34,9 +39,18 @@ func GetLogCommand(params *flags.Params) *cobra.Command { Short: "Get Log by ", Long: "Get Log by . is typically of format /results//logs/", RunE: func(cmd *cobra.Command, args []string) error { - resp, err := params.LogsClient.GetLog(cmd.Context(), &pb.GetLogRequest{ - Name: args[0], - }) + var resp grpc.ServerStreamingClient[httpbody.HttpBody] + var err error + + if config.GetConfig().UseV1Alpha2 { + resp, err = params.LogsClient.GetLog(cmd.Context(), &pb.GetLogRequest{ + Name: args[0], + }) + } else { + resp, err = params.PluginLogsClient.GetLog(cmd.Context(), &pb3.GetLogRequest{ + Name: args[0], + }) + } if err != nil { fmt.Printf("GetLog: %v\n", err) return err diff --git a/pkg/cli/cmd/root.go b/pkg/cli/cmd/root.go index 8ad8f5dca..0c57bd0ec 100644 --- a/pkg/cli/cmd/root.go +++ b/pkg/cli/cmd/root.go @@ -69,6 +69,14 @@ func Root() *cobra.Command { params.LogsClient = logClient + pluginLogsClient, err := client.DefaultPluginLogsClient(cmd.Context(), overrideAPIAdr) + + if err != nil { + return err + } + + params.PluginLogsClient = pluginLogsClient + return nil }, PersistentPostRun: func(_ *cobra.Command, _ []string) { @@ -87,6 +95,7 @@ func Root() *cobra.Command { cmd.PersistentFlags().String("sa-ns", "", "ServiceAccount Namespace, if not given, it will be taken from current context") cmd.PersistentFlags().Bool("portforward", true, "enable auto portforwarding to tekton-results-api-service, when addr is set and portforward is true, tkn-results will portforward tekton-results-api-service automatically") cmd.PersistentFlags().Bool("insecure", false, "determines whether to run insecure GRPC tls request") + cmd.PersistentFlags().Bool("v1alpha2", false, "use v1alpha2 API for get log command") cmd.AddCommand(ListCommand(params), records.Command(params), logs.Command(params)) diff --git a/pkg/cli/config/config.go b/pkg/cli/config/config.go index 01c7521cd..09fedd7ed 100644 --- a/pkg/cli/config/config.go +++ b/pkg/cli/config/config.go @@ -42,6 +42,9 @@ type Config struct { Portforward bool // Insecure determines whether to use insecure GRPC tls communication Insecure bool + + // v1alpha2 + UseV1Alpha2 bool } // SSLConfig contains SSL configuration information. @@ -116,6 +119,7 @@ func setConfig() error { cfg.Portforward = viper.GetBool("portforward") cfg.Insecure = viper.GetBool("insecure") + cfg.UseV1Alpha2 = viper.GetBool("v1alpha2") return nil } diff --git a/pkg/cli/flags/flags.go b/pkg/cli/flags/flags.go index c43f8dbee..fa9faebd1 100644 --- a/pkg/cli/flags/flags.go +++ b/pkg/cli/flags/flags.go @@ -3,12 +3,14 @@ package flags import ( "github.com/spf13/cobra" pb "github.com/tektoncd/results/proto/v1alpha2/results_go_proto" + pb3 "github.com/tektoncd/results/proto/v1alpha3/results_go_proto" ) // Params contains a ResultsClient and LogsClient type Params struct { - ResultsClient pb.ResultsClient - LogsClient pb.LogsClient + ResultsClient pb.ResultsClient + LogsClient pb.LogsClient + PluginLogsClient pb3.LogsClient } // ListOptions is used on commands that list Results, Records or Logs