From 39189fe1648c8218f8296680fa29b47ea0285801 Mon Sep 17 00:00:00 2001 From: Alessandro Boch Date: Wed, 2 Aug 2017 23:00:12 -0700 Subject: [PATCH] Fix api server null pointer def on inspect/ls null ipam-driver networks - When a network is created with the null ipam driver, docker api server thread will deference a nil pointer on `docker network ls` and on `docker network inspect `. This because buildIpamResource() assumes a gateway address is always present, which is not correct. Signed-off-by: Alessandro Boch Upstream-commit: beebfc0cf6240c8af511eb4d7e29314c8de6ddf2 Component: engine --- .../api/server/router/network/network_routes.go | 4 +++- .../docker_cli_network_unix_test.go | 15 +++++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/components/engine/api/server/router/network/network_routes.go b/components/engine/api/server/router/network/network_routes.go index 723bd16107..f439d65ad9 100644 --- a/components/engine/api/server/router/network/network_routes.go +++ b/components/engine/api/server/router/network/network_routes.go @@ -409,7 +409,9 @@ func buildIpamResources(r *types.NetworkResource, nwInfo libnetwork.NetworkInfo) for _, ip4Info := range ipv4Info { iData := network.IPAMConfig{} iData.Subnet = ip4Info.IPAMData.Pool.String() - iData.Gateway = ip4Info.IPAMData.Gateway.IP.String() + if ip4Info.IPAMData.Gateway != nil { + iData.Gateway = ip4Info.IPAMData.Gateway.IP.String() + } r.IPAM.Config = append(r.IPAM.Config, iData) } } diff --git a/components/engine/integration-cli/docker_cli_network_unix_test.go b/components/engine/integration-cli/docker_cli_network_unix_test.go index 05cc078bcb..5685c7bd0f 100644 --- a/components/engine/integration-cli/docker_cli_network_unix_test.go +++ b/components/engine/integration-cli/docker_cli_network_unix_test.go @@ -690,6 +690,21 @@ func (s *DockerNetworkSuite) TestDockerNetworkIPAMOptions(c *check.C) { c.Assert(opts["opt2"], checker.Equals, "drv2") } +func (s *DockerNetworkSuite) TestDockerNetworkNullIPAMDriver(c *check.C) { + // Create a network with null ipam driver + _, _, err := dockerCmdWithError("network", "create", "-d", dummyNetworkDriver, "--ipam-driver", "null", "test000") + c.Assert(err, check.IsNil) + assertNwIsAvailable(c, "test000") + + // Verify the inspect data contains the default subnet provided by the null + // ipam driver and no gateway, as the null ipam driver does not provide one + nr := getNetworkResource(c, "test000") + c.Assert(nr.IPAM.Driver, checker.Equals, "null") + c.Assert(len(nr.IPAM.Config), checker.Equals, 1) + c.Assert(nr.IPAM.Config[0].Subnet, checker.Equals, "0.0.0.0/0") + c.Assert(nr.IPAM.Config[0].Gateway, checker.Equals, "") +} + func (s *DockerNetworkSuite) TestDockerNetworkInspectDefault(c *check.C) { nr := getNetworkResource(c, "none") c.Assert(nr.Driver, checker.Equals, "null")