mirror of
https://github.com/moby/moby.git
synced 2022-11-09 12:21:53 -05:00
d565a4df48
Currently the driver configuration is pushed through a separate api. This makes driver configuration possible at any arbitrary time. This unncessarily complicates the driver implementation. More importantly the driver does not get access to it's configuration before it can do the handshake with libnetwork. This make the internal drivers a little bit different to external plugins which can get their configuration before the handshake with libnetwork. This PR attempts to fix that mismatch between internal drivers and external plugins. Signed-off-by: Jana Radhakrishnan <mrjana@docker.com>
131 lines
2.7 KiB
Go
131 lines
2.7 KiB
Go
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"net"
|
|
"os"
|
|
"os/signal"
|
|
|
|
"github.com/docker/docker/pkg/reexec"
|
|
"github.com/docker/libnetwork/driverapi"
|
|
"github.com/docker/libnetwork/drivers/overlay"
|
|
"github.com/docker/libnetwork/netlabel"
|
|
"github.com/vishvananda/netlink"
|
|
)
|
|
|
|
type router struct {
|
|
d driverapi.Driver
|
|
}
|
|
|
|
type endpoint struct {
|
|
addr net.IPNet
|
|
mac net.HardwareAddr
|
|
name string
|
|
}
|
|
|
|
func (r *router) RegisterDriver(name string, driver driverapi.Driver, c driverapi.Capability) error {
|
|
r.d = driver
|
|
return nil
|
|
}
|
|
|
|
func (ep *endpoint) Interface() driverapi.InterfaceInfo {
|
|
return nil
|
|
}
|
|
|
|
func (ep *endpoint) AddInterface(mac net.HardwareAddr, ipv4 net.IPNet, ipv6 net.IPNet) error {
|
|
ep.addr = ipv4
|
|
ep.mac = mac
|
|
return nil
|
|
}
|
|
|
|
func (ep *endpoint) InterfaceName() driverapi.InterfaceNameInfo {
|
|
return ep
|
|
}
|
|
|
|
func (ep *endpoint) SetNames(srcName, dstPrefix string) error {
|
|
ep.name = srcName
|
|
return nil
|
|
}
|
|
|
|
func (ep *endpoint) SetGateway(net.IP) error {
|
|
return nil
|
|
}
|
|
|
|
func (ep *endpoint) SetGatewayIPv6(net.IP) error {
|
|
return nil
|
|
}
|
|
|
|
func (ep *endpoint) AddStaticRoute(destination *net.IPNet, routeType int,
|
|
nextHop net.IP) error {
|
|
return nil
|
|
}
|
|
|
|
func main() {
|
|
if reexec.Init() {
|
|
return
|
|
}
|
|
|
|
opt := make(map[string]interface{})
|
|
if len(os.Args) > 1 {
|
|
opt[netlabel.OverlayBindInterface] = os.Args[1]
|
|
}
|
|
if len(os.Args) > 2 {
|
|
opt[netlabel.OverlayNeighborIP] = os.Args[2]
|
|
}
|
|
if len(os.Args) > 3 {
|
|
opt[netlabel.KVProvider] = os.Args[3]
|
|
}
|
|
if len(os.Args) > 4 {
|
|
opt[netlabel.KVProviderURL] = os.Args[4]
|
|
}
|
|
|
|
r := &router{}
|
|
if err := overlay.Init(r, opt); err != nil {
|
|
fmt.Printf("Failed to initialize overlay driver: %v\n", err)
|
|
os.Exit(1)
|
|
}
|
|
|
|
if err := r.d.CreateNetwork("testnetwork",
|
|
map[string]interface{}{}); err != nil {
|
|
fmt.Printf("Failed to create network in the driver: %v\n", err)
|
|
os.Exit(1)
|
|
}
|
|
|
|
ep := &endpoint{}
|
|
if err := r.d.CreateEndpoint("testnetwork", "testep",
|
|
ep, map[string]interface{}{}); err != nil {
|
|
fmt.Printf("Failed to create endpoint in the driver: %v\n", err)
|
|
os.Exit(1)
|
|
}
|
|
|
|
if err := r.d.Join("testnetwork", "testep",
|
|
"", ep, map[string]interface{}{}); err != nil {
|
|
fmt.Printf("Failed to join an endpoint in the driver: %v\n", err)
|
|
os.Exit(1)
|
|
}
|
|
|
|
link, err := netlink.LinkByName(ep.name)
|
|
if err != nil {
|
|
fmt.Printf("Failed to find the container interface with name %s: %v\n",
|
|
ep.name, err)
|
|
os.Exit(1)
|
|
}
|
|
|
|
ipAddr := &netlink.Addr{IPNet: &ep.addr, Label: ""}
|
|
if err := netlink.AddrAdd(link, ipAddr); err != nil {
|
|
fmt.Printf("Failed to add address to the interface: %v\n", err)
|
|
os.Exit(1)
|
|
}
|
|
|
|
sigCh := make(chan os.Signal, 1)
|
|
signal.Notify(sigCh, os.Interrupt, os.Kill)
|
|
|
|
for {
|
|
select {
|
|
case <-sigCh:
|
|
r.d.Leave("testnetwork", "testep")
|
|
overlay.Fini(r.d)
|
|
os.Exit(0)
|
|
}
|
|
}
|
|
}
|