diff --git a/internal/xds/translator/route.go b/internal/xds/translator/route.go index 03af02482835..07336fa48ee1 100644 --- a/internal/xds/translator/route.go +++ b/internal/xds/translator/route.go @@ -8,6 +8,7 @@ package translator import ( "errors" "strings" + "time" corev3 "github.com/envoyproxy/go-control-plane/envoy/config/core/v3" routev3 "github.com/envoyproxy/go-control-plane/envoy/config/route/v3" @@ -62,7 +63,7 @@ func buildXdsRoute(httpRoute *ir.HTTPRoute) (*routev3.Route, error) { // If there are invalid backends then a weighted cluster is required for the route routeAction = buildXdsWeightedRouteAction(httpRoute) } else { - routeAction = buildXdsRouteAction(httpRoute.Destination.Name) + routeAction = buildXdsRouteAction(httpRoute) } if httpRoute.Mirrors != nil { routeAction.RequestMirrorPolicies = buildXdsRequestMirrorPolicies(httpRoute.Mirrors) @@ -207,11 +208,12 @@ func buildXdsStringMatcher(irMatch *ir.StringMatch) *matcherv3.StringMatcher { return stringMatcher } -func buildXdsRouteAction(destName string) *routev3.RouteAction { +func buildXdsRouteAction(httpRoute *ir.HTTPRoute) *routev3.RouteAction { return &routev3.RouteAction{ ClusterSpecifier: &routev3.RouteAction_Cluster{ - Cluster: destName, + Cluster: httpRoute.Destination.Name, }, + IdleTimeout: idleTimeout(httpRoute), } } @@ -239,9 +241,31 @@ func buildXdsWeightedRouteAction(httpRoute *ir.HTTPRoute) *routev3.RouteAction { Clusters: clusters, }, }, + IdleTimeout: idleTimeout(httpRoute), } } +func idleTimeout(httpRoute *ir.HTTPRoute) *durationpb.Duration { + if httpRoute.Timeout != nil && httpRoute.Timeout.HTTP != nil { + if httpRoute.Timeout.HTTP.RequestTimeout != nil { + timeout := time.Hour // Default to 1 hour + + // Ensure is not less than the request timeout + if timeout < httpRoute.Timeout.HTTP.RequestTimeout.Duration { + timeout = httpRoute.Timeout.HTTP.RequestTimeout.Duration + } + + // Disable idle timeout when request timeout is disabled + if httpRoute.Timeout.HTTP.RequestTimeout.Duration == 0 { + timeout = 0 + } + + return durationpb.New(timeout) + } + } + return nil +} + func buildXdsRedirectAction(redirection *ir.Redirect) *routev3.RedirectAction { routeAction := &routev3.RedirectAction{} diff --git a/internal/xds/translator/testdata/in/xds-ir/http-route-timeout.yaml b/internal/xds/translator/testdata/in/xds-ir/http-route-timeout.yaml index da1a4243aa3a..fdd2b84ef849 100644 --- a/internal/xds/translator/testdata/in/xds-ir/http-route-timeout.yaml +++ b/internal/xds/translator/testdata/in/xds-ir/http-route-timeout.yaml @@ -23,3 +23,25 @@ http: - endpoints: - host: "1.2.3.4" port: 50000 + - name: "second-route" + hostname: "*" + timeout: + http: + requestTimeout: 4000s + destination: + name: "second-route-dest" + settings: + - endpoints: + - host: "1.2.3.4" + port: 50001 + - name: "third-route" + hostname: "*" + timeout: + http: + requestTimeout: 0s + destination: + name: "third-route-dest" + settings: + - endpoints: + - host: "1.2.3.4" + port: 50002 diff --git a/internal/xds/translator/testdata/out/xds-ir/http-route-timeout.clusters.yaml b/internal/xds/translator/testdata/out/xds-ir/http-route-timeout.clusters.yaml index c8692b816025..869321c6504a 100644 --- a/internal/xds/translator/testdata/out/xds-ir/http-route-timeout.clusters.yaml +++ b/internal/xds/translator/testdata/out/xds-ir/http-route-timeout.clusters.yaml @@ -12,3 +12,31 @@ outlierDetection: {} perConnectionBufferLimitBytes: 32768 type: EDS +- commonLbConfig: + localityWeightedLbConfig: {} + connectTimeout: 10s + dnsLookupFamily: V4_ONLY + edsClusterConfig: + edsConfig: + ads: {} + resourceApiVersion: V3 + serviceName: second-route-dest + lbPolicy: LEAST_REQUEST + name: second-route-dest + outlierDetection: {} + perConnectionBufferLimitBytes: 32768 + type: EDS +- commonLbConfig: + localityWeightedLbConfig: {} + connectTimeout: 10s + dnsLookupFamily: V4_ONLY + edsClusterConfig: + edsConfig: + ads: {} + resourceApiVersion: V3 + serviceName: third-route-dest + lbPolicy: LEAST_REQUEST + name: third-route-dest + outlierDetection: {} + perConnectionBufferLimitBytes: 32768 + type: EDS diff --git a/internal/xds/translator/testdata/out/xds-ir/http-route-timeout.endpoints.yaml b/internal/xds/translator/testdata/out/xds-ir/http-route-timeout.endpoints.yaml index 3b3f2d09076e..42a346c4041a 100644 --- a/internal/xds/translator/testdata/out/xds-ir/http-route-timeout.endpoints.yaml +++ b/internal/xds/translator/testdata/out/xds-ir/http-route-timeout.endpoints.yaml @@ -10,3 +10,27 @@ loadBalancingWeight: 1 locality: region: first-route-dest/backend/0 +- clusterName: second-route-dest + endpoints: + - lbEndpoints: + - endpoint: + address: + socketAddress: + address: 1.2.3.4 + portValue: 50001 + loadBalancingWeight: 1 + loadBalancingWeight: 1 + locality: + region: second-route-dest/backend/0 +- clusterName: third-route-dest + endpoints: + - lbEndpoints: + - endpoint: + address: + socketAddress: + address: 1.2.3.4 + portValue: 50002 + loadBalancingWeight: 1 + loadBalancingWeight: 1 + locality: + region: third-route-dest/backend/0 diff --git a/internal/xds/translator/testdata/out/xds-ir/http-route-timeout.routes.yaml b/internal/xds/translator/testdata/out/xds-ir/http-route-timeout.routes.yaml index db3dbd4ba6a1..23d2bf4b701b 100644 --- a/internal/xds/translator/testdata/out/xds-ir/http-route-timeout.routes.yaml +++ b/internal/xds/translator/testdata/out/xds-ir/http-route-timeout.routes.yaml @@ -14,6 +14,25 @@ name: first-route route: cluster: first-route-dest + idleTimeout: 3600s timeout: 5s upgradeConfigs: - upgradeType: websocket + - match: + prefix: / + name: second-route + route: + cluster: second-route-dest + idleTimeout: 4000s + timeout: 4000s + upgradeConfigs: + - upgradeType: websocket + - match: + prefix: / + name: third-route + route: + cluster: third-route-dest + idleTimeout: 0s + timeout: 0s + upgradeConfigs: + - upgradeType: websocket