- Keep old fields in NetworkSetting to respect the deprecation policy.
Signed-off-by: David Calavera <david.calavera@gmail.com>
| ... | ... |
@@ -286,6 +286,7 @@ type ContainerJSON struct {
|
| 286 | 286 |
// NetworkSettings exposes the network settings in the api |
| 287 | 287 |
type NetworkSettings struct {
|
| 288 | 288 |
NetworkSettingsBase |
| 289 |
+ DefaultNetworkSettings |
|
| 289 | 290 |
Networks map[string]*network.EndpointSettings |
| 290 | 291 |
} |
| 291 | 292 |
|
| ... | ... |
@@ -302,6 +303,20 @@ type NetworkSettingsBase struct {
|
| 302 | 302 |
SecondaryIPv6Addresses []network.Address |
| 303 | 303 |
} |
| 304 | 304 |
|
| 305 |
+// DefaultNetworkSettings holds network information |
|
| 306 |
+// during the 2 release deprecation period. |
|
| 307 |
+// It will be removed in Docker 1.11. |
|
| 308 |
+type DefaultNetworkSettings struct {
|
|
| 309 |
+ EndpointID string |
|
| 310 |
+ Gateway string |
|
| 311 |
+ GlobalIPv6Address string |
|
| 312 |
+ GlobalIPv6PrefixLen int |
|
| 313 |
+ IPAddress string |
|
| 314 |
+ IPPrefixLen int |
|
| 315 |
+ IPv6Gateway string |
|
| 316 |
+ MacAddress string |
|
| 317 |
+} |
|
| 318 |
+ |
|
| 305 | 319 |
// MountPoint represents a mount point configuration inside the container. |
| 306 | 320 |
type MountPoint struct {
|
| 307 | 321 |
Name string `json:",omitempty"` |
| ... | ... |
@@ -36,12 +36,5 @@ type StatsJSON struct {
|
| 36 | 36 |
// NetworkSettings is a backward compatible struct for APIs prior to 1.21 |
| 37 | 37 |
type NetworkSettings struct {
|
| 38 | 38 |
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 |
|
| 47 | 40 |
} |
| ... | ... |
@@ -28,7 +28,7 @@ func (daemon *Daemon) ContainerInspect(name string, size bool) (*types.Container |
| 28 | 28 |
|
| 29 | 29 |
mountPoints := addMountPoints(container) |
| 30 | 30 |
networkSettings := &types.NetworkSettings{
|
| 31 |
- types.NetworkSettingsBase{
|
|
| 31 |
+ NetworkSettingsBase: types.NetworkSettingsBase{
|
|
| 32 | 32 |
Bridge: container.NetworkSettings.Bridge, |
| 33 | 33 |
SandboxID: container.NetworkSettings.SandboxID, |
| 34 | 34 |
HairpinMode: container.NetworkSettings.HairpinMode, |
| ... | ... |
@@ -39,7 +39,8 @@ func (daemon *Daemon) ContainerInspect(name string, size bool) (*types.Container |
| 39 | 39 |
SecondaryIPAddresses: container.NetworkSettings.SecondaryIPAddresses, |
| 40 | 40 |
SecondaryIPv6Addresses: container.NetworkSettings.SecondaryIPv6Addresses, |
| 41 | 41 |
}, |
| 42 |
- container.NetworkSettings.Networks, |
|
| 42 |
+ DefaultNetworkSettings: daemon.getDefaultNetworkSettings(container.NetworkSettings.Networks), |
|
| 43 |
+ Networks: container.NetworkSettings.Networks, |
|
| 43 | 44 |
} |
| 44 | 45 |
|
| 45 | 46 |
return &types.ContainerJSON{base, mountPoints, container.Config, networkSettings}, nil
|
| ... | ... |
@@ -68,7 +69,7 @@ func (daemon *Daemon) ContainerInspect120(name string) (*v1p20.ContainerJSON, er |
| 68 | 68 |
container.Config.ExposedPorts, |
| 69 | 69 |
container.hostConfig.VolumeDriver, |
| 70 | 70 |
} |
| 71 |
- networkSettings := getBackwardsCompatibleNetworkSettings(container.NetworkSettings) |
|
| 71 |
+ networkSettings := daemon.getBackwardsCompatibleNetworkSettings(container.NetworkSettings) |
|
| 72 | 72 |
|
| 73 | 73 |
return &v1p20.ContainerJSON{base, mountPoints, config, networkSettings}, nil
|
| 74 | 74 |
} |
| ... | ... |
@@ -167,7 +168,7 @@ func (daemon *Daemon) VolumeInspect(name string) (*types.Volume, error) {
|
| 167 | 167 |
return volumeToAPIType(v), nil |
| 168 | 168 |
} |
| 169 | 169 |
|
| 170 |
-func getBackwardsCompatibleNetworkSettings(settings *network.Settings) *v1p20.NetworkSettings {
|
|
| 170 |
+func (daemon *Daemon) getBackwardsCompatibleNetworkSettings(settings *network.Settings) *v1p20.NetworkSettings {
|
|
| 171 | 171 |
result := &v1p20.NetworkSettings{
|
| 172 | 172 |
NetworkSettingsBase: types.NetworkSettingsBase{
|
| 173 | 173 |
Bridge: settings.Bridge, |
| ... | ... |
@@ -180,16 +181,26 @@ func getBackwardsCompatibleNetworkSettings(settings *network.Settings) *v1p20.Ne |
| 180 | 180 |
SecondaryIPAddresses: settings.SecondaryIPAddresses, |
| 181 | 181 |
SecondaryIPv6Addresses: settings.SecondaryIPv6Addresses, |
| 182 | 182 |
}, |
| 183 |
+ DefaultNetworkSettings: daemon.getDefaultNetworkSettings(settings.Networks), |
|
| 183 | 184 |
} |
| 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 |
- } |
|
| 185 |
+ |
|
| 194 | 186 |
return result |
| 195 | 187 |
} |
| 188 |
+ |
|
| 189 |
+// getDefaultNetworkSettings creates the deprecated structure that holds the information |
|
| 190 |
+// about the bridge network for a container. |
|
| 191 |
+func (daemon *Daemon) getDefaultNetworkSettings(networks map[string]*network.EndpointSettings) types.DefaultNetworkSettings {
|
|
| 192 |
+ var settings types.DefaultNetworkSettings |
|
| 193 |
+ |
|
| 194 |
+ if defaultNetwork, ok := networks["bridge"]; ok {
|
|
| 195 |
+ settings.EndpointID = defaultNetwork.EndpointID |
|
| 196 |
+ settings.Gateway = defaultNetwork.Gateway |
|
| 197 |
+ settings.GlobalIPv6Address = defaultNetwork.GlobalIPv6Address |
|
| 198 |
+ settings.GlobalIPv6PrefixLen = defaultNetwork.GlobalIPv6PrefixLen |
|
| 199 |
+ settings.IPAddress = defaultNetwork.IPAddress |
|
| 200 |
+ settings.IPPrefixLen = defaultNetwork.IPPrefixLen |
|
| 201 |
+ settings.IPv6Gateway = defaultNetwork.IPv6Gateway |
|
| 202 |
+ settings.MacAddress = defaultNetwork.MacAddress |
|
| 203 |
+ } |
|
| 204 |
+ return settings |
|
| 205 |
+} |
| ... | ... |
@@ -50,7 +50,7 @@ func (daemon *Daemon) ContainerInspectPre120(name string) (*v1p19.ContainerJSON, |
| 50 | 50 |
container.hostConfig.CPUShares, |
| 51 | 51 |
container.hostConfig.CpusetCpus, |
| 52 | 52 |
} |
| 53 |
- networkSettings := getBackwardsCompatibleNetworkSettings(container.NetworkSettings) |
|
| 53 |
+ networkSettings := daemon.getBackwardsCompatibleNetworkSettings(container.NetworkSettings) |
|
| 54 | 54 |
|
| 55 | 55 |
return &v1p19.ContainerJSON{base, volumes, volumesRW, config, networkSettings}, nil
|
| 56 | 56 |
} |
| ... | ... |
@@ -2,11 +2,12 @@ package main |
| 2 | 2 |
|
| 3 | 3 |
import ( |
| 4 | 4 |
"encoding/json" |
| 5 |
- "fmt" |
|
| 6 | 5 |
"net/http" |
| 7 | 6 |
"strings" |
| 8 | 7 |
|
| 9 | 8 |
"github.com/docker/docker/api/types" |
| 9 |
+ "github.com/docker/docker/api/types/versions/v1p20" |
|
| 10 |
+ "github.com/docker/docker/pkg/integration/checker" |
|
| 10 | 11 |
"github.com/docker/docker/pkg/stringutils" |
| 11 | 12 |
"github.com/go-check/check" |
| 12 | 13 |
) |
| ... | ... |
@@ -23,19 +24,15 @@ func (s *DockerSuite) TestInspectApiContainerResponse(c *check.C) {
|
| 23 | 23 |
version string |
| 24 | 24 |
keys []string |
| 25 | 25 |
}{
|
| 26 |
- {"1.20", append(keysBase, "Mounts")},
|
|
| 27 |
- {"1.19", append(keysBase, "Volumes", "VolumesRW")},
|
|
| 26 |
+ {"v1.20", append(keysBase, "Mounts")},
|
|
| 27 |
+ {"v1.19", append(keysBase, "Volumes", "VolumesRW")},
|
|
| 28 | 28 |
} |
| 29 | 29 |
|
| 30 | 30 |
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) |
|
| 31 |
+ body := getInspectBody(c, cs.version, cleanedContainerID) |
|
| 36 | 32 |
|
| 37 | 33 |
var inspectJSON map[string]interface{}
|
| 38 |
- if err = json.Unmarshal(body, &inspectJSON); err != nil {
|
|
| 34 |
+ if err := json.Unmarshal(body, &inspectJSON); err != nil {
|
|
| 39 | 35 |
c.Fatalf("unable to unmarshal body for version %s: %v", cs.version, err)
|
| 40 | 36 |
} |
| 41 | 37 |
|
| ... | ... |
@@ -57,15 +54,12 @@ func (s *DockerSuite) TestInspectApiContainerVolumeDriverLegacy(c *check.C) {
|
| 57 | 57 |
|
| 58 | 58 |
cleanedContainerID := strings.TrimSpace(out) |
| 59 | 59 |
|
| 60 |
- cases := []string{"1.19", "1.20"}
|
|
| 60 |
+ cases := []string{"v1.19", "v1.20"}
|
|
| 61 | 61 |
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) |
|
| 62 |
+ body := getInspectBody(c, version, cleanedContainerID) |
|
| 66 | 63 |
|
| 67 | 64 |
var inspectJSON map[string]interface{}
|
| 68 |
- if err = json.Unmarshal(body, &inspectJSON); err != nil {
|
|
| 65 |
+ if err := json.Unmarshal(body, &inspectJSON); err != nil {
|
|
| 69 | 66 |
c.Fatalf("unable to unmarshal body for version %s: %v", version, err)
|
| 70 | 67 |
} |
| 71 | 68 |
|
| ... | ... |
@@ -85,13 +79,10 @@ func (s *DockerSuite) TestInspectApiContainerVolumeDriver(c *check.C) {
|
| 85 | 85 |
|
| 86 | 86 |
cleanedContainerID := strings.TrimSpace(out) |
| 87 | 87 |
|
| 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) |
|
| 88 |
+ body := getInspectBody(c, "v1.21", cleanedContainerID) |
|
| 92 | 89 |
|
| 93 | 90 |
var inspectJSON map[string]interface{}
|
| 94 |
- if err = json.Unmarshal(body, &inspectJSON); err != nil {
|
|
| 91 |
+ if err := json.Unmarshal(body, &inspectJSON); err != nil {
|
|
| 95 | 92 |
c.Fatalf("unable to unmarshal body for version 1.21: %v", err)
|
| 96 | 93 |
} |
| 97 | 94 |
|
| ... | ... |
@@ -140,15 +131,12 @@ func (s *DockerSuite) TestInspectApiEmptyFieldsInConfigPre121(c *check.C) {
|
| 140 | 140 |
|
| 141 | 141 |
cleanedContainerID := strings.TrimSpace(out) |
| 142 | 142 |
|
| 143 |
- cases := []string{"1.19", "1.20"}
|
|
| 143 |
+ cases := []string{"v1.19", "v1.20"}
|
|
| 144 | 144 |
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) |
|
| 145 |
+ body := getInspectBody(c, version, cleanedContainerID) |
|
| 149 | 146 |
|
| 150 | 147 |
var inspectJSON map[string]interface{}
|
| 151 |
- if err = json.Unmarshal(body, &inspectJSON); err != nil {
|
|
| 148 |
+ if err := json.Unmarshal(body, &inspectJSON); err != nil {
|
|
| 152 | 149 |
c.Fatalf("unable to unmarshal body for version %s: %v", version, err)
|
| 153 | 150 |
} |
| 154 | 151 |
|
| ... | ... |
@@ -164,3 +152,33 @@ func (s *DockerSuite) TestInspectApiEmptyFieldsInConfigPre121(c *check.C) {
|
| 164 | 164 |
} |
| 165 | 165 |
} |
| 166 | 166 |
} |
| 167 |
+ |
|
| 168 |
+func (s *DockerSuite) TestInspectApiBridgeNetworkSettings120(c *check.C) {
|
|
| 169 |
+ out, _ := dockerCmd(c, "run", "-d", "busybox", "true") |
|
| 170 |
+ |
|
| 171 |
+ cleanedContainerID := strings.TrimSpace(out) |
|
| 172 |
+ body := getInspectBody(c, "v1.20", cleanedContainerID) |
|
| 173 |
+ |
|
| 174 |
+ var inspectJSON v1p20.ContainerJSON |
|
| 175 |
+ err := json.Unmarshal(body, &inspectJSON) |
|
| 176 |
+ c.Assert(err, checker.IsNil) |
|
| 177 |
+ |
|
| 178 |
+ settings := inspectJSON.NetworkSettings |
|
| 179 |
+ c.Assert(settings.IPAddress, checker.Not(checker.HasLen), 0) |
|
| 180 |
+} |
|
| 181 |
+ |
|
| 182 |
+func (s *DockerSuite) TestInspectApiBridgeNetworkSettings121(c *check.C) {
|
|
| 183 |
+ out, _ := dockerCmd(c, "run", "-d", "busybox", "true") |
|
| 184 |
+ cleanedContainerID := strings.TrimSpace(out) |
|
| 185 |
+ |
|
| 186 |
+ body := getInspectBody(c, "v1.21", cleanedContainerID) |
|
| 187 |
+ |
|
| 188 |
+ var inspectJSON types.ContainerJSON |
|
| 189 |
+ err := json.Unmarshal(body, &inspectJSON) |
|
| 190 |
+ c.Assert(err, checker.IsNil) |
|
| 191 |
+ |
|
| 192 |
+ settings := inspectJSON.NetworkSettings |
|
| 193 |
+ c.Assert(settings.IPAddress, checker.Not(checker.HasLen), 0) |
|
| 194 |
+ c.Assert(settings.Networks["bridge"], checker.Not(checker.IsNil)) |
|
| 195 |
+ c.Assert(settings.IPAddress, checker.Equals, settings.Networks["bridge"].IPAddress) |
|
| 196 |
+} |
| ... | ... |
@@ -13,6 +13,7 @@ import ( |
| 13 | 13 |
"strings" |
| 14 | 14 |
|
| 15 | 15 |
"github.com/docker/docker/api/types" |
| 16 |
+ "github.com/docker/docker/api/types/versions/v1p20" |
|
| 16 | 17 |
"github.com/docker/docker/pkg/integration/checker" |
| 17 | 18 |
"github.com/docker/libnetwork/driverapi" |
| 18 | 19 |
remoteapi "github.com/docker/libnetwork/drivers/remote/api" |
| ... | ... |
@@ -641,3 +642,31 @@ func (s *DockerNetworkSuite) TestDockerNetworkMacInspect(c *check.C) {
|
| 641 | 641 |
c.Assert(err, checker.IsNil) |
| 642 | 642 |
c.Assert(mac, checker.Equals, "a0:b1:c2:d3:e4:f5") |
| 643 | 643 |
} |
| 644 |
+ |
|
| 645 |
+func (s *DockerSuite) TestInspectApiMultipeNetworks(c *check.C) {
|
|
| 646 |
+ dockerCmd(c, "network", "create", "mybridge1") |
|
| 647 |
+ dockerCmd(c, "network", "create", "mybridge2") |
|
| 648 |
+ out, _ := dockerCmd(c, "run", "-d", "busybox", "top") |
|
| 649 |
+ id := strings.TrimSpace(out) |
|
| 650 |
+ c.Assert(waitRun(id), check.IsNil) |
|
| 651 |
+ |
|
| 652 |
+ dockerCmd(c, "network", "connect", "mybridge1", id) |
|
| 653 |
+ dockerCmd(c, "network", "connect", "mybridge2", id) |
|
| 654 |
+ |
|
| 655 |
+ body := getInspectBody(c, "v1.20", id) |
|
| 656 |
+ var inspect120 v1p20.ContainerJSON |
|
| 657 |
+ err := json.Unmarshal(body, &inspect120) |
|
| 658 |
+ c.Assert(err, checker.IsNil) |
|
| 659 |
+ |
|
| 660 |
+ versionedIP := inspect120.NetworkSettings.IPAddress |
|
| 661 |
+ |
|
| 662 |
+ body = getInspectBody(c, "v1.21", id) |
|
| 663 |
+ var inspect121 types.ContainerJSON |
|
| 664 |
+ err = json.Unmarshal(body, &inspect121) |
|
| 665 |
+ c.Assert(err, checker.IsNil) |
|
| 666 |
+ c.Assert(inspect121.NetworkSettings.Networks, checker.HasLen, 3) |
|
| 667 |
+ |
|
| 668 |
+ bridge := inspect121.NetworkSettings.Networks["bridge"] |
|
| 669 |
+ c.Assert(bridge.IPAddress, checker.Equals, versionedIP) |
|
| 670 |
+ c.Assert(bridge.IPAddress, checker.Equals, inspect121.NetworkSettings.IPAddress) |
|
| 671 |
+} |
| ... | ... |
@@ -1587,3 +1587,11 @@ func waitInspect(name, expr, expected string, timeout time.Duration) error {
|
| 1587 | 1587 |
} |
| 1588 | 1588 |
return nil |
| 1589 | 1589 |
} |
| 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 |
+} |