Skip to content

Commit 57e4391

Browse files
authored
googlec2p: use the bootstrap parsing code to generate parsed bootstrap config instead of handcrafting it (#7040)
1 parent fc3f327 commit 57e4391

File tree

4 files changed

+51
-49
lines changed

4 files changed

+51
-49
lines changed

xds/googledirectpath/googlec2p.go

Lines changed: 47 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@ import (
3030
"net/url"
3131
"time"
3232

33-
"google.golang.org/grpc"
3433
"google.golang.org/grpc/grpclog"
3534
"google.golang.org/grpc/internal/envconfig"
3635
"google.golang.org/grpc/internal/googlecloud"
@@ -39,9 +38,6 @@ import (
3938
"google.golang.org/grpc/resolver"
4039
"google.golang.org/grpc/xds/internal/xdsclient"
4140
"google.golang.org/grpc/xds/internal/xdsclient/bootstrap"
42-
"google.golang.org/protobuf/types/known/structpb"
43-
44-
v3corepb "github.com/envoyproxy/go-control-plane/envoy/config/core/v3"
4541

4642
_ "google.golang.org/grpc/xds" // To register xds resolvers and balancers.
4743
)
@@ -57,6 +53,7 @@ const (
5753

5854
gRPCUserAgentName = "gRPC Go"
5955
clientFeatureNoOverprovisioning = "envoy.lb.does_not_support_overprovisioning"
56+
clientFeatureResourceWrapper = "xds.config.resource-in-sotw"
6057
ipv6CapableMetadataName = "TRAFFICDIRECTOR_DIRECTPATH_C2P_IPV6_CAPABLE"
6158

6259
logPrefix = "[google-c2p-resolver]"
@@ -102,30 +99,26 @@ func (c2pResolverBuilder) Build(t resolver.Target, cc resolver.ClientConn, opts
10299
go func() { zoneCh <- getZone(httpReqTimeout) }()
103100
go func() { ipv6CapableCh <- getIPv6Capable(httpReqTimeout) }()
104101

105-
balancerName := envconfig.C2PResolverTestOnlyTrafficDirectorURI
106-
if balancerName == "" {
107-
balancerName = tdURL
102+
xdsServerURI := envconfig.C2PResolverTestOnlyTrafficDirectorURI
103+
if xdsServerURI == "" {
104+
xdsServerURI = tdURL
108105
}
109-
serverConfig, err := bootstrap.ServerConfigFromJSON([]byte(fmt.Sprintf(`
106+
107+
nodeCfg := newNodeConfig(<-zoneCh, <-ipv6CapableCh)
108+
xdsServerCfg := newXdsServerConfig(xdsServerURI)
109+
authoritiesCfg := newAuthoritiesConfig(xdsServerCfg)
110+
111+
config, err := bootstrap.NewConfigFromContents([]byte(fmt.Sprintf(`
110112
{
111-
"server_uri": "%s",
112-
"channel_creds": [{"type": "google_default"}],
113-
"server_features": ["xds_v3", "ignore_resource_deletion", "xds.config.resource-in-sotw"]
114-
}`, balancerName)))
113+
"xds_servers": [%s],
114+
"client_default_listener_resource_name_template": "%%s",
115+
"authorities": %s,
116+
"node": %s
117+
}`, xdsServerCfg, authoritiesCfg, nodeCfg)))
118+
115119
if err != nil {
116120
return nil, fmt.Errorf("failed to build bootstrap configuration: %v", err)
117121
}
118-
config := &bootstrap.Config{
119-
XDSServer: serverConfig,
120-
ClientDefaultListenerResourceNameTemplate: "%s",
121-
Authorities: map[string]*bootstrap.Authority{
122-
c2pAuthority: {
123-
XDSServer: serverConfig,
124-
ClientListenerResourceNameTemplate: fmt.Sprintf("xdstp://%s/envoy.config.listener.v3.Listener/%%s", c2pAuthority),
125-
},
126-
},
127-
NodeProto: newNode(<-zoneCh, <-ipv6CapableCh),
128-
}
129122

130123
// Create singleton xds client with this config. The xds client will be
131124
// used by the xds resolver later.
@@ -166,30 +159,41 @@ func (r *c2pResolver) Close() {
166159
r.clientCloseFunc()
167160
}
168161

169-
var ipv6EnabledMetadata = &structpb.Struct{
170-
Fields: map[string]*structpb.Value{
171-
ipv6CapableMetadataName: structpb.NewBoolValue(true),
172-
},
173-
}
174-
175162
var id = fmt.Sprintf("C2P-%d", grpcrand.Int())
176163

177-
// newNode makes a copy of defaultNode, and populate it's Metadata and
178-
// Locality fields.
179-
func newNode(zone string, ipv6Capable bool) *v3corepb.Node {
180-
ret := &v3corepb.Node{
181-
// Not all required fields are set in defaultNote. Metadata will be set
182-
// if ipv6 is enabled. Locality will be set to the value from metadata.
183-
Id: id,
184-
UserAgentName: gRPCUserAgentName,
185-
UserAgentVersionType: &v3corepb.Node_UserAgentVersion{UserAgentVersion: grpc.Version},
186-
ClientFeatures: []string{clientFeatureNoOverprovisioning},
187-
}
188-
ret.Locality = &v3corepb.Locality{Zone: zone}
164+
func newNodeConfig(zone string, ipv6Capable bool) string {
165+
metadata := ""
189166
if ipv6Capable {
190-
ret.Metadata = ipv6EnabledMetadata
167+
metadata = fmt.Sprintf(`, "metadata": { "%s": true }`, ipv6CapableMetadataName)
191168
}
192-
return ret
169+
170+
return fmt.Sprintf(`
171+
{
172+
"id": "%s",
173+
"locality": {
174+
"zone": "%s"
175+
}
176+
%s
177+
}`, id, zone, metadata)
178+
}
179+
180+
func newAuthoritiesConfig(xdsServer string) string {
181+
return fmt.Sprintf(`
182+
{
183+
"%s": {
184+
"xds_servers": [%s]
185+
}
186+
}
187+
`, c2pAuthority, xdsServer)
188+
}
189+
190+
func newXdsServerConfig(xdsServerURI string) string {
191+
return fmt.Sprintf(`
192+
{
193+
"server_uri": "%s",
194+
"channel_creds": [{"type": "google_default"}],
195+
"server_features": ["xds_v3", "ignore_resource_deletion", "xds.config.resource-in-sotw"]
196+
}`, xdsServerURI)
193197
}
194198

195199
// runDirectPath returns whether this resolver should use direct path.

xds/googledirectpath/googlec2p_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -199,7 +199,7 @@ func TestBuildXDS(t *testing.T) {
199199
Locality: &v3corepb.Locality{Zone: testZone},
200200
UserAgentName: gRPCUserAgentName,
201201
UserAgentVersionType: &v3corepb.Node_UserAgentVersion{UserAgentVersion: grpc.Version},
202-
ClientFeatures: []string{clientFeatureNoOverprovisioning},
202+
ClientFeatures: []string{clientFeatureNoOverprovisioning, clientFeatureResourceWrapper},
203203
}
204204
if tt.ipv6 {
205205
wantNode.Metadata = &structpb.Struct{

xds/internal/xdsclient/bootstrap/bootstrap.go

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -453,11 +453,9 @@ func NewConfig() (*Config, error) {
453453
return newConfigFromContents(data)
454454
}
455455

456-
// NewConfigFromContentsForTesting returns a new Config using the specified
456+
// NewConfigFromContents returns a new Config using the specified
457457
// bootstrap file contents instead of reading the environment variable.
458-
//
459-
// This is only suitable for testing purposes.
460-
func NewConfigFromContentsForTesting(data []byte) (*Config, error) {
458+
func NewConfigFromContents(data []byte) (*Config, error) {
461459
return newConfigFromContents(data)
462460
}
463461

xds/internal/xdsclient/client_new.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -163,7 +163,7 @@ func getOrMakeClientForTesting(config []byte) (*clientRefCounted, error) {
163163
return c, nil
164164
}
165165

166-
bcfg, err := bootstrap.NewConfigFromContentsForTesting(config)
166+
bcfg, err := bootstrap.NewConfigFromContents(config)
167167
if err != nil {
168168
return nil, fmt.Errorf("bootstrap config %s: %v", string(config), err)
169169
}

0 commit comments

Comments
 (0)