15954: Start websocket and keepstore.
[arvados.git] / lib / service / cmd.go
index 0391c5a043dd75e6d3cdaa38f6ba31c9c4dec3ca..48912b8898c4cce944c43f3879c4a03ac25a87f8 100644 (file)
@@ -12,14 +12,15 @@ import (
        "io"
        "net"
        "net/http"
+       "net/url"
        "os"
        "strings"
 
-       "git.curoverse.com/arvados.git/lib/cmd"
-       "git.curoverse.com/arvados.git/lib/config"
-       "git.curoverse.com/arvados.git/sdk/go/arvados"
-       "git.curoverse.com/arvados.git/sdk/go/ctxlog"
-       "git.curoverse.com/arvados.git/sdk/go/httpserver"
+       "git.arvados.org/arvados.git/lib/cmd"
+       "git.arvados.org/arvados.git/lib/config"
+       "git.arvados.org/arvados.git/sdk/go/arvados"
+       "git.arvados.org/arvados.git/sdk/go/ctxlog"
+       "git.arvados.org/arvados.git/sdk/go/httpserver"
        "github.com/coreos/go-systemd/daemon"
        "github.com/prometheus/client_golang/prometheus"
        "github.com/sirupsen/logrus"
@@ -164,23 +165,34 @@ func getListenAddr(svcs arvados.Services, prog arvados.ServiceName, log logrus.F
        if !ok {
                return arvados.URL{}, fmt.Errorf("unknown service name %q", prog)
        }
+
+       if want := os.Getenv("ARVADOS_SERVICE_INTERNAL_URL"); want == "" {
+       } else if url, err := url.Parse(want); err != nil {
+               return arvados.URL{}, fmt.Errorf("$ARVADOS_SERVICE_INTERNAL_URL (%q): %s", want, err)
+       } else {
+               return arvados.URL(*url), nil
+       }
+
+       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{}