Skip to content

Commit

Permalink
direct response docs and tests (envoyproxy#4583)
Browse files Browse the repository at this point in the history
* tests: direct response

Signed-off-by: Arko Dasgupta <[email protected]>

* unit tests

Signed-off-by: Arko Dasgupta <[email protected]>

* fix ns

Signed-off-by: Arko Dasgupta <[email protected]>

* docs for direct response

Signed-off-by: Arko Dasgupta <[email protected]>

* negative tests

Signed-off-by: Arko Dasgupta <[email protected]>
  • Loading branch information
arkodg authored Nov 4, 2024
1 parent 04ac7b4 commit f384a64
Show file tree
Hide file tree
Showing 7 changed files with 749 additions and 24 deletions.
2 changes: 1 addition & 1 deletion internal/gatewayapi/route.go
Original file line number Diff line number Diff line change
Expand Up @@ -237,7 +237,7 @@ func (t *Translator) processHTTPRouteRules(httpRoute *HTTPRouteContext, parentRe
// If the route has no valid backends then just use a direct response and don't fuss with weighted responses
for _, ruleRoute := range ruleRoutes {
noValidBackends := ruleRoute.Destination == nil || ruleRoute.Destination.ToBackendWeights().Valid == 0
if noValidBackends && ruleRoute.Redirect == nil {
if ruleRoute.DirectResponse == nil && noValidBackends && ruleRoute.Redirect == nil {
ruleRoute.DirectResponse = &ir.CustomResponse{
StatusCode: ptr.To(uint32(500)),
}
Expand Down
119 changes: 119 additions & 0 deletions internal/gatewayapi/testdata/httproute-with-direct-response.in.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,119 @@
gateways:
- apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
namespace: envoy-gateway
name: gateway-1
spec:
gatewayClassName: envoy-gateway-class
listeners:
- name: http
protocol: HTTP
port: 80
hostname: "*.envoyproxy.io"
allowedRoutes:
namespaces:
from: All
httpRoutes:
- apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: direct-response
namespace: default
spec:
parentRefs:
- name: gateway-1
namespace: envoy-gateway
sectionName: http
rules:
- matches:
- path:
type: PathPrefix
value: /inline
filters:
- type: ExtensionRef
extensionRef:
group: gateway.envoyproxy.io
kind: HTTPRouteFilter
name: direct-response-inline
- matches:
- path:
type: PathPrefix
value: /value-ref
filters:
- type: ExtensionRef
extensionRef:
group: gateway.envoyproxy.io
kind: HTTPRouteFilter
name: direct-response-value-ref
- apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: direct-response-with-errors
namespace: default
spec:
parentRefs:
- name: gateway-1
namespace: envoy-gateway
sectionName: http
rules:
- matches:
- path:
type: PathPrefix
value: /value-ref-not-found
filters:
- type: ExtensionRef
extensionRef:
group: gateway.envoyproxy.io
kind: HTTPRouteFilter
name: direct-response-value-ref-not-found
configMaps:
- apiVersion: v1
kind: ConfigMap
metadata:
name: value-ref-response
namespace: default
data:
response.body: '{"error": "Internal Server Error"}'
httpFilters:
- apiVersion: gateway.envoyproxy.io/v1alpha1
kind: HTTPRouteFilter
metadata:
name: direct-response-inline
namespace: default
spec:
directResponse:
contentType: text/plain
body:
type: Inline
inline: "OK"
- apiVersion: gateway.envoyproxy.io/v1alpha1
kind: HTTPRouteFilter
metadata:
name: direct-response-value-ref-not-exit
namespace: default
spec:
directResponse:
contentType: application/json
statusCode: 502
body:
type: ValueRef
valueRef:
group: ""
kind: ConfigMap
name: value-ref-does-not-exist
- apiVersion: gateway.envoyproxy.io/v1alpha1
kind: HTTPRouteFilter
metadata:
name: direct-response-value-ref
namespace: default
spec:
directResponse:
contentType: application/json
statusCode: 502
body:
type: ValueRef
valueRef:
group: ""
kind: ConfigMap
name: value-ref-response
208 changes: 208 additions & 0 deletions internal/gatewayapi/testdata/httproute-with-direct-response.out.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,208 @@
gateways:
- apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
creationTimestamp: null
name: gateway-1
namespace: envoy-gateway
spec:
gatewayClassName: envoy-gateway-class
listeners:
- allowedRoutes:
namespaces:
from: All
hostname: '*.envoyproxy.io'
name: http
port: 80
protocol: HTTP
status:
listeners:
- attachedRoutes: 2
conditions:
- lastTransitionTime: null
message: Sending translated listener configuration to the data plane
reason: Programmed
status: "True"
type: Programmed
- lastTransitionTime: null
message: Listener has been successfully translated
reason: Accepted
status: "True"
type: Accepted
- lastTransitionTime: null
message: Listener references have been resolved
reason: ResolvedRefs
status: "True"
type: ResolvedRefs
name: http
supportedKinds:
- group: gateway.networking.k8s.io
kind: HTTPRoute
- group: gateway.networking.k8s.io
kind: GRPCRoute
httpRoutes:
- apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
creationTimestamp: null
name: direct-response
namespace: default
spec:
parentRefs:
- name: gateway-1
namespace: envoy-gateway
sectionName: http
rules:
- filters:
- extensionRef:
group: gateway.envoyproxy.io
kind: HTTPRouteFilter
name: direct-response-inline
type: ExtensionRef
matches:
- path:
type: PathPrefix
value: /inline
- filters:
- extensionRef:
group: gateway.envoyproxy.io
kind: HTTPRouteFilter
name: direct-response-value-ref
type: ExtensionRef
matches:
- path:
type: PathPrefix
value: /value-ref
status:
parents:
- conditions:
- lastTransitionTime: null
message: Route is accepted
reason: Accepted
status: "True"
type: Accepted
- lastTransitionTime: null
message: Resolved all the Object references for the Route
reason: ResolvedRefs
status: "True"
type: ResolvedRefs
controllerName: gateway.envoyproxy.io/gatewayclass-controller
parentRef:
name: gateway-1
namespace: envoy-gateway
sectionName: http
- apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
creationTimestamp: null
name: direct-response-with-errors
namespace: default
spec:
parentRefs:
- name: gateway-1
namespace: envoy-gateway
sectionName: http
rules:
- filters:
- extensionRef:
group: gateway.envoyproxy.io
kind: HTTPRouteFilter
name: direct-response-value-ref-not-found
type: ExtensionRef
matches:
- path:
type: PathPrefix
value: /value-ref-not-found
status:
parents:
- conditions:
- lastTransitionTime: null
message: 'Unable to translate HTTPRouteFilter: default/direct-response-value-ref-not-found'
reason: UnsupportedValue
status: "False"
type: Accepted
- lastTransitionTime: null
message: 'Unable to translate HTTPRouteFilter: default/direct-response-value-ref-not-found'
reason: BackendNotFound
status: "False"
type: ResolvedRefs
controllerName: gateway.envoyproxy.io/gatewayclass-controller
parentRef:
name: gateway-1
namespace: envoy-gateway
sectionName: http
infraIR:
envoy-gateway/gateway-1:
proxy:
listeners:
- address: null
name: envoy-gateway/gateway-1/http
ports:
- containerPort: 10080
name: http-80
protocol: HTTP
servicePort: 80
metadata:
labels:
gateway.envoyproxy.io/owning-gateway-name: gateway-1
gateway.envoyproxy.io/owning-gateway-namespace: envoy-gateway
name: envoy-gateway/gateway-1
xdsIR:
envoy-gateway/gateway-1:
accessLog:
text:
- path: /dev/stdout
http:
- address: 0.0.0.0
hostnames:
- '*.envoyproxy.io'
isHTTP2: false
metadata:
kind: Gateway
name: gateway-1
namespace: envoy-gateway
sectionName: http
name: envoy-gateway/gateway-1/http
path:
escapedSlashesAction: UnescapeAndRedirect
mergeSlashes: true
port: 10080
routes:
- addResponseHeaders:
- append: false
name: Content-Type
value:
- application/json
directResponse:
body: '{"error": "Internal Server Error"}'
statusCode: 502
hostname: '*.envoyproxy.io'
isHTTP2: false
metadata:
kind: HTTPRoute
name: direct-response
namespace: default
name: httproute/default/direct-response/rule/1/match/0/*_envoyproxy_io
pathMatch:
distinct: false
name: ""
prefix: /value-ref
- addResponseHeaders:
- append: false
name: Content-Type
value:
- text/plain
directResponse:
body: OK
statusCode: 200
hostname: '*.envoyproxy.io'
isHTTP2: false
metadata:
kind: HTTPRoute
name: direct-response
namespace: default
name: httproute/default/direct-response/rule/0/match/0/*_envoyproxy_io
pathMatch:
distinct: false
name: ""
prefix: /inline
Loading

0 comments on commit f384a64

Please sign in to comment.