diff --git a/e2e/etcd_config_test.go b/e2e/etcd_config_test.go index eedd9106e..9cdfbb062 100644 --- a/e2e/etcd_config_test.go +++ b/e2e/etcd_config_test.go @@ -84,3 +84,32 @@ func TestEtcdMultiPeer(t *testing.T) { } } } + +// TestEtcdUnixPeers checks that etcd will boot with unix socket peers. +func TestEtcdUnixPeers(t *testing.T) { + d, err := ioutil.TempDir("", "e1.etcd") + if err != nil { + t.Fatal(err) + } + defer os.RemoveAll(d) + proc, err := spawnCmd( + []string{ + binDir + "/etcd", + "--data-dir", d, + "--name", "e1", + "--listen-peer-urls", "unix://etcd.unix:1", + "--initial-advertise-peer-urls", "unix://etcd.unix:1", + "--initial-cluster", "e1=unix://etcd.unix:1", + }, + ) + defer os.Remove("etcd.unix:1") + if err != nil { + t.Fatal(err) + } + if err = waitReadyExpectProc(proc, etcdServerReadyLines); err != nil { + t.Fatal(err) + } + if err = proc.Stop(); err != nil { + t.Fatal(err) + } +} diff --git a/pkg/netutil/netutil.go b/pkg/netutil/netutil.go index 5e38dc98d..6f7b56abb 100644 --- a/pkg/netutil/netutil.go +++ b/pkg/netutil/netutil.go @@ -92,15 +92,19 @@ func resolveTCPAddrs(ctx context.Context, urls [][]url.URL) ([][]url.URL, error) } func resolveURL(ctx context.Context, u url.URL) (string, error) { + if u.Scheme == "unix" || u.Scheme == "unixs" { + // unix sockets don't resolve over TCP + return "", nil + } + host, _, err := net.SplitHostPort(u.Host) + if err != nil { + plog.Errorf("could not parse url %s during tcp resolving", u.Host) + return "", err + } + if host == "localhost" || net.ParseIP(host) != nil { + return "", nil + } for ctx.Err() == nil { - host, _, err := net.SplitHostPort(u.Host) - if err != nil { - plog.Errorf("could not parse url %s during tcp resolving", u.Host) - return "", err - } - if host == "localhost" || net.ParseIP(host) != nil { - return "", nil - } tcpAddr, err := resolveTCPAddr(ctx, u.Host) if err == nil { plog.Infof("resolving %s to %s", u.Host, tcpAddr.String())