From e44529bbc98445bc5e52afd3c46e68e2ddf3f73f Mon Sep 17 00:00:00 2001 From: xinnjie Date: Mon, 16 Dec 2024 22:38:17 +0800 Subject: [PATCH] feat: pipelinerun list --- pkg/cli/cmd/pipelinerun/list.go | 66 ++++++++++++++++++++++++--------- pkg/cli/cmd/records/get.go | 2 +- 2 files changed, 49 insertions(+), 19 deletions(-) diff --git a/pkg/cli/cmd/pipelinerun/list.go b/pkg/cli/cmd/pipelinerun/list.go index 6a9d94755..842a814e9 100644 --- a/pkg/cli/cmd/pipelinerun/list.go +++ b/pkg/cli/cmd/pipelinerun/list.go @@ -1,6 +1,8 @@ package pipelinerun import ( + "context" + "encoding/json" "fmt" "io" "text/tabwriter" @@ -8,17 +10,19 @@ import ( "github.com/jonboulle/clockwork" "github.com/spf13/cobra" + "github.com/tektoncd/cli/pkg/formatted" + pipelinev1 "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1" + pipelinev1beta1 "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1" "github.com/tektoncd/results/pkg/cli/flags" - "github.com/tektoncd/results/pkg/cli/format" pb "github.com/tektoncd/results/proto/v1alpha2/results_go_proto" ) -const listTemplate = `{{- $size := len .Results -}}{{- if eq $size 0 -}} +const listTemplate = `{{- $size := len .PipelineRuns -}}{{- if eq $size 0 -}} No PipelineRuns found {{ else -}} NAMESPACE UID STARTED DURATION STATUS -{{- range $_, $result := .Results }} -{{ formatNamespace $result.Name }} {{ $result.Uid }} {{ formatAge $result.Summary.StartTime $.Time }} {{ formatDuration $result.Summary.StartTime $result.Summary.EndTime }} {{ formatStatus $result.Summary.Status }} +{{- range $_, $pr := .PipelineRuns }} +{{ $pr.ObjectMeta.Namespace }} {{ $pr.ObjectMeta.Name }} {{ formatAge $pr.Status.StartTime $.Time }} {{ formatDuration $pr.Status.StartTime $pr.Status.CompletionTime }} {{ formatCondition $pr.Status.Conditions }} {{- end -}} {{- end -}}` @@ -50,15 +54,15 @@ List all PipelineRuns in 'default' namespace: return fmt.Errorf("limit was %d, but must be greater than 0", opts.Limit) } - resp, err := params.ResultsClient.ListResults(cmd.Context(), &pb.ListResultsRequest{ - Parent: opts.Namespace, + resp, err := params.ResultsClient.ListRecords(cmd.Context(), &pb.ListRecordsRequest{ + Parent: fmt.Sprintf("%s/results/-", opts.Namespace), PageSize: int32(opts.Limit), - Filter: `summary.type==PIPELINE_RUN`, + Filter: `data_type==PIPELINE_RUN`, }) if err != nil { return fmt.Errorf("failed to list PipelineRuns from namespace %s: %v", opts.Namespace, err) } - return printFormatted(cmd.OutOrStdout(), resp.Results, params.Clock) + return printFormatted(cmd.OutOrStdout(), resp.Records, params.Clock) }, } cmd.Flags().StringVarP(&opts.Namespace, "namespace", "n", "default", "Namespace to list PipelineRuns in") @@ -66,23 +70,49 @@ List all PipelineRuns in 'default' namespace: return cmd } -func printFormatted(out io.Writer, results []*pb.Result, c clockwork.Clock) error { +func pipelineRunFromRecord(record *pb.Record) (*pipelinev1.PipelineRun, error) { + pr := &pipelinev1.PipelineRun{} + if record.Data.GetType() == "tekton.dev/v1beta1.PipelineRun" { + prV1beta1 := &pipelinev1beta1.PipelineRun{} + if err := json.Unmarshal(record.Data.Value, prV1beta1); err != nil { + return nil, fmt.Errorf("failed to unmarshal PipelineRun data: %v", err) + } + if err := pr.ConvertFrom(context.TODO(), prV1beta1); err != nil { + return nil, fmt.Errorf("failed to convert v1beta1 PipelineRun to v1: %v", err) + } + } else { + if err := json.Unmarshal(record.Data.Value, pr); err != nil { + return nil, fmt.Errorf("failed to unmarshal PipelineRun data: %v", err) + } + } + return pr, nil +} + +func printFormatted(out io.Writer, records []*pb.Record, c clockwork.Clock) error { var data = struct { - Results []*pb.Result - Time clockwork.Clock + PipelineRuns []*pipelinev1.PipelineRun + Time clockwork.Clock }{ - Results: results, - Time: c, + PipelineRuns: []*pipelinev1.PipelineRun{}, + Time: c, } + + for _, record := range records { + if pr, err := pipelineRunFromRecord(record); err != nil { + continue + } else { + data.PipelineRuns = append(data.PipelineRuns, pr) + } + } + funcMap := template.FuncMap{ - "formatAge": format.Age, - "formatDuration": format.Duration, - "formatStatus": format.Status, - "formatNamespace": format.Namespace, + "formatAge": formatted.Age, + "formatDuration": formatted.Duration, + "formatCondition": formatted.Condition, } w := tabwriter.NewWriter(out, 0, 5, 3, ' ', tabwriter.TabIndent) - t := template.Must(template.New("List PipelineRuns").Funcs(funcMap).Parse(listTemplate)) + t := template.Must(template.New("List TaskRuns").Funcs(funcMap).Parse(listTemplate)) err := t.Execute(w, data) if err != nil { diff --git a/pkg/cli/cmd/records/get.go b/pkg/cli/cmd/records/get.go index a6a5dc7e2..00248aca6 100644 --- a/pkg/cli/cmd/records/get.go +++ b/pkg/cli/cmd/records/get.go @@ -34,7 +34,7 @@ const tmpl = `Name: {{.Record.Name}} UID: {{.Record.Uid}} Status: Created: {{ formatAge .Record.CreateTime .Time }} Duration: {{formatDuration .Record.CreateTime .Record.UpdateTime}} -{{if .Record.Data }} +{{- if .Record.Data }} Type: {{.Record.Data.Type}} Data: {{formatJSON .Record.Data.Value}}