Преглед на файлове

Add ovrouter binary

Add support for ovrouter biinary which can
act as both an independent integration test
tool to test overlay driver without libnetwork
as well as convert overlay driver into a plugin
in the future.

Signed-off-by: Jana Radhakrishnan <mrjana@docker.com>
Jana Radhakrishnan преди 10 години
родител
ревизия
ec68d342d1
променени са 1 файла, в които са добавени 149 реда и са изтрити 0 реда
  1. 149 0
      libnetwork/cmd/ovrouter/ovrouter.go

+ 149 - 0
libnetwork/cmd/ovrouter/ovrouter.go

@@ -0,0 +1,149 @@
+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/docker/libnetwork/types"
+	"github.com/vishvananda/netlink"
+)
+
+type router struct {
+	d driverapi.Driver
+}
+
+type endpoint struct {
+	addr net.IPNet
+	mac  net.HardwareAddr
+	name string
+	id   int
+}
+
+func (r *router) RegisterDriver(name string, driver driverapi.Driver, c driverapi.Capability) error {
+	r.d = driver
+	return nil
+}
+
+func (ep *endpoint) Interfaces() []driverapi.InterfaceInfo {
+	return nil
+}
+
+func (ep *endpoint) AddInterface(ID int, mac net.HardwareAddr, ipv4 net.IPNet, ipv6 net.IPNet) error {
+	ep.id = ID
+	ep.addr = ipv4
+	ep.mac = mac
+	return nil
+}
+
+func (ep *endpoint) InterfaceNames() []driverapi.InterfaceNameInfo {
+	return []driverapi.InterfaceNameInfo{ep}
+
+}
+
+func (ep *endpoint) SetNames(srcName, dstPrefix string) error {
+	ep.name = srcName
+	return nil
+}
+
+func (ep *endpoint) ID() int {
+	return ep.id
+}
+
+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, interfaceID int) error {
+	return nil
+}
+
+func (ep *endpoint) SetHostsPath(string) error {
+	return nil
+}
+
+func (ep *endpoint) SetResolvConfPath(string) error {
+	return nil
+}
+
+func main() {
+	if reexec.Init() {
+		return
+	}
+
+	r := &router{}
+	if err := overlay.Init(r); err != nil {
+		fmt.Printf("Failed to initialize overlay driver: %v\n", err)
+		os.Exit(1)
+	}
+
+	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.d.Config(opt)
+
+	if err := r.d.CreateNetwork(types.UUID("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(types.UUID("testnetwork"), types.UUID("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(types.UUID("testnetwork"), types.UUID("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(types.UUID("testnetwork"), types.UUID("testep"))
+			overlay.Fini(r.d)
+			os.Exit(0)
+		}
+	}
+}