15717: If there are several InternalURLs for the same host, try them all
authorPeter Amstutz <pamstutz@veritasgenetics.com>
Tue, 15 Oct 2019 15:37:24 +0000 (11:37 -0400)
committerPeter Amstutz <pamstutz@veritasgenetics.com>
Tue, 15 Oct 2019 15:37:24 +0000 (11:37 -0400)
Arvados-DCO-1.1-Signed-off-by: Peter Amstutz <pamstutz@veritasgenetics.com>

lib/service/cmd.go

index 0391c5a043dd75e6d3cdaa38f6ba31c9c4dec3ca..70892cfc3a933e0addf17c6e1be899d2c0c031e4 100644 (file)
@@ -164,23 +164,26 @@ func getListenAddr(svcs arvados.Services, prog arvados.ServiceName, log logrus.F
        if !ok {
                return arvados.URL{}, fmt.Errorf("unknown service name %q", prog)
        }
+       errors := []string{}
        for url := range svc.InternalURLs {
-               if strings.HasPrefix(url.Host, "localhost:") {
-                       return url, nil
-               }
                listener, err := net.Listen("tcp", url.Host)
                if err == nil {
                        listener.Close()
                        return url, nil
                } else if strings.Contains(err.Error(), "cannot assign requested address") {
+                       // If 'Host' specifies a different server than
+                       // the current one, it'll resolve the hostname
+                       // to IP address, and then fail because it
+                       // can't bind an IP address it doesn't own.
                        continue
-               } else if strings.Contains(err.Error(), "address already in use") {
-                       return url, err
                } else {
-                       log.Warn(err)
+                       errors = append(errors, fmt.Sprintf("tried %v, got %v", url, err))
                }
        }
-       return arvados.URL{}, fmt.Errorf("configuration does not enable the %s service on this host", prog)
+       if len(errors) > 0 {
+               return arvados.URL{}, fmt.Errorf("could not enable the %q service on this host: %s", prog, strings.Join(errors, "; "))
+       }
+       return arvados.URL{}, fmt.Errorf("configuration does not enable the %q service on this host", prog)
 }
 
 type contextKeyURL struct{}