Skip to content

Commit dd4d212

Browse files
committed
latest review from easwar
- cleanup in clientimpl close rather than individual authority close - convert tests in bootstrap_test to table driven tests
1 parent e694f4c commit dd4d212

File tree

8 files changed

+56
-60
lines changed

8 files changed

+56
-60
lines changed

xds/internal/xdsclient/authority.go

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -448,10 +448,6 @@ func (a *authority) close() {
448448
a.resourcesMu.Lock()
449449
a.closed = true
450450
a.resourcesMu.Unlock()
451-
452-
for _, cleanup := range a.serverCfg.Cleanups {
453-
cleanup()
454-
}
455451
}
456452

457453
func (a *authority) watchResource(rType xdsresource.Type, resourceName string, watcher xdsresource.ResourceWatcher) func() {

xds/internal/xdsclient/bootstrap/bootstrap.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,7 @@ type ServerConfig struct {
167167
IgnoreResourceDeletion bool
168168

169169
// Cleanups are called when the xDS client for this server is closed. Allows
170-
// cleaning up resources created specifically for the xDS client.
170+
// cleaning up resources created specifically for this ServerConfig.
171171
Cleanups []func()
172172
}
173173

xds/internal/xdsclient/bootstrap/bootstrap_test.go

Lines changed: 27 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1008,49 +1008,39 @@ func TestServerConfigMarshalAndUnmarshal(t *testing.T) {
10081008
}
10091009

10101010
func TestDefaultBundles(t *testing.T) {
1011-
if c := bootstrap.GetCredentials("google_default"); c == nil {
1012-
t.Errorf(`bootstrap.GetCredentials("google_default") credential is nil, want non-nil`)
1013-
}
1014-
1015-
if c := bootstrap.GetCredentials("insecure"); c == nil {
1016-
t.Errorf(`bootstrap.GetCredentials("insecure") credential is nil, want non-nil`)
1017-
}
1011+
tests := []string{"google_default", "insecure", "tls"}
10181012

1019-
if c := bootstrap.GetCredentials("tls"); c == nil {
1020-
t.Errorf(`bootstrap.GetCredentials("tls") credential is nil, want non-nil`)
1013+
for _, typename := range tests {
1014+
t.Run(typename, func(t *testing.T) {
1015+
if c := bootstrap.GetCredentials(typename); c == nil {
1016+
t.Errorf(`bootstrap.GetCredentials(%s) credential is nil, want non-nil`, typename)
1017+
}
1018+
})
10211019
}
10221020
}
10231021

10241022
func TestCredsBuilders(t *testing.T) {
1025-
b := &googleDefaultCredsBuilder{}
1026-
if _, stop, err := b.Build(nil); err != nil {
1027-
t.Errorf("googleDefaultCredsBuilder.Build failed: %v", err)
1028-
} else {
1029-
stop()
1030-
}
1031-
if got, want := b.Name(), "google_default"; got != want {
1032-
t.Errorf("googleDefaultCredsBuilder.Name = %v, want %v", got, want)
1033-
}
1034-
1035-
i := &insecureCredsBuilder{}
1036-
if _, stop, err := i.Build(nil); err != nil {
1037-
t.Errorf("insecureCredsBuilder.Build failed: %v", err)
1038-
} else {
1039-
stop()
1023+
tests := []struct {
1024+
typename string
1025+
builder bootstrap.Credentials
1026+
}{
1027+
{"google_default", &googleDefaultCredsBuilder{}},
1028+
{"insecure", &insecureCredsBuilder{}},
1029+
{"tls", &tlsCredsBuilder{}},
10401030
}
10411031

1042-
if got, want := i.Name(), "insecure"; got != want {
1043-
t.Errorf("insecureCredsBuilder.Name = %v, want %v", got, want)
1044-
}
1032+
for _, test := range tests {
1033+
t.Run(test.typename, func(t *testing.T) {
1034+
if got, want := test.builder.Name(), test.typename; got != want {
1035+
t.Errorf("%T.Name = %v, want %v", test.builder, got, want)
1036+
}
10451037

1046-
tcb := &tlsCredsBuilder{}
1047-
if _, stop, err := tcb.Build(nil); err != nil {
1048-
t.Errorf("tlsCredsBuilder.Build failed: %v", err)
1049-
} else {
1050-
stop()
1051-
}
1052-
if got, want := tcb.Name(), "tls"; got != want {
1053-
t.Errorf("tlsCredsBuilder.Name = %v, want %v", got, want)
1038+
_, stop, err := test.builder.Build(nil)
1039+
if err != nil {
1040+
t.Fatalf("%T.Build failed: %v", test.builder, err)
1041+
}
1042+
stop()
1043+
})
10541044
}
10551045
}
10561046

@@ -1061,9 +1051,10 @@ func TestTlsCredsBuilder(t *testing.T) {
10611051
t.Fatalf("tls.Build() failed with error %s when expected to succeed", err)
10621052
}
10631053
stop()
1054+
10641055
if _, stop, err := tls.Build(json.RawMessage(`{"ca_certificate_file":"/ca_certificates.pem","refresh_interval": "asdf"}`)); err == nil {
10651056
t.Errorf("tls.Build() succeeded with an invalid refresh interval, when expected to fail")
10661057
stop()
10671058
}
1068-
// more tests for config validity are defined in tlscreds subpackage.
1059+
// package internal/xdsclient/tlscreds has tests for config validity.
10691060
}

xds/internal/xdsclient/clientimpl.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,5 +85,17 @@ func (c *clientImpl) close() {
8585
c.authorityMu.Unlock()
8686
c.serializerClose()
8787

88+
for _, f := range c.config.XDSServer.Cleanups {
89+
f()
90+
}
91+
for _, a := range c.config.Authorities {
92+
if a.XDSServer == nil {
93+
// The server for this authority is the top-level one, cleaned up above.
94+
continue
95+
}
96+
for _, f := range a.XDSServer.Cleanups {
97+
f()
98+
}
99+
}
88100
c.logger.Infof("Shutdown")
89101
}

xds/internal/xdsclient/singleton_test.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ package xdsclient
2020

2121
import (
2222
"context"
23+
"encoding/json"
2324
"testing"
2425

2526
"github.com/google/uuid"
@@ -36,6 +37,7 @@ func (s) TestClientNewSingleton(t *testing.T) {
3637
cleanup, err := bootstrap.CreateFile(bootstrap.Options{
3738
NodeID: nodeID,
3839
ServerURI: "non-existent-server-address",
40+
CertificateProviders: map[string]json.RawMessage{},
3941
})
4042
if err != nil {
4143
t.Fatal(err)

xds/internal/xdsclient/tlscreds/bundle.go

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ import (
3131
"google.golang.org/grpc/credentials"
3232
"google.golang.org/grpc/credentials/tls/certprovider"
3333
"google.golang.org/grpc/credentials/tls/certprovider/pemfile"
34+
"google.golang.org/grpc/internal/grpcsync"
3435
)
3536

3637
// bundle is an implementation of credentials.Bundle which implements mTLS
@@ -41,7 +42,9 @@ type bundle struct {
4142

4243
// NewBundle returns a credentials.Bundle which implements mTLS Credentials in xDS
4344
// Bootstrap File. It delegates certificate loading to a file_watcher provider
44-
// if either client certificates or server root CA is specified.
45+
// if either client certificates or server root CA is specified. The second
46+
// return value is a close func that should be called when the caller no longer
47+
// needs this bundle.
4548
// See gRFC A65: github.com/grpc/proposal/blob/master/A65-xds-mtls-creds-in-bootstrap.md
4649
func NewBundle(jd json.RawMessage) (credentials.Bundle, func(), error) {
4750
cfg := &struct {
@@ -78,7 +81,7 @@ func NewBundle(jd json.RawMessage) (credentials.Bundle, func(), error) {
7881
}
7982
return &bundle{
8083
transportCredentials: &reloadingCreds{provider: provider},
81-
}, func() { provider.Close() }, nil
84+
}, grpcsync.OnceFunc(func() { provider.Close() }), nil
8285
}
8386

8487
func (t *bundle) TransportCredentials() credentials.TransportCredentials {
@@ -97,15 +100,6 @@ func (t *bundle) NewWithMode(string) (credentials.Bundle, error) {
97100
return nil, fmt.Errorf("xDS TLS credentials only support one mode")
98101
}
99102

100-
// Close releases the underlying provider. Note that credentials.Bundle are
101-
// not closeable, so users of this type must use a type assertion to call Close.
102-
func (t *bundle) Close() {
103-
cred, ok := t.transportCredentials.(*reloadingCreds)
104-
if ok {
105-
cred.provider.Close()
106-
}
107-
}
108-
109103
// reloadingCreds is a credentials.TransportCredentials for client
110104
// side mTLS that reloads the server root CA certificate and the client
111105
// certificates from the provider on every client handshake. This is necessary

xds/internal/xdsclient/tlscreds/bundle_ext_test.go

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -106,11 +106,11 @@ func (s) TestValidTlsBuilder(t *testing.T) {
106106
for _, test := range tests {
107107
t.Run(test.name, func(t *testing.T) {
108108
msg := json.RawMessage(test.jd)
109-
if _, stop, err := tlscreds.NewBundle(msg); err != nil {
110-
t.Errorf("NewBundle(%s) returned error %s when expected to succeed", test.jd, err)
111-
} else {
112-
stop()
109+
_, stop, err := tlscreds.NewBundle(msg)
110+
if err != nil {
111+
t.Fatalf("NewBundle(%s) returned error %s when expected to succeed", test.jd, err)
113112
}
113+
stop()
114114
})
115115
}
116116
}
@@ -133,11 +133,12 @@ func (s) TestInvalidTlsBuilder(t *testing.T) {
133133
for _, test := range tests {
134134
t.Run(test.name, func(t *testing.T) {
135135
msg := json.RawMessage(test.jd)
136-
if _, stop, err := tlscreds.NewBundle(msg); err == nil || !strings.HasPrefix(err.Error(), test.wantErrPrefix) {
137-
t.Errorf("NewBundle(%s): got error %s, want an error with prefix %s", msg, err, test.wantErrPrefix)
138-
if err == nil {
136+
_, stop, err := tlscreds.NewBundle(msg)
137+
if err == nil || !strings.HasPrefix(err.Error(), test.wantErrPrefix) {
138+
if stop != nil {
139139
stop()
140140
}
141+
t.Fatalf("NewBundle(%s): got error %s, want an error with prefix %s", msg, err, test.wantErrPrefix)
141142
}
142143
})
143144
}

xds/internal/xdsclient/tlscreds/bundle_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ func Test(t *testing.T) {
4646

4747
type failingProvider struct{}
4848

49-
func (f failingProvider) KeyMaterial(ctx context.Context) (*certprovider.KeyMaterial, error) {
49+
func (f failingProvider) KeyMaterial(context.Context) (*certprovider.KeyMaterial, error) {
5050
return nil, errors.New("test error")
5151
}
5252

0 commit comments

Comments
 (0)