Browse code

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 authored on 2015/10/21 15:57:29
Showing 2 changed files
... ...
@@ -184,31 +184,49 @@ func (cli *DockerCli) CmdNetworkLs(args ...string) error {
184 184
 
185 185
 // CmdNetworkInspect inspects the network object for more details
186 186
 //
187
-// Usage: docker network inspect <NETWORK>
187
+// Usage: docker network inspect <NETWORK> [<NETWORK>]
188 188
 // CmdNetworkInspect handles Network inspect UI
189 189
 func (cli *DockerCli) CmdNetworkInspect(args ...string) error {
190 190
 	cmd := Cli.Subcmd("network inspect", []string{"NETWORK"}, "Displays detailed information on a network", false)
191
-	cmd.Require(flag.Exact, 1)
191
+	cmd.Require(flag.Min, 1)
192 192
 	err := cmd.ParseFlags(args, true)
193 193
 	if err != nil {
194 194
 		return err
195 195
 	}
196 196
 
197
-	obj, _, err := readBody(cli.call("GET", "/networks/"+cmd.Arg(0), nil, nil))
198
-	if err != nil {
199
-		return err
197
+	status := 0
198
+	var networks []*types.NetworkResource
199
+	for _, name := range cmd.Args() {
200
+		obj, _, err := readBody(cli.call("GET", "/networks/"+name, nil, nil))
201
+		if err != nil {
202
+			if strings.Contains(err.Error(), "not found") {
203
+				fmt.Fprintf(cli.err, "Error: No such network: %s\n", name)
204
+			} else {
205
+				fmt.Fprintf(cli.err, "%s", err)
206
+			}
207
+			status = 1
208
+			continue
209
+		}
210
+		networkResource := types.NetworkResource{}
211
+		if err := json.NewDecoder(bytes.NewReader(obj)).Decode(&networkResource); err != nil {
212
+			return err
213
+		}
214
+
215
+		networks = append(networks, &networkResource)
200 216
 	}
201
-	networkResource := &types.NetworkResource{}
202
-	if err := json.NewDecoder(bytes.NewReader(obj)).Decode(networkResource); err != nil {
217
+
218
+	b, err := json.MarshalIndent(networks, "", "    ")
219
+	if err != nil {
203 220
 		return err
204 221
 	}
205 222
 
206
-	indented := new(bytes.Buffer)
207
-	if err := json.Indent(indented, obj, "", "    "); err != nil {
223
+	if _, err := io.Copy(cli.out, bytes.NewReader(b)); err != nil {
208 224
 		return err
209 225
 	}
210
-	if _, err := io.Copy(cli.out, indented); err != nil {
211
-		return err
226
+	io.WriteString(cli.out, "\n")
227
+
228
+	if status != 0 {
229
+		return Cli.StatusError{StatusCode: status}
212 230
 	}
213 231
 	return nil
214 232
 }
... ...
@@ -119,10 +119,10 @@ func isNwPresent(c *check.C, name string) bool {
119 119
 
120 120
 func getNwResource(c *check.C, name string) *types.NetworkResource {
121 121
 	out, _ := dockerCmd(c, "network", "inspect", name)
122
-	nr := types.NetworkResource{}
122
+	nr := []types.NetworkResource{}
123 123
 	err := json.Unmarshal([]byte(out), &nr)
124 124
 	c.Assert(err, check.IsNil)
125
-	return &nr
125
+	return &nr[0]
126 126
 }
127 127
 
128 128
 func (s *DockerNetworkSuite) TestDockerNetworkLsDefault(c *check.C) {
... ...
@@ -145,6 +145,30 @@ func (s *DockerSuite) TestDockerNetworkDeleteNotExists(c *check.C) {
145 145
 	c.Assert(err, checker.NotNil, check.Commentf("%v", out))
146 146
 }
147 147
 
148
+func (s *DockerSuite) TestDockerInspectMultipleNetwork(c *check.C) {
149
+	out, _ := dockerCmd(c, "network", "inspect", "host", "none")
150
+	networkResources := []types.NetworkResource{}
151
+	err := json.Unmarshal([]byte(out), &networkResources)
152
+	c.Assert(err, check.IsNil)
153
+	c.Assert(networkResources, checker.HasLen, 2)
154
+
155
+	// Should print an error, return an exitCode 1 *but* should print the host network
156
+	out, exitCode, err := dockerCmdWithError("network", "inspect", "host", "nonexistent")
157
+	c.Assert(err, checker.NotNil)
158
+	c.Assert(exitCode, checker.Equals, 1)
159
+	c.Assert(out, checker.Contains, "Error: No such network: nonexistent")
160
+	networkResources = []types.NetworkResource{}
161
+	inspectOut := strings.SplitN(out, "\n", 2)[1]
162
+	err = json.Unmarshal([]byte(inspectOut), &networkResources)
163
+	c.Assert(networkResources, checker.HasLen, 1)
164
+
165
+	// Should print an error and return an exitCode, nothing else
166
+	out, exitCode, err = dockerCmdWithError("network", "inspect", "nonexistent")
167
+	c.Assert(err, checker.NotNil)
168
+	c.Assert(exitCode, checker.Equals, 1)
169
+	c.Assert(out, checker.Contains, "Error: No such network: nonexistent")
170
+}
171
+
148 172
 func (s *DockerNetworkSuite) TestDockerNetworkConnectDisconnect(c *check.C) {
149 173
 	dockerCmd(c, "network", "create", "test")
150 174
 	assertNwIsAvailable(c, "test")