From 15798a73d98b07acc85efaddf11cd80d466cc0e1 Mon Sep 17 00:00:00 2001 From: Yicheng Qin Date: Fri, 26 Sep 2014 16:50:15 -0700 Subject: [PATCH 1/3] etcdserver: return client urls for /v2/machines --- etcdserver/cluster.go | 14 ++++++++ etcdserver/cluster_test.go | 60 ++++++++++++++++++++++++++++++++ etcdserver/etcdhttp/http.go | 2 +- etcdserver/etcdhttp/http_test.go | 6 ++-- 4 files changed, 78 insertions(+), 4 deletions(-) diff --git a/etcdserver/cluster.go b/etcdserver/cluster.go index 793b63bad..ffb40ff39 100644 --- a/etcdserver/cluster.go +++ b/etcdserver/cluster.go @@ -112,3 +112,17 @@ func (c Cluster) Endpoints() []string { sort.Strings(endpoints) return endpoints } + +// ClientURLs returns a list of all client addresses. Each address is prefixed +// with the scheme (currently "http://"). The returned list is sorted in +// ascending lexicographical order. +func (c Cluster) ClientURLs() []string { + urls := make([]string, 0) + for _, p := range c { + for _, url := range p.ClientURLs { + urls = append(urls, addScheme(url)) + } + } + sort.Strings(urls) + return urls +} diff --git a/etcdserver/cluster_test.go b/etcdserver/cluster_test.go index 7ddf6d461..dc05832d9 100644 --- a/etcdserver/cluster_test.go +++ b/etcdserver/cluster_test.go @@ -1,6 +1,7 @@ package etcdserver import ( + "reflect" "testing" ) @@ -141,3 +142,62 @@ func TestClusterAddBad(t *testing.T) { } } } + +func TestClusterClientURLs(t *testing.T) { + tests := []struct { + mems []Member + wurls []string + }{ + // single peer with a single address + { + mems: []Member{ + {ID: 1, ClientURLs: []string{"192.0.2.1"}}, + }, + wurls: []string{"http://192.0.2.1"}, + }, + + // single peer with a single address with a port + { + mems: []Member{ + {ID: 1, ClientURLs: []string{"192.0.2.1:8001"}}, + }, + wurls: []string{"http://192.0.2.1:8001"}, + }, + + // several members explicitly unsorted + { + mems: []Member{ + {ID: 2, ClientURLs: []string{"192.0.2.3", "192.0.2.4"}}, + {ID: 3, ClientURLs: []string{"192.0.2.5", "192.0.2.6"}}, + {ID: 1, ClientURLs: []string{"192.0.2.1", "192.0.2.2"}}, + }, + wurls: []string{"http://192.0.2.1", "http://192.0.2.2", "http://192.0.2.3", "http://192.0.2.4", "http://192.0.2.5", "http://192.0.2.6"}, + }, + + // no members + { + mems: []Member{}, + wurls: []string{}, + }, + + // peer with no endpoints + { + mems: []Member{ + {ID: 3, ClientURLs: []string{}}, + }, + wurls: []string{}, + }, + } + + for i, tt := range tests { + c := Cluster{} + if err := c.AddSlice(tt.mems); err != nil { + t.Errorf("AddSlice error: %v", err) + continue + } + urls := c.ClientURLs() + if !reflect.DeepEqual(urls, tt.wurls) { + t.Errorf("#%d: ClientURLs = %v, want %v", i, tt.wurls, urls) + } + } +} diff --git a/etcdserver/etcdhttp/http.go b/etcdserver/etcdhttp/http.go index db9e4249f..e250e026d 100644 --- a/etcdserver/etcdhttp/http.go +++ b/etcdserver/etcdhttp/http.go @@ -115,7 +115,7 @@ func (h serverHandler) serveMachines(w http.ResponseWriter, r *http.Request) { if !allowMethod(w, r.Method, "GET", "HEAD") { return } - endpoints := h.clusterStore.Get().Endpoints() + endpoints := h.clusterStore.Get().ClientURLs() w.Write([]byte(strings.Join(endpoints, ", "))) } diff --git a/etcdserver/etcdhttp/http_test.go b/etcdserver/etcdhttp/http_test.go index 7e60e53bb..2e2b4cd92 100644 --- a/etcdserver/etcdhttp/http_test.go +++ b/etcdserver/etcdhttp/http_test.go @@ -612,9 +612,9 @@ func TestV2MachinesEndpoint(t *testing.T) { func TestServeMachines(t *testing.T) { cluster := &fakeCluster{ members: []etcdserver.Member{ - {ID: 0xBEEF0, PeerURLs: []string{"localhost:8080"}}, - {ID: 0xBEEF1, PeerURLs: []string{"localhost:8081"}}, - {ID: 0xBEEF2, PeerURLs: []string{"localhost:8082"}}, + {ID: 0xBEEF0, ClientURLs: []string{"localhost:8080"}}, + {ID: 0xBEEF1, ClientURLs: []string{"localhost:8081"}}, + {ID: 0xBEEF2, ClientURLs: []string{"localhost:8082"}}, }, } From e83f8519959a960d1fc7972ff105de513b504cd4 Mon Sep 17 00:00:00 2001 From: Yicheng Qin Date: Sun, 28 Sep 2014 14:35:48 -0700 Subject: [PATCH 2/3] etcdserver: move cluster test from etcdhttp to etcdserver --- etcdserver/cluster_test.go | 59 ++++++++++++++++++++++++++++++ etcdserver/etcdhttp/http_test.go | 62 -------------------------------- 2 files changed, 59 insertions(+), 62 deletions(-) diff --git a/etcdserver/cluster_test.go b/etcdserver/cluster_test.go index dc05832d9..228156f37 100644 --- a/etcdserver/cluster_test.go +++ b/etcdserver/cluster_test.go @@ -143,6 +143,65 @@ func TestClusterAddBad(t *testing.T) { } } +func TestClusterGetEndpoints(t *testing.T) { + tests := []struct { + mems []Member + endpoints []string + }{ + // single peer with a single address + { + mems: []Member{ + {ID: 1, PeerURLs: []string{"192.0.2.1"}}, + }, + endpoints: []string{"http://192.0.2.1"}, + }, + + // single peer with a single address with a port + { + mems: []Member{ + {ID: 1, PeerURLs: []string{"192.0.2.1:8001"}}, + }, + endpoints: []string{"http://192.0.2.1:8001"}, + }, + + // several members explicitly unsorted + { + mems: []Member{ + {ID: 2, PeerURLs: []string{"192.0.2.3", "192.0.2.4"}}, + {ID: 3, PeerURLs: []string{"192.0.2.5", "192.0.2.6"}}, + {ID: 1, PeerURLs: []string{"192.0.2.1", "192.0.2.2"}}, + }, + endpoints: []string{"http://192.0.2.1", "http://192.0.2.2", "http://192.0.2.3", "http://192.0.2.4", "http://192.0.2.5", "http://192.0.2.6"}, + }, + + // no members + { + mems: []Member{}, + endpoints: []string{}, + }, + + // peer with no endpoints + { + mems: []Member{ + {ID: 3, PeerURLs: []string{}}, + }, + endpoints: []string{}, + }, + } + + for i, tt := range tests { + c := Cluster{} + if err := c.AddSlice(tt.mems); err != nil { + t.Errorf("AddSlice error: %v", err) + continue + } + endpoints := c.Endpoints() + if !reflect.DeepEqual(tt.endpoints, endpoints) { + t.Errorf("#%d: members.Endpoints() incorrect: want=%#v got=%#v", i, tt.endpoints, endpoints) + } + } +} + func TestClusterClientURLs(t *testing.T) { tests := []struct { mems []Member diff --git a/etcdserver/etcdhttp/http_test.go b/etcdserver/etcdhttp/http_test.go index 2e2b4cd92..440ed6ee4 100644 --- a/etcdserver/etcdhttp/http_test.go +++ b/etcdserver/etcdhttp/http_test.go @@ -634,68 +634,6 @@ func TestServeMachines(t *testing.T) { } } -func TestClusterGetEndpoints(t *testing.T) { - tests := []struct { - clusterStore etcdserver.ClusterStore - endpoints []string - }{ - // single peer with a single address - { - clusterStore: &fakeCluster{ - members: []etcdserver.Member{ - {ID: 1, PeerURLs: []string{"192.0.2.1"}}, - }, - }, - endpoints: []string{"http://192.0.2.1"}, - }, - - // single peer with a single address with a port - { - clusterStore: &fakeCluster{ - members: []etcdserver.Member{ - {ID: 1, PeerURLs: []string{"192.0.2.1:8001"}}, - }, - }, - endpoints: []string{"http://192.0.2.1:8001"}, - }, - - // several members explicitly unsorted - { - clusterStore: &fakeCluster{ - members: []etcdserver.Member{ - {ID: 2, PeerURLs: []string{"192.0.2.3", "192.0.2.4"}}, - {ID: 3, PeerURLs: []string{"192.0.2.5", "192.0.2.6"}}, - {ID: 1, PeerURLs: []string{"192.0.2.1", "192.0.2.2"}}, - }, - }, - endpoints: []string{"http://192.0.2.1", "http://192.0.2.2", "http://192.0.2.3", "http://192.0.2.4", "http://192.0.2.5", "http://192.0.2.6"}, - }, - - // no members - { - clusterStore: &fakeCluster{members: []etcdserver.Member{}}, - endpoints: []string{}, - }, - - // peer with no endpoints - { - clusterStore: &fakeCluster{ - members: []etcdserver.Member{ - {ID: 3, PeerURLs: []string{}}, - }, - }, - endpoints: []string{}, - }, - } - - for i, tt := range tests { - endpoints := tt.clusterStore.Get().Endpoints() - if !reflect.DeepEqual(tt.endpoints, endpoints) { - t.Errorf("#%d: members.Endpoints() incorrect: want=%#v got=%#v", i, tt.endpoints, endpoints) - } - } -} - func TestAllowMethod(t *testing.T) { tests := []struct { m string From 5784693a39d60e41a67c7fffbd9b643de9ea143c Mon Sep 17 00:00:00 2001 From: Yicheng Qin Date: Sun, 28 Sep 2014 14:38:40 -0700 Subject: [PATCH 3/3] etcdserver: Cluster.Endpoints() -> Cluster.PeerURLs() --- etcdserver/cluster.go | 4 ++-- etcdserver/cluster_test.go | 30 +++++++++++++++--------------- main.go | 2 +- 3 files changed, 18 insertions(+), 18 deletions(-) diff --git a/etcdserver/cluster.go b/etcdserver/cluster.go index ffb40ff39..bd8e00c14 100644 --- a/etcdserver/cluster.go +++ b/etcdserver/cluster.go @@ -99,10 +99,10 @@ func (c Cluster) IDs() []int64 { return ids } -// Endpoints returns a list of all peer addresses. Each address is prefixed +// PeerURLs returns a list of all peer addresses. Each address is prefixed // with the scheme (currently "http://"). The returned list is sorted in // ascending lexicographical order. -func (c Cluster) Endpoints() []string { +func (c Cluster) PeerURLs() []string { endpoints := make([]string, 0) for _, p := range c { for _, addr := range p.PeerURLs { diff --git a/etcdserver/cluster_test.go b/etcdserver/cluster_test.go index 228156f37..ebae4fbcf 100644 --- a/etcdserver/cluster_test.go +++ b/etcdserver/cluster_test.go @@ -143,17 +143,17 @@ func TestClusterAddBad(t *testing.T) { } } -func TestClusterGetEndpoints(t *testing.T) { +func TestClusterPeerURLs(t *testing.T) { tests := []struct { - mems []Member - endpoints []string + mems []Member + wurls []string }{ // single peer with a single address { mems: []Member{ {ID: 1, PeerURLs: []string{"192.0.2.1"}}, }, - endpoints: []string{"http://192.0.2.1"}, + wurls: []string{"http://192.0.2.1"}, }, // single peer with a single address with a port @@ -161,7 +161,7 @@ func TestClusterGetEndpoints(t *testing.T) { mems: []Member{ {ID: 1, PeerURLs: []string{"192.0.2.1:8001"}}, }, - endpoints: []string{"http://192.0.2.1:8001"}, + wurls: []string{"http://192.0.2.1:8001"}, }, // several members explicitly unsorted @@ -171,21 +171,21 @@ func TestClusterGetEndpoints(t *testing.T) { {ID: 3, PeerURLs: []string{"192.0.2.5", "192.0.2.6"}}, {ID: 1, PeerURLs: []string{"192.0.2.1", "192.0.2.2"}}, }, - endpoints: []string{"http://192.0.2.1", "http://192.0.2.2", "http://192.0.2.3", "http://192.0.2.4", "http://192.0.2.5", "http://192.0.2.6"}, + wurls: []string{"http://192.0.2.1", "http://192.0.2.2", "http://192.0.2.3", "http://192.0.2.4", "http://192.0.2.5", "http://192.0.2.6"}, }, // no members { - mems: []Member{}, - endpoints: []string{}, + mems: []Member{}, + wurls: []string{}, }, - // peer with no endpoints + // peer with no peer urls { mems: []Member{ {ID: 3, PeerURLs: []string{}}, }, - endpoints: []string{}, + wurls: []string{}, }, } @@ -195,9 +195,9 @@ func TestClusterGetEndpoints(t *testing.T) { t.Errorf("AddSlice error: %v", err) continue } - endpoints := c.Endpoints() - if !reflect.DeepEqual(tt.endpoints, endpoints) { - t.Errorf("#%d: members.Endpoints() incorrect: want=%#v got=%#v", i, tt.endpoints, endpoints) + urls := c.PeerURLs() + if !reflect.DeepEqual(urls, tt.wurls) { + t.Errorf("#%d: PeerURLs = %v, want %v", i, urls, tt.wurls) } } } @@ -239,7 +239,7 @@ func TestClusterClientURLs(t *testing.T) { wurls: []string{}, }, - // peer with no endpoints + // peer with no client urls { mems: []Member{ {ID: 3, ClientURLs: []string{}}, @@ -256,7 +256,7 @@ func TestClusterClientURLs(t *testing.T) { } urls := c.ClientURLs() if !reflect.DeepEqual(urls, tt.wurls) { - t.Errorf("#%d: ClientURLs = %v, want %v", i, tt.wurls, urls) + t.Errorf("#%d: ClientURLs = %v, want %v", i, urls, tt.wurls) } } } diff --git a/main.go b/main.go index 94c12130c..0e7ca68ff 100644 --- a/main.go +++ b/main.go @@ -247,7 +247,7 @@ func startProxy() { log.Fatal(err) } - ph, err := proxy.NewHandler(pt, (*cluster).Endpoints()) + ph, err := proxy.NewHandler(pt, (*cluster).PeerURLs()) if err != nil { log.Fatal(err) }