-
Notifications
You must be signed in to change notification settings - Fork 0
/
dns_srv.go
80 lines (67 loc) · 1.59 KB
/
dns_srv.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
package clientbuilder
import (
"crypto/tls"
"net"
"net/url"
"strconv"
etcd "go.etcd.io/etcd/clientv3"
)
/*
FillConfigFromDNS queries DNS records for endpoints and adds them to the
specified etcd client configuration.
*/
func FillConfigFromDNS(conf *etcd.Config, srvtype, domain string) error {
var srvs []*net.SRV
var srv *net.SRV
var u url.URL
var err error
if srvtype == "etcd-client-ssl" {
u.Scheme = "https"
} else {
u.Scheme = "http"
}
_, srvs, err = net.LookupSRV(srvtype, "tcp", domain)
if err != nil {
return err
}
for _, srv = range srvs {
var port string = strconv.FormatUint(uint64(srv.Port), 10)
u.Host = net.JoinHostPort(srv.Target, port)
conf.Endpoints = append(conf.Endpoints, u.String())
}
return nil
}
/*
NewFromDNS creates a new etcd client configured from a DNS domain name, with
an optional user name and password.
*/
func NewFromDNS(domain, user, pass string) (*etcd.Client, error) {
var config etcd.Config = etcd.Config{
Username: user,
Password: pass,
}
var err error
err = FillConfigFromDNS(&config, "etcd-client", domain)
if err != nil {
return nil, err
}
return etcd.New(config)
}
/*
NewTLSFromDNS creates a new etcd client configured from a DNS domain name, with
a TLS configuration and an optional user name and password.
*/
func NewTLSFromDNS(tc *tls.Config,
domain, user, pass string) (*etcd.Client, error) {
var config etcd.Config = etcd.Config{
Username: user,
Password: pass,
TLS: tc,
}
var err error
err = FillConfigFromDNS(&config, "etcd-client-ssl", domain)
if err != nil {
return nil, err
}
return etcd.New(config)
}