소스 검색

Add support for multiple network in inspect

To be consistent with other inspect command (on container and images),
add the possiblity to pass multiple network to the network inspect
commands.

`docker network inspect host bridge none` is possible now.

Signed-off-by: Vincent Demeester <vincent@sbr.pm>
Vincent Demeester 9 년 전
부모
커밋
7af9f988ac
2개의 변경된 파일55개의 추가작업 그리고 13개의 파일을 삭제
  1. 29 11
      api/client/network.go
  2. 26 2
      integration-cli/docker_cli_network_unix_test.go

+ 29 - 11
api/client/network.go

@@ -184,31 +184,49 @@ func (cli *DockerCli) CmdNetworkLs(args ...string) error {
 
 
 // CmdNetworkInspect inspects the network object for more details
 // CmdNetworkInspect inspects the network object for more details
 //
 //
-// Usage: docker network inspect <NETWORK>
+// Usage: docker network inspect <NETWORK> [<NETWORK>]
 // CmdNetworkInspect handles Network inspect UI
 // CmdNetworkInspect handles Network inspect UI
 func (cli *DockerCli) CmdNetworkInspect(args ...string) error {
 func (cli *DockerCli) CmdNetworkInspect(args ...string) error {
 	cmd := Cli.Subcmd("network inspect", []string{"NETWORK"}, "Displays detailed information on a network", false)
 	cmd := Cli.Subcmd("network inspect", []string{"NETWORK"}, "Displays detailed information on a network", false)
-	cmd.Require(flag.Exact, 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
 	}
 	}
 
 
-	obj, _, err := readBody(cli.call("GET", "/networks/"+cmd.Arg(0), nil, nil))
-	if err != nil {
-		return err
+	status := 0
+	var networks []*types.NetworkResource
+	for _, name := range cmd.Args() {
+		obj, _, err := readBody(cli.call("GET", "/networks/"+name, nil, nil))
+		if err != nil {
+			if strings.Contains(err.Error(), "not found") {
+				fmt.Fprintf(cli.err, "Error: No such network: %s\n", name)
+			} else {
+				fmt.Fprintf(cli.err, "%s", err)
+			}
+			status = 1
+			continue
+		}
+		networkResource := types.NetworkResource{}
+		if err := json.NewDecoder(bytes.NewReader(obj)).Decode(&networkResource); err != nil {
+			return err
+		}
+
+		networks = append(networks, &networkResource)
 	}
 	}
-	networkResource := &types.NetworkResource{}
-	if err := json.NewDecoder(bytes.NewReader(obj)).Decode(networkResource); err != nil {
+
+	b, err := json.MarshalIndent(networks, "", "    ")
+	if err != nil {
 		return err
 		return err
 	}
 	}
 
 
-	indented := new(bytes.Buffer)
-	if err := json.Indent(indented, obj, "", "    "); err != nil {
+	if _, err := io.Copy(cli.out, bytes.NewReader(b)); err != nil {
 		return err
 		return err
 	}
 	}
-	if _, err := io.Copy(cli.out, indented); err != nil {
-		return err
+	io.WriteString(cli.out, "\n")
+
+	if status != 0 {
+		return Cli.StatusError{StatusCode: status}
 	}
 	}
 	return nil
 	return nil
 }
 }

+ 26 - 2
integration-cli/docker_cli_network_unix_test.go

@@ -119,10 +119,10 @@ func isNwPresent(c *check.C, name string) bool {
 
 
 func getNwResource(c *check.C, name string) *types.NetworkResource {
 func getNwResource(c *check.C, name string) *types.NetworkResource {
 	out, _ := dockerCmd(c, "network", "inspect", name)
 	out, _ := dockerCmd(c, "network", "inspect", name)
-	nr := types.NetworkResource{}
+	nr := []types.NetworkResource{}
 	err := json.Unmarshal([]byte(out), &nr)
 	err := json.Unmarshal([]byte(out), &nr)
 	c.Assert(err, check.IsNil)
 	c.Assert(err, check.IsNil)
-	return &nr
+	return &nr[0]
 }
 }
 
 
 func (s *DockerNetworkSuite) TestDockerNetworkLsDefault(c *check.C) {
 func (s *DockerNetworkSuite) TestDockerNetworkLsDefault(c *check.C) {
@@ -145,6 +145,30 @@ func (s *DockerSuite) TestDockerNetworkDeleteNotExists(c *check.C) {
 	c.Assert(err, checker.NotNil, check.Commentf("%v", out))
 	c.Assert(err, checker.NotNil, check.Commentf("%v", out))
 }
 }
 
 
+func (s *DockerSuite) TestDockerInspectMultipleNetwork(c *check.C) {
+	out, _ := dockerCmd(c, "network", "inspect", "host", "none")
+	networkResources := []types.NetworkResource{}
+	err := json.Unmarshal([]byte(out), &networkResources)
+	c.Assert(err, check.IsNil)
+	c.Assert(networkResources, checker.HasLen, 2)
+
+	// Should print an error, return an exitCode 1 *but* should print the host network
+	out, exitCode, err := dockerCmdWithError("network", "inspect", "host", "nonexistent")
+	c.Assert(err, checker.NotNil)
+	c.Assert(exitCode, checker.Equals, 1)
+	c.Assert(out, checker.Contains, "Error: No such network: nonexistent")
+	networkResources = []types.NetworkResource{}
+	inspectOut := strings.SplitN(out, "\n", 2)[1]
+	err = json.Unmarshal([]byte(inspectOut), &networkResources)
+	c.Assert(networkResources, checker.HasLen, 1)
+
+	// Should print an error and return an exitCode, nothing else
+	out, exitCode, err = dockerCmdWithError("network", "inspect", "nonexistent")
+	c.Assert(err, checker.NotNil)
+	c.Assert(exitCode, checker.Equals, 1)
+	c.Assert(out, checker.Contains, "Error: No such network: nonexistent")
+}
+
 func (s *DockerNetworkSuite) TestDockerNetworkConnectDisconnect(c *check.C) {
 func (s *DockerNetworkSuite) TestDockerNetworkConnectDisconnect(c *check.C) {
 	dockerCmd(c, "network", "create", "test")
 	dockerCmd(c, "network", "create", "test")
 	assertNwIsAvailable(c, "test")
 	assertNwIsAvailable(c, "test")