/
endpoints.go
105 lines (86 loc) · 2.08 KB
/
endpoints.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
package main
import (
"errors"
"fmt"
"os"
"strings"
"go.etcd.io/etcd/client/pkg/v3/srv"
"golang.org/x/exp/slices"
)
func endpointsWithLeaderAtEnd(gcfg globalConfig, statusList []epStatus) ([]string, error) {
eps, err := endpoints(gcfg)
if err != nil || len(eps) <= 1 {
return eps, err
}
var sortedEps, leaderEps []string
for _, status := range statusList {
if status.Resp.Header.MemberId != status.Resp.Leader {
sortedEps = append(sortedEps, status.Ep)
} else {
leaderEps = append(leaderEps, status.Ep)
}
}
sortedEps = append(sortedEps, leaderEps...)
return sortedEps, nil
}
func endpoints(gcfg globalConfig) ([]string, error) {
if !gcfg.useClusterEndpoints {
if len(gcfg.endpoints) == 0 {
return nil, errors.New("no endpoints provided")
}
return gcfg.endpoints, nil
}
return endpointsFromCluster(gcfg)
}
func endpointsFromCluster(gcfg globalConfig) ([]string, error) {
memberlistResp, err := memberList(gcfg)
if err != nil {
return nil, err
}
var eps []string
for _, m := range memberlistResp.Members {
// learner member only serves Status and SerializableRead requests, just ignore it
if !m.GetIsLearner() {
eps = append(eps, m.ClientURLs...)
}
}
slices.Sort(eps)
eps = slices.Compact(eps)
return eps, nil
}
func endpointsFromCmd(gcfg globalConfig) ([]string, error) {
eps, err := endpointsFromDNSDiscovery(gcfg)
if err != nil {
return nil, err
}
if len(eps) == 0 {
eps = gcfg.endpoints
}
if len(eps) == 0 {
return nil, errors.New("no endpoints provided")
}
return eps, nil
}
func endpointsFromDNSDiscovery(gcfg globalConfig) ([]string, error) {
if gcfg.dnsDomain == "" {
return nil, nil
}
srvs, err := srv.GetClient("etcd-client", gcfg.dnsDomain, gcfg.dnsService)
if err != nil {
return nil, err
}
eps := srvs.Endpoints
if gcfg.insecureDiscovery {
return eps, nil
}
// strip insecure connections
var ret []string
for _, ep := range eps {
if strings.HasPrefix(ep, "http://") {
fmt.Fprintf(os.Stderr, "ignoring discovered insecure endpoint %q\n", ep)
continue
}
ret = append(ret, ep)
}
return ret, nil
}