func (m *httpMembersAPI) Add(ctx context.Context, peerURL string) (*Member, error) { urls, err := types.NewURLs([]string{peerURL}) if err != nil { return nil, err } req := &membersAPIActionAdd{peerURLs: urls} resp, body, err := m.client.Do(ctx, req) if err != nil { return nil, err } if err := assertStatusCode(resp.StatusCode, http.StatusCreated, http.StatusConflict); err != nil { return nil, err } if resp.StatusCode != http.StatusCreated { var merr membersError if err := json.Unmarshal(body, &merr); err != nil { return nil, err } return nil, merr } var memb Member if err := json.Unmarshal(body, &memb); err != nil { return nil, err } return &memb, nil }
func (m *httpMembersAPI) Update(ctx context.Context, memberID string, peerURLs []string) error { urls, err := types.NewURLs(peerURLs) if err != nil { return err } req := &membersAPIActionUpdate{peerURLs: urls, memberID: memberID} resp, body, err := m.client.Do(ctx, req) if err != nil { return err } if err := assertStatusCode(resp.StatusCode, http.StatusNoContent, http.StatusNotFound, http.StatusConflict); err != nil { return err } if resp.StatusCode != http.StatusNoContent { var merr membersError if err := json.Unmarshal(body, &merr); err != nil { return err } return merr } return nil }
// Set parses a command line set of URLs formatted like: // http://127.0.0.1:7001,http://10.1.1.2:80 func (us *URLsValue) Set(s string) error { strs := strings.Split(s, ",") nus, err := types.NewURLs(strs) if err != nil { return err } *us = URLsValue(nus) return nil }
func mustNewURLs(t *testing.T, urls []string) []url.URL { if len(urls) == 0 { return nil } u, err := types.NewURLs(urls) if err != nil { t.Fatalf("error creating new URLs from %q: %v", urls, err) } return u }
func NewSimpleEtcd() (*SimpleEtcd, error) { var err error se := &SimpleEtcd{} se.listener, err = net.Listen("tcp", ":0") if err != nil { return nil, err } se.Port = se.listener.Addr().(*net.TCPAddr).Port clientURLs, err := interfaceURLs(se.Port) if err != nil { se.Destroy() return nil, err } se.dataDir, err = ioutil.TempDir("", tempPrefix) if err != nil { se.Destroy() return nil, err } peerURLs, err := types.NewURLs([]string{peerURL}) if err != nil { se.Destroy() return nil, err } cluster, err := etcdserver.NewClusterFromString(clusterName, clusterCfg) if err != nil { se.Destroy() return nil, err } cfg := &etcdserver.ServerConfig{ Name: memberName, ClientURLs: clientURLs, PeerURLs: peerURLs, DataDir: se.dataDir, Cluster: cluster, NewCluster: true, Transport: &http.Transport{}, TickMs: 100, ElectionTicks: 10, } se.server, err = etcdserver.NewServer(cfg) if err != nil { return nil, err } se.server.Start() go http.Serve(se.listener, etcdhttp.NewClientHandler(se.server)) return se, nil }
func (t *transport) AddRemote(id types.ID, us []string) { t.mu.Lock() defer t.mu.Unlock() if _, ok := t.remotes[id]; ok { return } urls, err := types.NewURLs(us) if err != nil { plog.Panicf("newURLs %+v should never fail: %+v", us, err) } t.remotes[id] = startRemote(t.roundTripper, urls, t.id, id, t.clusterID, t.raft, t.errorc) }
func (t *transport) UpdatePeer(id types.ID, us []string) { t.mu.Lock() defer t.mu.Unlock() // TODO: return error or just panic? if _, ok := t.peers[id]; !ok { return } urls, err := types.NewURLs(us) if err != nil { plog.Panicf("newURLs %+v should never fail: %+v", us, err) } t.peers[id].Update(urls) }
func (t *transport) AddPeer(id types.ID, us []string) { t.mu.Lock() defer t.mu.Unlock() if _, ok := t.peers[id]; ok { return } urls, err := types.NewURLs(us) if err != nil { plog.Panicf("newURLs %+v should never fail: %+v", us, err) } fs := t.leaderStats.Follower(id.String()) t.peers[id] = startPeer(t.roundTripper, urls, t.id, id, t.clusterID, t.raft, fs, t.errorc, t.term) }
func (m *MemberCreateRequest) UnmarshalJSON(data []byte) error { s := struct { PeerURLs []string `json:"peerURLs"` }{} err := json.Unmarshal(data, &s) if err != nil { return err } urls, err := types.NewURLs(s.PeerURLs) if err != nil { return err } m.PeerURLs = urls return nil }