@@ -46,6 +46,8 @@ type ClusterInterrogator interface {
46
46
WaitForClusterAvailable (retries int , retryInterval time.Duration ) (bool , error )
47
47
Sync () error
48
48
AddMember (name string , peerAddrs string ) ([]Member , error )
49
+ GetMemberID (peerURL string ) (uint64 , error )
50
+ RemoveMember (id uint64 ) ([]Member , error )
49
51
}
50
52
51
53
// Client provides connection parameters for an etcd cluster
@@ -146,6 +148,62 @@ type Member struct {
146
148
PeerURL string
147
149
}
148
150
151
+ // GetMemberID returns the member ID of the given peer URL
152
+ func (c Client ) GetMemberID (peerURL string ) (uint64 , error ) {
153
+ cli , err := clientv3 .New (clientv3.Config {
154
+ Endpoints : c .Endpoints ,
155
+ DialTimeout : 30 * time .Second ,
156
+ TLS : c .TLS ,
157
+ })
158
+ if err != nil {
159
+ return 0 , err
160
+ }
161
+ defer cli .Close ()
162
+
163
+ ctx , cancel := context .WithTimeout (context .Background (), 10 * time .Second )
164
+ resp , err := cli .MemberList (ctx )
165
+ cancel ()
166
+ if err != nil {
167
+ return 0 , err
168
+ }
169
+
170
+ for _ , member := range resp .Members {
171
+ if member .GetPeerURLs ()[0 ] == peerURL {
172
+ return member .GetID (), nil
173
+ }
174
+ }
175
+ return 0 , nil
176
+ }
177
+
178
+ // RemoveMember notifies an etcd cluster to remove an existing member
179
+ func (c Client ) RemoveMember (id uint64 ) ([]Member , error ) {
180
+ cli , err := clientv3 .New (clientv3.Config {
181
+ Endpoints : c .Endpoints ,
182
+ DialTimeout : 30 * time .Second ,
183
+ TLS : c .TLS ,
184
+ })
185
+ if err != nil {
186
+ return nil , err
187
+ }
188
+ defer cli .Close ()
189
+
190
+ // Remove an existing member from the cluster
191
+ ctx , cancel := context .WithTimeout (context .Background (), 10 * time .Second )
192
+ resp , err := cli .MemberRemove (ctx , id )
193
+ cancel ()
194
+ if err != nil {
195
+ return nil , err
196
+ }
197
+
198
+ // Returns the updated list of etcd members
199
+ ret := []Member {}
200
+ for _ , m := range resp .Members {
201
+ ret = append (ret , Member {Name : m .Name , PeerURL : m .PeerURLs [0 ]})
202
+ }
203
+
204
+ return ret , nil
205
+ }
206
+
149
207
// AddMember notifies an existing etcd cluster that a new member is joining
150
208
func (c * Client ) AddMember (name string , peerAddrs string ) ([]Member , error ) {
151
209
// Parse the peer address, required to add the client URL later to the list
0 commit comments