diff --git a/cmd/common.go b/cmd/common.go index 0f781504..63658231 100644 --- a/cmd/common.go +++ b/cmd/common.go @@ -220,7 +220,11 @@ func verifyCert(caCert []byte) (string, error) { return string(caCert), nil } -func loadConfig(path string) (config.Config, error) { +func loadConfig(ctx *cli.Context) (config.Config, error) { + path := ctx.GlobalString("config") + if path == "" { + path = os.ExpandEnv("${HOME}/.rancher/cli2.json") + } cf := config.Config{ Path: path, Servers: make(map[string]*config.ServerConfig), @@ -240,12 +244,7 @@ func loadConfig(path string) (config.Config, error) { } func lookupConfig(ctx *cli.Context) (*config.ServerConfig, error) { - path := ctx.GlobalString("config") - if path == "" { - path = os.ExpandEnv("${HOME}/.rancher/cli2.json") - } - - cf, err := loadConfig(path) + cf, err := loadConfig(ctx) if nil != err { return nil, err } diff --git a/cmd/context.go b/cmd/context.go index bb30a200..cf6d3faf 100644 --- a/cmd/context.go +++ b/cmd/context.go @@ -1,8 +1,6 @@ package cmd import ( - "os" - "github.com/rancher/cli/cliclient" "github.com/sirupsen/logrus" "github.com/urfave/cli" @@ -36,12 +34,7 @@ be automatically selected. } func contextSwitch(ctx *cli.Context) error { - path := ctx.GlobalString("cf") - if path == "" { - path = os.ExpandEnv("${HOME}/.rancher/cli2.json") - } - - cf, err := loadConfig(path) + cf, err := loadConfig(ctx) if err != nil { return err } diff --git a/cmd/login.go b/cmd/login.go index d7d5aa56..70654672 100644 --- a/cmd/login.go +++ b/cmd/login.go @@ -70,12 +70,7 @@ func loginSetup(ctx *cli.Context) error { return cli.ShowCommandHelp(ctx, "login") } - path := ctx.GlobalString("cf") - if path == "" { - path = os.ExpandEnv("${HOME}/.rancher/cli2.json") - } - - cf, err := loadConfig(path) + cf, err := loadConfig(ctx) if err != nil { return err } diff --git a/cmd/server.go b/cmd/server.go new file mode 100644 index 00000000..e163dfa2 --- /dev/null +++ b/cmd/server.go @@ -0,0 +1,155 @@ +package cmd + +import ( + "bufio" + "fmt" + "os" + "strings" + + "github.com/pkg/errors" + "github.com/sirupsen/logrus" + "github.com/urfave/cli" +) + +type serverData struct { + Name string + URL string +} + +func ServerCommand() cli.Command { + return cli.Command{ + Name: "server", + Usage: "Operations for the server", + Description: `Switch or view the server currently in focus. +`, + Subcommands: []cli.Command{ + { + Name: "current", + Usage: "Display the current server", + Action: serverCurrent, + }, + { + Name: "delete", + Usage: "Delete a server", + ArgsUsage: "[SERVER_NAME]", + Description: ` +The server arg is optional, if not passed in a list of available servers will +be displayed and one can be selected. +`, + Action: serverDelete, + }, + { + Name: "ls", + Usage: "List all servers", + Action: serverLs, + }, + { + Name: "switch", + Usage: "Switch to a new server", + ArgsUsage: "[SERVER_NAME]", + Description: ` +The server arg is optional, if not passed in a list of available servers will +be displayed and one can be selected. +`, + + Action: serverSwitch, + }, + }, + } +} + +func serverCurrent(ctx *cli.Context) error { + cf, err := loadConfig(ctx) + if err != nil { + return err + } + + fmt.Printf("%s\n", cf.CurrentServer) + return nil +} + +func serverDelete(ctx *cli.Context) error { + cf, err := loadConfig(ctx) + if err != nil { + return err + } + + serverName, err := serverSelect(ctx) + if err != nil { + return err + } + + _, ok := cf.Servers[serverName] + if !ok { + return errors.New("Server not found") + } + + delete(cf.Servers, serverName) + + cf.Write() + logrus.Infof("Server %s deleted", serverName) + return nil +} + +func serverLs(ctx *cli.Context) error { + cf, err := loadConfig(ctx) + if err != nil { + return err + } + + writer := NewTableWriter([][]string{ + {"NAME", "Name"}, + {"URL", "URL"}, + }, ctx) + + defer writer.Close() + + for name, server := range cf.Servers { + writer.Write(&serverData{ + Name: name, + URL: server.URL, + }) + } + + return writer.Err() +} + +func serverSwitch(ctx *cli.Context) error { + cf, err := loadConfig(ctx) + if err != nil { + return err + } + + serverName, err := serverSelect(ctx) + if err != nil { + return err + } + + _, ok := cf.Servers[serverName] + if !ok { + return errors.New("Server not found") + } + + cf.CurrentServer = serverName + cf.Write() + + return nil +} + +func serverSelect(ctx *cli.Context) (string, error) { + serverName := "" + if ctx.NArg() == 1 { + serverName = ctx.Args().First() + } else { + serverLs(ctx) + fmt.Print("Select a Server:") + + reader := bufio.NewReader(os.Stdin) + input, err := reader.ReadString('\n') + if err != nil { + return "", err + } + serverName = strings.TrimSpace(input) + } + return serverName, nil +} diff --git a/main.go b/main.go index 2b5b9eba..e0ccbd40 100644 --- a/main.go +++ b/main.go @@ -8,7 +8,7 @@ import ( "github.com/pkg/errors" "github.com/rancher/cli/cmd" - "github.com/rancher/cli/rancher_prompt" + rancherprompt "github.com/rancher/cli/rancher_prompt" "github.com/sirupsen/logrus" "github.com/urfave/cli" ) @@ -96,6 +96,7 @@ func mainErr() error { cmd.NodeCommand(), cmd.ProjectCommand(), cmd.PsCommand(), + cmd.ServerCommand(), cmd.SettingsCommand(), cmd.SSHCommand(), cmd.UpCommand(),