diff --git a/tools/run_tests/xds_k8s_test_driver/config/common.cfg b/tools/run_tests/xds_k8s_test_driver/config/common.cfg index 54fee5bc2b5..b0e543a35ff 100644 --- a/tools/run_tests/xds_k8s_test_driver/config/common.cfg +++ b/tools/run_tests/xds_k8s_test_driver/config/common.cfg @@ -2,6 +2,13 @@ # https://github.com/GoogleCloudPlatform/traffic-director-grpc-bootstrap/releases/tag/v0.14.0 --td_bootstrap_image=gcr.io/grpc-testing/td-grpc-bootstrap:d6baaf7b0e0c63054ac4d9bedc09021ff261d599 +# The reference implementation of the xDS test server. +# Can be used in tests where language-specific xDS test server does not exist, +# or missing a feature required for the test. +# TODO(sergiitk): Update every ~ 6 months; next 2023-02. +# https://github.com/grpc/grpc-java/commits/v1.48.1 +--server_image_universal=gcr.io/grpc-testing/xds-interop/java-server:d56f8fbe1d2822bc4f91515dd471ad49493fc385 + --logger_levels=__main__:DEBUG,framework:INFO --verbosity=0 # Google projects: remove if console.cloud.google.com redirects to Logs Explorer diff --git a/tools/run_tests/xds_k8s_test_driver/config/url-map.cfg b/tools/run_tests/xds_k8s_test_driver/config/url-map.cfg index 5a31dae3ee8..03dcb32b1c1 100644 --- a/tools/run_tests/xds_k8s_test_driver/config/url-map.cfg +++ b/tools/run_tests/xds_k8s_test_driver/config/url-map.cfg @@ -1,11 +1,14 @@ --resource_prefix=interop-psm-url-map --strategy=reuse --server_xds_port=8848 + +# TODO(sergiitk): Use --server_image_universal instead. # NOTE(lidiz) we pin the server image to java-server because: # 1. Only Java server understands the rpc-behavior metadata. # 2. All UrlMap tests today are testing client-side logic. # grpc-java master: 438f8d9e7880b2f6ae2b376a35a9f5f32b4dbeaa TODO: use v1.40.0 --server_image=gcr.io/grpc-testing/xds-interop/java-server:438f8d9e7880b2f6ae2b376a35a9f5f32b4dbeaa + # Disables the GCP Workload Identity feature to simplify permission control --gcp_service_account=None --private_api_key_secret_name=None diff --git a/tools/run_tests/xds_k8s_test_driver/framework/helpers/skips.py b/tools/run_tests/xds_k8s_test_driver/framework/helpers/skips.py index 47b8a671499..83dabe8fb77 100644 --- a/tools/run_tests/xds_k8s_test_driver/framework/helpers/skips.py +++ b/tools/run_tests/xds_k8s_test_driver/framework/helpers/skips.py @@ -48,7 +48,10 @@ class Lang(enum.Flag): @dataclass class TestConfig: - """Describes the config for the test suite.""" + """Describes the config for the test suite. + + TODO(sergiitk): rename to LangSpec and rename skips.py to lang.py. + """ client_lang: Lang server_lang: Lang version: Optional[str] @@ -85,8 +88,11 @@ def _get_lang(image_name: str) -> Lang: re.search(r'/(\w+)-(client|server):', image_name).group(1)) -def evaluate_test_config(check: Callable[[TestConfig], bool]) -> None: - """Evaluates the test config check against Abseil flags.""" +def evaluate_test_config(check: Callable[[TestConfig], bool]) -> TestConfig: + """Evaluates the test config check against Abseil flags. + + TODO(sergiitk): split into parse_lang_spec and check_is_supported. + """ # NOTE(lidiz) a manual skip mechanism is needed because absl/flags # cannot be used in the built-in test-skipping decorators. See the # official FAQs: @@ -100,3 +106,4 @@ def evaluate_test_config(check: Callable[[TestConfig], bool]) -> None: raise unittest.SkipTest(f'Unsupported test config: {test_config}') logger.info('Detected language and version: %s', test_config) + return test_config diff --git a/tools/run_tests/xds_k8s_test_driver/framework/xds_k8s_flags.py b/tools/run_tests/xds_k8s_test_driver/framework/xds_k8s_flags.py index e259de8bf1d..5a1de5f1fa1 100644 --- a/tools/run_tests/xds_k8s_test_driver/framework/xds_k8s_flags.py +++ b/tools/run_tests/xds_k8s_test_driver/framework/xds_k8s_flags.py @@ -34,6 +34,12 @@ TD_BOOTSTRAP_IMAGE = flags.DEFINE_string( SERVER_IMAGE = flags.DEFINE_string("server_image", default=None, help="Server Docker image name") +SERVER_IMAGE_UNIVERSAL = flags.DEFINE_string( + "server_image_universal", + default=None, + help=("Server Docker image name to use in tests that need to override\n" + "the language-specific xDS test server with the reference\n" + "implementation of a different language, or a different version.")) CLIENT_IMAGE = flags.DEFINE_string("client_image", default=None, help="Client Docker image name") diff --git a/tools/run_tests/xds_k8s_test_driver/framework/xds_k8s_testcase.py b/tools/run_tests/xds_k8s_test_driver/framework/xds_k8s_testcase.py index ff568614570..3b5f7f6f92d 100644 --- a/tools/run_tests/xds_k8s_test_driver/framework/xds_k8s_testcase.py +++ b/tools/run_tests/xds_k8s_test_driver/framework/xds_k8s_testcase.py @@ -72,6 +72,7 @@ class TdPropagationRetryableError(Exception): class XdsKubernetesBaseTestCase(absltest.TestCase): + lang_spec: skips.TestConfig client_namespace: str client_runner: KubernetesClientRunner ensure_firewall: bool @@ -115,7 +116,7 @@ class XdsKubernetesBaseTestCase(absltest.TestCase): # Raises unittest.SkipTest if given client/server/version does not # support current test case. - skips.evaluate_test_config(cls.is_supported) + cls.lang_spec = skips.evaluate_test_config(cls.is_supported) # Must be called before KubernetesApiManager or GcpApiManager init. xds_flags.set_socket_default_timeout_from_flag() diff --git a/tools/run_tests/xds_k8s_test_driver/tests/outlier_detection_test.py b/tools/run_tests/xds_k8s_test_driver/tests/outlier_detection_test.py index ce26e01d28e..f570a6c7782 100644 --- a/tools/run_tests/xds_k8s_test_driver/tests/outlier_detection_test.py +++ b/tools/run_tests/xds_k8s_test_driver/tests/outlier_detection_test.py @@ -17,12 +17,14 @@ from typing import List from absl import flags from absl.testing import absltest +from framework import xds_k8s_flags from framework import xds_k8s_testcase from framework import xds_url_map_testcase from framework.helpers import skips logger = logging.getLogger(__name__) flags.adopt_module_key_flags(xds_k8s_testcase) +flags.mark_flag_as_required('server_image_universal') # Type aliases RpcTypeUnaryCall = xds_url_map_testcase.RpcTypeUnaryCall @@ -45,10 +47,21 @@ class OutlierDetectionTest(xds_k8s_testcase.RegularXdsKubernetesTestCase): requests. """ + @classmethod + def setUpClass(cls): + """Force the java test server for languages not yet supporting + the `rpc-behavior` feature. + + https://github.com/grpc/grpc/blob/master/doc/xds-test-descriptions.md#server + """ + super().setUpClass() + if cls.lang_spec.client_lang != _Lang.JAVA: + # TODO(mlumish): Once rpc-behavior supported by a language, make the + # override version-conditional. + cls.server_image = xds_k8s_flags.SERVER_IMAGE_UNIVERSAL.value + @staticmethod def is_supported(config: skips.TestConfig) -> bool: - if config.server_lang != _Lang.JAVA: - return False if config.client_lang in _Lang.CPP | _Lang.PYTHON: return config.version_gte('v1.48.x') if config.client_lang == _Lang.NODE: