diff --git a/api/client/network.go b/api/client/network.go index b4328da611..d5853918de 100644 --- a/api/client/network.go +++ b/api/client/network.go @@ -8,6 +8,7 @@ import ( "net" "strings" "text/tabwriter" + "text/template" "github.com/docker/docker/api/types" Cli "github.com/docker/docker/cli" @@ -203,14 +204,25 @@ func (cli *DockerCli) CmdNetworkLs(args ...string) error { // Usage: docker network inspect [OPTIONS] [NETWORK...] func (cli *DockerCli) CmdNetworkInspect(args ...string) error { cmd := Cli.Subcmd("network inspect", []string{"NETWORK [NETWORK...]"}, "Displays detailed information on one or more networks", false) + tmplStr := cmd.String([]string{"f", "-format"}, "", "Format the output using the given go template") cmd.Require(flag.Min, 1) - err := cmd.ParseFlags(args, true) - if err != nil { + + if err := cmd.ParseFlags(args, true); err != nil { return err } + var tmpl *template.Template + if *tmplStr != "" { + var err error + tmpl, err = template.New("").Funcs(funcMap).Parse(*tmplStr) + if err != nil { + return err + } + } + status := 0 - var networks []*types.NetworkResource + var networks []types.NetworkResource + buf := new(bytes.Buffer) for _, name := range cmd.Args() { obj, _, err := readBody(cli.call("GET", "/networks/"+name, nil, nil)) if err != nil { @@ -222,12 +234,34 @@ func (cli *DockerCli) CmdNetworkInspect(args ...string) error { status = 1 continue } - networkResource := types.NetworkResource{} + var networkResource types.NetworkResource if err := json.NewDecoder(bytes.NewReader(obj)).Decode(&networkResource); err != nil { return err } - networks = append(networks, &networkResource) + if tmpl == nil { + networks = append(networks, networkResource) + continue + } + + if err := tmpl.Execute(buf, &networkResource); err != nil { + if err := tmpl.Execute(buf, &networkResource); err != nil { + fmt.Fprintf(cli.err, "%s\n", err) + return Cli.StatusError{StatusCode: 1} + } + } + buf.WriteString("\n") + } + + if tmpl != nil { + if _, err := io.Copy(cli.out, buf); err != nil { + return err + } + return nil + } + + if len(networks) == 0 { + io.WriteString(cli.out, "[]") } b, err := json.MarshalIndent(networks, "", " ") diff --git a/contrib/completion/bash/docker b/contrib/completion/bash/docker index 90c21a9ad4..03c593f600 100644 --- a/contrib/completion/bash/docker +++ b/contrib/completion/bash/docker @@ -1133,9 +1133,15 @@ _docker_network_disconnect() { } _docker_network_inspect() { + case "$prev" in + --format|-f) + return + ;; + esac + case "$cur" in -*) - COMPREPLY=( $( compgen -W "--help" -- "$cur" ) ) + COMPREPLY=( $( compgen -W "--format -f --help" -- "$cur" ) ) ;; *) __docker_networks diff --git a/contrib/completion/zsh/_docker b/contrib/completion/zsh/_docker index 4212d8172c..b5be7cff39 100644 --- a/contrib/completion/zsh/_docker +++ b/contrib/completion/zsh/_docker @@ -309,9 +309,10 @@ __docker_network_subcommand() { "($help)*"{-o=,--opt=}"[Set driver specific options]:key=value: " \ "($help -)1:Network Name: " && ret=0 ;; - (inspect|rm) + (inspect) _arguments $(__docker_arguments) \ $opts_help \ + "($help -f --format)"{-f=,--format=}"[Format the output using the given go template]:template: " \ "($help -)*:network:__docker_networks" && ret=0 ;; (ls) @@ -320,6 +321,11 @@ __docker_network_subcommand() { "($help)--no-trunc[Do not truncate the output]" \ "($help -q --quiet)"{-q,--quiet}"[Only display numeric IDs]" && ret=0 ;; + (rm) + _arguments $(__docker_arguments) \ + $opts_help \ + "($help -)*:network:__docker_networks" && ret=0 + ;; (help) _arguments $(__docker_arguments) ":subcommand:__docker_network_commands" && ret=0 ;; diff --git a/docs/reference/commandline/network_inspect.md b/docs/reference/commandline/network_inspect.md index e458ffff8e..0f6342f514 100644 --- a/docs/reference/commandline/network_inspect.md +++ b/docs/reference/commandline/network_inspect.md @@ -14,6 +14,7 @@ parent = "smn_cli" Displays detailed information on a network + -f, --format= Format the output using the given go template. --help=false Print usage Returns information about one or more networks. By default, this command renders all results in a JSON object. For example, if you connect two containers to a network: @@ -26,7 +27,11 @@ $ sudo docker run -itd --name=container2 busybox bda12f8922785d1f160be70736f26c1e331ab8aaf8ed8d56728508f2e2fd4727 ``` -The `network inspect` command shows the containers, by id, in its results. +The `network inspect` command shows the containers, by id, in its +results. You can specify an alternate format to execute a given +template for each result. Go's +[text/template](http://golang.org/pkg/text/template/) package describes all the +details of the format. ```bash $ sudo docker network inspect bridge diff --git a/integration-cli/docker_cli_network_unix_test.go b/integration-cli/docker_cli_network_unix_test.go index 6608e07089..7914838f00 100644 --- a/integration-cli/docker_cli_network_unix_test.go +++ b/integration-cli/docker_cli_network_unix_test.go @@ -293,6 +293,17 @@ func (s *DockerSuite) TestDockerNetworkDeleteMultiple(c *check.C) { assertNwIsAvailable(c, "testDelMulti2") } +func (s *DockerSuite) TestDockerNetworkInspect(c *check.C) { + out, _ := dockerCmd(c, "network", "inspect", "host") + networkResources := []types.NetworkResource{} + err := json.Unmarshal([]byte(out), &networkResources) + c.Assert(err, check.IsNil) + c.Assert(networkResources, checker.HasLen, 1) + + out, _ = dockerCmd(c, "network", "inspect", "--format='{{ .Name }}'", "host") + c.Assert(strings.TrimSpace(out), check.Equals, "host") +} + func (s *DockerSuite) TestDockerInspectMultipleNetwork(c *check.C) { out, _ := dockerCmd(c, "network", "inspect", "host", "none") networkResources := []types.NetworkResource{} diff --git a/man/docker-network-inspect.1.md b/man/docker-network-inspect.1.md index 90bd808ad6..889967ae85 100644 --- a/man/docker-network-inspect.1.md +++ b/man/docker-network-inspect.1.md @@ -6,6 +6,7 @@ docker-network-inspect - inspect a network # SYNOPSIS **docker network inspect** +[**-f**|**--format**[=*FORMAT*]] [**--help**] NETWORK [NETWORK...] @@ -21,7 +22,11 @@ $ sudo docker run -itd --name=container2 busybox bda12f8922785d1f160be70736f26c1e331ab8aaf8ed8d56728508f2e2fd4727 ``` -The `network inspect` command shows the containers, by id, in its results. +The `network inspect` command shows the containers, by id, in its +results. You can specify an alternate format to execute a given +template for each result. Go's +[text/template](http://golang.org/pkg/text/template/) package +describes all the details of the format. ```bash $ sudo docker network inspect bridge @@ -69,6 +74,8 @@ $ sudo docker network inspect bridge ``` # OPTIONS +**-f**, **--format**="" + Format the output using the given go template. **--help** Print usage statement