Envoy's L7 Go extension API (#22573)
Signed-off-by: wangfakang <fakangwang@gmail.com> Mirrored from https://github.com/envoyproxy/envoy @ c256b948683b8bd800df80f69f470e1202510242pull/626/head
parent
87462a3f0b
commit
56b03fbe74
4 changed files with 228 additions and 0 deletions
@ -0,0 +1,12 @@ |
|||||||
|
# DO NOT EDIT. This file is generated by tools/proto_format/proto_sync.py. |
||||||
|
|
||||||
|
load("@envoy_api//bazel:api_build_system.bzl", "api_proto_package") |
||||||
|
|
||||||
|
licenses(["notice"]) # Apache 2 |
||||||
|
|
||||||
|
api_proto_package( |
||||||
|
deps = [ |
||||||
|
"@com_github_cncf_udpa//udpa/annotations:pkg", |
||||||
|
"@com_github_cncf_udpa//xds/annotations/v3:pkg", |
||||||
|
], |
||||||
|
) |
@ -0,0 +1,214 @@ |
|||||||
|
syntax = "proto3"; |
||||||
|
|
||||||
|
package envoy.extensions.filters.http.golang.v3alpha; |
||||||
|
|
||||||
|
import "google/protobuf/any.proto"; |
||||||
|
|
||||||
|
import "xds/annotations/v3/status.proto"; |
||||||
|
|
||||||
|
import "udpa/annotations/status.proto"; |
||||||
|
import "validate/validate.proto"; |
||||||
|
|
||||||
|
option java_package = "io.envoyproxy.envoy.extensions.filters.http.golang.v3alpha"; |
||||||
|
option java_outer_classname = "GolangProto"; |
||||||
|
option java_multiple_files = true; |
||||||
|
option go_package = "github.com/envoyproxy/go-control-plane/envoy/extensions/filters/http/golang/v3alpha"; |
||||||
|
option (udpa.annotations.file_status).package_version_status = ACTIVE; |
||||||
|
option (xds.annotations.v3.file_status).work_in_progress = true; |
||||||
|
|
||||||
|
// [#protodoc-title: golang extension filter] |
||||||
|
// Golang :ref:`configuration overview <config_http_filters_golang>`. |
||||||
|
// [#extension: envoy.filters.http.golang] |
||||||
|
// |
||||||
|
// In the below example, we configured the go plugin 'auth' and 'limit' dynamic libraries into |
||||||
|
// Envoy, which can avoid rebuilding Envoy. |
||||||
|
// |
||||||
|
// * Develop go-plugin |
||||||
|
// |
||||||
|
// We can implement the interface of ``StreamFilter <contrib/golang/filters/http/source/go/pkg/api.StreamFilter>`` |
||||||
|
// API by the GO language to achieve the effects of Envoy native filter. |
||||||
|
// |
||||||
|
// The filter based on the APIs implementation ``StreamFilter <contrib/golang/filters/http/source/go/pkg/api.StreamFilter>`` |
||||||
|
// For details, take a look at the :repo:`/contrib/golang/filters/http/test/test_data/echo`. |
||||||
|
// |
||||||
|
// Then put the GO plugin source code into the ${OUTPUT}/src/ directory with the name of the plugin |
||||||
|
// for GO plugin builds. |
||||||
|
// The following examples implement limit and auth GO plugins. |
||||||
|
// |
||||||
|
// .. code-block:: bash |
||||||
|
// |
||||||
|
// $ tree /home/admin/envoy/go-plugins/src/ |
||||||
|
// |--auth |
||||||
|
// | |--config.go |
||||||
|
// | |--filter.go |
||||||
|
// ---limit |
||||||
|
// |--config.go |
||||||
|
// |--filter.go |
||||||
|
// |
||||||
|
// * Build go-plugin |
||||||
|
// |
||||||
|
// Build the Go plugin so by `go_plugin_generate.sh` script, below example the `liblimit.so` and |
||||||
|
// `libauth.so` will be generated in the `/home/admin/envoy/go-plugins/` directory. |
||||||
|
// |
||||||
|
// .. code-block:: bash |
||||||
|
// |
||||||
|
// #!/bin/bash |
||||||
|
// if [ $# != 2 ]; then |
||||||
|
// echo "need input the go plugin name" |
||||||
|
// exit 1 |
||||||
|
// fi |
||||||
|
// |
||||||
|
// PLUGINNAME=$1 |
||||||
|
// OUTPUT=/home/admin/envoy/go-plugins/ |
||||||
|
// PLUGINSRCDIR=${OUTPUT}/src/${PLUGINNAME} |
||||||
|
// go build --buildmode=c-shared -v -o $OUTPUT/lib${PLUGINNAME}.so $PLUGINSRCDIR |
||||||
|
// |
||||||
|
// .. code-block:: bash |
||||||
|
// |
||||||
|
// $ go_plugin_generate.sh limit |
||||||
|
// $ go_plugin_generate.sh auth |
||||||
|
// |
||||||
|
// * Configure go-plugin |
||||||
|
// |
||||||
|
// Use the http filter of :ref: `golang <envoy.filters.http.golang>` to specify |
||||||
|
// :ref: `library` <envoy.filters.http.golang> in ingress and egress to enable the plugin. |
||||||
|
// |
||||||
|
// Example: |
||||||
|
// |
||||||
|
// .. code-block:: yaml |
||||||
|
// |
||||||
|
// static_resources: |
||||||
|
// listeners: |
||||||
|
// - name: ingress |
||||||
|
// address: |
||||||
|
// socket_address: |
||||||
|
// protocol: TCP |
||||||
|
// address: 0.0.0.0 |
||||||
|
// port_value: 8080 |
||||||
|
// filter_chains: |
||||||
|
// - filters: |
||||||
|
// - name: envoy.filters.network.http_connection_manager |
||||||
|
// ...... |
||||||
|
// http_filters: |
||||||
|
// - name: envoy.filters.http.golang |
||||||
|
// typed_config: |
||||||
|
// "@type": type.googleapis.com/envoy.extensions.filters.http.golang.v3alpha.Config |
||||||
|
// library_id: limit-id |
||||||
|
// library_path: "/home/admin/envoy/go-plugins/liblimit.so" |
||||||
|
// plugine_name: limit |
||||||
|
// plugin_config: |
||||||
|
// "@type": type.googleapis.com/envoy.extensions.filters.http.golang.plugins.limit.v3.Config |
||||||
|
// xxx1: xx1 |
||||||
|
// xxx2: xx2 |
||||||
|
// - name: envoy.filters.http.header_to_metadata |
||||||
|
// - name: envoy.filters.http.golang |
||||||
|
// typed_config: |
||||||
|
// "@type": type.googleapis.com/envoy.extensions.filters.http.golang.v3alpha.Config |
||||||
|
// library_id: auth-id |
||||||
|
// library_path: "/home/admin/envoy/go-plugins/libauth.so" |
||||||
|
// plugine_name: auth |
||||||
|
// plugin_config: |
||||||
|
// "@type": type.googleapis.com/envoy.extensions.filters.http.golang.plugins.auth.v3.Config |
||||||
|
// xxx1: xx1 |
||||||
|
// xxx2: xx2 |
||||||
|
// - name: envoy.filters.http.router |
||||||
|
// - name: egress |
||||||
|
// address: |
||||||
|
// socket_address: |
||||||
|
// protocol: TCP |
||||||
|
// address: 0.0.0.0 |
||||||
|
// port_value: 8081 |
||||||
|
// filter_chains: |
||||||
|
// - filters: |
||||||
|
// - name: envoy.filters.network.http_connection_manager |
||||||
|
// ...... |
||||||
|
// http_filters: |
||||||
|
// - name: envoy.filters.http.golang |
||||||
|
// typed_config: |
||||||
|
// "@type": type.googleapis.com/envoy.extensions.filters.http.golang.v3alpha.Config |
||||||
|
// library_id: auth-id |
||||||
|
// library_path: "/home/admin/envoy/go-plugins/libauth.so" |
||||||
|
// plugine_name: auth |
||||||
|
// plugin_config: |
||||||
|
// "@type": type.googleapis.com/envoy.extensions.filters.http.golang.plugins.auth.v3.Config |
||||||
|
// xxx1: xx1 |
||||||
|
// xxx2: xx2 |
||||||
|
// - name: envoy.filters.http.router |
||||||
|
// [#next-free-field: 6] |
||||||
|
message Config { |
||||||
|
enum MergePolicy { |
||||||
|
MERGE_VIRTUALHOST_ROUTER_FILTER = 0; |
||||||
|
MERGE_VIRTUALHOST_ROUTER = 1; |
||||||
|
OVERRIDE = 3; |
||||||
|
} |
||||||
|
|
||||||
|
// library_id is a unique ID for a dynamic library file, must be unique globally. |
||||||
|
string library_id = 1 [(validate.rules).string = {min_len: 1}]; |
||||||
|
|
||||||
|
// Dynamic library implementing the interface of |
||||||
|
// ``StreamFilter <contrib/golang/filters/http/source/go/pkg/api.StreamFilter>``. |
||||||
|
// [#comment:TODO(wangfakang): Support for downloading libraries from remote repositories.] |
||||||
|
string library_path = 2 [(validate.rules).string = {min_len: 1}]; |
||||||
|
|
||||||
|
// plugin_name is the name of the go plugin, which needs to be consistent with the name |
||||||
|
// registered in http::RegisterHttpFilterConfigFactory. |
||||||
|
string plugin_name = 3 [(validate.rules).string = {min_bytes: 1}]; |
||||||
|
|
||||||
|
// plugin_config is the configuration of the go plugin, note that this configuration is |
||||||
|
// only parsed in the go plugin. |
||||||
|
google.protobuf.Any plugin_config = 4; |
||||||
|
|
||||||
|
// merge_policy is the merge policy configured by the go plugin. |
||||||
|
// go plugin configuration supports three dimensions: the virtual host’s typed_per_filter_config, |
||||||
|
// the route’s typed_per_filter_config or filter's config. |
||||||
|
// The meanings are as follows: |
||||||
|
// MERGE_VIRTUALHOST_ROUTER_FILTER: pass all configuration into go plugin. |
||||||
|
// MERGE_VIRTUALHOST_ROUTER: pass Virtual-Host and Router configuration into go plugin. |
||||||
|
// OVERRIDE: override according to Router > Virtual_host > Filter priority and pass the |
||||||
|
// configuration to the go plugin. |
||||||
|
MergePolicy merge_policy = 5 [(validate.rules).enum = {defined_only: true}]; |
||||||
|
} |
||||||
|
|
||||||
|
message RouterPlugin { |
||||||
|
// Example |
||||||
|
// |
||||||
|
// .. code-block:: yaml |
||||||
|
// |
||||||
|
// typed_per_filter_config: |
||||||
|
// envoy.filters.http.golang: |
||||||
|
// "@type": type.googleapis.com/envoy.extensions.filters.http.golang.v3alpha.ConfigsPerRoute |
||||||
|
// plugins_config: |
||||||
|
// plugin1: |
||||||
|
// disabled: true |
||||||
|
oneof override { |
||||||
|
option (validate.required) = true; |
||||||
|
|
||||||
|
// [#not-implemented-hide:] |
||||||
|
// Disable the filter for this particular vhost or route. |
||||||
|
// If disabled is specified in multiple per-filter-configs, the most specific one will be used. |
||||||
|
bool disabled = 1 [(validate.rules).bool = {const: true}]; |
||||||
|
|
||||||
|
// The config field is used to setting per-route plugin config. |
||||||
|
google.protobuf.Any config = 2; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
message ConfigsPerRoute { |
||||||
|
// plugins_config is the configuration of the go plugin at the per-router, and |
||||||
|
// key is the name of the go plugin. |
||||||
|
// Example |
||||||
|
// |
||||||
|
// .. code-block:: yaml |
||||||
|
// |
||||||
|
// typed_per_filter_config: |
||||||
|
// envoy.filters.http.golang: |
||||||
|
// "@type": type.googleapis.com/envoy.extensions.filters.http.golang.v3alpha.ConfigsPerRoute |
||||||
|
// plugins_config: |
||||||
|
// plugin1: |
||||||
|
// disabled: true |
||||||
|
// plugin2: |
||||||
|
// config: |
||||||
|
// "@type": type.googleapis.com/golang.http.plugin2 |
||||||
|
// xxx: xxx |
||||||
|
map<string, RouterPlugin> plugins_config = 1; |
||||||
|
} |
Loading…
Reference in new issue