Add support for multiple network in inspect
| ... | ... |
@@ -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") |