Bladeren bron

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 jaren geleden
bovenliggende
commit
7af9f988ac
2 gewijzigde bestanden met toevoegingen van 55 en 13 verwijderingen
  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
 //
-// Usage: docker network inspect <NETWORK>
+// Usage: docker network inspect <NETWORK> [<NETWORK>]
 // CmdNetworkInspect handles Network inspect UI
 func (cli *DockerCli) CmdNetworkInspect(args ...string) error {
 	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)
 	if err != nil {
 		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
 	}
 
-	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
 	}
-	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
 }

+ 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 {
 	out, _ := dockerCmd(c, "network", "inspect", name)
-	nr := types.NetworkResource{}
+	nr := []types.NetworkResource{}
 	err := json.Unmarshal([]byte(out), &nr)
 	c.Assert(err, check.IsNil)
-	return &nr
+	return &nr[0]
 }
 
 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))
 }
 
+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) {
 	dockerCmd(c, "network", "create", "test")
 	assertNwIsAvailable(c, "test")