// If logerr is true, it prints out more error messages. func getClusterFromRemotePeers(urls []string, timeout time.Duration, logerr bool, rt http.RoundTripper) (*membership.RaftCluster, error) { cc := &http.Client{ Transport: rt, Timeout: timeout, } for _, u := range urls { resp, err := cc.Get(u + "/members") if err != nil { if logerr { plog.Warningf("could not get cluster response from %s: %v", u, err) } continue } b, err := ioutil.ReadAll(resp.Body) resp.Body.Close() if err != nil { if logerr { plog.Warningf("could not read the body of cluster response: %v", err) } continue } var membs []*membership.Member if err = json.Unmarshal(b, &membs); err != nil { if logerr { plog.Warningf("could not unmarshal cluster response: %v", err) } continue } id, err := types.IDFromString(resp.Header.Get("X-Etcd-Cluster-ID")) if err != nil { if logerr { plog.Warningf("could not parse the cluster ID from cluster res: %v", err) } continue } // check the length of membership members // if the membership members are present then prepare and return raft cluster // if membership members are not present then the raft cluster formed will be // an invalid empty cluster hence return failed to get raft cluster member(s) from the given urls error if len(membs) > 0 { return membership.NewClusterFromMembers("", id, membs), nil } return nil, fmt.Errorf("failed to get raft cluster member(s) from the given urls.") } return nil, fmt.Errorf("could not retrieve cluster information from the given urls") }
// If logerr is true, it prints out more error messages. func getClusterFromRemotePeers(urls []string, timeout time.Duration, logerr bool, rt http.RoundTripper) (*membership.RaftCluster, error) { cc := &http.Client{ Transport: rt, Timeout: timeout, } for _, u := range urls { resp, err := cc.Get(u + "/members") if err != nil { if logerr { plog.Warningf("could not get cluster response from %s: %v", u, err) } continue } b, err := ioutil.ReadAll(resp.Body) resp.Body.Close() if err != nil { if logerr { plog.Warningf("could not read the body of cluster response: %v", err) } continue } var membs []*membership.Member if err = json.Unmarshal(b, &membs); err != nil { if logerr { plog.Warningf("could not unmarshal cluster response: %v", err) } continue } id, err := types.IDFromString(resp.Header.Get("X-Etcd-Cluster-ID")) if err != nil { if logerr { plog.Warningf("could not parse the cluster ID from cluster res: %v", err) } continue } return membership.NewClusterFromMembers("", id, membs), nil } return nil, fmt.Errorf("could not retrieve cluster information from the given urls") }
func TestGetOtherPeerURLs(t *testing.T) { tests := []struct { membs []*membership.Member wurls []string }{ { []*membership.Member{ membership.NewMember("1", types.MustNewURLs([]string{"http://10.0.0.1:1"}), "a", nil), }, []string{}, }, { []*membership.Member{ membership.NewMember("1", types.MustNewURLs([]string{"http://10.0.0.1:1"}), "a", nil), membership.NewMember("2", types.MustNewURLs([]string{"http://10.0.0.2:2"}), "a", nil), membership.NewMember("3", types.MustNewURLs([]string{"http://10.0.0.3:3"}), "a", nil), }, []string{"http://10.0.0.2:2", "http://10.0.0.3:3"}, }, { []*membership.Member{ membership.NewMember("1", types.MustNewURLs([]string{"http://10.0.0.1:1"}), "a", nil), membership.NewMember("3", types.MustNewURLs([]string{"http://10.0.0.3:3"}), "a", nil), membership.NewMember("2", types.MustNewURLs([]string{"http://10.0.0.2:2"}), "a", nil), }, []string{"http://10.0.0.2:2", "http://10.0.0.3:3"}, }, } for i, tt := range tests { cl := membership.NewClusterFromMembers("", types.ID(0), tt.membs) self := "1" urls := getRemotePeerURLs(cl, self) if !reflect.DeepEqual(urls, tt.wurls) { t.Errorf("#%d: urls = %+v, want %+v", i, urls, tt.wurls) } } }