Add StructMatcher and use it in NodeMatcher (#9818)
Signed-off-by: Fuqiang Gao <fuqianggao@google.com> Mirrored from https://github.com/envoyproxy/envoy @ e342011f7ec685fb93008691e4deb3f09165d83fmaster-ci-test
parent
403ae88f9c
commit
b9cd39eba0
6 changed files with 179 additions and 4 deletions
@ -0,0 +1,82 @@ |
||||
syntax = "proto3"; |
||||
|
||||
package envoy.type.matcher; |
||||
|
||||
import "envoy/type/matcher/value.proto"; |
||||
|
||||
import "validate/validate.proto"; |
||||
|
||||
option java_package = "io.envoyproxy.envoy.type.matcher"; |
||||
option java_outer_classname = "StructProto"; |
||||
option java_multiple_files = true; |
||||
|
||||
// [#protodoc-title: Struct matcher] |
||||
|
||||
// StructMatcher provides a general interface to check if a given value is matched in |
||||
// google.protobuf.Struct. It uses `path` to retrieve the value |
||||
// from the struct and then check if it's matched to the specified value. |
||||
// |
||||
// For example, for the following Struct: |
||||
// |
||||
// .. code-block:: yaml |
||||
// |
||||
// fields: |
||||
// a: |
||||
// struct_value: |
||||
// fields: |
||||
// b: |
||||
// struct_value: |
||||
// fields: |
||||
// c: |
||||
// string_value: pro |
||||
// t: |
||||
// list_value: |
||||
// values: |
||||
// - string_value: m |
||||
// - string_value: n |
||||
// |
||||
// The following MetadataMatcher is matched as the path [a, b, c] will retrieve a string value "pro" |
||||
// from the Metadata which is matched to the specified prefix match. |
||||
// |
||||
// .. code-block:: yaml |
||||
// |
||||
// path: |
||||
// - key: a |
||||
// - key: b |
||||
// - key: c |
||||
// value: |
||||
// string_match: |
||||
// prefix: pr |
||||
// |
||||
// The following StructMatcher is matched as the code will match one of the string values in the |
||||
// list at the path [a, t]. |
||||
// |
||||
// .. code-block:: yaml |
||||
// |
||||
// path: |
||||
// - key: a |
||||
// - key: t |
||||
// value: |
||||
// list_match: |
||||
// one_of: |
||||
// string_match: |
||||
// exact: m |
||||
// |
||||
// An example use of StructMatcher is to match metadata in envoy.v*.core.Node. |
||||
message StructMatcher { |
||||
// Specifies the segment in a path to retrieve value from Struct. |
||||
message PathSegment { |
||||
oneof segment { |
||||
option (validate.required) = true; |
||||
|
||||
// If specified, use the key to retrieve the value in a Struct. |
||||
string key = 1 [(validate.rules).string = {min_bytes: 1}]; |
||||
} |
||||
} |
||||
|
||||
// The path to retrieve the Value from the Struct. |
||||
repeated PathSegment path = 2 [(validate.rules).repeated = {min_items: 1}]; |
||||
|
||||
// The StructMatcher is matched if the value retrieved by path is matched to this value. |
||||
ValueMatcher value = 3 [(validate.rules).message = {required: true}]; |
||||
} |
@ -0,0 +1,89 @@ |
||||
syntax = "proto3"; |
||||
|
||||
package envoy.type.matcher.v3; |
||||
|
||||
import "envoy/type/matcher/v3/value.proto"; |
||||
|
||||
import "udpa/annotations/versioning.proto"; |
||||
|
||||
import "validate/validate.proto"; |
||||
|
||||
option java_package = "io.envoyproxy.envoy.type.matcher.v3"; |
||||
option java_outer_classname = "StructProto"; |
||||
option java_multiple_files = true; |
||||
|
||||
// [#protodoc-title: Struct matcher] |
||||
|
||||
// StructMatcher provides a general interface to check if a given value is matched in |
||||
// google.protobuf.Struct. It uses `path` to retrieve the value |
||||
// from the struct and then check if it's matched to the specified value. |
||||
// |
||||
// For example, for the following Struct: |
||||
// |
||||
// .. code-block:: yaml |
||||
// |
||||
// fields: |
||||
// a: |
||||
// struct_value: |
||||
// fields: |
||||
// b: |
||||
// struct_value: |
||||
// fields: |
||||
// c: |
||||
// string_value: pro |
||||
// t: |
||||
// list_value: |
||||
// values: |
||||
// - string_value: m |
||||
// - string_value: n |
||||
// |
||||
// The following MetadataMatcher is matched as the path [a, b, c] will retrieve a string value "pro" |
||||
// from the Metadata which is matched to the specified prefix match. |
||||
// |
||||
// .. code-block:: yaml |
||||
// |
||||
// path: |
||||
// - key: a |
||||
// - key: b |
||||
// - key: c |
||||
// value: |
||||
// string_match: |
||||
// prefix: pr |
||||
// |
||||
// The following StructMatcher is matched as the code will match one of the string values in the |
||||
// list at the path [a, t]. |
||||
// |
||||
// .. code-block:: yaml |
||||
// |
||||
// path: |
||||
// - key: a |
||||
// - key: t |
||||
// value: |
||||
// list_match: |
||||
// one_of: |
||||
// string_match: |
||||
// exact: m |
||||
// |
||||
// An example use of StructMatcher is to match metadata in envoy.v*.core.Node. |
||||
message StructMatcher { |
||||
option (udpa.annotations.versioning).previous_message_type = "envoy.type.matcher.StructMatcher"; |
||||
|
||||
// Specifies the segment in a path to retrieve value from Struct. |
||||
message PathSegment { |
||||
option (udpa.annotations.versioning).previous_message_type = |
||||
"envoy.type.matcher.StructMatcher.PathSegment"; |
||||
|
||||
oneof segment { |
||||
option (validate.required) = true; |
||||
|
||||
// If specified, use the key to retrieve the value in a Struct. |
||||
string key = 1 [(validate.rules).string = {min_bytes: 1}]; |
||||
} |
||||
} |
||||
|
||||
// The path to retrieve the Value from the Struct. |
||||
repeated PathSegment path = 2 [(validate.rules).repeated = {min_items: 1}]; |
||||
|
||||
// The StructMatcher is matched if the value retrieved by path is matched to this value. |
||||
ValueMatcher value = 3 [(validate.rules).message = {required: true}]; |
||||
} |
Loading…
Reference in new issue