Skip to content

Commit fa35126

Browse files
committed
*: add client support for discovery-srv-name
Signed-off-by: Sam Batschelet <[email protected]>
1 parent 83304cf commit fa35126

File tree

9 files changed

+113
-44
lines changed

9 files changed

+113
-44
lines changed

client/discover.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ import (
2121
// Discoverer is an interface that wraps the Discover method.
2222
type Discoverer interface {
2323
// Discover looks up the etcd servers for the domain.
24-
Discover(domain string) ([]string, error)
24+
Discover(domain string, serviceName string) ([]string, error)
2525
}
2626

2727
type srvDiscover struct{}
@@ -31,8 +31,8 @@ func NewSRVDiscover() Discoverer {
3131
return &srvDiscover{}
3232
}
3333

34-
func (d *srvDiscover) Discover(domain string) ([]string, error) {
35-
srvs, err := srv.GetClient("etcd-client", domain)
34+
func (d *srvDiscover) Discover(domain string, serviceName string) ([]string, error) {
35+
srvs, err := srv.GetClient("etcd-client", domain, serviceName)
3636
if err != nil {
3737
return nil, err
3838
}

etcdctl/ctlv2/command/util.go

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -86,15 +86,15 @@ func getPeersFlagValue(c *cli.Context) []string {
8686
}
8787

8888
func getDomainDiscoveryFlagValue(c *cli.Context) ([]string, error) {
89-
domainstr, insecure := getDiscoveryDomain(c)
89+
domainstr, insecure, serviceName := getDiscoveryDomain(c)
9090

9191
// If we still don't have domain discovery, return nothing
9292
if domainstr == "" {
9393
return []string{}, nil
9494
}
9595

9696
discoverer := client.NewSRVDiscover()
97-
eps, err := discoverer.Discover(domainstr)
97+
eps, err := discoverer.Discover(domainstr, serviceName)
9898
if err != nil {
9999
return nil, err
100100
}
@@ -113,15 +113,19 @@ func getDomainDiscoveryFlagValue(c *cli.Context) ([]string, error) {
113113
return ret, err
114114
}
115115

116-
func getDiscoveryDomain(c *cli.Context) (domainstr string, insecure bool) {
116+
func getDiscoveryDomain(c *cli.Context) (domainstr string, insecure bool, serviceName string) {
117117
domainstr = c.GlobalString("discovery-srv")
118118
// Use an environment variable if nothing was supplied on the
119119
// command line
120120
if domainstr == "" {
121121
domainstr = os.Getenv("ETCDCTL_DISCOVERY_SRV")
122122
}
123123
insecure = c.GlobalBool("insecure-discovery") || (os.Getenv("ETCDCTL_INSECURE_DISCOVERY") != "")
124-
return domainstr, insecure
124+
serviceName = c.GlobalString("discovery-srv-name")
125+
if serviceName == "" {
126+
serviceName = os.Getenv("ETCDCTL_DISCOVERY_SRV_NAME")
127+
}
128+
return domainstr, insecure, serviceName
125129
}
126130

127131
func getEndpoints(c *cli.Context) ([]string, error) {
@@ -168,7 +172,7 @@ func getTransport(c *cli.Context) (*http.Transport, error) {
168172
keyfile = os.Getenv("ETCDCTL_KEY_FILE")
169173
}
170174

171-
discoveryDomain, insecure := getDiscoveryDomain(c)
175+
discoveryDomain, insecure, _ := getDiscoveryDomain(c)
172176
if insecure {
173177
discoveryDomain = ""
174178
}

etcdctl/ctlv3/command/global.go

Lines changed: 24 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -39,14 +39,15 @@ import (
3939
// GlobalFlags are flags that defined globally
4040
// and are inherited to all sub-commands.
4141
type GlobalFlags struct {
42-
Insecure bool
43-
InsecureSkipVerify bool
44-
InsecureDiscovery bool
45-
Endpoints []string
46-
DialTimeout time.Duration
47-
CommandTimeOut time.Duration
48-
KeepAliveTime time.Duration
49-
KeepAliveTimeout time.Duration
42+
Insecure bool
43+
InsecureSkipVerify bool
44+
InsecureDiscovery bool
45+
Endpoints []string
46+
DialTimeout time.Duration
47+
CommandTimeOut time.Duration
48+
KeepAliveTime time.Duration
49+
KeepAliveTimeout time.Duration
50+
DNSClusterServiceName string
5051

5152
TLS transport.TLSInfo
5253

@@ -75,8 +76,9 @@ type authCfg struct {
7576
}
7677

7778
type discoveryCfg struct {
78-
domain string
79-
insecure bool
79+
domain string
80+
insecure bool
81+
serviceName string
8082
}
8183

8284
var display printer = &simplePrinter{}
@@ -390,10 +392,19 @@ func discoverySrvFromCmd(cmd *cobra.Command) string {
390392
return domainStr
391393
}
392394

395+
func discoveryDNSClusterServiceNameFromCmd(cmd *cobra.Command) string {
396+
serviceNameStr, err := cmd.Flags().GetString("discovery-srv-name")
397+
if err != nil {
398+
ExitWithError(ExitBadArgs, err)
399+
}
400+
return serviceNameStr
401+
}
402+
393403
func discoveryCfgFromCmd(cmd *cobra.Command) *discoveryCfg {
394404
return &discoveryCfg{
395-
domain: discoverySrvFromCmd(cmd),
396-
insecure: insecureDiscoveryFromCmd(cmd),
405+
domain: discoverySrvFromCmd(cmd),
406+
insecure: insecureDiscoveryFromCmd(cmd),
407+
serviceName: discoveryDNSClusterServiceNameFromCmd(cmd),
397408
}
398409
}
399410

@@ -422,7 +433,7 @@ func endpointsFromFlagValue(cmd *cobra.Command) ([]string, error) {
422433
return []string{}, nil
423434
}
424435

425-
srvs, err := srv.GetClient("etcd-client", discoveryCfg.domain)
436+
srvs, err := srv.GetClient("etcd-client", discoveryCfg.domain, discoveryCfg.serviceName)
426437
if err != nil {
427438
return nil, err
428439
}

etcdctl/ctlv3/ctl.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ func init() {
6767
rootCmd.PersistentFlags().StringVar(&globalFlags.User, "user", "", "username[:password] for authentication (prompt if password is not supplied)")
6868
rootCmd.PersistentFlags().StringVar(&globalFlags.Password, "password", "", "password for authentication (if this option is used, --user option shouldn't include password)")
6969
rootCmd.PersistentFlags().StringVarP(&globalFlags.TLS.ServerName, "discovery-srv", "d", "", "domain name to query for SRV records describing cluster endpoints")
70+
rootCmd.PersistentFlags().StringVarP(&globalFlags.DNSClusterServiceName, "discovery-srv-name", "", "", "service name to query when using DNS discovery")
7071

7172
rootCmd.AddCommand(
7273
command.NewGetCommand(),

etcdmain/gateway.go

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -28,12 +28,13 @@ import (
2828
)
2929

3030
var (
31-
gatewayListenAddr string
32-
gatewayEndpoints []string
33-
gatewayDNSCluster string
34-
gatewayInsecureDiscovery bool
35-
getewayRetryDelay time.Duration
36-
gatewayCA string
31+
gatewayListenAddr string
32+
gatewayEndpoints []string
33+
gatewayDNSCluster string
34+
gatewayDNSClusterServiceName string
35+
gatewayInsecureDiscovery bool
36+
getewayRetryDelay time.Duration
37+
gatewayCA string
3738
)
3839

3940
var (
@@ -68,6 +69,7 @@ func newGatewayStartCommand() *cobra.Command {
6869

6970
cmd.Flags().StringVar(&gatewayListenAddr, "listen-addr", "127.0.0.1:23790", "listen address")
7071
cmd.Flags().StringVar(&gatewayDNSCluster, "discovery-srv", "", "DNS domain used to bootstrap initial cluster")
72+
cmd.Flags().StringVar(&gatewayDNSClusterServiceName, "discovery-srv-name", "", "service name to query when using DNS discovery")
7173
cmd.Flags().BoolVar(&gatewayInsecureDiscovery, "insecure-discovery", false, "accept insecure SRV records")
7274
cmd.Flags().StringVar(&gatewayCA, "trusted-ca-file", "", "path to the client server TLS CA file.")
7375

@@ -97,7 +99,7 @@ func startGateway(cmd *cobra.Command, args []string) {
9799
os.Exit(1)
98100
}
99101

100-
srvs := discoverEndpoints(lg, gatewayDNSCluster, gatewayCA, gatewayInsecureDiscovery)
102+
srvs := discoverEndpoints(lg, gatewayDNSCluster, gatewayCA, gatewayInsecureDiscovery, gatewayDNSClusterServiceName)
101103
if len(srvs.Endpoints) == 0 {
102104
// no endpoints discovered, fall back to provided endpoints
103105
srvs.Endpoints = gatewayEndpoints

etcdmain/grpc_proxy.go

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -49,14 +49,15 @@ import (
4949
)
5050

5151
var (
52-
grpcProxyListenAddr string
53-
grpcProxyMetricsListenAddr string
54-
grpcProxyEndpoints []string
55-
grpcProxyDNSCluster string
56-
grpcProxyInsecureDiscovery bool
57-
grpcProxyDataDir string
58-
grpcMaxCallSendMsgSize int
59-
grpcMaxCallRecvMsgSize int
52+
grpcProxyListenAddr string
53+
grpcProxyMetricsListenAddr string
54+
grpcProxyEndpoints []string
55+
grpcProxyDNSCluster string
56+
grpcProxyDNSClusterServiceName string
57+
grpcProxyInsecureDiscovery bool
58+
grpcProxyDataDir string
59+
grpcMaxCallSendMsgSize int
60+
grpcMaxCallRecvMsgSize int
6061

6162
// tls for connecting to etcd
6263

@@ -111,7 +112,8 @@ func newGRPCProxyStartCommand() *cobra.Command {
111112
}
112113

113114
cmd.Flags().StringVar(&grpcProxyListenAddr, "listen-addr", "127.0.0.1:23790", "listen address")
114-
cmd.Flags().StringVar(&grpcProxyDNSCluster, "discovery-srv", "", "DNS domain used to bootstrap initial cluster")
115+
cmd.Flags().StringVar(&grpcProxyDNSCluster, "discovery-srv", "", "domain name to query for SRV records describing cluster endpoints")
116+
cmd.Flags().StringVar(&grpcProxyDNSClusterServiceName, "discovery-srv-name", "", "service name to query when using DNS discovery")
115117
cmd.Flags().StringVar(&grpcProxyMetricsListenAddr, "metrics-addr", "", "listen for /metrics requests on an additional interface")
116118
cmd.Flags().BoolVar(&grpcProxyInsecureDiscovery, "insecure-discovery", false, "accept insecure SRV records")
117119
cmd.Flags().StringSliceVar(&grpcProxyEndpoints, "endpoints", []string{"127.0.0.1:2379"}, "comma separated etcd cluster endpoints")
@@ -249,7 +251,7 @@ func checkArgs() {
249251
}
250252

251253
func mustNewClient(lg *zap.Logger) *clientv3.Client {
252-
srvs := discoverEndpoints(lg, grpcProxyDNSCluster, grpcProxyCA, grpcProxyInsecureDiscovery)
254+
srvs := discoverEndpoints(lg, grpcProxyDNSCluster, grpcProxyCA, grpcProxyInsecureDiscovery, grpcProxyDNSClusterServiceName)
253255
eps := srvs.Endpoints
254256
if len(eps) == 0 {
255257
eps = grpcProxyEndpoints

etcdmain/util.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,11 @@ import (
2424
"go.uber.org/zap"
2525
)
2626

27-
func discoverEndpoints(lg *zap.Logger, dns string, ca string, insecure bool) (s srv.SRVClients) {
27+
func discoverEndpoints(lg *zap.Logger, dns string, ca string, insecure bool, serviceName string) (s srv.SRVClients) {
2828
if dns == "" {
2929
return s
3030
}
31-
srvs, err := srv.GetClient("etcd-client", dns)
31+
srvs, err := srv.GetClient("etcd-client", dns, serviceName)
3232
if err != nil {
3333
fmt.Fprintln(os.Stderr, err)
3434
os.Exit(1)

pkg/srv/srv.go

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ type SRVClients struct {
9696
}
9797

9898
// GetClient looks up the client endpoints for a service and domain.
99-
func GetClient(service, domain string) (*SRVClients, error) {
99+
func GetClient(service, domain string, serviceName string) (*SRVClients, error) {
100100
var urls []*url.URL
101101
var srvs []*net.SRV
102102

@@ -115,8 +115,8 @@ func GetClient(service, domain string) (*SRVClients, error) {
115115
return nil
116116
}
117117

118-
errHTTPS := updateURLs(service+"-ssl", "https")
119-
errHTTP := updateURLs(service, "http")
118+
errHTTPS := updateURLs(GetSRVService(service, serviceName, "https"), "https")
119+
errHTTP := updateURLs(GetSRVService(service, serviceName, "http"), "http")
120120

121121
if errHTTPS != nil && errHTTP != nil {
122122
return nil, fmt.Errorf("dns lookup errors: %s and %s", errHTTPS, errHTTP)
@@ -128,3 +128,15 @@ func GetClient(service, domain string) (*SRVClients, error) {
128128
}
129129
return &SRVClients{Endpoints: endpoints, SRVs: srvs}, nil
130130
}
131+
132+
// GetSRVService generates a SRV service including an optional suffix.
133+
func GetSRVService(service, serviceName string, scheme string) (SRVService string) {
134+
if scheme == "https" {
135+
service = fmt.Sprintf("%s-ssl", service)
136+
}
137+
138+
if serviceName != "" {
139+
return fmt.Sprintf("%s-%s", service, serviceName)
140+
}
141+
return service
142+
}

pkg/srv/srv_test.go

Lines changed: 38 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -188,7 +188,7 @@ func TestSRVDiscover(t *testing.T) {
188188
return "", nil, errors.New("Unknown service in mock")
189189
}
190190

191-
srvs, err := GetClient("etcd-client", "example.com")
191+
srvs, err := GetClient("etcd-client", "example.com", "")
192192
if err != nil {
193193
t.Fatalf("%d: err: %#v", i, err)
194194
}
@@ -199,3 +199,40 @@ func TestSRVDiscover(t *testing.T) {
199199

200200
}
201201
}
202+
203+
func TestGetSRVService(t *testing.T) {
204+
tests := []struct {
205+
scheme string
206+
serviceName string
207+
208+
expected string
209+
}{
210+
{
211+
"https",
212+
"",
213+
"etcd-client-ssl",
214+
},
215+
{
216+
"http",
217+
"",
218+
"etcd-client",
219+
},
220+
{
221+
"https",
222+
"foo",
223+
"etcd-client-ssl-foo",
224+
},
225+
{
226+
"http",
227+
"bar",
228+
"etcd-client-bar",
229+
},
230+
}
231+
232+
for i, tt := range tests {
233+
service := GetSRVService("etcd-client", tt.serviceName, tt.scheme)
234+
if strings.Compare(service, tt.expected) != 0 {
235+
t.Errorf("#%d: service = %s, want %s", i, service, tt.expected)
236+
}
237+
}
238+
}

0 commit comments

Comments
 (0)