diff --git a/nameserver/dns_test.go b/nameserver/dns_test.go index 13bc6153..74768715 100644 --- a/nameserver/dns_test.go +++ b/nameserver/dns_test.go @@ -18,7 +18,7 @@ import ( func startServer(t *testing.T, upstream *dns.ClientConfig) (*DNSServer, *Nameserver, int, int) { peername, err := router.PeerNameFromString("00:00:00:02:00:00") require.Nil(t, err) - nameserver := New(peername, nil, nil, "") + nameserver := New(peername, nil, "") dnsserver, err := NewDNSServer(nameserver, "weave.local.", "0.0.0.0:0", "", 30, 5*time.Second) require.Nil(t, err) udpPort := dnsserver.servers[0].PacketConn.LocalAddr().(*net.UDPAddr).Port diff --git a/nameserver/http.go b/nameserver/http.go index 771a1e23..29311d4c 100644 --- a/nameserver/http.go +++ b/nameserver/http.go @@ -8,6 +8,7 @@ import ( "github.com/gorilla/mux" "github.com/miekg/dns" + "github.com/weaveworks/weave/common/docker" "github.com/weaveworks/weave/net/address" ) @@ -16,7 +17,7 @@ func (n *Nameserver) badRequest(w http.ResponseWriter, err error) { n.infof("%v", err) } -func (n *Nameserver) HandleHTTP(router *mux.Router) { +func (n *Nameserver) HandleHTTP(router *mux.Router, dockerCli *docker.Client) { router.Methods("GET").Path("/domain").HandlerFunc(func(w http.ResponseWriter, r *http.Request) { fmt.Fprint(w, n.domain) }) @@ -39,7 +40,7 @@ func (n *Nameserver) HandleHTTP(router *mux.Router) { return } - if r.FormValue("check-alive") == "true" && n.docker.IsContainerNotRunning(container) { + if r.FormValue("check-alive") == "true" && dockerCli != nil && dockerCli.IsContainerNotRunning(container) { n.infof("container '%s' is not running: removing", container) if err := n.Delete(hostname, container, ipStr, ip); err != nil { n.infof("failed to remove: %v", err) diff --git a/nameserver/nameserver.go b/nameserver/nameserver.go index 97797f84..19037804 100644 --- a/nameserver/nameserver.go +++ b/nameserver/nameserver.go @@ -11,7 +11,6 @@ import ( "github.com/miekg/dns" . "github.com/weaveworks/weave/common" - "github.com/weaveworks/weave/common/docker" "github.com/weaveworks/weave/net/address" "github.com/weaveworks/weave/router" ) @@ -41,18 +40,16 @@ type Nameserver struct { ourName router.PeerName domain string gossip router.Gossip - docker *docker.Client entries Entries peers *router.Peers quit chan struct{} } -func New(ourName router.PeerName, peers *router.Peers, docker *docker.Client, domain string) *Nameserver { +func New(ourName router.PeerName, peers *router.Peers, domain string) *Nameserver { ns := &Nameserver{ ourName: ourName, domain: dns.Fqdn(domain), peers: peers, - docker: docker, quit: make(chan struct{}), } if peers != nil { diff --git a/nameserver/nameserver_test.go b/nameserver/nameserver_test.go index 3d5d462c..581fe321 100644 --- a/nameserver/nameserver_test.go +++ b/nameserver/nameserver_test.go @@ -23,7 +23,7 @@ func makeNetwork(size int) ([]*Nameserver, *gossip.TestRouter) { for i := 0; i < size; i++ { name, _ := router.PeerNameFromString(fmt.Sprintf("%02d:00:00:02:00:00", i)) - nameserver := New(name, nil, nil, "") + nameserver := New(name, nil, "") nameserver.SetGossip(gossipRouter.Connect(nameserver.ourName, nameserver)) nameserver.Start() nameservers[i] = nameserver @@ -205,7 +205,7 @@ func testNameservers(t *testing.T) { func TestContainerAndPeerDeath(t *testing.T) { peername, err := router.PeerNameFromString("00:00:00:02:00:00") require.Nil(t, err) - nameserver := New(peername, nil, nil, "") + nameserver := New(peername, nil, "") err = nameserver.AddEntry("hostname", "containerid", peername, address.Address(0)) require.Nil(t, err) @@ -229,7 +229,7 @@ func TestTombstoneDeletion(t *testing.T) { peername, err := router.PeerNameFromString("00:00:00:02:00:00") require.Nil(t, err) - nameserver := New(peername, nil, nil, "") + nameserver := New(peername, nil, "") err = nameserver.AddEntry("hostname", "containerid", peername, address.Address(0)) require.Nil(t, err) diff --git a/prog/weaver/main.go b/prog/weaver/main.go index b8bd3326..b778b349 100644 --- a/prog/weaver/main.go +++ b/prog/weaver/main.go @@ -51,7 +51,7 @@ func main() { iprangeCIDR string ipsubnetCIDR string peerCount int - apiPath string + dockerAPI string peers []string noDNS bool dnsDomain string @@ -79,7 +79,7 @@ func main() { mflag.StringVar(&iprangeCIDR, []string{"#iprange", "#-iprange", "-ipalloc-range"}, "", "IP address range reserved for automatic allocation, in CIDR notation") mflag.StringVar(&ipsubnetCIDR, []string{"#ipsubnet", "#-ipsubnet", "-ipalloc-default-subnet"}, "", "subnet to allocate within by default, in CIDR notation") mflag.IntVar(&peerCount, []string{"#initpeercount", "#-initpeercount", "-init-peer-count"}, 0, "number of peers in network (for IP address allocation)") - mflag.StringVar(&apiPath, []string{"#api", "-api"}, "unix:///var/run/docker.sock", "Path to Docker API socket") + mflag.StringVar(&dockerAPI, []string{"#api", "#-api", "-docker-api"}, "", "Docker API endpoint, e.g. unix:///var/run/docker.sock") mflag.BoolVar(&noDNS, []string{"-no-dns"}, false, "disable DNS server") mflag.StringVar(&dnsDomain, []string{"-dns-domain"}, nameserver.DefaultDomain, "local domain to server requests for") mflag.StringVar(&dnsListenAddress, []string{"-dns-listen-address"}, nameserver.DefaultListenAddress, "address to listen on for DNS requests") @@ -175,18 +175,26 @@ func main() { router := weave.NewRouter(config, name, nickName) Log.Println("Our name is", router.Ourself) - dockerCli, err := docker.NewClient(apiPath) - if err != nil { - Log.Fatal("Unable to start docker client: ", err) + var dockerCli *docker.Client + if dockerAPI != "" { + dc, err := docker.NewClient(dockerAPI) + if err != nil { + Log.Fatal("Unable to start docker client: ", err) + } + dockerCli = dc + } + observeContainers := func(o docker.ContainerObserver) { + if dockerCli != nil { + if err = dockerCli.AddObserver(o); err != nil { + Log.Fatal("Unable to start watcher", err) + } + } } - var allocator *ipam.Allocator var defaultSubnet address.CIDR if iprangeCIDR != "" { allocator, defaultSubnet = createAllocator(router, iprangeCIDR, ipsubnetCIDR, determineQuorum(peerCount, peers)) - if err = dockerCli.AddObserver(allocator); err != nil { - Log.Fatal("Unable to start watcher", err) - } + observeContainers(allocator) } else if peerCount > 0 { Log.Fatal("--init-peer-count flag specified without --ipalloc-range") } @@ -196,11 +204,9 @@ func main() { dnsserver *nameserver.DNSServer ) if !noDNS { - ns = nameserver.New(router.Ourself.Peer.Name, router.Peers, dockerCli, dnsDomain) + ns = nameserver.New(router.Ourself.Peer.Name, router.Peers, dnsDomain) ns.SetGossip(router.NewGossip("nameserver", ns)) - if err = dockerCli.AddObserver(ns); err != nil { - Log.Fatal("Unable to start watcher", err) - } + observeContainers(ns) ns.Start() defer ns.Stop() dnsserver, err = nameserver.NewDNSServer(ns, dnsDomain, dnsListenAddress, @@ -226,7 +232,7 @@ func main() { allocator.HandleHTTP(muxRouter, defaultSubnet, dockerCli) } if ns != nil { - ns.HandleHTTP(muxRouter) + ns.HandleHTTP(muxRouter, dockerCli) } router.HandleHTTP(muxRouter) HandleHTTP(muxRouter, version, router, allocator, defaultSubnet, ns, dnsserver) diff --git a/weave b/weave index 4b0bdba5..62c277f0 100755 --- a/weave +++ b/weave @@ -1187,7 +1187,7 @@ launch_router() { -v /var/run/docker.sock:/var/run/docker.sock \ -e WEAVE_PASSWORD \ -e WEAVE_CIDR=none \ - $WEAVE_DOCKER_ARGS $IMAGE $COVERAGE_ARGS --iface $CONTAINER_IFNAME --port $CONTAINER_PORT --name "$PEERNAME" --nickname "$(hostname)" --ipalloc-range "$IPRANGE" --dns-effective-listen-address "$DOCKER_BRIDGE_IP" "$@") + $WEAVE_DOCKER_ARGS $IMAGE $COVERAGE_ARGS --iface $CONTAINER_IFNAME --port $CONTAINER_PORT --name "$PEERNAME" --nickname "$(hostname)" --ipalloc-range "$IPRANGE" --dns-effective-listen-address "$DOCKER_BRIDGE_IP" --docker-api "unix:///var/run/docker.sock" "$@") with_container_netns_or_die $ROUTER_CONTAINER launch err_msg=$(death_msg $CONTAINER_NAME) container_ip $CONTAINER_NAME "$err_msg" "$err_msg" || return 1