From 2ccfc5b7f1faf8a22ca6195bf50ae8d94984d077 Mon Sep 17 00:00:00 2001 From: Yangmin Zhu Date: Tue, 31 Aug 2021 14:58:50 -0700 Subject: [PATCH 1/2] matcher: add invert matching in metadata matcher Signed-off-by: Yangmin Zhu --- api/envoy/type/matcher/v3/metadata.proto | 3 +++ docs/root/version_history/current.rst | 1 + .../envoy/type/matcher/v3/metadata.proto | 3 +++ source/common/common/matchers.cc | 2 +- test/common/common/matchers_test.cc | 16 ++++++++++++++++ 5 files changed, 24 insertions(+), 1 deletion(-) diff --git a/api/envoy/type/matcher/v3/metadata.proto b/api/envoy/type/matcher/v3/metadata.proto index 68710dc718546..de19a2f34dbd1 100644 --- a/api/envoy/type/matcher/v3/metadata.proto +++ b/api/envoy/type/matcher/v3/metadata.proto @@ -101,4 +101,7 @@ message MetadataMatcher { // The MetadataMatcher is matched if the value retrieved by path is matched to this value. ValueMatcher value = 3 [(validate.rules).message = {required: true}]; + + // If true, the match result will be inverted. + bool invert = 4; } diff --git a/docs/root/version_history/current.rst b/docs/root/version_history/current.rst index 71c41c24694b5..b65e5b589bfca 100644 --- a/docs/root/version_history/current.rst +++ b/docs/root/version_history/current.rst @@ -94,6 +94,7 @@ New Features * http: sanitizing the referer header as documented :ref:`here `. This feature can be temporarily turned off by setting runtime guard ``envoy.reloadable_features.sanitize_http_header_referer`` to false. * jwt_authn: added support for :ref:`Jwt Cache ` and its size can be specified by :ref:`jwt_cache_size `. * listener: new listener metric ``downstream_cx_transport_socket_connect_timeout`` to track transport socket timeouts. +* matcher: added :ref:`invert ` for inverting the match result in the metadata matcher. * rbac: added :ref:`destination_port_range ` for matching range of destination ports. * route config: added :ref:`dynamic_metadata ` for routing based on dynamic metadata. * thrift_proxy: added support for :ref:`mirroring requests `. diff --git a/generated_api_shadow/envoy/type/matcher/v3/metadata.proto b/generated_api_shadow/envoy/type/matcher/v3/metadata.proto index 68710dc718546..de19a2f34dbd1 100644 --- a/generated_api_shadow/envoy/type/matcher/v3/metadata.proto +++ b/generated_api_shadow/envoy/type/matcher/v3/metadata.proto @@ -101,4 +101,7 @@ message MetadataMatcher { // The MetadataMatcher is matched if the value retrieved by path is matched to this value. ValueMatcher value = 3 [(validate.rules).message = {required: true}]; + + // If true, the match result will be inverted. + bool invert = 4; } diff --git a/source/common/common/matchers.cc b/source/common/common/matchers.cc index cb57af2869f3f..d619276718d06 100644 --- a/source/common/common/matchers.cc +++ b/source/common/common/matchers.cc @@ -118,7 +118,7 @@ PathMatcher::createSafeRegex(const envoy::type::matcher::v3::RegexMatcher& regex bool MetadataMatcher::match(const envoy::config::core::v3::Metadata& metadata) const { const auto& value = Envoy::Config::Metadata::metadataValue(&metadata, matcher_.filter(), path_); - return value_matcher_ && value_matcher_->match(value); + return value_matcher_ && (value_matcher_->match(value) ^ matcher_.invert()); } bool PathMatcher::match(const absl::string_view path) const { diff --git a/test/common/common/matchers_test.cc b/test/common/common/matchers_test.cc index bcdf34441acc7..581967af8b3ea 100644 --- a/test/common/common/matchers_test.cc +++ b/test/common/common/matchers_test.cc @@ -280,6 +280,22 @@ TEST(MetadataTest, MatchDoubleListValue) { metadataValue.Clear(); } +TEST(MetadataTest, InvertMatch) { + envoy::config::core::v3::Metadata metadata; + Envoy::Config::Metadata::mutableMetadataValue(metadata, "envoy.filter.x", "label") + .set_string_value("prod"); + + envoy::type::matcher::v3::MetadataMatcher matcher; + matcher.set_filter("envoy.filter.x"); + matcher.add_path()->set_key("label"); + matcher.set_invert(true); + + matcher.mutable_value()->mutable_string_match()->set_exact("test"); + EXPECT_TRUE(Envoy::Matchers::MetadataMatcher(matcher).match(metadata)); + matcher.mutable_value()->mutable_string_match()->set_exact("prod"); + EXPECT_FALSE(Envoy::Matchers::MetadataMatcher(matcher).match(metadata)); +} + TEST(StringMatcher, ExactMatchIgnoreCase) { envoy::type::matcher::v3::StringMatcher matcher; matcher.set_exact("exact"); From ce95d20aa0f1aa9c7c5b67dfe245e62562daa756 Mon Sep 17 00:00:00 2001 From: Yangmin Zhu Date: Wed, 1 Sep 2021 14:52:46 -0700 Subject: [PATCH 2/2] address comment Signed-off-by: Yangmin Zhu --- source/common/common/matchers.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/common/common/matchers.cc b/source/common/common/matchers.cc index d619276718d06..f34a482ca7a35 100644 --- a/source/common/common/matchers.cc +++ b/source/common/common/matchers.cc @@ -118,7 +118,7 @@ PathMatcher::createSafeRegex(const envoy::type::matcher::v3::RegexMatcher& regex bool MetadataMatcher::match(const envoy::config::core::v3::Metadata& metadata) const { const auto& value = Envoy::Config::Metadata::metadataValue(&metadata, matcher_.filter(), path_); - return value_matcher_ && (value_matcher_->match(value) ^ matcher_.invert()); + return value_matcher_->match(value) ^ matcher_.invert(); } bool PathMatcher::match(const absl::string_view path) const {