github.com/jfrazelle/docker@v1.1.2-0.20210712172922-bf78e25fe508/libnetwork/cmd/ovrouter/ovrouter.go (about) 1 // +build linux 2 3 package main 4 5 import ( 6 "fmt" 7 "net" 8 "os" 9 "os/signal" 10 11 "github.com/docker/docker/libnetwork/driverapi" 12 "github.com/docker/docker/libnetwork/drivers/overlay" 13 "github.com/docker/docker/libnetwork/netlabel" 14 "github.com/docker/docker/libnetwork/types" 15 "github.com/docker/docker/pkg/plugingetter" 16 "github.com/docker/docker/pkg/reexec" 17 "github.com/vishvananda/netlink" 18 ) 19 20 type router struct { 21 d driverapi.Driver 22 } 23 24 type endpoint struct { 25 addr *net.IPNet 26 mac net.HardwareAddr 27 name string 28 } 29 30 func (r *router) GetPluginGetter() plugingetter.PluginGetter { 31 return nil 32 } 33 34 func (r *router) RegisterDriver(name string, driver driverapi.Driver, c driverapi.Capability) error { 35 r.d = driver 36 return nil 37 } 38 39 func (ep *endpoint) Interface() driverapi.InterfaceInfo { 40 return nil 41 } 42 43 func (ep *endpoint) SetMacAddress(mac net.HardwareAddr) error { 44 if ep.mac != nil { 45 return types.ForbiddenErrorf("endpoint interface MAC address present (%s). Cannot be modified with %s.", ep.mac, mac) 46 } 47 if mac == nil { 48 return types.BadRequestErrorf("tried to set nil MAC address to endpoint interface") 49 } 50 ep.mac = types.GetMacCopy(mac) 51 return nil 52 } 53 54 func (ep *endpoint) SetIPAddress(address *net.IPNet) error { 55 if address.IP == nil { 56 return types.BadRequestErrorf("tried to set nil IP address to endpoint interface") 57 } 58 if address.IP.To4() == nil { 59 return types.NotImplementedErrorf("do not support ipv6 yet") 60 } 61 if ep.addr != nil { 62 return types.ForbiddenErrorf("endpoint interface IP present (%s). Cannot be modified with %s.", ep.addr, address) 63 } 64 ep.addr = types.GetIPNetCopy(address) 65 return nil 66 } 67 68 func (ep *endpoint) MacAddress() net.HardwareAddr { 69 return types.GetMacCopy(ep.mac) 70 } 71 72 func (ep *endpoint) Address() *net.IPNet { 73 return types.GetIPNetCopy(ep.addr) 74 } 75 76 func (ep *endpoint) AddressIPv6() *net.IPNet { 77 return nil 78 } 79 80 func (ep *endpoint) InterfaceName() driverapi.InterfaceNameInfo { 81 return ep 82 } 83 84 func (ep *endpoint) SetNames(srcName, dstPrefix string) error { 85 ep.name = srcName 86 return nil 87 } 88 89 func (ep *endpoint) SetGateway(net.IP) error { 90 return nil 91 } 92 93 func (ep *endpoint) SetGatewayIPv6(net.IP) error { 94 return nil 95 } 96 97 func (ep *endpoint) AddStaticRoute(destination *net.IPNet, routeType int, 98 nextHop net.IP) error { 99 return nil 100 } 101 102 func (ep *endpoint) AddTableEntry(tableName string, key string, value []byte) error { 103 return nil 104 } 105 106 func (ep *endpoint) DisableGatewayService() {} 107 108 func main() { 109 if reexec.Init() { 110 return 111 } 112 113 opt := make(map[string]interface{}) 114 if len(os.Args) > 1 { 115 opt[netlabel.OverlayBindInterface] = os.Args[1] 116 } 117 if len(os.Args) > 2 { 118 opt[netlabel.OverlayNeighborIP] = os.Args[2] 119 } 120 if len(os.Args) > 3 { 121 opt[netlabel.GlobalKVProvider] = os.Args[3] 122 } 123 if len(os.Args) > 4 { 124 opt[netlabel.GlobalKVProviderURL] = os.Args[4] 125 } 126 127 r := &router{} 128 if err := overlay.Init(r, opt); err != nil { 129 fmt.Printf("Failed to initialize overlay driver: %v\n", err) 130 os.Exit(1) 131 } 132 133 if err := r.d.CreateNetwork("testnetwork", 134 map[string]interface{}{}, nil, nil, nil); err != nil { 135 fmt.Printf("Failed to create network in the driver: %v\n", err) 136 os.Exit(1) 137 } 138 139 ep := &endpoint{} 140 if err := r.d.CreateEndpoint("testnetwork", "testep", 141 ep, map[string]interface{}{}); err != nil { 142 fmt.Printf("Failed to create endpoint in the driver: %v\n", err) 143 os.Exit(1) 144 } 145 146 if err := r.d.Join("testnetwork", "testep", 147 "", ep, map[string]interface{}{}); err != nil { 148 fmt.Printf("Failed to join an endpoint in the driver: %v\n", err) 149 os.Exit(1) 150 } 151 152 link, err := netlink.LinkByName(ep.name) 153 if err != nil { 154 fmt.Printf("Failed to find the container interface with name %s: %v\n", 155 ep.name, err) 156 os.Exit(1) 157 } 158 159 ipAddr := &netlink.Addr{IPNet: ep.addr, Label: ""} 160 if err := netlink.AddrAdd(link, ipAddr); err != nil { 161 fmt.Printf("Failed to add address to the interface: %v\n", err) 162 os.Exit(1) 163 } 164 165 sigCh := make(chan os.Signal, 1) 166 signal.Notify(sigCh, os.Interrupt) 167 168 for range sigCh { 169 if err := r.d.Leave("testnetwork", "testep"); err != nil { 170 fmt.Printf("Error leaving: %v", err) 171 } 172 overlay.Fini(r.d) 173 os.Exit(0) 174 } 175 }