"docker.sock" is used to access Docker API which is required to: 1. subscribe to Docker events to configure-arp, 2. query Docker network info to detect whether multicast should be enabled. 3. get list of Swarm peers before starting the plugin. (1) is currently not implemented. (2) is replaced by WEAVE_MULTICAST env var which can enable multicast for all Weave networks created by the plugin (not ideal, but better than nothing). (3) is fixed by not removing "restart.sentinel".
91 lines
2.4 KiB
Go
91 lines
2.4 KiB
Go
package plugin
|
|
|
|
import (
|
|
"net"
|
|
"os"
|
|
"path"
|
|
"strings"
|
|
|
|
"github.com/docker/libnetwork/ipamapi"
|
|
weaveapi "github.com/weaveworks/weave/api"
|
|
"github.com/weaveworks/weave/common"
|
|
"github.com/weaveworks/weave/common/docker"
|
|
weavenet "github.com/weaveworks/weave/net"
|
|
ipamplugin "github.com/weaveworks/weave/plugin/ipam"
|
|
netplugin "github.com/weaveworks/weave/plugin/net"
|
|
"github.com/weaveworks/weave/plugin/skel"
|
|
)
|
|
|
|
const (
|
|
pluginV2Name = "net-plugin"
|
|
MulticastOption = netplugin.MulticastOption
|
|
)
|
|
|
|
var Log = common.Log
|
|
|
|
func Start(weaveAPIAddr string, dockerClient *docker.Client, address string, meshAddress string, dns bool, isPluginV2, forceMulticast bool) {
|
|
weave := weaveapi.NewClient(weaveAPIAddr, Log)
|
|
|
|
Log.Info("Waiting for Weave API Server...")
|
|
weave.WaitAPIServer(30)
|
|
Log.Info("Finished waiting for Weave API Server")
|
|
|
|
if err := run(dockerClient, weave, address, meshAddress, dns, isPluginV2, forceMulticast); err != nil {
|
|
Log.Fatal(err)
|
|
}
|
|
}
|
|
|
|
func run(dockerClient *docker.Client, weave *weaveapi.Client, address, meshAddress string, dns, isPluginV2, forceMulticast bool) error {
|
|
endChan := make(chan error, 1)
|
|
|
|
if address != "" {
|
|
globalListener, err := listenAndServe(dockerClient, weave, address, endChan, "global", false, dns, isPluginV2, forceMulticast)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
defer os.Remove(address)
|
|
defer globalListener.Close()
|
|
}
|
|
if meshAddress != "" {
|
|
meshListener, err := listenAndServe(dockerClient, weave, meshAddress, endChan, "local", true, dns, isPluginV2, forceMulticast)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
defer os.Remove(meshAddress)
|
|
defer meshListener.Close()
|
|
}
|
|
|
|
return <-endChan
|
|
}
|
|
|
|
func listenAndServe(dockerClient *docker.Client, weave *weaveapi.Client, address string, endChan chan<- error, scope string, withIpam, dns bool, isPluginV2, forceMulticast bool) (net.Listener, error) {
|
|
var name string
|
|
if isPluginV2 {
|
|
name = pluginV2Name
|
|
} else {
|
|
name = strings.TrimSuffix(path.Base(address), ".sock")
|
|
}
|
|
|
|
d, err := netplugin.New(dockerClient, weave, name, scope, dns, isPluginV2, forceMulticast)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
var i ipamapi.Ipam
|
|
if withIpam {
|
|
i = ipamplugin.NewIpam(weave)
|
|
}
|
|
|
|
listener, err := weavenet.ListenUnixSocket(address)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
Log.Printf("Listening on %s for %s scope", address, scope)
|
|
|
|
go func() {
|
|
endChan <- skel.Listen(listener, d, i)
|
|
}()
|
|
|
|
return listener, nil
|
|
}
|