diff --git a/common/docker/client.go b/common/docker/client.go index 6a4eaff1..ded610b3 100644 --- a/common/docker/client.go +++ b/common/docker/client.go @@ -80,3 +80,16 @@ func (c *Client) IsContainerNotRunning(idStr string) bool { Log.Errorf("[docker] Could not check container status: %s", err) return false } + +func (c *Client) GetContainerBridgeIP(nameOrID string) (string, error) { + Log.Debugf("Getting IP for container %s", nameOrID) + info, err := c.InspectContainer(nameOrID) + if err != nil { + return "", err + } + return info.NetworkSettings.IPAddress, nil +} + +func (c *Client) InspectContainer(nameOrId string) (*docker.Container, error) { + return c.Client.InspectContainer(nameOrId) +} diff --git a/plugin/dns.go b/plugin/dns.go index 27652cfe..526d46bd 100644 --- a/plugin/dns.go +++ b/plugin/dns.go @@ -8,7 +8,7 @@ import ( ) func (d *dockerer) registerWithDNS(ID string, fqdn string, ip string) error { - dnsip, err := d.getContainerBridgeIP(WeaveDNSContainer) + dnsip, err := d.client.GetContainerBridgeIP(WeaveContainer) if err != nil { return fmt.Errorf("nameserver not available: %s", err) } @@ -33,7 +33,7 @@ func (d *dockerer) registerWithDNS(ID string, fqdn string, ip string) error { } func (d *dockerer) deregisterWithDNS(ID string, ip string) error { - dnsip, err := d.getContainerBridgeIP(WeaveDNSContainer) + dnsip, err := d.client.GetContainerBridgeIP(WeaveContainer) if err != nil { return fmt.Errorf("nameserver not available: %s", err) } diff --git a/plugin/docker.go b/plugin/docker.go index d7b4b337..4934d737 100644 --- a/plugin/docker.go +++ b/plugin/docker.go @@ -1,23 +1,9 @@ package plugin import ( - "github.com/fsouza/go-dockerclient" - . "github.com/weaveworks/weave/common" + "github.com/weaveworks/weave/common/docker" ) type dockerer struct { client *docker.Client } - -func (d *dockerer) getContainerBridgeIP(nameOrID string) (string, error) { - Log.Debugf("Getting IP for container %s", nameOrID) - info, err := d.InspectContainer(nameOrID) - if err != nil { - return "", err - } - return info.NetworkSettings.IPAddress, nil -} - -func (d *dockerer) InspectContainer(nameOrId string) (*docker.Container, error) { - return d.client.InspectContainer(nameOrId) -} diff --git a/plugin/driver.go b/plugin/driver.go index 8467c58f..85cded7c 100644 --- a/plugin/driver.go +++ b/plugin/driver.go @@ -7,10 +7,10 @@ import ( "github.com/docker/libnetwork/types" . "github.com/weaveworks/weave/common" + "github.com/weaveworks/weave/common/docker" "github.com/weaveworks/weave/common/odp" "github.com/weaveworks/weave/plugin/skel" - docker "github.com/fsouza/go-dockerclient" "github.com/vishvananda/netlink" ) diff --git a/plugin/ipam.go b/plugin/ipam.go index 927f7fff..bbc28aaf 100644 --- a/plugin/ipam.go +++ b/plugin/ipam.go @@ -10,7 +10,7 @@ import ( ) func (d *dockerer) ipamOp(ID string, op string) (*net.IPNet, error) { - weaveip, err := d.getContainerBridgeIP(WeaveContainer) + weaveip, err := d.client.GetContainerBridgeIP(WeaveContainer) Log.Debugf("IPAM operation %s for %s", op, ID) if err != nil { return nil, err @@ -52,7 +52,7 @@ func (d *dockerer) lookupIP(ID string) (*net.IPNet, error) { // release an IP which is no longer needed func (d *dockerer) releaseIP(ID string) error { - weaveip, err := d.getContainerBridgeIP(WeaveContainer) + weaveip, err := d.client.GetContainerBridgeIP(WeaveContainer) if err != nil { return err } diff --git a/plugin/watcher.go b/plugin/watcher.go index 50f87dd5..1bfafd03 100644 --- a/plugin/watcher.go +++ b/plugin/watcher.go @@ -4,19 +4,16 @@ import ( "fmt" "strings" - "github.com/fsouza/go-dockerclient" . "github.com/weaveworks/weave/common" + "github.com/weaveworks/weave/common/docker" ) const ( - WeaveDNSContainer = "weavedns" - WeaveDomain = "weave.local" + WeaveDomain = "weave.local" ) type watcher struct { dockerer - networks map[string]bool - events chan *docker.APIEvents } type Watcher interface { @@ -27,31 +24,18 @@ func NewWatcher(client *docker.Client) (Watcher, error) { dockerer: dockerer{ client: client, }, - networks: make(map[string]bool), - events: make(chan *docker.APIEvents), } - err := client.AddEventListener(w.events) + err := client.AddObserver(w) if err != nil { return nil, err } - go func() { - for event := range w.events { - switch event.Status { - case "start": - w.ContainerStart(event.ID) - case "die": - w.ContainerDied(event.ID) - } - } - }() - return w, nil } -func (w *watcher) ContainerStart(id string) { +func (w *watcher) ContainerStarted(id string) { Log.Debugf("Container started %s", id) - info, err := w.InspectContainer(id) + info, err := w.client.InspectContainer(id) if err != nil { Log.Warningf("error inspecting container: %s", err) return @@ -69,7 +53,7 @@ func (w *watcher) ContainerStart(id string) { func (w *watcher) ContainerDied(id string) { Log.Debugf("Container died %s", id) - info, err := w.InspectContainer(id) + info, err := w.client.InspectContainer(id) if err != nil { Log.Warningf("error inspecting container: %s", err) return