blob: 2ef63ce68444f1ad2f1d923b96ae82af05623662 [file] [log] [blame]
khenaidooffe076b2019-01-15 16:08:08 -05001// 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
15package v2v3
16
17import (
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
32type fakeStats struct{}
33
34func (s *fakeStats) SelfStats() []byte { return nil }
35func (s *fakeStats) LeaderStats() []byte { return nil }
36func (s *fakeStats) StoreStats() []byte { return nil }
37
38type v2v3Server struct {
39 c *clientv3.Client
40 store *v2v3Store
41 fakeStats
42}
43
44func NewServer(c *clientv3.Client, pfx string) etcdserver.ServerPeer {
45 return &v2v3Server{c: c, store: newStore(c, pfx)}
46}
47
48func (s *v2v3Server) ClientCertAuthEnabled() bool { return false }
49
50func (s *v2v3Server) LeaseHandler() http.Handler { panic("STUB: lease handler") }
51func (s *v2v3Server) RaftHandler() http.Handler { panic("STUB: raft handler") }
52
53func (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
63func (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
71func (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
79func (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
87func 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
104func (s *v2v3Server) ClusterVersion() *semver.Version { return s.Version() }
105func (s *v2v3Server) Cluster() api.Cluster { return s }
106func (s *v2v3Server) Alarms() []*pb.AlarmMember { return nil }
107
108func (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}