Skip to content

Commit ce7fd1e

Browse files
committed
[gateway] Invoke PostRouteModify extension hook during xDS translation
The PostRouteModify RPC was defined in the extension proto but never called by the translator. This adds processExtensionPostRouteHook in extension.go and wires it into Translate() between the listener and cluster hooks. The extension server can now inject per-route metadata (e.g., project_id into filter_metadata) which is needed for OTEL access log and tracing attribution.
1 parent 885ba0a commit ce7fd1e

File tree

2 files changed

+56
-0
lines changed

2 files changed

+56
-0
lines changed

pkg/gateway/xds/translator/extension.go

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import (
1818
"github.com/apoxy-dev/apoxy/pkg/log"
1919
clusterv3 "github.com/envoyproxy/go-control-plane/envoy/config/cluster/v3"
2020
listenerv3 "github.com/envoyproxy/go-control-plane/envoy/config/listener/v3"
21+
routev3 "github.com/envoyproxy/go-control-plane/envoy/config/route/v3"
2122
cachetypes "github.com/envoyproxy/go-control-plane/pkg/cache/types"
2223
resourcev3 "github.com/envoyproxy/go-control-plane/pkg/resource/v3"
2324
"github.com/envoyproxy/gateway/proto/extension"
@@ -150,6 +151,39 @@ func processExtensionPostListenerHook(
150151
return nil
151152
}
152153

154+
// processExtensionPostRouteHook calls PostRouteModify on the extension server
155+
// for each route in every RouteConfiguration, allowing the extension to inject
156+
// per-route metadata (e.g., project_id into filter_metadata).
157+
func processExtensionPostRouteHook(
158+
ctx context.Context,
159+
tCtx *types.ResourceVersionTable,
160+
c extension.EnvoyGatewayExtensionClient,
161+
) error {
162+
log := log.DefaultLogger
163+
164+
for _, r := range tCtx.XdsResources[resourcev3.RouteType] {
165+
routeCfg := r.(*routev3.RouteConfiguration)
166+
for _, vh := range routeCfg.GetVirtualHosts() {
167+
for i, route := range vh.GetRoutes() {
168+
log.Info("Processing extension post route hook", "route", route.GetName())
169+
reqCtx, cancel := context.WithTimeout(ctx, 2*time.Second)
170+
resp, err := c.PostRouteModify(reqCtx, &extension.PostRouteModifyRequest{
171+
Route: route,
172+
})
173+
cancel()
174+
if err != nil {
175+
return err
176+
}
177+
if resp.GetRoute() != nil {
178+
vh.Routes[i] = resp.GetRoute()
179+
}
180+
}
181+
}
182+
}
183+
184+
return nil
185+
}
186+
153187
// processExtensionPostTranslateHook calls PostTranslateModify on the extension
154188
// server with all translated xDS clusters, allowing the extension to modify
155189
// or add clusters (e.g., to set per-project DNS resolver ports or inject an

pkg/gateway/xds/translator/translator.go

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,10 @@ func (t *Translator) Translate(xdsIR *ir.Xds) (*types.ResourceVersionTable, erro
107107
errs = errors.Join(errs, err)
108108
}
109109

110+
if err := t.notifyExtensionServerAboutRoutes(tCtx); err != nil {
111+
errs = errors.Join(errs, err)
112+
}
113+
110114
if err := t.notifyExtensionServerAboutClusters(tCtx); err != nil {
111115
errs = errors.Join(errs, err)
112116
}
@@ -121,6 +125,24 @@ func (t *Translator) Translate(xdsIR *ir.Xds) (*types.ResourceVersionTable, erro
121125
return tCtx, errs
122126
}
123127

128+
// notifyExtensionServerAboutRoutes calls the extension server's PostRouteModify
129+
// hook for each route in every RouteConfiguration. This allows the extension to
130+
// inject per-route metadata (e.g., project_id into filter_metadata).
131+
func (t *Translator) notifyExtensionServerAboutRoutes(tCtx *types.ResourceVersionTable) error {
132+
if t.ExtensionServer == nil {
133+
return nil
134+
}
135+
136+
if err := processExtensionPostRouteHook(t.Ctx, tCtx, t.ExtensionServer.EnvoyGatewayExtensionClient); err != nil {
137+
if !t.ExtensionServer.FailOpen {
138+
return err
139+
}
140+
slog.Error("Extension Manager PostRoute failure", "error", err)
141+
}
142+
143+
return nil
144+
}
145+
124146
// notifyExtensionServerAboutClusters calls the extension server's
125147
// PostTranslateModify hook with all translated xDS clusters.
126148
func (t *Translator) notifyExtensionServerAboutClusters(tCtx *types.ResourceVersionTable) error {

0 commit comments

Comments
 (0)