Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Task-17: Funnel errors to cobra commands #34

Merged
merged 5 commits into from
Oct 7, 2017
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 10 additions & 2 deletions cmd/args.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package cmd

import (
"fmt"
"log"

"github.com/exitshell/konnect/engine"
Expand All @@ -14,14 +15,21 @@ var ArgsCmd = &cobra.Command{
Long: "Print the SSH command for a host",
Run: func(cmd *cobra.Command, args []string) {
// Resolve filename from flags.
filename := resolveFilename(cmd)
filename, err := resolveFilename(cmd)
handleErr(err)

// Check that only one host was specified.
if len(args) != 1 {
log.Fatal("Please specify one host")
}

// Init engine.
konnect, err := engine.Init(filename)
handleErr(err)

// Print Host SSH command.
engine.Init(filename).Args(args[0])
hostArgs, err := konnect.Args(args[0])
handleErr(err)
fmt.Println(hostArgs)
},
}
18 changes: 12 additions & 6 deletions cmd/cmd.go
Original file line number Diff line number Diff line change
Expand Up @@ -57,11 +57,15 @@ func init() {
func InteractivePrompt(cmd *cobra.Command) {
fmt.Println("Starting interactive prompt...")
// Resolve filename from flags.
filename := resolveFilename(cmd)
filename, err := resolveFilename(cmd)
handleErr(err)

// Init Konnect engine and get host names.
engine := engine.Init(filename)
hosts := engine.GetHosts()
// Init engine.
konnect, err := engine.Init(filename)
handleErr(err)

// Get host names.
hosts := konnect.GetHosts()

// Create survey.
prompt := []*survey.Question{
Expand All @@ -81,12 +85,14 @@ func InteractivePrompt(cmd *cobra.Command) {
}{}

// Show prompt.
if err := survey.Ask(prompt, &answer); err != nil {
if err = survey.Ask(prompt, &answer); err != nil {
log.Fatal("No host was selected")
}

// Connect to host.
engine.Connect(answer.Hostname)
if err := konnect.Connect(answer.Hostname); err != nil {
log.Fatal(err)
}
}

// AddCommands - Connects subcommands to the RootCmd.
Expand Down
11 changes: 9 additions & 2 deletions cmd/connect.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,14 +14,21 @@ var ConnectCmd = &cobra.Command{
Long: "Connect to a host",
Run: func(cmd *cobra.Command, args []string) {
// Resolve filename from flags.
filename := resolveFilename(cmd)
filename, err := resolveFilename(cmd)
handleErr(err)

// Check that only one host was specified.
if len(args) != 1 {
log.Fatal("Please specify one host")
}

// Init engine.
konnect, err := engine.Init(filename)
handleErr(err)

// Connect to host.
engine.Init(filename).Connect(args[0])
if err := konnect.Connect(args[0]); err != nil {
log.Fatal(err)
}
},
}
6 changes: 4 additions & 2 deletions cmd/init.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ var InitCmd = &cobra.Command{
log.Fatal("Too many args. Please specify a directory")
}

// If specified, then use the given directory.
// If a diectory is specified, then use the given directory.
if len(args) == 1 {
dir = args[0]
}
Expand All @@ -42,6 +42,8 @@ var InitCmd = &cobra.Command{
log.Fatalf("File %v already exists.\n", filename)
}

makeDefaultConfig(filename)
if err := makeDefaultConfig(filename); err != nil {
log.Fatal(err)
}
},
}
12 changes: 9 additions & 3 deletions cmd/list.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package cmd

import (
"fmt"
"log"

"github.com/exitshell/konnect/engine"
Expand All @@ -9,19 +10,24 @@ import (

// ListCmd - List all hosts from config file.
var ListCmd = &cobra.Command{
Use: "ls",
Use: "list",
Short: "List all hosts",
Long: "List all hosts",
Run: func(cmd *cobra.Command, args []string) {
// Resolve filename from flags.
filename := resolveFilename(cmd)
filename, err := resolveFilename(cmd)
handleErr(err)

// Check that only one host was specified.
if len(args) != 0 {
log.Fatal("The list subcommand does not take any arguments")
}

// Init engine.
konnect, err := engine.Init(filename)
handleErr(err)

// List all hosts.
engine.Init(filename).List()
fmt.Print(konnect.List())
},
}
11 changes: 8 additions & 3 deletions cmd/status.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,12 @@ var StatusCmd = &cobra.Command{
Long: "Check the status of one or more hosts",
Run: func(cmd *cobra.Command, args []string) {
// Resolve filename from flags.
filename := resolveFilename(cmd)
filename, err := resolveFilename(cmd)
handleErr(err)

// Init engine.
konnect := engine.Init(filename)
konnect, err := engine.Init(filename)
handleErr(err)

hosts := args

Expand All @@ -43,7 +46,9 @@ var StatusCmd = &cobra.Command{
hosts = removeDuplicates(hosts)

// Validate hosts.
konnect.CheckHosts(hosts)
if err := konnect.CheckHosts(hosts); err != nil {
log.Fatal(err)
}

// Check status of the resolved hosts.
fmt.Printf("Testing connections for %v\n\n", strings.Join(hosts, ", "))
Expand Down
22 changes: 16 additions & 6 deletions cmd/utils_.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,14 @@ import (
"github.com/spf13/cobra"
)

// handleErr is a function that logs Fatal
// if the given error `err` is populated.
func handleErr(err error) {
if err != nil {
log.Fatal(err)
}
}

func getDefaultConfig() string {
return "./konnect.yml"
}
Expand All @@ -36,7 +44,7 @@ func removeDuplicates(elements []string) []string {
// Resolve the config filename from cmd flags.
// Fallback to default filename.
// Validate that the file exists.
func resolveFilename(cmd *cobra.Command) string {
func resolveFilename(cmd *cobra.Command) (string, error) {
// Get config filename from flags.
filename, _ := cmd.Flags().GetString("filename")
wasProvided := true
Expand All @@ -59,13 +67,13 @@ func resolveFilename(cmd *cobra.Command) string {
// Could not find the config file that the user specified.
err = fmt.Errorf("Config %v does not exist", filename)
}
log.Fatal(err)
return "", err
}

return filename
return filename, nil
}

func makeDefaultConfig(filename string) {
func makeDefaultConfig(filename string) error {
// Make default proxylist and konnect engine.
proxyList := map[string]*proxy.SSHProxy{
"app": &proxy.SSHProxy{
Expand All @@ -87,7 +95,7 @@ func makeDefaultConfig(filename string) {
// Marshal konnect struct to a byte slice.
byteSlice, err := yaml.Marshal(konnect)
if err != nil {
log.Fatal(err)
return err
}

// Make config header.
Expand All @@ -104,10 +112,12 @@ func makeDefaultConfig(filename string) {

// Write byte slice to file.
if err = ioutil.WriteFile(filename, data, 0644); err != nil {
log.Fatal(err)
return err
}

fmt.Println("Created configuration file at:")
c := color.New(color.FgCyan, color.Bold)
c.Printf("%v\n", filename)

return nil
}
29 changes: 14 additions & 15 deletions engine/api.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,55 +2,54 @@ package engine

import (
"fmt"
"log"
"path/filepath"
"strings"
)

// Init - Create a new Konnect object.
func Init(filename string) *Konnect {
func Init(filename string) (*Konnect, error) {
filename, err := filepath.Abs(filename)
if err != nil {
log.Fatal(err)
return nil, err
}

konnect := New()
if err = konnect.LoadFromFile(filename); err != nil {
log.Fatal(err)
return nil, err
}

return konnect
return konnect, nil
}

// List - Show info for all SSHProxy objects.
func (k *Konnect) List() {
func (k *Konnect) List() string {
result := ""
hosts := k.GetHosts()
for _, host := range hosts {
fmt.Println(k.Hosts[host].Info())
result += fmt.Sprintln(k.Hosts[host].Info())
}
return result
}

// Args - Print SSH Args for a given host.
func (k *Konnect) Args(host string) {
func (k *Konnect) Args(host string) (string, error) {
proxy, err := k.Get(host)
if err != nil {
log.Fatal(err)
return "", err
}

argsStr := strings.Join(proxy.Args(), " ")
fmt.Println(argsStr)
return argsStr, err
}

// Connect to host.
func (k *Konnect) Connect(host string) {
func (k *Konnect) Connect(host string) error {
proxy, err := k.Get(host)
if err != nil {
log.Fatal(err)
return err
}

if err = proxy.Connect(); err != nil {
log.Fatal(err)
}
return proxy.Connect()
}

// Status - Check the status of one or more hosts.
Expand Down
6 changes: 3 additions & 3 deletions engine/engine.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ import (
"errors"
"fmt"
"io/ioutil"
"log"
"sort"

yaml "gopkg.in/yaml.v2"
Expand Down Expand Up @@ -41,14 +40,15 @@ func (k *Konnect) GetHosts() []string {
}

// CheckHosts - Ensure that the given host names exist.
func (k *Konnect) CheckHosts(hosts []string) {
func (k *Konnect) CheckHosts(hosts []string) error {
// If a given host does not exist
// in Konnect.Hosts, then throw an error.
for _, host := range hosts {
if _, ok := k.Hosts[host]; ok != true {
log.Fatalf("Undefined host %v", host)
return fmt.Errorf("Undefined host %v", host)
}
}
return nil
}

// LoadFromFile - Load and validate SSHProxy objects from a yaml config file.
Expand Down