// serviceConfig constructs the config for all good instances of a single service. func serviceConfig(client *api.Client, name string, passing map[string]bool, tagPrefix string) (config []string) { if name == "" || len(passing) == 0 { return nil } q := &api.QueryOptions{RequireConsistent: true} svcs, _, err := client.Catalog().Service(name, "", q) if err != nil { log.Printf("[WARN] [%s] Error getting catalog service %s. %v", name, err) return nil } for _, svc := range svcs { // check if the instance is in the list of instances // which passed the health check if _, ok := passing[svc.ServiceID]; !ok { continue } for _, tag := range svc.ServiceTags { if host, path, ok := parseURLPrefixTag(tag, tagPrefix); ok { name, addr, port := svc.ServiceName, svc.ServiceAddress, svc.ServicePort if runtime.GOOS == "darwin" && !strings.Contains(addr, ".") { addr += ".local" } config = append(config, fmt.Sprintf("route add %s %s%s http://%s:%d/ tags %q", name, host, path, addr, port, strings.Join(svc.ServiceTags, ","))) } } } return config }