refactor connection establishment

This commit is contained in:
Leo Antunes 2018-08-20 22:51:07 +02:00
parent a7f3eb52f6
commit 7bf4e645ec
2 changed files with 67 additions and 66 deletions

View file

@ -6,6 +6,10 @@ import (
"strings"
"docker.io/go-docker/api/types"
"docker.io/go-docker/api/types/events"
"docker.io/go-docker/api/types/filters"
"github.com/cenkalti/backoff"
log "github.com/sirupsen/logrus"
)
type ipsToNamesMap map[string][]string
@ -13,6 +17,8 @@ type ipsToNamesMap map[string][]string
type dockerClienter interface {
ContainerList(context.Context, types.ContainerListOptions) ([]types.Container, error)
ContainerInspect(context.Context, string) (types.ContainerJSON, error)
Events(context.Context, types.EventsOptions) (<-chan events.Message, <-chan error)
Ping(context.Context) (types.Ping, error)
}
func getAllIPsToNames(client dockerClienter) (ipsToNamesMap, error) {
@ -73,3 +79,60 @@ func getIPsToNames(client dockerClienter, id string) (ipsToNamesMap, error) {
return ipsToNames, nil
}
func listenForEvents(client dockerClienter) {
eventOpts := types.EventsOptions{
Filters: filters.NewArgs(
filters.Arg("type", "container"),
filters.Arg("event", "start"),
filters.Arg("event", "die"),
),
}
events, errors := client.Events(context.Background(), eventOpts)
loop:
for {
select {
case event := <-events:
switch event.Action {
case "start":
ipsToNames, err := getIPsToNames(client, event.Actor.Attributes["name"])
if err != nil {
log.WithFields(
log.Fields{"container": event.Actor.ID},
).Errorf("could not get info for container: %s", err)
continue
}
err = addToEtcHosts(ipsToNames)
if err != nil {
log.WithFields(
log.Fields{"container": event.Actor.ID},
).Errorf("could not add container to hosts file: %s", err)
}
case "die":
// We remove by name because we cannot get the container's IP after it has been stopped.
// Names are supposed to be kept unique by the docker deamon.
removeFromEtcHosts(event.Actor.Attributes["name"])
}
case err := <-errors:
log.Errorf("error fetching event: %s", err)
break loop
}
}
}
func waitForConnection(client dockerClienter) {
err := backoff.Retry(func() error {
log.Info("retrying connection to docker")
_, err := client.Ping(context.Background())
if err != nil {
return fmt.Errorf("error pinging docker server: %s", err)
}
return nil
}, backoff.NewExponentialBackOff())
if err != nil {
// we should not get here with infinite backoff
log.Fatal(err)
}
log.Info("connected to docker daemon")
}