diff --git a/etcd/etcd.go b/etcd/etcd.go index 7fe0c9cab..ced79ebe4 100644 --- a/etcd/etcd.go +++ b/etcd/etcd.go @@ -166,7 +166,17 @@ func (s *Server) Run() error { } log.Printf("id=%x server.run source=-discovery seeds=\"%v\"\n", s.id, seeds) } else { - seeds = s.cfg.Peers + for _, p := range s.cfg.Peers { + u, err := url.Parse(p) + if err != nil { + log.Printf("id=%x server.run err=%q", err) + continue + } + if u.Scheme == "" { + u.Scheme = s.cfg.PeerTLSInfo().Scheme() + } + seeds = append(seeds, u.String()) + } log.Printf("id=%x server.run source=-peers seeds=\"%v\"\n", s.id, seeds) } s.peerHub.setSeeds(seeds) diff --git a/etcd/etcd_functional_test.go b/etcd/etcd_functional_test.go index 9e8472855..cf7826f8b 100644 --- a/etcd/etcd_functional_test.go +++ b/etcd/etcd_functional_test.go @@ -18,6 +18,7 @@ package etcd import ( "math/rand" + "net/url" "reflect" "testing" "time" @@ -103,6 +104,31 @@ func TestJoinThroughFollower(t *testing.T) { } } +func TestJoinWithoutHTTPScheme(t *testing.T) { + bt := &testServer{} + bt.Start() + + cl := testCluster{nodes: []*testServer{bt}} + seed := bt.URL + u, err := url.Parse(seed) + if err != nil { + t.Fatal(err) + } + // remove HTTP scheme + seed = u.Host + u.Path + + for i := 1; i < 3; i++ { + c := newTestConfig() + c.Peers = []string{seed} + ts := &testServer{Config: c, Id: int64(i)} + ts.Start() + ts.WaitMode(participantMode) + cl.nodes = append(cl.nodes, ts) + cl.Leader() + } + cl.Destroy() +} + func TestClusterConfigReload(t *testing.T) { defer afterTest(t)