Skip to content

Commit 3ef3e7a

Browse files
committed
TUN-4927: Parameterize region in edge discovery code
1 parent 12ad264 commit 3ef3e7a

File tree

6 files changed

+35
-10
lines changed

6 files changed

+35
-10
lines changed

edgediscovery/allregions/discovery.go

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@ const (
2222
dotServerName = "cloudflare-dns.com"
2323
dotServerAddr = "1.1.1.1:853"
2424
dotTimeout = 15 * time.Second
25+
26+
logFieldAddress = "address"
2527
)
2628

2729
// Redeclare network functions so they can be overridden in tests.
@@ -59,7 +61,9 @@ var friendlyDNSErrorLines = []string{
5961
}
6062

6163
// EdgeDiscovery implements HA service discovery lookup.
62-
func edgeDiscovery(log *zerolog.Logger) ([][]*EdgeAddr, error) {
64+
func edgeDiscovery(log *zerolog.Logger, srvService string) ([][]*EdgeAddr, error) {
65+
log.Debug().Str("domain", "_"+srvService+"._"+srvProto+"."+srvName).Msg("looking up edge SRV record")
66+
6367
_, addrs, err := netLookupSRV(srvService, srvProto, srvName)
6468
if err != nil {
6569
_, fallbackAddrs, fallbackErr := fallbackLookupSRV(srvService, srvProto, srvName)
@@ -87,7 +91,7 @@ func edgeDiscovery(log *zerolog.Logger) ([][]*EdgeAddr, error) {
8791
return resolvedAddrPerCNAME, nil
8892
}
8993

90-
func lookupSRVWithDOT(service, proto, name string) (cname string, addrs []*net.SRV, err error) {
94+
func lookupSRVWithDOT(string, string, string) (cname string, addrs []*net.SRV, err error) {
9195
// Inspiration: https://github.com/artyom/dot/blob/master/dot.go
9296
r := &net.Resolver{
9397
PreferGo: true,
@@ -130,13 +134,13 @@ func ResolveAddrs(addrs []string, log *zerolog.Logger) (resolved []*EdgeAddr) {
130134
for _, addr := range addrs {
131135
tcpAddr, err := net.ResolveTCPAddr("tcp", addr)
132136
if err != nil {
133-
log.Error().Msgf("Failed to resolve %s to TCP address, err: %v", addr, err)
137+
log.Error().Str(logFieldAddress, addr).Err(err).Msg("failed to resolve to TCP address")
134138
continue
135139
}
136140

137141
udpAddr, err := net.ResolveUDPAddr("udp", addr)
138142
if err != nil {
139-
log.Error().Msgf("Failed to resolve %s to UDP address, err: %v", addr, err)
143+
log.Error().Str(logFieldAddress, addr).Err(err).Msg("failed to resolve to UDP address")
140144
continue
141145
}
142146
resolved = append(resolved, &EdgeAddr{

edgediscovery/allregions/discovery_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ func TestEdgeDiscovery(t *testing.T) {
2525
}
2626

2727
l := zerolog.Nop()
28-
addrLists, err := edgeDiscovery(&l)
28+
addrLists, err := edgeDiscovery(&l, "")
2929
assert.NoError(t, err)
3030
actualAddrSet := map[string]bool{}
3131
for _, addrs := range addrLists {

edgediscovery/allregions/regions.go

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,8 @@ type Regions struct {
1818
// ------------------------------------
1919

2020
// ResolveEdge resolves the Cloudflare edge, returning all regions discovered.
21-
func ResolveEdge(log *zerolog.Logger) (*Regions, error) {
22-
edgeAddrs, err := edgeDiscovery(log)
21+
func ResolveEdge(log *zerolog.Logger, region string) (*Regions, error) {
22+
edgeAddrs, err := edgeDiscovery(log, getRegionalServiceName(region))
2323
if err != nil {
2424
return nil, err
2525
}
@@ -122,3 +122,12 @@ func (rs *Regions) GiveBack(addr *EdgeAddr) bool {
122122
}
123123
return rs.region2.GiveBack(addr)
124124
}
125+
126+
// Return regionalized service name if `region` isn't empty, otherwise return the global service name for origintunneld
127+
func getRegionalServiceName(region string) string {
128+
if region != "" {
129+
return region + "-" + srvService // Example: `us-origintunneld`
130+
}
131+
132+
return srvService // Global service is just `origintunneld`
133+
}

edgediscovery/allregions/regions_test.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,18 @@ func TestNewNoResolveBalancesRegions(t *testing.T) {
156156
}
157157
}
158158

159+
func TestGetRegionalServiceName(t *testing.T) {
160+
// Empty region should just go to origintunneld
161+
globalServiceName := getRegionalServiceName("")
162+
assert.Equal(t, srvService, globalServiceName)
163+
164+
// Non-empty region should go to the regional origintunneld variant
165+
for _, region := range []string{"us", "pt", "am"} {
166+
regionalServiceName := getRegionalServiceName(region)
167+
assert.Equal(t, region+"-"+srvService, regionalServiceName)
168+
}
169+
}
170+
159171
func RegionsIsBalanced(t *testing.T, rs *Regions) {
160172
delta := rs.region1.AvailableAddrs() - rs.region2.AvailableAddrs()
161173
assert.True(t, abs(delta) <= 1)

edgediscovery/edgediscovery.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,8 @@ type Edge struct {
3030

3131
// ResolveEdge runs the initial discovery of the Cloudflare edge, finding Addrs that can be allocated
3232
// to connections.
33-
func ResolveEdge(log *zerolog.Logger) (*Edge, error) {
34-
regions, err := allregions.ResolveEdge(log)
33+
func ResolveEdge(log *zerolog.Logger, region string) (*Edge, error) {
34+
regions, err := allregions.ResolveEdge(log, region)
3535
if err != nil {
3636
return new(Edge), err
3737
}

origin/supervisor.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ func NewSupervisor(config *TunnelConfig, reconnectCh chan ReconnectSignal, grace
7474
if len(config.EdgeAddrs) > 0 {
7575
edgeIPs, err = edgediscovery.StaticEdge(config.Log, config.EdgeAddrs)
7676
} else {
77-
edgeIPs, err = edgediscovery.ResolveEdge(config.Log)
77+
edgeIPs, err = edgediscovery.ResolveEdge(config.Log, "")
7878
}
7979
if err != nil {
8080
return nil, err

0 commit comments

Comments
 (0)