Skip to content

Commit

Permalink
add fault plugin (#368)
Browse files Browse the repository at this point in the history
Signed-off-by: spacewander <[email protected]>
  • Loading branch information
spacewander authored Mar 11, 2024
1 parent 74d77e5 commit 2982e26
Show file tree
Hide file tree
Showing 9 changed files with 316 additions and 0 deletions.
1 change: 1 addition & 0 deletions controller/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ COPY go.mod go.sum ./
RUN go mod download
# TODO: find a way to cache controller dependencies
COPY api/ api/
COPY internal/ internal/
COPY pkg/ pkg/
COPY plugins/ plugins/
COPY controller/ controller/
Expand Down
18 changes: 18 additions & 0 deletions controller/internal/translation/testdata/plugins/fault.in.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
apiVersion: mosn.io/v1
kind: HTTPFilterPolicy
metadata:
name: policy
namespace: default
spec:
targetRef:
group: networking.istio.io
kind: VirtualService
name: default
filters:
fault:
config:
maxActiveFaults: 100
abort:
headerAbort: {}
percentage:
numerator: 100
47 changes: 47 additions & 0 deletions controller/internal/translation/testdata/plugins/fault.out.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
- metadata:
creationTimestamp: null
name: htnn-h-default.local
spec:
configPatches:
- applyTo: HTTP_ROUTE
match:
routeConfiguration:
vhost:
name: default.local:80
route:
name: default/default
patch:
operation: MERGE
value:
typed_per_filter_config:
htnn.filters.http.fault:
'@type': type.googleapis.com/envoy.extensions.filters.http.fault.v3.HTTPFault
abort:
headerAbort: {}
percentage:
numerator: 100
maxActiveFaults: 100
status: {}
- metadata:
creationTimestamp: null
name: htnn-http-filter
spec:
configPatches:
- applyTo: HTTP_FILTER
match:
context: GATEWAY
listener:
filterChain:
filter:
name: envoy.filters.network.http_connection_manager
subFilter:
name: htnn.filters.http.golang
patch:
operation: INSERT_BEFORE
value:
disabled: true
name: htnn.filters.http.fault
typed_config:
'@type': type.googleapis.com/envoy.extensions.filters.http.fault.v3.HTTPFault
priority: 100
status: {}
61 changes: 61 additions & 0 deletions controller/plugins/fault/config.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
// Copyright The HTNN Authors.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package fault

import (
fault "github.com/envoyproxy/go-control-plane/envoy/extensions/filters/http/fault/v3"

"mosn.io/htnn/pkg/filtermanager/api"
"mosn.io/htnn/pkg/plugins"
)

const (
Name = "fault"
)

func init() {
plugins.RegisterHttpPlugin(Name, &plugin{})
}

type plugin struct {
plugins.PluginMethodDefaultImpl
}

func (p *plugin) Type() plugins.PluginType {
return plugins.TypeGeneral
}

func (p *plugin) Order() plugins.PluginOrder {
return plugins.PluginOrder{
Position: plugins.OrderPositionOuter,
Operation: plugins.OrderOperationInsertLast,
}
}

func (p *plugin) Config() api.PluginConfig {
return &fault.HTTPFault{}
}

func (p *plugin) RouteConfigTypeURL() string {
return "type.googleapis.com/envoy.extensions.filters.http.fault.v3.HTTPFault"
}

func (p *plugin) HTTPFilterConfigPlaceholder() map[string]interface{} {
return map[string]interface{}{
"typed_config": map[string]interface{}{
"@type": p.RouteConfigTypeURL(),
},
}
}
1 change: 1 addition & 0 deletions controller/plugins/plugins.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ package plugins
import (
_ "mosn.io/htnn/controller/plugins/bandwidth_limit"
_ "mosn.io/htnn/controller/plugins/buffer"
_ "mosn.io/htnn/controller/plugins/fault"
_ "mosn.io/htnn/controller/plugins/local_ratelimit"
_ "mosn.io/htnn/controller/plugins/lua"
_ "mosn.io/htnn/plugins" // register Go plugins
Expand Down
34 changes: 34 additions & 0 deletions e2e/tests/fault.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
// Copyright The HTNN Authors.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package tests

import (
"testing"

"github.com/stretchr/testify/require"

"mosn.io/htnn/e2e/pkg/suite"
)

func init() {
suite.Register(suite.Test{
Manifests: []string{"base/httproute.yml"},
Run: func(t *testing.T, suite *suite.Suite) {
resp, err := suite.Head("/echo", nil)
require.NoError(t, err)
require.Equal(t, 401, resp.StatusCode)
},
})
}
16 changes: 16 additions & 0 deletions e2e/tests/fault.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
apiVersion: mosn.io/v1
kind: HTTPFilterPolicy
metadata:
name: policy
spec:
targetRef:
group: gateway.networking.k8s.io
kind: HTTPRoute
name: default
filters:
fault:
config:
abort:
http_status: 401
percentage:
numerator: 100
69 changes: 69 additions & 0 deletions site/content/en/docs/reference/plugins/fault.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
---
title: Fault
---

## Description

The `fault` plugin supports response and delay injections by leveraging Envoy's `fault` filter.

## Attribute

| | |
|-------|---------|
| Type | General |
| Order | Outer |

## Configuration

See the corresponding [Envoy documentation](https://www.envoyproxy.io/docs/envoy/v1.28.0/configuration/http/http_filters/fault_filter).

## Usage

Assumed we have the HTTPRoute below attached to `localhost:10000`, and a backend server listening to port `8080`:

```yaml
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: default
spec:
parentRefs:
- name: default
namespace: default
rules:
- matches:
- path:
type: PathPrefix
value: /
backendRefs:
- name: backend
port: 8080
```
By applying the configuration below, requests sent to `http://localhost:10000/` will receive a 401 response 100% of the time:

```yaml
apiVersion: mosn.io/v1
kind: HTTPFilterPolicy
metadata:
name: policy
spec:
targetRef:
group: gateway.networking.k8s.io
kind: HTTPRoute
name: default
filters:
fault:
config:
abort:
http_status: 401
percentage:
numerator: 100
```

Let's try it out:

```
$ curl http://localhost:10000/ -i 2>/dev/null | head -1
HTTP/1.1 401 Unauthorized
```
69 changes: 69 additions & 0 deletions site/content/zh-hans/docs/reference/plugins/fault.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
---
title: Fault
---

## 说明

`fault` 插件支持通过利用 Envoy 的 `fault` 过滤器注入响应和延迟。

## 属性

| | |
|-------|---------|
| Type | General |
| Order | Outer |

## 配置

请参阅相应的 [Envoy 文档](https://www.envoyproxy.io/docs/envoy/v1.28.0/configuration/http/http_filters/fault_filter)

## 用法

假设我们有下面附加到 `localhost:10000` 的 HTTPRoute,并且有一个后端服务器监听端口 `8080`

```yaml
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: default
spec:
parentRefs:
- name: default
namespace: default
rules:
- matches:
- path:
type: PathPrefix
value: /
backendRefs:
- name: backend
port: 8080
```
通过应用下面的配置,发送到 `http://localhost:10000/` 的请求将 100% 收到 401 响应:

```yaml
apiVersion: mosn.io/v1
kind: HTTPFilterPolicy
metadata:
name: policy
spec:
targetRef:
group: gateway.networking.k8s.io
kind: HTTPRoute
name: default
filters:
fault:
config:
abort:
http_status: 401
percentage:
numerator: 100
```

让我们试一下:

```
$ curl http://localhost:10000/ -i 2>/dev/null | head -1
HTTP/1.1 401 Unauthorized
```

0 comments on commit 2982e26

Please sign in to comment.