Skip to content

Conversation

@Pranjali-2501
Copy link
Contributor

@Pranjali-2501 Pranjali-2501 commented Nov 26, 2025

This PR implements the validation logic and extracting per endpoint Hostname attributes from xDS resources for gRFC A81

Key Changes:

  1. RDS Resource Validation :

    • The boolean value of RouteAction.auto_host_rewrite is extracted from the RDS resource and stored in route struct
    • This field is only set to true in the parsed route struct if the trusted_xds_server option is present in the ServerConfig and the global environment variable for authority overriding is enabled.
  2. EDS Resource Validation:

    • The Endpoint.hostname field is extracted from the EDS resource and will be stored as a hostname string in parsed endpoint struct. It will be changed to be an per-endpoint resolver attribute in a follow-up PR.

RELEASE NOTES: None

@Pranjali-2501 Pranjali-2501 added this to the 1.78 Release milestone Nov 26, 2025
@Pranjali-2501 Pranjali-2501 added Type: Feature New features or improvements in behavior Area: xDS Includes everything xDS related, including LB policies used with xDS. labels Nov 26, 2025
@codecov
Copy link

codecov bot commented Nov 26, 2025

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 83.22%. Comparing base (a764d3f) to head (8f184b4).
⚠️ Report is 2 commits behind head on master.

Additional details and impacted files
@@            Coverage Diff             @@
##           master    #8728      +/-   ##
==========================================
+ Coverage   83.21%   83.22%   +0.01%     
==========================================
  Files         419      419              
  Lines       32443    32454      +11     
==========================================
+ Hits        26997    27011      +14     
- Misses       4056     4058       +2     
+ Partials     1390     1385       -5     
Files with missing lines Coverage Δ
internal/envconfig/envconfig.go 100.00% <ø> (ø)
internal/xds/xdsclient/xdsresource/filter_chain.go 93.92% <100.00%> (+0.55%) ⬆️
...ds/xdsclient/xdsresource/listener_resource_type.go 96.15% <100.00%> (ø)
...dsclient/xdsresource/route_config_resource_type.go 93.33% <100.00%> (ø)
...nternal/xds/xdsclient/xdsresource/unmarshal_eds.go 94.32% <100.00%> (+0.04%) ⬆️
...nternal/xds/xdsclient/xdsresource/unmarshal_lds.go 88.46% <100.00%> (ø)
...nternal/xds/xdsclient/xdsresource/unmarshal_rds.go 87.74% <100.00%> (+0.14%) ⬆️

... and 24 files with indirect coverage changes

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

Copy link
Contributor

@easwars easwars left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The PR description says:

  • This string value is included as a per-endpoint resolver attribute (hostname) in the parsed resource struct.

But the PR only stores it as a string, and not as a resolver attribute. The per-endpoint resolver attribute is defined here:

Attributes *attributes.Attributes

This means that the parsed Endpoint struct defined here:

needs to be changed to contain a resolver.Endpoint instead of a slice of address strings, and the newly added HostName field and some of the other existing things like Weight and HashKey also need to move into the endpoint attributes. This is probably big enough to be made as a separate PR though. Let's discuss this offline.

But for now, maybe the PR description need to be modified though to state that we are only storing it as a string for now and that in a follow-up PR we will change it to be an endpoint attribute.

Comment on lines 81 to 83
// XDSAuthorityRewrite is set if xDS authority rewriting is enabled,
// according to gRFC A81. It can be enabled by setting
// GRPC_EXPERIMENTAL_XDS_AUTHORITY_REWRITE to true.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nit: Maybe something like:

// XDSAuthorityRewrite indicates whether xDS authority rewriting is enabled.
// This feature is defined in gRFC A81 and is enabled by setting the
// environment variable GRPC_EXPERIMENTAL_XDS_AUTHORITY_REWRITE to "true".

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done.

update.RouteConfigName = name
case *v3httppb.HttpConnectionManager_RouteConfig:
routeU, err := generateRDSUpdateFromRouteConfiguration(apiLis.GetRouteConfig())
routeU, err := generateRDSUpdateFromRouteConfiguration(nil, apiLis.GetRouteConfig())
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why are we passing nil here? This is an inline route configuration in the listener resource and needs to be handled exactly the same way as the non-inlined version is. So, you would have to plumb the DecodeOptions all the way from listenerResourceDecoder.Decode to unmarshalListenerResource to here (just like you are currently doing for the RDS decoding pipeline).

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Made the changes.

// Can specify v3 here, as will never get to this function
// if v2.
routeU, err := generateRDSUpdateFromRouteConfiguration(hcm.GetRouteConfig())
routeU, err := generateRDSUpdateFromRouteConfiguration(nil, hcm.GetRouteConfig())
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It is fine to pass nil here since this is server side listener resource processing and here we don't have to worry about authority rewriting. We might have to plump the decode options to this at some point in the future if they are required for something else on the server-side, but for now, we are good.

func (d *routeConfigResourceDecoder) Decode(resource *xdsclient.AnyProto, _ xdsclient.DecodeOptions) (*xdsclient.DecodeResult, error) {
name, rc, err := unmarshalRouteConfigResource(resource.ToAny())
func (d *routeConfigResourceDecoder) Decode(resource *xdsclient.AnyProto, opts xdsclient.DecodeOptions) (*xdsclient.DecodeResult, error) {
name, rc, err := unmarshalRouteConfigResource(&opts, resource.ToAny())
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nit: Why is the order of arguments being reversed here? It would be nicer if we can retain the same order of arguments for Decode and unmarshalRouteConfigResource and the whole chain down from there. For here, and for the LDS side as well (which you are going to have to add, see another comment for more details).

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done.

}

got := update.VirtualHosts[0].Routes[0].AutoHostRewrite

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nit: delete newline

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

done.

ldsTarget = "lds.target.good:1111"
)

buildRouteConfig := func() *v3routepb.RouteConfiguration {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why is this a function? Can this be declared inside the test body instead?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done.

Action: &v3routepb.Route_Route{
Route: &v3routepb.RouteAction{
ClusterSpecifier: &v3routepb.RouteAction_Cluster{Cluster: clusterName},
HostRewriteSpecifier: &v3routepb.RouteAction_AutoHostRewrite{AutoHostRewrite: &wrapperspb.BoolValue{Value: true}},
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We probably also need test cases for when the AutoHostRewrite field in the proto is false.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Added a testcase for that.

m: func() *v3endpointpb.ClusterLoadAssignment {
clab0 := newClaBuilder("test", nil)
clab0.addLocality("locality-1", 1, 1, []endpointOpts{{addrWithPort: "addr1:314"}}, &addLocalityOptions{
clab0.addLocality("locality-1", 1, 1, []endpointOpts{{addrWithPort: "addr1:314", hostname: "addr1"}}, &addLocalityOptions{
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I know these callsites are existing art, but they are really hard to read. While you are here, could you please follow guidelines from here to make them more readable. See: go/go-style/decisions#func-formatting

Thanks.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Made the changes.

@easwars easwars assigned Pranjali-2501 and unassigned easwars Nov 26, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Area: xDS Includes everything xDS related, including LB policies used with xDS. Type: Feature New features or improvements in behavior

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants