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  }