appc: factor app connector arguments into a Config type (#17389)

Replace the positional arguments to NewAppConnector with a Config struct.
Update the existing uses. Other than the API change, there are no functional
changes in this commit.

Updates #15160
Updates #17192

Change-Id: Ibf37f021372155a4db8aaf738f4b4f2c746bf623
Signed-off-by: M. J. Fromberger <fromberger@tailscale.com>
This commit is contained in:
M. J. Fromberger
2025-10-01 11:39:01 -07:00
committed by GitHub
parent 05a4c8e839
commit 6f7ce5eb5d
5 changed files with 133 additions and 38 deletions
+68 -19
View File
@@ -28,9 +28,14 @@ func TestUpdateDomains(t *testing.T) {
ctx := context.Background()
var a *AppConnector
if shouldStore {
a = NewAppConnector(t.Logf, &appctest.RouteCollector{}, &RouteInfo{}, fakeStoreRoutes)
a = NewAppConnector(Config{
Logf: t.Logf,
RouteAdvertiser: &appctest.RouteCollector{},
RouteInfo: &RouteInfo{},
StoreRoutesFunc: fakeStoreRoutes,
})
} else {
a = NewAppConnector(t.Logf, &appctest.RouteCollector{}, nil, nil)
a = NewAppConnector(Config{Logf: t.Logf, RouteAdvertiser: &appctest.RouteCollector{}})
}
a.UpdateDomains([]string{"example.com"})
@@ -63,9 +68,13 @@ func TestUpdateRoutes(t *testing.T) {
rc := &appctest.RouteCollector{}
var a *AppConnector
if shouldStore {
a = NewAppConnector(t.Logf, rc, &RouteInfo{}, fakeStoreRoutes)
a = NewAppConnector(Config{
Logf: t.Logf,
RouteAdvertiser: rc,
RouteInfo: &RouteInfo{}, StoreRoutesFunc: fakeStoreRoutes,
})
} else {
a = NewAppConnector(t.Logf, rc, nil, nil)
a = NewAppConnector(Config{Logf: t.Logf, RouteAdvertiser: rc})
}
a.updateDomains([]string{"*.example.com"})
@@ -112,9 +121,14 @@ func TestUpdateRoutesUnadvertisesContainedRoutes(t *testing.T) {
rc := &appctest.RouteCollector{}
var a *AppConnector
if shouldStore {
a = NewAppConnector(t.Logf, rc, &RouteInfo{}, fakeStoreRoutes)
a = NewAppConnector(Config{
Logf: t.Logf,
RouteAdvertiser: rc,
RouteInfo: &RouteInfo{},
StoreRoutesFunc: fakeStoreRoutes,
})
} else {
a = NewAppConnector(t.Logf, rc, nil, nil)
a = NewAppConnector(Config{Logf: t.Logf, RouteAdvertiser: rc})
}
mak.Set(&a.domains, "example.com", []netip.Addr{netip.MustParseAddr("192.0.2.1")})
rc.SetRoutes([]netip.Prefix{netip.MustParsePrefix("192.0.2.1/32")})
@@ -133,9 +147,14 @@ func TestDomainRoutes(t *testing.T) {
rc := &appctest.RouteCollector{}
var a *AppConnector
if shouldStore {
a = NewAppConnector(t.Logf, rc, &RouteInfo{}, fakeStoreRoutes)
a = NewAppConnector(Config{
Logf: t.Logf,
RouteAdvertiser: rc,
RouteInfo: &RouteInfo{},
StoreRoutesFunc: fakeStoreRoutes,
})
} else {
a = NewAppConnector(t.Logf, rc, nil, nil)
a = NewAppConnector(Config{Logf: t.Logf, RouteAdvertiser: rc})
}
a.updateDomains([]string{"example.com"})
if err := a.ObserveDNSResponse(dnsResponse("example.com.", "192.0.0.8")); err != nil {
@@ -159,9 +178,14 @@ func TestObserveDNSResponse(t *testing.T) {
rc := &appctest.RouteCollector{}
var a *AppConnector
if shouldStore {
a = NewAppConnector(t.Logf, rc, &RouteInfo{}, fakeStoreRoutes)
a = NewAppConnector(Config{
Logf: t.Logf,
RouteAdvertiser: rc,
RouteInfo: &RouteInfo{},
StoreRoutesFunc: fakeStoreRoutes,
})
} else {
a = NewAppConnector(t.Logf, rc, nil, nil)
a = NewAppConnector(Config{Logf: t.Logf, RouteAdvertiser: rc})
}
// a has no domains configured, so it should not advertise any routes
@@ -248,9 +272,14 @@ func TestWildcardDomains(t *testing.T) {
rc := &appctest.RouteCollector{}
var a *AppConnector
if shouldStore {
a = NewAppConnector(t.Logf, rc, &RouteInfo{}, fakeStoreRoutes)
a = NewAppConnector(Config{
Logf: t.Logf,
RouteAdvertiser: rc,
RouteInfo: &RouteInfo{},
StoreRoutesFunc: fakeStoreRoutes,
})
} else {
a = NewAppConnector(t.Logf, rc, nil, nil)
a = NewAppConnector(Config{Logf: t.Logf, RouteAdvertiser: rc})
}
a.updateDomains([]string{"*.example.com"})
@@ -408,9 +437,14 @@ func TestUpdateRouteRouteRemoval(t *testing.T) {
var a *AppConnector
if shouldStore {
a = NewAppConnector(t.Logf, rc, &RouteInfo{}, fakeStoreRoutes)
a = NewAppConnector(Config{
Logf: t.Logf,
RouteAdvertiser: rc,
RouteInfo: &RouteInfo{},
StoreRoutesFunc: fakeStoreRoutes,
})
} else {
a = NewAppConnector(t.Logf, rc, nil, nil)
a = NewAppConnector(Config{Logf: t.Logf, RouteAdvertiser: rc})
}
// nothing has yet been advertised
assertRoutes("appc init", []netip.Prefix{}, []netip.Prefix{})
@@ -453,9 +487,14 @@ func TestUpdateDomainRouteRemoval(t *testing.T) {
var a *AppConnector
if shouldStore {
a = NewAppConnector(t.Logf, rc, &RouteInfo{}, fakeStoreRoutes)
a = NewAppConnector(Config{
Logf: t.Logf,
RouteAdvertiser: rc,
RouteInfo: &RouteInfo{},
StoreRoutesFunc: fakeStoreRoutes,
})
} else {
a = NewAppConnector(t.Logf, rc, nil, nil)
a = NewAppConnector(Config{Logf: t.Logf, RouteAdvertiser: rc})
}
assertRoutes("appc init", []netip.Prefix{}, []netip.Prefix{})
@@ -508,9 +547,14 @@ func TestUpdateWildcardRouteRemoval(t *testing.T) {
var a *AppConnector
if shouldStore {
a = NewAppConnector(t.Logf, rc, &RouteInfo{}, fakeStoreRoutes)
a = NewAppConnector(Config{
Logf: t.Logf,
RouteAdvertiser: rc,
RouteInfo: &RouteInfo{},
StoreRoutesFunc: fakeStoreRoutes,
})
} else {
a = NewAppConnector(t.Logf, rc, nil, nil)
a = NewAppConnector(Config{Logf: t.Logf, RouteAdvertiser: rc})
}
assertRoutes("appc init", []netip.Prefix{}, []netip.Prefix{})
@@ -649,7 +693,12 @@ func TestMetricBucketsAreSorted(t *testing.T) {
func TestUpdateRoutesDeadlock(t *testing.T) {
ctx := context.Background()
rc := &appctest.RouteCollector{}
a := NewAppConnector(t.Logf, rc, &RouteInfo{}, fakeStoreRoutes)
a := NewAppConnector(Config{
Logf: t.Logf,
RouteAdvertiser: rc,
RouteInfo: &RouteInfo{},
StoreRoutesFunc: fakeStoreRoutes,
})
advertiseCalled := new(atomic.Bool)
unadvertiseCalled := new(atomic.Bool)