mirror of https://github.com/grpc/grpc.git
interop-test: port metadata_filter_test case to x8s (#29028)
parent
02bddf2017
commit
87d2511723
1 changed files with 277 additions and 0 deletions
@ -0,0 +1,277 @@ |
||||
# Copyright 2022 The gRPC 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. |
||||
import json |
||||
import logging |
||||
from typing import Tuple |
||||
|
||||
from absl import flags |
||||
from absl.testing import absltest |
||||
|
||||
from framework import xds_url_map_testcase |
||||
from framework.test_app import client_app |
||||
|
||||
# Type aliases |
||||
HostRule = xds_url_map_testcase.HostRule |
||||
PathMatcher = xds_url_map_testcase.PathMatcher |
||||
GcpResourceManager = xds_url_map_testcase.GcpResourceManager |
||||
DumpedXdsConfig = xds_url_map_testcase.DumpedXdsConfig |
||||
RpcTypeUnaryCall = xds_url_map_testcase.RpcTypeUnaryCall |
||||
RpcTypeEmptyCall = xds_url_map_testcase.RpcTypeEmptyCall |
||||
XdsTestClient = client_app.XdsTestClient |
||||
|
||||
logger = logging.getLogger(__name__) |
||||
flags.adopt_module_key_flags(xds_url_map_testcase) |
||||
|
||||
_NUM_RPCS = 150 |
||||
_TEST_METADATA_KEY = 'xds_md' |
||||
_TEST_METADATA_VALUE_EMPTY = 'empty_ytpme' |
||||
_TEST_METADATA = ((RpcTypeEmptyCall, _TEST_METADATA_KEY, |
||||
_TEST_METADATA_VALUE_EMPTY),) |
||||
match_labels = [{ |
||||
'name': 'TRAFFICDIRECTOR_NETWORK_NAME', |
||||
'value': 'default-vpc' |
||||
}] |
||||
not_match_labels = [{'name': 'fake', 'value': 'fail'}] |
||||
|
||||
|
||||
class TestMetadataFilterMatchAll(xds_url_map_testcase.XdsUrlMapTestCase): |
||||
"""" The test url-map has two routeRules: the higher priority routes to |
||||
the default backends, but is supposed to be filtered out by TD because |
||||
of non-matching metadata filters. The lower priority routes to alternative |
||||
backends and metadata filter matches. Thus, it verifies that TD evaluates |
||||
metadata filters correctly.""" |
||||
|
||||
@staticmethod |
||||
def url_map_change( |
||||
host_rule: HostRule, |
||||
path_matcher: PathMatcher) -> Tuple[HostRule, PathMatcher]: |
||||
path_matcher["routeRules"] = [{ |
||||
'priority': 0, |
||||
'matchRules': [{ |
||||
'prefixMatch': |
||||
'/', |
||||
'metadataFilters': [{ |
||||
'filterMatchCriteria': 'MATCH_ALL', |
||||
'filterLabels': not_match_labels |
||||
}] |
||||
}], |
||||
'service': GcpResourceManager().default_backend_service() |
||||
}, { |
||||
'priority': 1, |
||||
'matchRules': [{ |
||||
'prefixMatch': |
||||
'/grpc.testing.TestService/Empty', |
||||
'headerMatches': [{ |
||||
'headerName': _TEST_METADATA_KEY, |
||||
'exactMatch': _TEST_METADATA_VALUE_EMPTY |
||||
}], |
||||
'metadataFilters': [{ |
||||
'filterMatchCriteria': 'MATCH_ALL', |
||||
'filterLabels': match_labels |
||||
}] |
||||
}], |
||||
'service': GcpResourceManager().alternative_backend_service() |
||||
}] |
||||
return host_rule, path_matcher |
||||
|
||||
def xds_config_validate(self, xds_config: DumpedXdsConfig): |
||||
self.assertNumEndpoints(xds_config, 2) |
||||
self.assertEqual(len(xds_config.rds['virtualHosts'][0]['routes']), 2) |
||||
self.assertEqual( |
||||
xds_config.rds['virtualHosts'][0]['routes'][0]['match']['prefix'], |
||||
"/grpc.testing.TestService/Empty") |
||||
self.assertEqual( |
||||
xds_config.rds['virtualHosts'][0]['routes'][0]['match']['headers'] |
||||
[0]['name'], _TEST_METADATA_KEY) |
||||
self.assertEqual( |
||||
xds_config.rds['virtualHosts'][0]['routes'][0]['match']['headers'] |
||||
[0]['exactMatch'], _TEST_METADATA_VALUE_EMPTY) |
||||
self.assertEqual( |
||||
xds_config.rds['virtualHosts'][0]['routes'][1]['match']['prefix'], |
||||
"") |
||||
|
||||
def rpc_distribution_validate(self, test_client: XdsTestClient): |
||||
rpc_distribution = self.configure_and_send(test_client, |
||||
rpc_types=[RpcTypeEmptyCall], |
||||
metadata=_TEST_METADATA, |
||||
num_rpcs=_NUM_RPCS) |
||||
self.assertEqual( |
||||
_NUM_RPCS, |
||||
rpc_distribution.empty_call_alternative_service_rpc_count) |
||||
|
||||
|
||||
class TestMetadataFilterMatchAny(xds_url_map_testcase.XdsUrlMapTestCase): |
||||
|
||||
@staticmethod |
||||
def url_map_change( |
||||
host_rule: HostRule, |
||||
path_matcher: PathMatcher) -> Tuple[HostRule, PathMatcher]: |
||||
path_matcher["routeRules"] = [{ |
||||
'priority': 0, |
||||
'matchRules': [{ |
||||
'prefixMatch': |
||||
'/', |
||||
'metadataFilters': [{ |
||||
'filterMatchCriteria': 'MATCH_ANY', |
||||
'filterLabels': not_match_labels |
||||
}] |
||||
}], |
||||
'service': GcpResourceManager().default_backend_service() |
||||
}, { |
||||
'priority': 1, |
||||
'matchRules': [{ |
||||
'prefixMatch': |
||||
'/grpc.testing.TestService/Unary', |
||||
'metadataFilters': [{ |
||||
'filterMatchCriteria': 'MATCH_ANY', |
||||
'filterLabels': not_match_labels + match_labels |
||||
}] |
||||
}], |
||||
'service': GcpResourceManager().alternative_backend_service() |
||||
}] |
||||
return host_rule, path_matcher |
||||
|
||||
def xds_config_validate(self, xds_config: DumpedXdsConfig): |
||||
self.assertNumEndpoints(xds_config, 2) |
||||
self.assertEqual(len(xds_config.rds['virtualHosts'][0]['routes']), 2) |
||||
self.assertEqual( |
||||
xds_config.rds['virtualHosts'][0]['routes'][0]['match']['prefix'], |
||||
"/grpc.testing.TestService/Unary") |
||||
self.assertEqual( |
||||
xds_config.rds['virtualHosts'][0]['routes'][1]['match']['prefix'], |
||||
"") |
||||
|
||||
def rpc_distribution_validate(self, test_client: XdsTestClient): |
||||
rpc_distribution = self.configure_and_send(test_client, |
||||
rpc_types=[RpcTypeUnaryCall], |
||||
num_rpcs=_NUM_RPCS) |
||||
self.assertEqual( |
||||
_NUM_RPCS, |
||||
rpc_distribution.unary_call_alternative_service_rpc_count) |
||||
|
||||
|
||||
class TestMetadataFilterMatchAnyAndAll(xds_url_map_testcase.XdsUrlMapTestCase): |
||||
|
||||
@staticmethod |
||||
def url_map_change( |
||||
host_rule: HostRule, |
||||
path_matcher: PathMatcher) -> Tuple[HostRule, PathMatcher]: |
||||
path_matcher["routeRules"] = [{ |
||||
'priority': 0, |
||||
'matchRules': [{ |
||||
'prefixMatch': |
||||
'/', |
||||
'metadataFilters': [{ |
||||
'filterMatchCriteria': 'MATCH_ALL', |
||||
'filterLabels': not_match_labels + match_labels |
||||
}] |
||||
}], |
||||
'service': GcpResourceManager().default_backend_service() |
||||
}, { |
||||
'priority': 1, |
||||
'matchRules': [{ |
||||
'prefixMatch': |
||||
'/grpc.testing.TestService/Unary', |
||||
'metadataFilters': [{ |
||||
'filterMatchCriteria': 'MATCH_ANY', |
||||
'filterLabels': not_match_labels + match_labels |
||||
}] |
||||
}], |
||||
'service': GcpResourceManager().alternative_backend_service() |
||||
}] |
||||
return host_rule, path_matcher |
||||
|
||||
def xds_config_validate(self, xds_config: DumpedXdsConfig): |
||||
self.assertNumEndpoints(xds_config, 2) |
||||
self.assertEqual(len(xds_config.rds['virtualHosts'][0]['routes']), 2) |
||||
self.assertEqual( |
||||
xds_config.rds['virtualHosts'][0]['routes'][0]['match']['prefix'], |
||||
"/grpc.testing.TestService/Unary") |
||||
self.assertEqual( |
||||
xds_config.rds['virtualHosts'][0]['routes'][1]['match']['prefix'], |
||||
"") |
||||
|
||||
def rpc_distribution_validate(self, test_client: XdsTestClient): |
||||
rpc_distribution = self.configure_and_send(test_client, |
||||
rpc_types=[RpcTypeUnaryCall], |
||||
num_rpcs=_NUM_RPCS) |
||||
self.assertEqual( |
||||
_NUM_RPCS, |
||||
rpc_distribution.unary_call_alternative_service_rpc_count) |
||||
|
||||
|
||||
class TestMetadataFilterMatchMultipleRules( |
||||
xds_url_map_testcase.XdsUrlMapTestCase): |
||||
|
||||
@staticmethod |
||||
def url_map_change( |
||||
host_rule: HostRule, |
||||
path_matcher: PathMatcher) -> Tuple[HostRule, PathMatcher]: |
||||
path_matcher["routeRules"] = [{ |
||||
'priority': 0, |
||||
'matchRules': [{ |
||||
'prefixMatch': |
||||
'/', |
||||
'headerMatches': [{ |
||||
'headerName': _TEST_METADATA_KEY, |
||||
'exactMatch': _TEST_METADATA_VALUE_EMPTY |
||||
}], |
||||
'metadataFilters': [{ |
||||
'filterMatchCriteria': 'MATCH_ANY', |
||||
'filterLabels': match_labels |
||||
}] |
||||
}], |
||||
'service': GcpResourceManager().alternative_backend_service() |
||||
}, { |
||||
'priority': 1, |
||||
'matchRules': [{ |
||||
'prefixMatch': |
||||
'/grpc.testing.TestService/Unary', |
||||
'metadataFilters': [{ |
||||
'filterMatchCriteria': 'MATCH_ALL', |
||||
'filterLabels': match_labels |
||||
}] |
||||
}], |
||||
'service': GcpResourceManager().default_backend_service() |
||||
}] |
||||
return host_rule, path_matcher |
||||
|
||||
def xds_config_validate(self, xds_config: DumpedXdsConfig): |
||||
self.assertNumEndpoints(xds_config, 2) |
||||
self.assertEqual(len(xds_config.rds['virtualHosts'][0]['routes']), 3) |
||||
self.assertEqual( |
||||
xds_config.rds['virtualHosts'][0]['routes'][0]['match']['headers'] |
||||
[0]['name'], _TEST_METADATA_KEY) |
||||
self.assertEqual( |
||||
xds_config.rds['virtualHosts'][0]['routes'][0]['match']['headers'] |
||||
[0]['exactMatch'], _TEST_METADATA_VALUE_EMPTY) |
||||
self.assertEqual( |
||||
xds_config.rds['virtualHosts'][0]['routes'][1]['match']['prefix'], |
||||
"/grpc.testing.TestService/Unary") |
||||
self.assertEqual( |
||||
xds_config.rds['virtualHosts'][0]['routes'][2]['match']['prefix'], |
||||
"") |
||||
|
||||
def rpc_distribution_validate(self, test_client: XdsTestClient): |
||||
rpc_distribution = self.configure_and_send(test_client, |
||||
rpc_types=[RpcTypeEmptyCall], |
||||
metadata=_TEST_METADATA, |
||||
num_rpcs=_NUM_RPCS) |
||||
self.assertEqual( |
||||
_NUM_RPCS, |
||||
rpc_distribution.empty_call_alternative_service_rpc_count) |
||||
|
||||
|
||||
if __name__ == '__main__': |
||||
absltest.main() |
Loading…
Reference in new issue