go.etcd.io/etcd@v3.3.27+incompatible/etcdserver/api/v2v3/server.go (about) 1 // Copyright 2017 The etcd Authors 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 package v2v3 16 17 import ( 18 "context" 19 "net/http" 20 "time" 21 22 "github.com/coreos/etcd/clientv3" 23 "github.com/coreos/etcd/etcdserver" 24 "github.com/coreos/etcd/etcdserver/api" 25 pb "github.com/coreos/etcd/etcdserver/etcdserverpb" 26 "github.com/coreos/etcd/etcdserver/membership" 27 "github.com/coreos/etcd/pkg/types" 28 29 "github.com/coreos/go-semver/semver" 30 ) 31 32 type fakeStats struct{} 33 34 func (s *fakeStats) SelfStats() []byte { return nil } 35 func (s *fakeStats) LeaderStats() []byte { return nil } 36 func (s *fakeStats) StoreStats() []byte { return nil } 37 38 type v2v3Server struct { 39 c *clientv3.Client 40 store *v2v3Store 41 fakeStats 42 } 43 44 func NewServer(c *clientv3.Client, pfx string) etcdserver.ServerPeer { 45 return &v2v3Server{c: c, store: newStore(c, pfx)} 46 } 47 48 func (s *v2v3Server) ClientCertAuthEnabled() bool { return false } 49 50 func (s *v2v3Server) LeaseHandler() http.Handler { panic("STUB: lease handler") } 51 func (s *v2v3Server) RaftHandler() http.Handler { panic("STUB: raft handler") } 52 53 func (s *v2v3Server) Leader() types.ID { 54 ctx, cancel := context.WithTimeout(context.TODO(), 5*time.Second) 55 defer cancel() 56 resp, err := s.c.Status(ctx, s.c.Endpoints()[0]) 57 if err != nil { 58 return 0 59 } 60 return types.ID(resp.Leader) 61 } 62 63 func (s *v2v3Server) AddMember(ctx context.Context, memb membership.Member) ([]*membership.Member, error) { 64 resp, err := s.c.MemberAdd(ctx, memb.PeerURLs) 65 if err != nil { 66 return nil, err 67 } 68 return v3MembersToMembership(resp.Members), nil 69 } 70 71 func (s *v2v3Server) RemoveMember(ctx context.Context, id uint64) ([]*membership.Member, error) { 72 resp, err := s.c.MemberRemove(ctx, id) 73 if err != nil { 74 return nil, err 75 } 76 return v3MembersToMembership(resp.Members), nil 77 } 78 79 func (s *v2v3Server) UpdateMember(ctx context.Context, m membership.Member) ([]*membership.Member, error) { 80 resp, err := s.c.MemberUpdate(ctx, uint64(m.ID), m.PeerURLs) 81 if err != nil { 82 return nil, err 83 } 84 return v3MembersToMembership(resp.Members), nil 85 } 86 87 func v3MembersToMembership(v3membs []*pb.Member) []*membership.Member { 88 membs := make([]*membership.Member, len(v3membs)) 89 for i, m := range v3membs { 90 membs[i] = &membership.Member{ 91 ID: types.ID(m.ID), 92 RaftAttributes: membership.RaftAttributes{ 93 PeerURLs: m.PeerURLs, 94 }, 95 Attributes: membership.Attributes{ 96 Name: m.Name, 97 ClientURLs: m.ClientURLs, 98 }, 99 } 100 } 101 return membs 102 } 103 104 func (s *v2v3Server) ClusterVersion() *semver.Version { return s.Version() } 105 func (s *v2v3Server) Cluster() api.Cluster { return s } 106 func (s *v2v3Server) Alarms() []*pb.AlarmMember { return nil } 107 108 func (s *v2v3Server) Do(ctx context.Context, r pb.Request) (etcdserver.Response, error) { 109 applier := etcdserver.NewApplierV2(s.store, nil) 110 reqHandler := etcdserver.NewStoreRequestV2Handler(s.store, applier) 111 req := (*etcdserver.RequestV2)(&r) 112 resp, err := req.Handle(ctx, reqHandler) 113 if resp.Err != nil { 114 return resp, resp.Err 115 } 116 return resp, err 117 }