// restoreContainers loads all running containers and inserts // them into skydns when skydock starts func restoreContainers() error { containers, err := dockerClient.FetchAllContainers() if err != nil { return err } var container *docker.Container for _, cnt := range containers { uuid := utils.Truncate(cnt.Id) if container, err = dockerClient.FetchContainer(uuid, cnt.Image); err != nil { if err != docker.ErrImageNotTagged { log.Logf(log.ERROR, "failed to fetch %s on restore: %s", cnt.Id, err) } continue } service, err := plugins.createService(container) if err != nil { // doing a fatal here because we cannot do much if the plugins // return an invalid service or error fatal(err) } if err := sendService(uuid, service); err != nil { log.Logf(log.ERROR, "failed to send %s to skydns on restore: %s", uuid, err) } } return nil }
func eventHandler(c chan *docker.Event, group *sync.WaitGroup) { defer group.Done() for event := range c { log.Logf(log.DEBUG, "received event (%s) %s %s", event.Status, event.ContainerId, event.Image) uuid := utils.Truncate(event.ContainerId) switch event.Status { case "die", "stop", "kill": if err := removeService(uuid); err != nil { log.Logf(log.ERROR, "error removing %s from skydns: %s", uuid, err) } case "start", "restart": if err := addService(uuid, event.Image); err != nil { log.Logf(log.ERROR, "error adding %s to skydns: %s", uuid, err) } } } }