mirror of
https://github.com/moby/moby.git
synced 2025-07-16 02:42:02 +03:00
Execute buildPortMapInfo after Endpoint.Join()
- As the retrieved info may not be available at Endpoint creation time for certain network drivers - Also retrieve the MAC address from Endpoint.Info().Iface() Signed-off-by: Alessandro Boch <aboch@docker.com>
This commit is contained in:
@ -20,6 +20,7 @@ import (
|
||||
remoteipam "github.com/docker/libnetwork/ipams/remote/api"
|
||||
"github.com/docker/libnetwork/netlabel"
|
||||
"github.com/go-check/check"
|
||||
"github.com/vishvananda/netlink"
|
||||
)
|
||||
|
||||
const dummyNetworkDriver = "dummy-network-driver"
|
||||
@ -79,6 +80,36 @@ func (s *DockerNetworkSuite) SetUpSuite(c *check.C) {
|
||||
fmt.Fprintf(w, "null")
|
||||
})
|
||||
|
||||
mux.HandleFunc(fmt.Sprintf("/%s.CreateEndpoint", driverapi.NetworkPluginEndpointType), func(w http.ResponseWriter, r *http.Request) {
|
||||
w.Header().Set("Content-Type", "application/vnd.docker.plugins.v1+json")
|
||||
fmt.Fprintf(w, `{"Interface":{"MacAddress":"a0:b1:c2:d3:e4:f5"}}`)
|
||||
})
|
||||
|
||||
mux.HandleFunc(fmt.Sprintf("/%s.Join", driverapi.NetworkPluginEndpointType), func(w http.ResponseWriter, r *http.Request) {
|
||||
w.Header().Set("Content-Type", "application/vnd.docker.plugins.v1+json")
|
||||
|
||||
veth := &netlink.Veth{
|
||||
LinkAttrs: netlink.LinkAttrs{Name: "randomIfName", TxQLen: 0}, PeerName: "cnt0"}
|
||||
if err := netlink.LinkAdd(veth); err != nil {
|
||||
fmt.Fprintf(w, `{"Error":"failed to add veth pair: `+err.Error()+`"}`)
|
||||
} else {
|
||||
fmt.Fprintf(w, `{"InterfaceName":{ "SrcName":"cnt0", "DstPrefix":"veth"}}`)
|
||||
}
|
||||
})
|
||||
|
||||
mux.HandleFunc(fmt.Sprintf("/%s.Leave", driverapi.NetworkPluginEndpointType), func(w http.ResponseWriter, r *http.Request) {
|
||||
w.Header().Set("Content-Type", "application/vnd.docker.plugins.v1+json")
|
||||
fmt.Fprintf(w, "null")
|
||||
})
|
||||
|
||||
mux.HandleFunc(fmt.Sprintf("/%s.DeleteEndpoint", driverapi.NetworkPluginEndpointType), func(w http.ResponseWriter, r *http.Request) {
|
||||
w.Header().Set("Content-Type", "application/vnd.docker.plugins.v1+json")
|
||||
if link, err := netlink.LinkByName("cnt0"); err == nil {
|
||||
netlink.LinkDel(link)
|
||||
}
|
||||
fmt.Fprintf(w, "null")
|
||||
})
|
||||
|
||||
// Ipam Driver implementation
|
||||
var (
|
||||
poolRequest remoteipam.RequestPoolRequest
|
||||
@ -566,3 +597,44 @@ func (s *DockerNetworkSuite) TestDockerNetworkLinkOndefaultNetworkOnly(c *check.
|
||||
dockerCmd(c, "network", "connect", "bridge", cnt2)
|
||||
dockerCmd(c, "run", "-d", "--link", fmt.Sprintf("%s:%s", cnt2, cnt2), "busybox", "top")
|
||||
}
|
||||
|
||||
func (s *DockerNetworkSuite) TestDockerNetworkOverlayPortMapping(c *check.C) {
|
||||
// Verify exposed ports are present in ps output when running a container on
|
||||
// a network managed by a driver which does not provide the default gateway
|
||||
// for the container
|
||||
nwn := "ov"
|
||||
ctn := "bb"
|
||||
port1 := 80
|
||||
port2 := 443
|
||||
expose1 := fmt.Sprintf("--expose=%d", port1)
|
||||
expose2 := fmt.Sprintf("--expose=%d", port2)
|
||||
|
||||
dockerCmd(c, "network", "create", "-d", dummyNetworkDriver, nwn)
|
||||
assertNwIsAvailable(c, nwn)
|
||||
|
||||
dockerCmd(c, "run", "-d", "--net", nwn, "--name", ctn, expose1, expose2, "busybox", "top")
|
||||
|
||||
// Check docker ps o/p for last created container reports the unpublished ports
|
||||
unpPort1 := fmt.Sprintf("%d/tcp", port1)
|
||||
unpPort2 := fmt.Sprintf("%d/tcp", port2)
|
||||
out, _ := dockerCmd(c, "ps", "-n=1")
|
||||
// Missing unpublished ports in docker ps output
|
||||
c.Assert(out, checker.Contains, unpPort1)
|
||||
// Missing unpublished ports in docker ps output
|
||||
c.Assert(out, checker.Contains, unpPort2)
|
||||
}
|
||||
|
||||
func (s *DockerNetworkSuite) TestDockerNetworkMacInspect(c *check.C) {
|
||||
// Verify endpoint MAC address is correctly populated in container's network settings
|
||||
nwn := "ov"
|
||||
ctn := "bb"
|
||||
|
||||
dockerCmd(c, "network", "create", "-d", dummyNetworkDriver, nwn)
|
||||
assertNwIsAvailable(c, nwn)
|
||||
|
||||
dockerCmd(c, "run", "-d", "--net", nwn, "--name", ctn, "busybox", "top")
|
||||
|
||||
mac, err := inspectField(ctn, "NetworkSettings.Networks."+nwn+".MacAddress")
|
||||
c.Assert(err, checker.IsNil)
|
||||
c.Assert(mac, checker.Equals, "a0:b1:c2:d3:e4:f5")
|
||||
}
|
||||
|
Reference in New Issue
Block a user