Skip to content

Commit

Permalink
Adds List Command implementation to list the approvaltask
Browse files Browse the repository at this point in the history
Signed-off-by: PuneetPunamiya <ppunamiy@redhat.com>
  • Loading branch information
PuneetPunamiya committed Apr 22, 2024
1 parent b242bff commit 5ff906c
Show file tree
Hide file tree
Showing 30 changed files with 2,833 additions and 8 deletions.
4 changes: 3 additions & 1 deletion cmd/tkn-approvaltask/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,13 @@ package main
import (
"os"

"github.com/openshift-pipelines/manual-approval-gate/pkg/cli"
"github.com/openshift-pipelines/manual-approval-gate/pkg/cli/cmd"
)

func main() {
approvaltask := cmd.Root()
tp := &cli.ApprovalTaskParams{}
approvaltask := cmd.Root(tp)

if err := approvaltask.Execute(); err != nil {
os.Exit(1)
Expand Down
5 changes: 4 additions & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,11 @@ module github.com/openshift-pipelines/manual-approval-gate
go 1.18

require (
github.com/fatih/color v1.13.0
github.com/hashicorp/errwrap v1.1.0
github.com/hashicorp/go-multierror v1.1.1
github.com/hashicorp/golang-lru v1.0.2
github.com/pkg/errors v0.9.1
github.com/spf13/cobra v1.7.0
github.com/stretchr/testify v1.8.4
github.com/tektoncd/pipeline v0.53.2
Expand Down Expand Up @@ -62,6 +64,8 @@ require (
github.com/kelseyhightower/envconfig v1.4.0 // indirect
github.com/klauspost/compress v1.16.5 // indirect
github.com/mailru/easyjson v0.7.7 // indirect
github.com/mattn/go-colorable v0.1.9 // indirect
github.com/mattn/go-isatty v0.0.14 // indirect
github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect
github.com/mitchellh/go-homedir v1.1.0 // indirect
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
Expand All @@ -70,7 +74,6 @@ require (
github.com/opencontainers/go-digest v1.0.0 // indirect
github.com/opencontainers/image-spec v1.1.0-rc5 // indirect
github.com/openzipkin/zipkin-go v0.3.0 // indirect
github.com/pkg/errors v0.9.1 // indirect
github.com/pmezard/go-difflib v1.0.0 // indirect
github.com/prometheus/client_golang v1.14.0 // indirect
github.com/prometheus/client_model v0.3.0 // indirect
Expand Down
9 changes: 9 additions & 0 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -315,6 +315,8 @@ github.com/evanphx/json-patch v4.12.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQL
github.com/evanphx/json-patch/v5 v5.6.0 h1:b91NhWfaz02IuVxO9faSllyAtNXHMPkC5J8sJCLunww=
github.com/evanphx/json-patch/v5 v5.6.0/go.mod h1:G79N1coSVB93tBe7j6PhzjmR3/2VvlbKOFpnXhI9Bw4=
github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w=
github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk=
github.com/flowstack/go-jsonschema v0.1.1/go.mod h1:yL7fNggx1o8rm9RlgXv7hTBWxdBM0rVwpMwimd3F3N0=
github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc=
github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k=
Expand Down Expand Up @@ -595,8 +597,13 @@ github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0
github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
github.com/marstr/guid v1.1.0/go.mod h1:74gB1z2wpxxInTG6yaqA7KrtM0NZ+RbrcqDvYHefzho=
github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
github.com/mattn/go-colorable v0.1.9 h1:sqDoxXbdeALODt0DAeJCVp38ps9ZogZEAXjus69YV3U=
github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y=
github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=
github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=
github.com/mattn/go-shellwords v1.0.3/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vqg+NOMyg4B2o=
github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
Expand Down Expand Up @@ -1101,6 +1108,7 @@ golang.org/x/sys v0.0.0-20191210023423-ac6580df4449/go.mod h1:h1NjWce9XRLGQEsW7w
golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200120151820-655fe14d7479/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
Expand Down Expand Up @@ -1148,6 +1156,7 @@ golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBc
golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
Expand Down
100 changes: 98 additions & 2 deletions pkg/cli/cmd/list/list.go
Original file line number Diff line number Diff line change
@@ -1,17 +1,113 @@
package list

import (
"context"
"fmt"
"log"
"os"
"text/tabwriter"
"text/template"

"github.com/fatih/color"
"github.com/openshift-pipelines/manual-approval-gate/pkg/apis/approvaltask/v1alpha1"
cli "github.com/openshift-pipelines/manual-approval-gate/pkg/cli"
"github.com/spf13/cobra"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)

func Root() *cobra.Command {
type ListOptions struct {
AllNamespaces bool
}

var ConditionColor = map[string]color.Attribute{
"Rejected": color.FgHiRed,
"Approved": color.FgHiGreen,
"Pending": color.FgHiBlue,
}

const listTemplate = `NAME NumberOfApprovalsRequired PendingApprovals Rejected STATUS{{range .ApprovalTasks.Items}}
{{.Name}} {{.Spec.NumberOfApprovalsRequired}} {{pendingApprovals .}} {{rejected .}} {{state .}}{{end}}
`

func pendingApprovals(at *v1alpha1.ApprovalTask) int {
return at.Spec.NumberOfApprovalsRequired - len(at.Status.ApproversResponse)
}

func rejected(at *v1alpha1.ApprovalTask) int {
count := 0
for _, approver := range at.Status.ApproversResponse {
if approver.Response == "rejected" {
count = count + 1
}
}
return count
}

func ColorStatus(status string) string {
return color.New(ConditionColor[status]).Sprint(status)
}

func state(at *v1alpha1.ApprovalTask) string {
var state string

switch at.Status.State {
case "approved":
state = "Approved"
case "rejected":
state = "Rejected"
case "pending":
state = "Pending"
}
return ColorStatus(state)
}

func Root(p cli.Params) *cobra.Command {
opts := &ListOptions{}
funcMap := template.FuncMap{
"pendingApprovals": pendingApprovals,
"state": state,
"rejected": rejected,
}
c := &cobra.Command{
Use: "list",
Short: "List all approval tasks",
Long: `This command lists all the approval tasks.`,
Run: func(cmd *cobra.Command, args []string) {},
Run: func(cmd *cobra.Command, args []string) {
cs, err := p.Clients()
if err != nil {
fmt.Println("Error getting clients:", err)
return
}

ns := p.Namespace()
if opts.AllNamespaces {
ns = ""
}

at, err := cs.ApprovalTask.ApprovalTasks(ns).List(context.TODO(), metav1.ListOptions{})
if err != nil {
fmt.Println("Failed to list the approval tasks:", err)
return
}

var data = struct {
ApprovalTasks *v1alpha1.ApprovalTaskList
}{
ApprovalTasks: at,
}

t, err := template.New("List Approvaltask").Funcs(funcMap).Parse(listTemplate)

w := tabwriter.NewWriter(os.Stdout, 8, 8, 8, ' ', 0)
if err := t.Execute(w, data); err != nil {
log.Fatal(err)
}
w.Flush()

},
}

c.Flags().BoolVarP(&opts.AllNamespaces, "all-namespaces", "A", opts.AllNamespaces, "list Tasks from all namespaces")

return c
}
16 changes: 12 additions & 4 deletions pkg/cli/cmd/root.go
Original file line number Diff line number Diff line change
@@ -1,18 +1,26 @@
package cmd

import (
cli "github.com/openshift-pipelines/manual-approval-gate/pkg/cli"
"github.com/openshift-pipelines/manual-approval-gate/pkg/cli/cmd/list"
"github.com/openshift-pipelines/manual-approval-gate/pkg/cli/flags"
"github.com/spf13/cobra"
)

func Root() *cobra.Command {
func Root(p cli.Params) *cobra.Command {
c := &cobra.Command{
Use: "tkn-approvaltask",
Short: "tkn approvaltask is a CLI tool for managing approvalTask",
Long: `This application is a CLI tool to manage approvalTask`,
Short: "Approval Task CLI",
Long: `tkn plugin to use approval task as CLI`,
Annotations: map[string]string{
"commandType": "main",
},
PersistentPreRunE: flags.PersistentPreRunE(p),
}

c.AddCommand(list.Root())
c.AddCommand(list.Root(p))

flags.AddOptions(c)

return c
}
30 changes: 30 additions & 0 deletions pkg/cli/flags/flags.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package flags

import (
cli "github.com/openshift-pipelines/manual-approval-gate/pkg/cli"
"github.com/spf13/cobra"
)

func AddOptions(cmd *cobra.Command) {
cmd.PersistentFlags().StringP(
"namespace", "n", "",
"namespace to use (default: from $KUBECONFIG)")
}

func PersistentPreRunE(p cli.Params) func(*cobra.Command, []string) error {
return func(cmd *cobra.Command, _ []string) error {
return InitParams(p, cmd)
}
}

func InitParams(p cli.Params, cmd *cobra.Command) error {
ns, err := cmd.Flags().GetString("namespace")
if err != nil {
return err
}
if ns != "" {
p.SetNamespace(ns)
}

return nil
}
Loading

0 comments on commit 5ff906c

Please sign in to comment.