Browse code

Merge pull request #17218 from vdemeester/17023-network-multiple-inspect

Add support for multiple network in inspect

Sebastiaan van Stijn authored on 2015/10/22 03:09:02
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
 }
... ...
@@ -210,10 +210,10 @@ func isNwPresent(c *check.C, name string) bool {
210 210
 
211 211
 func getNwResource(c *check.C, name string) *types.NetworkResource {
212 212
 	out, _ := dockerCmd(c, "network", "inspect", name)
213
-	nr := types.NetworkResource{}
213
+	nr := []types.NetworkResource{}
214 214
 	err := json.Unmarshal([]byte(out), &nr)
215 215
 	c.Assert(err, check.IsNil)
216
-	return &nr
216
+	return &nr[0]
217 217
 }
218 218
 
219 219
 func (s *DockerNetworkSuite) TestDockerNetworkLsDefault(c *check.C) {
... ...
@@ -236,6 +236,30 @@ func (s *DockerSuite) TestDockerNetworkDeleteNotExists(c *check.C) {
236 236
 	c.Assert(err, checker.NotNil, check.Commentf("%v", out))
237 237
 }
238 238
 
239
+func (s *DockerSuite) TestDockerInspectMultipleNetwork(c *check.C) {
240
+	out, _ := dockerCmd(c, "network", "inspect", "host", "none")
241
+	networkResources := []types.NetworkResource{}
242
+	err := json.Unmarshal([]byte(out), &networkResources)
243
+	c.Assert(err, check.IsNil)
244
+	c.Assert(networkResources, checker.HasLen, 2)
245
+
246
+	// Should print an error, return an exitCode 1 *but* should print the host network
247
+	out, exitCode, err := dockerCmdWithError("network", "inspect", "host", "nonexistent")
248
+	c.Assert(err, checker.NotNil)
249
+	c.Assert(exitCode, checker.Equals, 1)
250
+	c.Assert(out, checker.Contains, "Error: No such network: nonexistent")
251
+	networkResources = []types.NetworkResource{}
252
+	inspectOut := strings.SplitN(out, "\n", 2)[1]
253
+	err = json.Unmarshal([]byte(inspectOut), &networkResources)
254
+	c.Assert(networkResources, checker.HasLen, 1)
255
+
256
+	// Should print an error and return an exitCode, nothing else
257
+	out, exitCode, err = dockerCmdWithError("network", "inspect", "nonexistent")
258
+	c.Assert(err, checker.NotNil)
259
+	c.Assert(exitCode, checker.Equals, 1)
260
+	c.Assert(out, checker.Contains, "Error: No such network: nonexistent")
261
+}
262
+
239 263
 func (s *DockerNetworkSuite) TestDockerNetworkConnectDisconnect(c *check.C) {
240 264
 	dockerCmd(c, "network", "create", "test")
241 265
 	assertNwIsAvailable(c, "test")