mirror of
https://github.com/moby/moby.git
synced 2022-11-09 12:21:53 -05:00
Fixed some basic client UI issues for the "network" command
Signed-off-by: Madhu Venugopal <madhu@docker.com>
This commit is contained in:
parent
32b1657a28
commit
2d3758619b
3 changed files with 54 additions and 47 deletions
|
@ -1,11 +1,9 @@
|
||||||
package client
|
package client
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"os"
|
|
||||||
"reflect"
|
"reflect"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
|
@ -51,25 +49,21 @@ func (cli *NetworkCli) getMethod(args ...string) (func(string, ...string) error,
|
||||||
// Cmd is borrowed from Docker UI and acts as the entry point for network UI commands.
|
// Cmd is borrowed from Docker UI and acts as the entry point for network UI commands.
|
||||||
// network UI commands are designed to be invoked from multiple parent chains
|
// network UI commands are designed to be invoked from multiple parent chains
|
||||||
func (cli *NetworkCli) Cmd(chain string, args ...string) error {
|
func (cli *NetworkCli) Cmd(chain string, args ...string) error {
|
||||||
var errStr string
|
|
||||||
if len(args) > 1 {
|
if len(args) > 1 {
|
||||||
method, exists := cli.getMethod(args[:2]...)
|
method, exists := cli.getMethod(args[:2]...)
|
||||||
if exists {
|
if exists {
|
||||||
return method(chain, args[2:]...)
|
return method(chain+" "+args[0], args[2:]...)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if len(args) > 0 {
|
if len(args) > 0 {
|
||||||
method, exists := cli.getMethod(args[0])
|
method, exists := cli.getMethod(args[0])
|
||||||
if !exists {
|
if !exists {
|
||||||
errStr = fmt.Sprintf("%s: '%s' is not a %s command. See '%s --help'.\n", chain, args[0], chain, chain)
|
return fmt.Errorf("%s: '%s' is not a %s command. See '%s --help'.\n", chain, args[0], chain, chain)
|
||||||
fmt.Fprintf(cli.err, errStr)
|
|
||||||
return errors.New(errStr)
|
|
||||||
}
|
}
|
||||||
return method(chain, args[1:]...)
|
return method(chain, args[1:]...)
|
||||||
}
|
}
|
||||||
errStr = fmt.Sprintf("'%s' is not a valid command. See '%s --help'.\n", chain, chain)
|
flag.Usage()
|
||||||
fmt.Fprintf(cli.err, errStr)
|
return nil
|
||||||
return errors.New(errStr)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Subcmd is borrowed from Docker UI and performs the same function of configuring the subCmds
|
// Subcmd is borrowed from Docker UI and performs the same function of configuring the subCmds
|
||||||
|
@ -92,7 +86,6 @@ func (cli *NetworkCli) Subcmd(chain, name, signature, description string, exitOn
|
||||||
fmt.Fprintf(cli.out, "\nUsage: %s %s%s%s\n\n%s\n\n", chain, name, options, signature, description)
|
fmt.Fprintf(cli.out, "\nUsage: %s %s%s%s\n\n%s\n\n", chain, name, options, signature, description)
|
||||||
flags.SetOutput(cli.out)
|
flags.SetOutput(cli.out)
|
||||||
flags.PrintDefaults()
|
flags.PrintDefaults()
|
||||||
os.Exit(0)
|
|
||||||
}
|
}
|
||||||
return flags
|
return flags
|
||||||
}
|
}
|
||||||
|
|
|
@ -28,16 +28,16 @@ func TestClientDummyCommand(t *testing.T) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestClientNoCommand(t *testing.T) {
|
func TestClientNetworkInvalidCommand(t *testing.T) {
|
||||||
var out, errOut bytes.Buffer
|
var out, errOut bytes.Buffer
|
||||||
cFunc := func(method, path string, data interface{}, headers map[string][]string) (io.ReadCloser, int, error) {
|
cFunc := func(method, path string, data interface{}, headers map[string][]string) (io.ReadCloser, int, error) {
|
||||||
return nopCloser{bytes.NewBufferString("")}, 200, nil
|
return nopCloser{bytes.NewBufferString("")}, 200, nil
|
||||||
}
|
}
|
||||||
cli := NewNetworkCli(&out, &errOut, cFunc)
|
cli := NewNetworkCli(&out, &errOut, cFunc)
|
||||||
|
|
||||||
err := cli.Cmd("docker")
|
err := cli.Cmd("docker", "network", "invalid")
|
||||||
if err == nil {
|
if err == nil {
|
||||||
t.Fatalf("Incorrect Command must fail")
|
t.Fatalf("Passing invalid commands must fail")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -119,33 +119,7 @@ func TestClientNetworkInfo(t *testing.T) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestClientNetworkJoin(t *testing.T) {
|
// Docker Flag processing in flag.go uses os.Exit() frequently, even for --help
|
||||||
var out, errOut bytes.Buffer
|
|
||||||
cFunc := func(method, path string, data interface{}, headers map[string][]string) (io.ReadCloser, int, error) {
|
|
||||||
return nopCloser{bytes.NewBufferString("")}, 200, nil
|
|
||||||
}
|
|
||||||
cli := NewNetworkCli(&out, &errOut, cFunc)
|
|
||||||
|
|
||||||
err := cli.Cmd("docker", "network", "join", "db1", "dbnet", "db1-ep")
|
|
||||||
if err != nil {
|
|
||||||
t.Fatal(err.Error())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestClientNetworkLeave(t *testing.T) {
|
|
||||||
var out, errOut bytes.Buffer
|
|
||||||
cFunc := func(method, path string, data interface{}, headers map[string][]string) (io.ReadCloser, int, error) {
|
|
||||||
return nopCloser{bytes.NewBufferString("")}, 200, nil
|
|
||||||
}
|
|
||||||
cli := NewNetworkCli(&out, &errOut, cFunc)
|
|
||||||
|
|
||||||
err := cli.Cmd("docker", "network", "leave", "db1", "dbnet")
|
|
||||||
if err != nil {
|
|
||||||
t.Fatal(err.Error())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Docker Flag processing in flag.go uses os.Exit(0) for --help
|
|
||||||
// TODO : Handle the --help test-case in the IT when CLI is available
|
// TODO : Handle the --help test-case in the IT when CLI is available
|
||||||
/*
|
/*
|
||||||
func TestClientNetworkCreateHelp(t *testing.T) {
|
func TestClientNetworkCreateHelp(t *testing.T) {
|
||||||
|
|
|
@ -8,17 +8,57 @@ import (
|
||||||
flag "github.com/docker/docker/pkg/mflag"
|
flag "github.com/docker/docker/pkg/mflag"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
nullNetType = "null"
|
||||||
|
)
|
||||||
|
|
||||||
|
type command struct {
|
||||||
|
name string
|
||||||
|
description string
|
||||||
|
}
|
||||||
|
|
||||||
|
var (
|
||||||
|
networkCommands = []command{
|
||||||
|
{"create", "Create a network"},
|
||||||
|
{"rm", "Remove a network"},
|
||||||
|
{"ls", "List all networks"},
|
||||||
|
{"info", "Display information of a network"},
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
func (cli *NetworkCli) CmdNetwork(chain string, args ...string) error {
|
||||||
|
cmd := cli.Subcmd(chain, "network", "COMMAND [OPTIONS] [arg...]", networkUsage(chain), false)
|
||||||
|
cmd.Require(flag.Min, 1)
|
||||||
|
err := cmd.ParseFlags(args, true)
|
||||||
|
if err == nil {
|
||||||
|
cmd.Usage()
|
||||||
|
return fmt.Errorf("Invalid command : %v", args)
|
||||||
|
}
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
func networkUsage(chain string) string {
|
||||||
|
help := "Commands:\n"
|
||||||
|
|
||||||
|
for _, cmd := range networkCommands {
|
||||||
|
help += fmt.Sprintf(" %-10.10s%s\n", cmd.name, cmd.description)
|
||||||
|
}
|
||||||
|
|
||||||
|
help += fmt.Sprintf("\nRun '%s network COMMAND --help' for more information on a command.", chain)
|
||||||
|
return help
|
||||||
|
}
|
||||||
|
|
||||||
// CmdNetworkCreate handles Network Create UI
|
// CmdNetworkCreate handles Network Create UI
|
||||||
func (cli *NetworkCli) CmdNetworkCreate(chain string, args ...string) error {
|
func (cli *NetworkCli) CmdNetworkCreate(chain string, args ...string) error {
|
||||||
cmd := cli.Subcmd(chain, "create", "NETWORK-NAME", chain+" create", false)
|
cmd := cli.Subcmd(chain, "create", "NETWORK-NAME", "Creates a new network with a name specified by the user", false)
|
||||||
flDriver := cmd.String([]string{"d", "-driver"}, "", "Driver to manage the Network")
|
flDriver := cmd.String([]string{"d", "-driver"}, "null", "Driver to manage the Network")
|
||||||
cmd.Require(flag.Min, 1)
|
cmd.Require(flag.Min, 1)
|
||||||
err := cmd.ParseFlags(args, true)
|
err := cmd.ParseFlags(args, true)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
if *flDriver == "" {
|
if *flDriver == "" {
|
||||||
*flDriver = "bridge"
|
*flDriver = nullNetType
|
||||||
}
|
}
|
||||||
// TODO : Proper Backend handling
|
// TODO : Proper Backend handling
|
||||||
obj, _, err := readBody(cli.call("POST", "/networks/"+args[0], nil, nil))
|
obj, _, err := readBody(cli.call("POST", "/networks/"+args[0], nil, nil))
|
||||||
|
@ -34,7 +74,7 @@ func (cli *NetworkCli) CmdNetworkCreate(chain string, args ...string) error {
|
||||||
|
|
||||||
// CmdNetworkRm handles Network Delete UI
|
// CmdNetworkRm handles Network Delete UI
|
||||||
func (cli *NetworkCli) CmdNetworkRm(chain string, args ...string) error {
|
func (cli *NetworkCli) CmdNetworkRm(chain string, args ...string) error {
|
||||||
cmd := cli.Subcmd(chain, "rm", "NETWORK-NAME", chain+" rm", false)
|
cmd := cli.Subcmd(chain, "rm", "NETWORK-NAME", "Deletes a network", false)
|
||||||
cmd.Require(flag.Min, 1)
|
cmd.Require(flag.Min, 1)
|
||||||
err := cmd.ParseFlags(args, true)
|
err := cmd.ParseFlags(args, true)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -54,7 +94,7 @@ func (cli *NetworkCli) CmdNetworkRm(chain string, args ...string) error {
|
||||||
|
|
||||||
// CmdNetworkLs handles Network List UI
|
// CmdNetworkLs handles Network List UI
|
||||||
func (cli *NetworkCli) CmdNetworkLs(chain string, args ...string) error {
|
func (cli *NetworkCli) CmdNetworkLs(chain string, args ...string) error {
|
||||||
cmd := cli.Subcmd(chain, "ls", "", chain+" ls", false)
|
cmd := cli.Subcmd(chain, "ls", "", "Lists all the networks created by the user", false)
|
||||||
err := cmd.ParseFlags(args, true)
|
err := cmd.ParseFlags(args, true)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
@ -73,7 +113,7 @@ func (cli *NetworkCli) CmdNetworkLs(chain string, args ...string) error {
|
||||||
|
|
||||||
// CmdNetworkInfo handles Network Info UI
|
// CmdNetworkInfo handles Network Info UI
|
||||||
func (cli *NetworkCli) CmdNetworkInfo(chain string, args ...string) error {
|
func (cli *NetworkCli) CmdNetworkInfo(chain string, args ...string) error {
|
||||||
cmd := cli.Subcmd(chain, "info", "NETWORK-NAME", chain+" info", false)
|
cmd := cli.Subcmd(chain, "info", "NETWORK-NAME", "Displays detailed information on a network", false)
|
||||||
cmd.Require(flag.Min, 1)
|
cmd.Require(flag.Min, 1)
|
||||||
err := cmd.ParseFlags(args, true)
|
err := cmd.ParseFlags(args, true)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
Loading…
Add table
Reference in a new issue