From 181b5632bf242dcb07366cc29ba17567a7f0129f Mon Sep 17 00:00:00 2001 From: Agniva De Sarker Date: Fri, 17 Jul 2020 14:32:07 +0530 Subject: [PATCH] MM-26883/26884: properly identify interface name for test services (#15040) * MM-26883/26884: properly identify interface name for test services We were just hardcoding to dockerhost which would only work inside a CI environment. This PR generalizes the logic to use fallbacks if dockerhost is not available. * Incorporate review comments --- utils/testutils/testutils.go | 46 ++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/utils/testutils/testutils.go b/utils/testutils/testutils.go index 3ad1b16d60..27a865381d 100644 --- a/utils/testutils/testutils.go +++ b/utils/testutils/testutils.go @@ -6,8 +6,13 @@ package testutils import ( "bytes" "io" + "net" "os" + "os/exec" "path/filepath" + "runtime" + "strconv" + "time" "github.com/mattermost/mattermost-server/v5/utils/fileutils" ) @@ -27,3 +32,44 @@ func ReadTestFile(name string) ([]byte, error) { return data.Bytes(), nil } } + +// GetInterface returns the best match of an interface that might be listening on a given port. +// This is helpful when a test is being run in a CI environment under docker. +func GetInterface(port int) string { + dial := func(iface string, port int) bool { + c, err := net.DialTimeout("tcp", iface+":"+strconv.Itoa(port), time.Second) + if err != nil { + return false + } + c.Close() + return true + } + // First, we check dockerhost + iface := "dockerhost" + if ok := dial(iface, port); ok { + return iface + } + // If not, we check localhost + iface = "localhost" + if ok := dial(iface, port); ok { + return iface + } + // If nothing works, we just attempt to use a hack and get the interface IP. + // https://stackoverflow.com/a/37212665/4962526. + cmdStr := "" + switch runtime.GOOS { + // Using ip address for Linux, ifconfig for Darwin. + case "linux": + cmdStr = `ip address | grep -E "([0-9]{1,3}\.){3}[0-9]{1,3}" | grep -v 127.0.0.1 | awk '{ print $2 }' | cut -f2 -d: | cut -f1 -d/ | head -n1` + case "darwin": + cmdStr = `ifconfig | grep -E "([0-9]{1,3}\.){3}[0-9]{1,3}" | grep -v 127.0.0.1 | awk '{ print $2 }' | cut -f2 -d: | head -n1` + default: + return "" + } + cmd := exec.Command("bash", "-c", cmdStr) + out, err := cmd.CombinedOutput() + if err != nil { + return "" + } + return string(out) +}