From 30b9d332760bd5dbc24fef19b8dc2b231ed8423d Mon Sep 17 00:00:00 2001 From: Adam Harrison Date: Wed, 20 Jan 2016 11:26:21 +0000 Subject: [PATCH 1/3] Adjust tests to accomodate docker/docker#14012 --- test/690_proxy_config_test.sh | 4 ++-- test/695_proxy_failure_modes_test.sh | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/test/690_proxy_config_test.sh b/test/690_proxy_config_test.sh index 11ddcbda..5359211b 100755 --- a/test/690_proxy_config_test.sh +++ b/test/690_proxy_config_test.sh @@ -34,8 +34,8 @@ assert_raises "proxy docker_on $HOST1 ps" weave_on $HOST1 stop-proxy # Booting it over tls errors -assert_raises "DOCKER_CLIENT_ARGS='--tls' weave_on $HOST1 launch-proxy" 1 -assert_raises "DOCKER_CERT_PATH='./tls' DOCKER_TLS_VERIFY=1 weave_on $HOST1 launch-proxy" 1 +assert_raises "! DOCKER_CLIENT_ARGS='--tls' weave_on $HOST1 launch-proxy" +assert_raises "! DOCKER_CERT_PATH='./tls' DOCKER_TLS_VERIFY=1 weave_on $HOST1 launch-proxy" # Booting it with a specific -H overrides defaults weave_on $HOST1 launch-proxy -H tcp://0.0.0.0:12345 diff --git a/test/695_proxy_failure_modes_test.sh b/test/695_proxy_failure_modes_test.sh index 45679ae4..aca0a5a8 100755 --- a/test/695_proxy_failure_modes_test.sh +++ b/test/695_proxy_failure_modes_test.sh @@ -6,7 +6,7 @@ start_suite "Proxy failure modes" # docker run should fail when weave router is not running weave_on $HOST1 launch-proxy -assert_raises "proxy docker_on $HOST1 run --rm $SMALL_IMAGE true" 1 +assert_raises "! proxy docker_on $HOST1 run --rm $SMALL_IMAGE true" assert_raises "proxy docker_on $HOST1 run --rm $SMALL_IMAGE true 2>&1 1>/dev/null | grep 'Error response from daemon: weave container is not present. Have you launched it?'" end_suite From 08e9db900a9bf0688b6c430de5abe57c715494ee Mon Sep 17 00:00:00 2001 From: Adam Harrison Date: Wed, 16 Mar 2016 09:23:32 +0000 Subject: [PATCH 2/3] Retry docker event subscription --- common/docker/client.go | 42 +++++++++++++++++++++++++++-------------- 1 file changed, 28 insertions(+), 14 deletions(-) diff --git a/common/docker/client.go b/common/docker/client.go index dabf3aec..8dcec712 100644 --- a/common/docker/client.go +++ b/common/docker/client.go @@ -4,12 +4,18 @@ import ( "errors" "fmt" "strings" + "time" docker "github.com/fsouza/go-dockerclient" . "github.com/weaveworks/weave/common" ) +const ( + InitialInterval = 1 * time.Second + MaxInterval = 60 * time.Second +) + // An observer for container events type ContainerObserver interface { ContainerStarted(ident string) @@ -72,21 +78,29 @@ func (c *Client) Info() string { // AddObserver adds an observer for docker events func (c *Client) AddObserver(ob ContainerObserver) error { - events := make(chan *docker.APIEvents) - if err := c.AddEventListener(events); err != nil { - Log.Errorf("[docker] Unable to add listener to Docker API: %s", err) - return err - } - go func() { - for event := range events { - switch event.Status { - case "start": - id := event.ID - ob.ContainerStarted(id) - case "die": - id := event.ID - ob.ContainerDied(id) + retryInterval := InitialInterval + for { + events := make(chan *docker.APIEvents) + if err := c.AddEventListener(events); err != nil { + Log.Errorf("[docker] Unable to add listener to Docker API: %s - retrying in %ds", err, retryInterval/time.Second) + } else { + for event := range events { + switch event.Status { + case "start": + id := event.ID + ob.ContainerStarted(id) + case "die": + id := event.ID + ob.ContainerDied(id) + } + } + Log.Errorf("[docker] Event listener channel closed - retrying subscription in %ds", retryInterval/time.Second) + } + time.Sleep(retryInterval) + retryInterval = retryInterval * 3 / 2 + if retryInterval > MaxInterval { + retryInterval = MaxInterval } } }() From 922f465ecba882c085f3c2b7ec9bdb066206a8ed Mon Sep 17 00:00:00 2001 From: Adam Harrison Date: Wed, 16 Mar 2016 13:38:50 +0000 Subject: [PATCH 3/3] Reset retry interval if we spent long enough processing events --- common/docker/client.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/common/docker/client.go b/common/docker/client.go index 8dcec712..e341b4f0 100644 --- a/common/docker/client.go +++ b/common/docker/client.go @@ -85,6 +85,7 @@ func (c *Client) AddObserver(ob ContainerObserver) error { if err := c.AddEventListener(events); err != nil { Log.Errorf("[docker] Unable to add listener to Docker API: %s - retrying in %ds", err, retryInterval/time.Second) } else { + start := time.Now() for event := range events { switch event.Status { case "start": @@ -95,6 +96,9 @@ func (c *Client) AddObserver(ob ContainerObserver) error { ob.ContainerDied(id) } } + if time.Since(start) > retryInterval { + retryInterval = InitialInterval + } Log.Errorf("[docker] Event listener channel closed - retrying subscription in %ds", retryInterval/time.Second) } time.Sleep(retryInterval)