Skip to content

Commit 5e4a675

Browse files
committed
test to validate xdsclient ServerIdentifier.Extensions without Equal methodd
1 parent 58d035d commit 5e4a675

File tree

4 files changed

+60
-20
lines changed

4 files changed

+60
-20
lines changed

xds/internal/clients/xdsclient/authority.go

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@ type authorityBuildOptions struct {
132132
// Note that no channels to management servers are created at this time. Instead
133133
// a channel to the first server configuration is created when the first watch
134134
// is registered, and more channels are created as needed by the fallback logic.
135-
func newAuthority(args authorityBuildOptions) (*authority, error) {
135+
func newAuthority(args authorityBuildOptions) *authority {
136136
ctx, cancel := context.WithCancel(context.Background())
137137
l := grpclog.Component("xds")
138138
logPrefix := args.logPrefix + fmt.Sprintf("[authority %q] ", args.name)
@@ -152,12 +152,9 @@ func newAuthority(args authorityBuildOptions) (*authority, error) {
152152
// first watch is registered, and channels to other server configurations
153153
// are created as needed to support fallback.
154154
for _, sc := range args.serverConfigs {
155-
if _, ok := sc.ServerIdentifier.Extensions.(interface{ Equal(any) bool }); sc.ServerIdentifier.Extensions != nil && !ok {
156-
return nil, fmt.Errorf("xdsclient: authority %s has a server config %s with non-nil ServerIdentifier.Extensions without implementing the `func (any) Equal(any) bool` method", args.name, serverConfigString(&sc))
157-
}
158155
ret.xdsChannelConfigs = append(ret.xdsChannelConfigs, &xdsChannelWithConfig{serverConfig: &sc})
159156
}
160-
return ret, nil
157+
return ret
161158
}
162159

163160
// adsStreamFailure is called to notify the authority about an ADS stream

xds/internal/clients/xdsclient/clientimpl.go

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -99,37 +99,30 @@ func newClientImpl(config *Config, watchExpiryTimeout time.Duration, streamBacko
9999
xdsActiveChannels: newServerConfigMap(),
100100
}
101101

102-
var err error
103102
for name, cfg := range config.Authorities {
104103
// If server configs are specified in the authorities map, use that.
105104
// Else, use the top-level server configs.
106105
serverCfg := config.Servers
107106
if len(cfg.XDSServers) >= 1 {
108107
serverCfg = cfg.XDSServers
109108
}
110-
c.authorities[name], err = newAuthority(authorityBuildOptions{
109+
c.authorities[name] = newAuthority(authorityBuildOptions{
111110
serverConfigs: serverCfg,
112111
name: name,
113112
serializer: c.serializer,
114113
getChannelForADS: c.getChannelForADS,
115114
logPrefix: clientPrefix(c),
116115
target: target,
117116
})
118-
if err != nil {
119-
return nil, err
120-
}
121117
}
122-
c.topLevelAuthority, err = newAuthority(authorityBuildOptions{
118+
c.topLevelAuthority = newAuthority(authorityBuildOptions{
123119
serverConfigs: config.Servers,
124120
name: "",
125121
serializer: c.serializer,
126122
getChannelForADS: c.getChannelForADS,
127123
logPrefix: clientPrefix(c),
128124
target: target,
129125
})
130-
if err != nil {
131-
return nil, err
132-
}
133126
c.logger = prefixLogger(c)
134127
return c, nil
135128
}

xds/internal/clients/xdsclient/xdsclient.go

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ package xdsclient
3232

3333
import (
3434
"errors"
35+
"fmt"
3536
"time"
3637

3738
v3statuspb "github.com/envoyproxy/go-control-plane/envoy/service/status/v3"
@@ -58,6 +59,24 @@ func New(config Config) (*XDSClient, error) {
5859
return nil, errors.New("xdsclient: no servers or authorities specified")
5960
}
6061

62+
for name, cfg := range config.Authorities {
63+
serverCfg := config.Servers
64+
if len(cfg.XDSServers) >= 1 {
65+
serverCfg = cfg.XDSServers
66+
}
67+
for _, sc := range serverCfg {
68+
if _, ok := sc.ServerIdentifier.Extensions.(interface{ Equal(any) bool }); sc.ServerIdentifier.Extensions != nil && !ok {
69+
return nil, fmt.Errorf("xdsclient: authority %s has a server config %s with non-nil ServerIdentifier.Extensions without implementing the `func (any) Equal(any) bool` method", name, serverConfigString(&sc))
70+
}
71+
}
72+
}
73+
74+
for _, sc := range config.Servers {
75+
if _, ok := sc.ServerIdentifier.Extensions.(interface{ Equal(any) bool }); sc.ServerIdentifier.Extensions != nil && !ok {
76+
return nil, fmt.Errorf("xdsclient: one of the default servers has a server config %s with non-nil ServerIdentifier.Extensions without implementing the `func (any) Equal(any) bool` method", serverConfigString(&sc))
77+
}
78+
}
79+
6180
clientImpl, err := newClientImpl(&config, defaultWatchExpiryTimeout, defaultExponentialBackoff, "xds-client")
6281
if err != nil {
6382
return nil, err

xds/internal/clients/xdsclient/xdsclient_test.go

Lines changed: 37 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
package xdsclient
2020

2121
import (
22+
"strings"
2223
"testing"
2324

2425
"google.golang.org/grpc/xds/internal/clients"
@@ -35,22 +36,22 @@ func (s) TestXDSClient_New(t *testing.T) {
3536
{
3637
name: "empty node ID",
3738
config: Config{},
38-
wantErr: "xdsclient: node ID is empty",
39+
wantErr: "node ID is empty",
3940
},
4041
{
4142
name: "nil resource types",
4243
config: Config{
4344
Node: clients.Node{ID: "node-id"},
4445
},
45-
wantErr: "xdsclient: resource types map is nil",
46+
wantErr: "resource types map is nil",
4647
},
4748
{
4849
name: "nil transport builder",
4950
config: Config{
5051
Node: clients.Node{ID: "node-id"},
5152
ResourceTypes: map[string]ResourceType{xdsresource.V3ListenerURL: listenerType},
5253
},
53-
wantErr: "xdsclient: transport builder is nil",
54+
wantErr: "transport builder is nil",
5455
},
5556
{
5657
name: "no servers or authorities",
@@ -59,7 +60,7 @@ func (s) TestXDSClient_New(t *testing.T) {
5960
ResourceTypes: map[string]ResourceType{xdsresource.V3ListenerURL: listenerType},
6061
TransportBuilder: grpctransport.NewBuilder(),
6162
},
62-
wantErr: "xdsclient: no servers or authorities specified",
63+
wantErr: "no servers or authorities specified",
6364
},
6465
{
6566
name: "success with servers",
@@ -77,10 +78,40 @@ func (s) TestXDSClient_New(t *testing.T) {
7778
Node: clients.Node{ID: "node-id"},
7879
ResourceTypes: map[string]ResourceType{xdsresource.V3ListenerURL: listenerType},
7980
TransportBuilder: grpctransport.NewBuilder(),
80-
Authorities: map[string]Authority{"authority-name": {}},
81+
Authorities: map[string]Authority{"authority-name": {XDSServers: []ServerConfig{{ServerIdentifier: clients.ServerIdentifier{ServerURI: "dummy-server"}}}}},
8182
},
8283
wantErr: "",
8384
},
85+
{
86+
name: "success with server identifier extensions with equal",
87+
config: Config{
88+
Node: clients.Node{ID: "node-id"},
89+
ResourceTypes: map[string]ResourceType{xdsresource.V3ListenerURL: listenerType},
90+
TransportBuilder: grpctransport.NewBuilder(),
91+
Servers: []ServerConfig{{ServerIdentifier: clients.ServerIdentifier{ServerURI: "dummy-server", Extensions: &testServerIdentifierExtension{x: 1}}}},
92+
},
93+
wantErr: "",
94+
},
95+
{
96+
name: "default servers with server identifier extensions without equal",
97+
config: Config{
98+
Node: clients.Node{ID: "node-id"},
99+
ResourceTypes: map[string]ResourceType{xdsresource.V3ListenerURL: listenerType},
100+
TransportBuilder: grpctransport.NewBuilder(),
101+
Servers: []ServerConfig{{ServerIdentifier: clients.ServerIdentifier{ServerURI: "dummy-server", Extensions: &testServerIdentifierExtensionWithoutEqual{x: 1}}}},
102+
},
103+
wantErr: "non-nil ServerIdentifier.Extensions without implementing the `func (any) Equal(any) bool` method",
104+
},
105+
{
106+
name: "authorities with server identifier extensions without equal",
107+
config: Config{
108+
Node: clients.Node{ID: "node-id"},
109+
ResourceTypes: map[string]ResourceType{xdsresource.V3ListenerURL: listenerType},
110+
TransportBuilder: grpctransport.NewBuilder(),
111+
Authorities: map[string]Authority{"authority-name": {XDSServers: []ServerConfig{{ServerIdentifier: clients.ServerIdentifier{ServerURI: "dummy-server", Extensions: &testServerIdentifierExtensionWithoutEqual{x: 1}}}}}},
112+
},
113+
wantErr: "non-nil ServerIdentifier.Extensions without implementing the `func (any) Equal(any) bool` method",
114+
},
84115
}
85116
for _, tt := range tests {
86117
t.Run(tt.name, func(t *testing.T) {
@@ -90,7 +121,7 @@ func (s) TestXDSClient_New(t *testing.T) {
90121
t.Fatalf("New(%+v) failed: %v", tt.config, err)
91122
}
92123
} else {
93-
if err == nil || err.Error() != tt.wantErr {
124+
if err == nil || !strings.Contains(err.Error(), tt.wantErr) {
94125
t.Fatalf("New(%+v) returned error %v, want error %q", tt.config, err, tt.wantErr)
95126
}
96127
}

0 commit comments

Comments
 (0)