Skip to content

Commit a7902f6

Browse files
committed
Refactor to use Cobra
1 parent eb0939b commit a7902f6

11 files changed

Lines changed: 195 additions & 203 deletions

File tree

CHANGELOG.md

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,9 @@ The changelog for Bonvoy
22

33
## Pending Release
44

5-
* Add `server-info` command to display information about the Envoy sidecar
6-
* Add `log-level` command to set Envoy's log level
5+
* Restructured to use cobra cli library rather than flag
6+
* Add `server info` command to display information about the Envoy sidecar
7+
* Add `log level` command to set Envoy's log level
78
* Restructure for better memory usage and a more closed API
89

910
## 0.0.1

README.md

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,5 +19,17 @@ bonvoy listeners auth-grpc
1919
### Show all Expired Certificates
2020

2121
```bash
22-
bonvoy certs-expired auth-grpc
22+
bonvoy certificates expired auth-grpc
23+
```
24+
25+
### Show Server Info
26+
27+
```bash
28+
bonvoy server info auth-grpc
29+
```
30+
31+
### Set Envoy Log Level
32+
33+
```bash
34+
bonvoy log level auth-grpc -l debug
2335
```

bonvoy.go

Lines changed: 26 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -3,37 +3,37 @@ package main
33
import (
44
"bonvoy/commands"
55
"bonvoy/config"
6-
"fmt"
76
"os"
87
)
98

10-
func root(args[] string) error {
11-
var cmds = commands.All()
12-
subcommand := os.Args[1]
13-
14-
for _, cmd := range cmds {
15-
if cmd.Name() == subcommand {
16-
var err = cmd.Init(os.Args[2:])
17-
if err != nil {
18-
panic(err)
19-
}
20-
return cmd.Run()
21-
}
22-
}
23-
return fmt.Errorf("Unknown subcommand: %s", subcommand)
24-
}
9+
//func root(args[] string) error {
10+
// var cmds = commands.All()
11+
// subcommand := os.Args[1]
12+
//
13+
// for _, cmd := range cmds {
14+
// if cmd.Name() == subcommand {
15+
// var err = cmd.Init(os.Args[2:])
16+
// if err != nil {
17+
// panic(err)
18+
// }
19+
// return cmd.Run()
20+
// }
21+
// }
22+
// return fmt.Errorf("Unknown subcommand: %s", subcommand)
23+
//}
2524

2625
func main() {
2726
_ = os.Setenv("DOCKER_API_VERSION", "1.39")
2827
config.Load()
29-
if len(os.Args) < 2 {
30-
fmt.Println("USAGE: bonvoy" +
31-
"\n\tversion - Display bonvoy version" +
32-
"\n\tlog-level [service] (level) - Set log level for a sidecar" +
33-
"\n\tcerts-expired - Display expired certificates compared to Consul agent for a sidecar" +
34-
"\n\tlisteners [service] - Display all listeners for sidecar")
35-
} else if err := root(os.Args[1:]); err != nil {
36-
fmt.Println(err)
37-
os.Exit(1)
38-
}
28+
commands.Init()
29+
//if len(os.Args) < 2 {
30+
// fmt.Println("USAGE: bonvoy" +
31+
// "\n\tversion - Display bonvoy version" +
32+
// "\n\tlog-level [service] (level) - Set log level for a sidecar" +
33+
// "\n\tcerts-expired - Display expired certificates compared to Consul agent for a sidecar" +
34+
// "\n\tlisteners [service] - Display all listeners for sidecar")
35+
//} else if err := root(os.Args[1:]); err != nil {
36+
// fmt.Println(err)
37+
// os.Exit(1)
38+
//}
3939
}

commands/certificates.go

Lines changed: 26 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -3,60 +3,52 @@ package commands
33
import (
44
"bonvoy/consul"
55
"bonvoy/envoy"
6-
"flag"
76
"fmt"
7+
"github.com/spf13/cobra"
88
"strings"
99
)
1010

11-
type ExpiredCertificatesCommand struct {
12-
fs *flag.FlagSet
13-
consul consul.Client
14-
name string
11+
type ExpiredCertificatesController struct {
12+
ServiceName string
13+
Consul consul.Client
1514
}
1615

17-
func BuildExpiredCertificatesCommand() *ExpiredCertificatesCommand {
18-
gc := &ExpiredCertificatesCommand{
19-
fs: flag.NewFlagSet("certs-expired", flag.ContinueOnError),
20-
consul: consul.NewClient(),
21-
}
22-
gc.fs.Arg(0)
23-
return gc
24-
}
25-
26-
func (g *ExpiredCertificatesCommand) Name() string {
27-
return g.fs.Name()
28-
}
29-
30-
func (g *ExpiredCertificatesCommand) Init(args []string) error {
31-
return g.fs.Parse(args)
16+
func BuildExpiredCertificatesController(rootCmd *cobra.Command) {
17+
rootCmd.AddCommand(&cobra.Command{
18+
Use: "certificates expired",
19+
Short: "Show all expired certificates",
20+
Long: `Display all expired sidecar certificates as compared to the local Consul agent`,
21+
Args: cobra.MinimumNArgs(2),
22+
RunE: func(cmd *cobra.Command, args []string) error {
23+
controller := ExpiredCertificatesController{
24+
ServiceName: args[1],
25+
Consul: consul.NewClient(),
26+
}
27+
return controller.Run()
28+
},
29+
})
3230
}
3331

34-
func (g *ExpiredCertificatesCommand) Run() error {
35-
var name = g.name
36-
if name == "" {
37-
name = g.fs.Arg(0)
38-
}
39-
40-
e, err := envoy.NewFromServiceName(name)
32+
func (c *ExpiredCertificatesController) Run() error {
33+
e, err := envoy.NewFromServiceName(c.ServiceName)
4134
if err != nil {
4235
return err
4336
}
4437
data := e.Certificates().Get()
4538

4639
for _, certs := range data.Certificates {
47-
for _, c := range certs.CertificateChain {
48-
a := strings.Split(c.SubjectAltNames[0].Uri, "/")
40+
for _, cert := range certs.CertificateChain {
41+
a := strings.Split(cert.SubjectAltNames[0].Uri, "/")
4942
svc := a[len(a)-1]
50-
leaf := g.consul.Agent().GetConnectLeafCaCertificate(svc)
43+
leaf := c.Consul.Agent().GetConnectLeafCaCertificate(svc)
5144

52-
if c.ExpirationTime != leaf.ValidBefore {
45+
if cert.ExpirationTime != leaf.ValidBefore {
5346
fmt.Println(svc)
5447
fmt.Println(" Envoy Process ID:", e.Pid)
55-
fmt.Printf(" Envoy Certificate Expiry: %s (%s days)\n", c.ExpirationTime, c.DaysUntilExpiration)
48+
fmt.Printf(" Envoy Certificate Expiry: %s (%s days)\n", cert.ExpirationTime, cert.DaysUntilExpiration)
5649
fmt.Println(" Consul Agent Certificate Expiry: ", leaf.ValidBefore)
5750
}
5851
}
5952
}
60-
6153
return nil
62-
}
54+
}

commands/listeners.go

Lines changed: 22 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -4,47 +4,42 @@ import (
44
"bonvoy/envoy"
55
"flag"
66
"fmt"
7+
"github.com/spf13/cobra"
78
)
89

9-
type ListenersCommand struct {
10-
fs *flag.FlagSet
11-
name string
12-
}
13-
14-
// ListenersCommand
15-
func BuildListeners() *ListenersCommand {
16-
gc := &ListenersCommand{
17-
fs: flag.NewFlagSet("listeners", flag.ContinueOnError),
18-
}
19-
gc.fs.Arg(0)
20-
gc.fs.StringVar(&gc.name, "service", "", "name of the service whose sidecar to enter")
21-
return gc
22-
}
23-
24-
func (g *ListenersCommand) Name() string {
25-
return g.fs.Name()
10+
type ListenersController struct {
11+
ServiceName string
2612
}
2713

28-
func (g *ListenersCommand) Init(args []string) error {
29-
return g.fs.Parse(args)
14+
func BuildListenersCommand(rootCmd *cobra.Command) {
15+
rootCmd.AddCommand(&cobra.Command{
16+
Use: "listeners",
17+
Short: "Show Envoy listeners",
18+
Long: `Display all registered Envoy sidecar listeners`,
19+
Args: cobra.MinimumNArgs(2),
20+
RunE: func(cmd *cobra.Command, args []string) error {
21+
controller := ListenersController{
22+
ServiceName: args[1],
23+
}
24+
return controller.Run()
25+
},
26+
})
3027
}
3128

32-
func (g *ListenersCommand) Run() error {
33-
var name = g.name
34-
if name == "" {
35-
name = g.fs.Arg(0)
36-
}
37-
38-
e, err := envoy.NewFromServiceName(name)
29+
func (s *ListenersController) Run() error {
30+
e, err := envoy.NewFromServiceName(s.ServiceName)
3931
if err != nil {
4032
return err
4133
}
4234
listeners := e.Listeners().Get()
43-
4435
fmt.Println("LISTENERS:")
4536
fmt.Println("----------------------------------------------------------------------")
4637
for _, listener := range listeners {
4738
fmt.Printf("%s: %s\n", listener.Name, listener.TargetAddress)
4839
}
4940
return nil
5041
}
42+
type ListenersCommand struct {
43+
fs *flag.FlagSet
44+
name string
45+
}

commands/logging.go

Lines changed: 28 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -2,65 +2,57 @@ package commands
22

33
import (
44
"bonvoy/envoy"
5-
"flag"
65
"fmt"
76
"github.com/manifoldco/promptui"
7+
"github.com/spf13/cobra"
88
)
99

10-
type SetLogLevelCommand struct {
11-
fs *flag.FlagSet
12-
name string
13-
level string
14-
}
15-
16-
// ListenersCommand
17-
func BuildSetLogLevelCommand() *SetLogLevelCommand {
18-
gc := &SetLogLevelCommand{
19-
fs: flag.NewFlagSet("log-level", flag.ContinueOnError),
20-
}
21-
gc.fs.StringVar(&gc.name, "service", "", "name of the service sidecar to set logging for")
22-
gc.fs.StringVar(&gc.level, "level", "", "Value to set logging to. Must be one of debug/info/warning/error")
23-
return gc
24-
}
10+
var (
11+
logLevel string
12+
)
2513

26-
func (g *SetLogLevelCommand) Name() string {
27-
return g.fs.Name()
14+
type SetLogLevelController struct {
15+
ServiceName string
2816
}
2917

30-
func (g *SetLogLevelCommand) Init(args []string) error {
31-
return g.fs.Parse(args)
18+
func BuildSetLogLevelCommand(rootCmd *cobra.Command) {
19+
cmd := &cobra.Command{
20+
Use: "log level",
21+
Short: "Set Envoy log level",
22+
Long: `Set the Envoy sidecar log level`,
23+
Args: cobra.MinimumNArgs(2),
24+
RunE: func(cmd *cobra.Command, args []string) error {
25+
controller := SetLogLevelController{
26+
ServiceName: args[1],
27+
}
28+
return controller.Run()
29+
},
30+
}
31+
cmd.Flags().StringVarP(&logLevel, "level", "l", "", "Desired log level (debug/info/warning/error")
32+
rootCmd.AddCommand(cmd)
3233
}
3334

34-
func (g *SetLogLevelCommand) Run() error {
35-
var name = g.name
36-
if name == "" {
37-
name = g.fs.Arg(0)
35+
func (c *SetLogLevelController) Run() error {
36+
if logLevel == "" {
37+
logLevel = c.SelectLogLevel()
3838
}
39-
var level = g.level
40-
if level == "" {
41-
level = g.fs.Arg(1)
42-
if level == "" {
43-
level = g.SelectLogLevel()
44-
}
45-
}
46-
47-
e, err := envoy.NewFromServiceName(name)
39+
e, err := envoy.NewFromServiceName(c.ServiceName)
4840
if err != nil {
4941
return err
5042
}
51-
e.Logging().SetLevel(level)
43+
e.Logging().SetLevel(logLevel)
5244
return nil
5345
}
5446

55-
func (g *SetLogLevelCommand) SelectLogLevel() string {
47+
func (c *SetLogLevelController) SelectLogLevel() string {
5648
prompt := promptui.Select{
5749
Label: "Please Select a Log Level",
5850
Items: []string{"debug", "info", "warning", "error"},
5951
}
6052
_, desired, err := prompt.Run()
6153
if err != nil {
6254
fmt.Printf("Prompt failed %v\n", err)
63-
panic(err)
55+
return "info"
6456
}
6557
return desired
6658
}

0 commit comments

Comments
 (0)