diff --git a/pkg/util/kubernetes.go b/pkg/util/kubernetes.go index 8a444e9d3..df3f5785c 100644 --- a/pkg/util/kubernetes.go +++ b/pkg/util/kubernetes.go @@ -65,42 +65,48 @@ type KubernetesSecret struct { Data map[string]string `json:"data,omitempty"` } -// GetServiceURL takes a default service URL, a service name and a service port, +// GetServiceURL takes a service name, a service port, and a default service URL, // and returns a URL for accessing the service. It first looks for an environment // variable set by Kubernetes by transposing the service name. If it can't find -// one, it looks up the service name in DNS. If that fails, it returns the default -// service URL. -func GetServiceURL(serviceURL, serviceName, servicePort string) string { - if serviceURL == "" { - serviceURL = MakeEnvVariableURL(serviceName) - if serviceURL == "" { +// one, it looks up the service name in DNS. If that doesn't work, it returns the +// default service URL. If that's empty, it returns an HTTP localhost URL for the +// service port. If service port is empty, it panics. +func GetServiceURL(serviceName, servicePort, serviceURL string) (string, error) { + if serviceName != "" { + varBase := strings.Replace(serviceName, "-", "_", -1) + varName := strings.ToUpper(varBase) + "_PORT" + serviceURL := os.Getenv(varName) + if serviceURL != "" { + return strings.Replace(serviceURL, "tcp", "http", 1), nil + } + + if servicePort != "" { addrs, err := net.LookupHost(serviceName) - if err != nil || len(addrs) < 1 { - log.Fatalf("cannot resolve service:%v. environment:%v\n", serviceName, os.Environ()) + if err == nil && len(addrs) > 0 { + return fmt.Sprintf("http://%s:%s", addrs[0], servicePort), nil } - - serviceURL = fmt.Sprintf("http://%s:%s", addrs[0], servicePort) } } - return serviceURL -} + if serviceURL != "" { + return serviceURL, nil + } -// MakeEnvVariableURL takes a service name and returns the value of the -// environment variable that identifies its URL, if it exists, or the empty -// string, if it doesn't. -func MakeEnvVariableURL(str string) string { - prefix := MakeEnvVariableName(str) - url := os.Getenv(prefix + "_PORT") - return strings.Replace(url, "tcp", "http", 1) + if servicePort != "" { + serviceURL = fmt.Sprintf("http://localhost:%s", servicePort) + return serviceURL, nil + } + + err := fmt.Errorf("cannot resolve service:%v in environment:%v\n", serviceName, os.Environ()) + return "", err } -// MakeEnvVariableName is copied from the Kubernetes source, -// which is referenced by the documentation for service environment variables. -func MakeEnvVariableName(str string) string { - // TODO: If we simplify to "all names are DNS1123Subdomains" this - // will need two tweaks: - // 1) Handle leading digits - // 2) Handle dots - return strings.ToUpper(strings.Replace(str, "-", "_", -1)) +// GetServiceURLOrDie calls GetServiceURL and exits if it returns an error. +func GetServiceURLOrDie(serviceName, servicePort, serviceURL string) string { + URL, err := GetServiceURL(serviceName, servicePort, serviceURL) + if err != nil { + log.Fatal(err) + } + + return URL }