mirror of
https://github.com/moby/moby.git
synced 2022-11-09 12:21:53 -05:00
6e4a572529
This commit brings in the first implementation of overlay driver which makes use of vxlan tunneling protocol to create logical networks across multiple hosts. This is very much alpha code and should be used for demo and testing purposes only. Signed-off-by: Jana Radhakrishnan <mrjana@docker.com>
80 lines
1.9 KiB
Go
80 lines
1.9 KiB
Go
package overlay
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"github.com/docker/libnetwork/netutils"
|
|
"github.com/docker/libnetwork/types"
|
|
"github.com/vishvananda/netlink"
|
|
)
|
|
|
|
func validateID(nid, eid types.UUID) error {
|
|
if nid == "" {
|
|
return fmt.Errorf("invalid network id")
|
|
}
|
|
|
|
if eid == "" {
|
|
return fmt.Errorf("invalid endpoint id")
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func createVethPair() (string, string, error) {
|
|
// Generate a name for what will be the host side pipe interface
|
|
name1, err := netutils.GenerateIfaceName(vethPrefix, vethLen)
|
|
if err != nil {
|
|
return "", "", fmt.Errorf("error generating veth name1: %v", err)
|
|
}
|
|
|
|
// Generate a name for what will be the sandbox side pipe interface
|
|
name2, err := netutils.GenerateIfaceName(vethPrefix, vethLen)
|
|
if err != nil {
|
|
return "", "", fmt.Errorf("error generating veth name2: %v", err)
|
|
}
|
|
|
|
// Generate and add the interface pipe host <-> sandbox
|
|
veth := &netlink.Veth{
|
|
LinkAttrs: netlink.LinkAttrs{Name: name1, TxQLen: 0},
|
|
PeerName: name2}
|
|
if err := netlink.LinkAdd(veth); err != nil {
|
|
return "", "", fmt.Errorf("error creating veth pair: %v", err)
|
|
}
|
|
|
|
return name1, name2, nil
|
|
}
|
|
|
|
func createVxlan(vni uint32) (string, error) {
|
|
name, err := netutils.GenerateIfaceName("vxlan", 7)
|
|
if err != nil {
|
|
return "", fmt.Errorf("error generating vxlan name: %v", err)
|
|
}
|
|
|
|
vxlan := &netlink.Vxlan{
|
|
LinkAttrs: netlink.LinkAttrs{Name: name},
|
|
VxlanId: int(vni),
|
|
Learning: true,
|
|
Proxy: true,
|
|
L3miss: true,
|
|
L2miss: true,
|
|
}
|
|
|
|
if err := netlink.LinkAdd(vxlan); err != nil {
|
|
return "", fmt.Errorf("error creating vxlan interface: %v", err)
|
|
}
|
|
|
|
return name, nil
|
|
}
|
|
|
|
func deleteVxlan(name string) error {
|
|
link, err := netlink.LinkByName(name)
|
|
if err != nil {
|
|
return fmt.Errorf("failed to find vxlan interface with name %s: %v", name, err)
|
|
}
|
|
|
|
if err := netlink.LinkDel(link); err != nil {
|
|
return fmt.Errorf("error deleting vxlan interface: %v", err)
|
|
}
|
|
|
|
return nil
|
|
}
|