Skip to content

Commit f301c57

Browse files
committed
Fix network inspect for default networks.
- Keep old fields in NetworkSetting to respect the deprecation policy. Signed-off-by: David Calavera <[email protected]>
1 parent 05534b6 commit f301c57

7 files changed

Lines changed: 123 additions & 49 deletions

File tree

api/types/types.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -286,6 +286,7 @@ type ContainerJSON struct {
286286
// NetworkSettings exposes the network settings in the api
287287
type NetworkSettings struct {
288288
NetworkSettingsBase
289+
DefaultNetworkSettings
289290
Networks map[string]*network.EndpointSettings
290291
}
291292

@@ -302,6 +303,20 @@ type NetworkSettingsBase struct {
302303
SecondaryIPv6Addresses []network.Address
303304
}
304305

306+
// DefaultNetworkSettings holds network information
307+
// during the 2 release deprecation period.
308+
// It will be removed in Docker 1.11.
309+
type DefaultNetworkSettings struct {
310+
EndpointID string
311+
Gateway string
312+
GlobalIPv6Address string
313+
GlobalIPv6PrefixLen int
314+
IPAddress string
315+
IPPrefixLen int
316+
IPv6Gateway string
317+
MacAddress string
318+
}
319+
305320
// MountPoint represents a mount point configuration inside the container.
306321
type MountPoint struct {
307322
Name string `json:",omitempty"`

api/types/versions/v1p20/types.go

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -36,12 +36,5 @@ type StatsJSON struct {
3636
// NetworkSettings is a backward compatible struct for APIs prior to 1.21
3737
type NetworkSettings struct {
3838
types.NetworkSettingsBase
39-
EndpointID string
40-
Gateway string
41-
GlobalIPv6Address string
42-
GlobalIPv6PrefixLen int
43-
IPAddress string
44-
IPPrefixLen int
45-
IPv6Gateway string
46-
MacAddress string
39+
types.DefaultNetworkSettings
4740
}

daemon/inspect.go

Lines changed: 25 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ func (daemon *Daemon) ContainerInspect(name string, size bool) (*types.Container
2828

2929
mountPoints := addMountPoints(container)
3030
networkSettings := &types.NetworkSettings{
31-
types.NetworkSettingsBase{
31+
NetworkSettingsBase: types.NetworkSettingsBase{
3232
Bridge: container.NetworkSettings.Bridge,
3333
SandboxID: container.NetworkSettings.SandboxID,
3434
HairpinMode: container.NetworkSettings.HairpinMode,
@@ -39,7 +39,8 @@ func (daemon *Daemon) ContainerInspect(name string, size bool) (*types.Container
3939
SecondaryIPAddresses: container.NetworkSettings.SecondaryIPAddresses,
4040
SecondaryIPv6Addresses: container.NetworkSettings.SecondaryIPv6Addresses,
4141
},
42-
container.NetworkSettings.Networks,
42+
DefaultNetworkSettings: daemon.getDefaultNetworkSettings(container.NetworkSettings.Networks),
43+
Networks: container.NetworkSettings.Networks,
4344
}
4445

4546
return &types.ContainerJSON{base, mountPoints, container.Config, networkSettings}, nil
@@ -68,7 +69,7 @@ func (daemon *Daemon) ContainerInspect120(name string) (*v1p20.ContainerJSON, er
6869
container.Config.ExposedPorts,
6970
container.hostConfig.VolumeDriver,
7071
}
71-
networkSettings := getBackwardsCompatibleNetworkSettings(container.NetworkSettings)
72+
networkSettings := daemon.getBackwardsCompatibleNetworkSettings(container.NetworkSettings)
7273

7374
return &v1p20.ContainerJSON{base, mountPoints, config, networkSettings}, nil
7475
}
@@ -167,7 +168,7 @@ func (daemon *Daemon) VolumeInspect(name string) (*types.Volume, error) {
167168
return volumeToAPIType(v), nil
168169
}
169170

170-
func getBackwardsCompatibleNetworkSettings(settings *network.Settings) *v1p20.NetworkSettings {
171+
func (daemon *Daemon) getBackwardsCompatibleNetworkSettings(settings *network.Settings) *v1p20.NetworkSettings {
171172
result := &v1p20.NetworkSettings{
172173
NetworkSettingsBase: types.NetworkSettingsBase{
173174
Bridge: settings.Bridge,
@@ -180,16 +181,26 @@ func getBackwardsCompatibleNetworkSettings(settings *network.Settings) *v1p20.Ne
180181
SecondaryIPAddresses: settings.SecondaryIPAddresses,
181182
SecondaryIPv6Addresses: settings.SecondaryIPv6Addresses,
182183
},
184+
DefaultNetworkSettings: daemon.getDefaultNetworkSettings(settings.Networks),
183185
}
184-
if bridgeSettings := settings.Networks["bridge"]; bridgeSettings != nil {
185-
result.EndpointID = bridgeSettings.EndpointID
186-
result.Gateway = bridgeSettings.Gateway
187-
result.GlobalIPv6Address = bridgeSettings.GlobalIPv6Address
188-
result.GlobalIPv6PrefixLen = bridgeSettings.GlobalIPv6PrefixLen
189-
result.IPAddress = bridgeSettings.IPAddress
190-
result.IPPrefixLen = bridgeSettings.IPPrefixLen
191-
result.IPv6Gateway = bridgeSettings.IPv6Gateway
192-
result.MacAddress = bridgeSettings.MacAddress
193-
}
186+
194187
return result
195188
}
189+
190+
// getDefaultNetworkSettings creates the deprecated structure that holds the information
191+
// about the bridge network for a container.
192+
func (daemon *Daemon) getDefaultNetworkSettings(networks map[string]*network.EndpointSettings) types.DefaultNetworkSettings {
193+
var settings types.DefaultNetworkSettings
194+
195+
if defaultNetwork, ok := networks["bridge"]; ok {
196+
settings.EndpointID = defaultNetwork.EndpointID
197+
settings.Gateway = defaultNetwork.Gateway
198+
settings.GlobalIPv6Address = defaultNetwork.GlobalIPv6Address
199+
settings.GlobalIPv6PrefixLen = defaultNetwork.GlobalIPv6PrefixLen
200+
settings.IPAddress = defaultNetwork.IPAddress
201+
settings.IPPrefixLen = defaultNetwork.IPPrefixLen
202+
settings.IPv6Gateway = defaultNetwork.IPv6Gateway
203+
settings.MacAddress = defaultNetwork.MacAddress
204+
}
205+
return settings
206+
}

daemon/inspect_unix.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ func (daemon *Daemon) ContainerInspectPre120(name string) (*v1p19.ContainerJSON,
5050
container.hostConfig.CPUShares,
5151
container.hostConfig.CpusetCpus,
5252
}
53-
networkSettings := getBackwardsCompatibleNetworkSettings(container.NetworkSettings)
53+
networkSettings := daemon.getBackwardsCompatibleNetworkSettings(container.NetworkSettings)
5454

5555
return &v1p19.ContainerJSON{base, volumes, volumesRW, config, networkSettings}, nil
5656
}

integration-cli/docker_api_inspect_test.go

Lines changed: 44 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,12 @@ package main
22

33
import (
44
"encoding/json"
5-
"fmt"
65
"net/http"
76
"strings"
87

98
"github.com/docker/docker/api/types"
9+
"github.com/docker/docker/api/types/versions/v1p20"
10+
"github.com/docker/docker/pkg/integration/checker"
1011
"github.com/docker/docker/pkg/stringutils"
1112
"github.com/go-check/check"
1213
)
@@ -23,19 +24,15 @@ func (s *DockerSuite) TestInspectApiContainerResponse(c *check.C) {
2324
version string
2425
keys []string
2526
}{
26-
{"1.20", append(keysBase, "Mounts")},
27-
{"1.19", append(keysBase, "Volumes", "VolumesRW")},
27+
{"v1.20", append(keysBase, "Mounts")},
28+
{"v1.19", append(keysBase, "Volumes", "VolumesRW")},
2829
}
2930

3031
for _, cs := range cases {
31-
endpoint := fmt.Sprintf("/v%s/containers/%s/json", cs.version, cleanedContainerID)
32-
33-
status, body, err := sockRequest("GET", endpoint, nil)
34-
c.Assert(err, check.IsNil)
35-
c.Assert(status, check.Equals, http.StatusOK)
32+
body := getInspectBody(c, cs.version, cleanedContainerID)
3633

3734
var inspectJSON map[string]interface{}
38-
if err = json.Unmarshal(body, &inspectJSON); err != nil {
35+
if err := json.Unmarshal(body, &inspectJSON); err != nil {
3936
c.Fatalf("unable to unmarshal body for version %s: %v", cs.version, err)
4037
}
4138

@@ -57,15 +54,12 @@ func (s *DockerSuite) TestInspectApiContainerVolumeDriverLegacy(c *check.C) {
5754

5855
cleanedContainerID := strings.TrimSpace(out)
5956

60-
cases := []string{"1.19", "1.20"}
57+
cases := []string{"v1.19", "v1.20"}
6158
for _, version := range cases {
62-
endpoint := fmt.Sprintf("/v%s/containers/%s/json", version, cleanedContainerID)
63-
status, body, err := sockRequest("GET", endpoint, nil)
64-
c.Assert(err, check.IsNil)
65-
c.Assert(status, check.Equals, http.StatusOK)
59+
body := getInspectBody(c, version, cleanedContainerID)
6660

6761
var inspectJSON map[string]interface{}
68-
if err = json.Unmarshal(body, &inspectJSON); err != nil {
62+
if err := json.Unmarshal(body, &inspectJSON); err != nil {
6963
c.Fatalf("unable to unmarshal body for version %s: %v", version, err)
7064
}
7165

@@ -85,13 +79,10 @@ func (s *DockerSuite) TestInspectApiContainerVolumeDriver(c *check.C) {
8579

8680
cleanedContainerID := strings.TrimSpace(out)
8781

88-
endpoint := fmt.Sprintf("/v1.21/containers/%s/json", cleanedContainerID)
89-
status, body, err := sockRequest("GET", endpoint, nil)
90-
c.Assert(err, check.IsNil)
91-
c.Assert(status, check.Equals, http.StatusOK)
82+
body := getInspectBody(c, "v1.21", cleanedContainerID)
9283

9384
var inspectJSON map[string]interface{}
94-
if err = json.Unmarshal(body, &inspectJSON); err != nil {
85+
if err := json.Unmarshal(body, &inspectJSON); err != nil {
9586
c.Fatalf("unable to unmarshal body for version 1.21: %v", err)
9687
}
9788

@@ -140,15 +131,12 @@ func (s *DockerSuite) TestInspectApiEmptyFieldsInConfigPre121(c *check.C) {
140131

141132
cleanedContainerID := strings.TrimSpace(out)
142133

143-
cases := []string{"1.19", "1.20"}
134+
cases := []string{"v1.19", "v1.20"}
144135
for _, version := range cases {
145-
endpoint := fmt.Sprintf("/v%s/containers/%s/json", version, cleanedContainerID)
146-
status, body, err := sockRequest("GET", endpoint, nil)
147-
c.Assert(err, check.IsNil)
148-
c.Assert(status, check.Equals, http.StatusOK)
136+
body := getInspectBody(c, version, cleanedContainerID)
149137

150138
var inspectJSON map[string]interface{}
151-
if err = json.Unmarshal(body, &inspectJSON); err != nil {
139+
if err := json.Unmarshal(body, &inspectJSON); err != nil {
152140
c.Fatalf("unable to unmarshal body for version %s: %v", version, err)
153141
}
154142

@@ -164,3 +152,33 @@ func (s *DockerSuite) TestInspectApiEmptyFieldsInConfigPre121(c *check.C) {
164152
}
165153
}
166154
}
155+
156+
func (s *DockerSuite) TestInspectApiBridgeNetworkSettings120(c *check.C) {
157+
out, _ := dockerCmd(c, "run", "-d", "busybox", "true")
158+
159+
cleanedContainerID := strings.TrimSpace(out)
160+
body := getInspectBody(c, "v1.20", cleanedContainerID)
161+
162+
var inspectJSON v1p20.ContainerJSON
163+
err := json.Unmarshal(body, &inspectJSON)
164+
c.Assert(err, checker.IsNil)
165+
166+
settings := inspectJSON.NetworkSettings
167+
c.Assert(settings.IPAddress, checker.Not(checker.HasLen), 0)
168+
}
169+
170+
func (s *DockerSuite) TestInspectApiBridgeNetworkSettings121(c *check.C) {
171+
out, _ := dockerCmd(c, "run", "-d", "busybox", "true")
172+
cleanedContainerID := strings.TrimSpace(out)
173+
174+
body := getInspectBody(c, "v1.21", cleanedContainerID)
175+
176+
var inspectJSON types.ContainerJSON
177+
err := json.Unmarshal(body, &inspectJSON)
178+
c.Assert(err, checker.IsNil)
179+
180+
settings := inspectJSON.NetworkSettings
181+
c.Assert(settings.IPAddress, checker.Not(checker.HasLen), 0)
182+
c.Assert(settings.Networks["bridge"], checker.Not(checker.IsNil))
183+
c.Assert(settings.IPAddress, checker.Equals, settings.Networks["bridge"].IPAddress)
184+
}

integration-cli/docker_cli_network_unix_test.go

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import (
1313
"strings"
1414

1515
"github.com/docker/docker/api/types"
16+
"github.com/docker/docker/api/types/versions/v1p20"
1617
"github.com/docker/docker/pkg/integration/checker"
1718
"github.com/docker/libnetwork/driverapi"
1819
remoteapi "github.com/docker/libnetwork/drivers/remote/api"
@@ -641,3 +642,31 @@ func (s *DockerNetworkSuite) TestDockerNetworkMacInspect(c *check.C) {
641642
c.Assert(err, checker.IsNil)
642643
c.Assert(mac, checker.Equals, "a0:b1:c2:d3:e4:f5")
643644
}
645+
646+
func (s *DockerSuite) TestInspectApiMultipeNetworks(c *check.C) {
647+
dockerCmd(c, "network", "create", "mybridge1")
648+
dockerCmd(c, "network", "create", "mybridge2")
649+
out, _ := dockerCmd(c, "run", "-d", "busybox", "top")
650+
id := strings.TrimSpace(out)
651+
c.Assert(waitRun(id), check.IsNil)
652+
653+
dockerCmd(c, "network", "connect", "mybridge1", id)
654+
dockerCmd(c, "network", "connect", "mybridge2", id)
655+
656+
body := getInspectBody(c, "v1.20", id)
657+
var inspect120 v1p20.ContainerJSON
658+
err := json.Unmarshal(body, &inspect120)
659+
c.Assert(err, checker.IsNil)
660+
661+
versionedIP := inspect120.NetworkSettings.IPAddress
662+
663+
body = getInspectBody(c, "v1.21", id)
664+
var inspect121 types.ContainerJSON
665+
err = json.Unmarshal(body, &inspect121)
666+
c.Assert(err, checker.IsNil)
667+
c.Assert(inspect121.NetworkSettings.Networks, checker.HasLen, 3)
668+
669+
bridge := inspect121.NetworkSettings.Networks["bridge"]
670+
c.Assert(bridge.IPAddress, checker.Equals, versionedIP)
671+
c.Assert(bridge.IPAddress, checker.Equals, inspect121.NetworkSettings.IPAddress)
672+
}

integration-cli/docker_utils.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1587,3 +1587,11 @@ func waitInspect(name, expr, expected string, timeout time.Duration) error {
15871587
}
15881588
return nil
15891589
}
1590+
1591+
func getInspectBody(c *check.C, version, id string) []byte {
1592+
endpoint := fmt.Sprintf("/%s/containers/%s/json", version, id)
1593+
status, body, err := sockRequest("GET", endpoint, nil)
1594+
c.Assert(err, check.IsNil)
1595+
c.Assert(status, check.Equals, http.StatusOK)
1596+
return body
1597+
}

0 commit comments

Comments
 (0)