From d0993162de13b1a0399a4a9e1516a3bf60501e49 Mon Sep 17 00:00:00 2001 From: Sergii Tkachenko Date: Wed, 9 Oct 2024 13:07:18 -0700 Subject: [PATCH 1/3] Replace Optional: part 1, no nesting --- bin/cleanup/cleanup.py | 6 +- framework/bootstrap_generator_testcase.py | 4 +- framework/helpers/datetime.py | 2 +- framework/helpers/grpc.py | 4 +- framework/helpers/highlighter.py | 8 +- framework/helpers/retryers.py | 32 ++++---- framework/helpers/skips.py | 2 +- framework/infrastructure/gcp/api.py | 14 ++-- framework/infrastructure/gcp/compute.py | 20 ++--- framework/infrastructure/gcp/iam.py | 12 +-- .../infrastructure/gcp/network_services.py | 36 ++++----- framework/infrastructure/k8s.py | 36 ++++----- .../k8s_internal/k8s_log_collector.py | 4 +- .../k8s_internal/k8s_port_forwarder.py | 8 +- framework/infrastructure/traffic_director.py | 78 +++++++++---------- framework/rpc/grpc.py | 6 +- framework/rpc/grpc_channelz.py | 12 ++- framework/rpc/grpc_csds.py | 6 +- framework/rpc/grpc_testing.py | 36 ++++----- framework/test_app/client_app.py | 40 +++++----- framework/test_app/runners/base_runner.py | 4 +- .../runners/k8s/gamma_server_runner.py | 28 +++---- .../test_app/runners/k8s/k8s_base_runner.py | 28 +++---- .../runners/k8s/k8s_xds_client_runner.py | 18 ++--- .../runners/k8s/k8s_xds_server_runner.py | 32 ++++---- framework/test_app/server_app.py | 14 ++-- framework/test_cases/base_testcase.py | 2 +- framework/xds_k8s_testcase.py | 26 +++---- framework/xds_url_map_testcase.py | 6 +- tests/authz_test.py | 4 +- tests/unit/helpers/skips_test.py | 8 +- 31 files changed, 265 insertions(+), 271 deletions(-) diff --git a/bin/cleanup/cleanup.py b/bin/cleanup/cleanup.py index a778610e..c719d54f 100644 --- a/bin/cleanup/cleanup.py +++ b/bin/cleanup/cleanup.py @@ -379,7 +379,7 @@ def cleanup_client( gcp_api_manager, gcp_service_account, *, - suffix: Optional[str] = "", + suffix: str | None = "", ): deployment_name = xds_flags.CLIENT_NAME.value if suffix: @@ -422,7 +422,7 @@ def cleanup_server( gcp_api_manager, gcp_service_account, *, - suffix: Optional[str] = "", + suffix: str | None = "", ): deployment_name = xds_flags.SERVER_NAME.value if suffix: @@ -563,7 +563,7 @@ def delete_k8s_resources( def _rule_match_k8s_namespace( namespace_name: str, k8s_resource_rules: List[K8sResourceRule] -) -> Optional[K8sResourceRule]: +) -> K8sResourceRule | None: for rule in k8s_resource_rules: result = re.search(rule.expression, namespace_name) if result is not None: diff --git a/framework/bootstrap_generator_testcase.py b/framework/bootstrap_generator_testcase.py index b2dc926d..9ac8a69c 100644 --- a/framework/bootstrap_generator_testcase.py +++ b/framework/bootstrap_generator_testcase.py @@ -127,7 +127,7 @@ def initTrafficDirectorManager(cls) -> TrafficDirectorManager: @classmethod def initKubernetesServerRunner( - cls, *, td_bootstrap_image: Optional[str] = None + cls, *, td_bootstrap_image: str | None = None ) -> KubernetesServerRunner: if not td_bootstrap_image: td_bootstrap_image = cls.td_bootstrap_image @@ -165,7 +165,7 @@ def startTestServer( return test_server def initKubernetesClientRunner( - self, td_bootstrap_image: Optional[str] = None + self, td_bootstrap_image: str | None = None ) -> KubernetesClientRunner: if not td_bootstrap_image: td_bootstrap_image = self.td_bootstrap_image diff --git a/framework/helpers/datetime.py b/framework/helpers/datetime.py index 27236d0f..ebddf2e1 100644 --- a/framework/helpers/datetime.py +++ b/framework/helpers/datetime.py @@ -57,7 +57,7 @@ def datetime_suffix(*, seconds: bool = False) -> str: return utc_now().strftime("%Y%m%d-%H%M" + ("%S" if seconds else "")) -def ago(date_from: datetime.datetime, now: Optional[datetime.datetime] = None): +def ago(date_from: datetime.datetime, now: datetime.datetime | None = None): if not now: now = utc_now() diff --git a/framework/helpers/grpc.py b/framework/helpers/grpc.py index 43c76a6a..c34c9c3e 100644 --- a/framework/helpers/grpc.py +++ b/framework/helpers/grpc.py @@ -31,7 +31,7 @@ @functools.cache -def status_from_int(grpc_status_int: int) -> Optional[grpc.StatusCode]: +def status_from_int(grpc_status_int: int) -> grpc.StatusCode | None: """Converts the integer gRPC status code to the grpc.StatusCode enum.""" for grpc_status in grpc.StatusCode: if grpc_status.value[0] == grpc_status_int: @@ -77,7 +77,7 @@ def from_response( ) -> "PrettyStatsPerMethod": stats: dict[str, int] = dict() for status_int, count in method_stats.result.items(): - status: Optional[grpc.StatusCode] = status_from_int(status_int) + status: grpc.StatusCode | None = status_from_int(status_int) status_formatted = status_pretty(status) if status else "None" stats[status_formatted] = count return PrettyStatsPerMethod( diff --git a/framework/helpers/highlighter.py b/framework/helpers/highlighter.py index ef6b74c7..8093e27f 100644 --- a/framework/helpers/highlighter.py +++ b/framework/helpers/highlighter.py @@ -63,14 +63,14 @@ class Highlighter: formatter: Formatter lexer: Lexer color: bool - color_style: Optional[str] = None + color_style: str | None = None def __init__( self, *, lexer: Lexer, - color: Optional[bool] = None, - color_style: Optional[str] = None, + color: bool | None = None, + color_style: str | None = None, ): self.lexer = lexer self.color = color if color is not None else COLOR.value @@ -97,7 +97,7 @@ def highlight(self, code: str) -> str: class HighlighterYaml(Highlighter): def __init__( - self, *, color: Optional[bool] = None, color_style: Optional[str] = None + self, *, color: bool | None = None, color_style: str | None = None ): super().__init__( lexer=YamlLexer(encoding="utf-8"), diff --git a/framework/helpers/retryers.py b/framework/helpers/retryers.py index ed46d603..ac2473ea 100644 --- a/framework/helpers/retryers.py +++ b/framework/helpers/retryers.py @@ -41,8 +41,8 @@ def _build_retry_conditions( *, - retry_on_exceptions: Optional[_ExceptionClasses] = None, - check_result: Optional[CheckResultFn] = None, + retry_on_exceptions: _ExceptionClasses | None = None, + check_result: CheckResultFn | None = None, ) -> List[retry_base]: # Retry on all exceptions by default if retry_on_exceptions is None: @@ -63,10 +63,10 @@ def exponential_retryer_with_timeout( wait_min: timedelta, wait_max: timedelta, timeout: timedelta, - retry_on_exceptions: Optional[_ExceptionClasses] = None, - check_result: Optional[CheckResultFn] = None, - logger: Optional[logging.Logger] = None, - log_level: Optional[int] = logging.DEBUG, + retry_on_exceptions: _ExceptionClasses | None = None, + check_result: CheckResultFn | None = None, + logger: logging.Logger | None = None, + log_level: int | None = logging.DEBUG, error_note: str = "", ) -> Retrying: if logger is None: @@ -95,11 +95,11 @@ def constant_retryer( *, wait_fixed: timedelta, attempts: int = 0, - timeout: Optional[timedelta] = None, - retry_on_exceptions: Optional[_ExceptionClasses] = None, - check_result: Optional[CheckResultFn] = None, - logger: Optional[logging.Logger] = None, - log_level: Optional[int] = logging.DEBUG, + timeout: timedelta | None = None, + retry_on_exceptions: _ExceptionClasses | None = None, + check_result: CheckResultFn | None = None, + logger: logging.Logger | None = None, + log_level: int | None = logging.DEBUG, error_note: str = "", ) -> Retrying: if logger is None: @@ -134,9 +134,9 @@ def constant_retryer( def _on_error_callback( *, - timeout: Optional[timedelta] = None, + timeout: timedelta | None = None, attempts: int = 0, - check_result: Optional[CheckResultFn] = None, + check_result: CheckResultFn | None = None, error_note: str = "", ): """A helper to propagate the initial state to the RetryError, so that @@ -234,9 +234,9 @@ def __init__( self, retry_state, *, - timeout: Optional[timedelta] = None, + timeout: timedelta | None = None, attempts: int = 0, - check_result: Optional[CheckResultFn] = None, + check_result: CheckResultFn | None = None, note: str = "", ): last_attempt: tenacity.Future = retry_state.outcome @@ -292,7 +292,7 @@ def reason_str(self): return self.exception_str() if self.exception() else self.result_str() @classmethod - def _exception_str(cls, err: Optional[BaseException]) -> str: + def _exception_str(cls, err: BaseException | None) -> str: return f"{type(err).__name__}: {err}" if err else "???" # TODO(sergiitk): Remove in py3.11, this will be built-in. See PEP 678. diff --git a/framework/helpers/skips.py b/framework/helpers/skips.py index e7c82798..0a99e62f 100644 --- a/framework/helpers/skips.py +++ b/framework/helpers/skips.py @@ -51,7 +51,7 @@ class TestConfig: client_lang: Lang server_lang: Lang - version: Optional[str] + version: str | None def version_gte(self, another: str) -> bool: """Returns a bool for whether this VERSION is >= then ANOTHER version. diff --git a/framework/infrastructure/gcp/api.py b/framework/infrastructure/gcp/api.py index a0be2db1..e0dcbeba 100644 --- a/framework/infrastructure/gcp/api.py +++ b/framework/infrastructure/gcp/api.py @@ -88,7 +88,7 @@ class GcpApiManager: # The previous value of googleapiclient.model.dump_request_response. - _dump_req_resp: Optional[bool] = None + _dump_req_resp: bool | None = None def __init__( self, @@ -263,8 +263,8 @@ def _build_from_discovery_v2( api_name, version, *, - api_key: Optional[str] = None, - visibility_labels: Optional[List] = None, + api_key: str | None = None, + visibility_labels: List | None = None, ): params = {} if api_key: @@ -305,8 +305,8 @@ class ResponseError(Error): reason: str uri: str - error_details: Optional[str] - status: Optional[int] + error_details: str | None + status: int | None cause: _HttpError def __init__(self, cause: _HttpError): @@ -441,7 +441,7 @@ def _execute( self, request: HttpRequest, *, - num_retries: Optional[int] = _GCP_API_RETRIES, + num_retries: int | None = _GCP_API_RETRIES, ) -> Dict[str, Any]: """Execute the immediate request. @@ -515,7 +515,7 @@ def wait_for_operation( class GcpStandardCloudApiResource(GcpProjectApiResource, metaclass=abc.ABCMeta): GLOBAL_LOCATION = "global" - def parent(self, location: Optional[str] = GLOBAL_LOCATION): + def parent(self, location: str | None = GLOBAL_LOCATION): if location is None: location = self.GLOBAL_LOCATION return f"projects/{self.project}/locations/{location}" diff --git a/framework/infrastructure/gcp/compute.py b/framework/infrastructure/gcp/compute.py index d1f4f96c..ff61d115 100644 --- a/framework/infrastructure/gcp/compute.py +++ b/framework/infrastructure/gcp/compute.py @@ -38,7 +38,7 @@ class ComputeV1( _WAIT_FOR_BACKEND_SEC = 60 * 10 _WAIT_FOR_BACKEND_SLEEP_SEC = 4 _WAIT_FOR_OPERATION_SEC = 60 * 10 - gfe_debug_header: Optional[str] + gfe_debug_header: str | None @dataclasses.dataclass(frozen=True) class GcpResource: @@ -60,7 +60,7 @@ def __init__( self, api_manager: gcp.api.GcpApiManager, project: str, - gfe_debug_header: Optional[str] = None, + gfe_debug_header: str | None = None, version: str = "v1", ): super().__init__(api_manager.compute(version), project) @@ -80,7 +80,7 @@ def create_health_check( name: str, protocol: HealthCheckProtocol, *, - port: Optional[int] = None, + port: int | None = None, ) -> "GcpResource": if protocol is self.HealthCheckProtocol.TCP: health_check_field = "tcpHealthCheck" @@ -117,7 +117,7 @@ def create_firewall_rule( network_url: str, source_ranges: List[str], ports: List[str], - ) -> Optional["GcpResource"]: + ) -> "GcpResource" | None: try: return self._insert_resource( self.api.firewalls(), @@ -146,11 +146,11 @@ def create_backend_service_traffic_director( self, name: str, health_check: "GcpResource", - affinity_header: Optional[str] = None, - protocol: Optional[BackendServiceProtocol] = None, - subset_size: Optional[int] = None, + affinity_header: str | None = None, + protocol: BackendServiceProtocol | None = None, + subset_size: int | None = None, locality_lb_policies: Optional[List[dict]] = None, - outlier_detection: Optional[dict] = None, + outlier_detection: dict | None = None, enable_dualstack: bool = False, ) -> "GcpResource": if not isinstance(protocol, self.BackendServiceProtocol): @@ -201,7 +201,7 @@ def backend_service_patch_backends( self, backend_service, backends, - max_rate_per_endpoint: Optional[int] = None, + max_rate_per_endpoint: int | None = None, *, circuit_breakers: Optional[dict[str, int]] = None, ): @@ -244,7 +244,7 @@ def create_url_map( matcher_name: str, src_hosts, dst_default_backend_service: "GcpResource", - dst_host_rule_match_backend_service: Optional["GcpResource"] = None, + dst_host_rule_match_backend_service: "GcpResource" | None = None, ) -> "GcpResource": if dst_host_rule_match_backend_service is None: dst_host_rule_match_backend_service = dst_default_backend_service diff --git a/framework/infrastructure/gcp/iam.py b/framework/infrastructure/gcp/iam.py index fc153da0..d103e37e 100644 --- a/framework/infrastructure/gcp/iam.py +++ b/framework/infrastructure/gcp/iam.py @@ -131,7 +131,7 @@ class Binding: role: str members: FrozenSet[str] - condition: Optional[Expr] = None + condition: Expr | None = None @classmethod def from_response(cls, response: Dict[str, Any]) -> "Policy.Binding": @@ -155,12 +155,12 @@ def as_dict(self) -> Dict[str, Any]: bindings: FrozenSet[Binding] etag: str - version: Optional[int] = None + version: int | None = None @functools.lru_cache(maxsize=128) def find_binding_for_role( - self, role: str, condition: Optional[Expr] = None - ) -> Optional["Policy.Binding"]: + self, role: str, condition: Expr | None = None + ) -> "Policy.Binding" | None: results = ( binding for binding in self.bindings @@ -283,7 +283,7 @@ def add_service_account_iam_policy_binding( https://cloud.google.com/iam/docs/reference/rest/v1/projects.serviceAccounts/setIamPolicy """ policy: Policy = self.get_service_account_iam_policy(account) - binding: Optional[Policy.Binding] = policy.find_binding_for_role(role) + binding: Policy.Binding | None = policy.find_binding_for_role(role) if binding and member in binding.members: logger.debug( "Member %s already has role %s for Service Account %s", @@ -325,7 +325,7 @@ def remove_service_account_iam_policy_binding( https://cloud.google.com/iam/docs/reference/rest/v1/projects.serviceAccounts/setIamPolicy """ policy: Policy = self.get_service_account_iam_policy(account) - binding: Optional[Policy.Binding] = policy.find_binding_for_role(role) + binding: Policy.Binding | None = policy.find_binding_for_role(role) if binding is None: logger.debug( diff --git a/framework/infrastructure/gcp/network_services.py b/framework/infrastructure/gcp/network_services.py index 86d4a97a..975002cb 100644 --- a/framework/infrastructure/gcp/network_services.py +++ b/framework/infrastructure/gcp/network_services.py @@ -37,8 +37,8 @@ class EndpointPolicy: endpoint_matcher: dict update_time: str create_time: str - http_filters: Optional[dict] = None - server_tls_policy: Optional[str] = None + http_filters: dict | None = None + server_tls_policy: str | None = None @classmethod def from_response( @@ -76,10 +76,10 @@ def from_response(cls, name: str, d: Dict[str, Any]) -> "Mesh": class GrpcRoute: @dataclasses.dataclass(frozen=True) class MethodMatch: - type: Optional[str] - grpc_service: Optional[str] - grpc_method: Optional[str] - case_sensitive: Optional[bool] + type: str | None + grpc_service: str | None + grpc_method: str | None + case_sensitive: bool | None @classmethod def from_response(cls, d: Dict[str, Any]) -> "GrpcRoute.MethodMatch": @@ -92,7 +92,7 @@ def from_response(cls, d: Dict[str, Any]) -> "GrpcRoute.MethodMatch": @dataclasses.dataclass(frozen=True) class HeaderMatch: - type: Optional[str] + type: str | None key: str value: str @@ -106,7 +106,7 @@ def from_response(cls, d: Dict[str, Any]) -> "GrpcRoute.HeaderMatch": @dataclasses.dataclass(frozen=True) class RouteMatch: - method: Optional["GrpcRoute.MethodMatch"] + method: "GrpcRoute.MethodMatch" | None headers: Tuple["GrpcRoute.HeaderMatch"] @classmethod @@ -125,7 +125,7 @@ def from_response(cls, d: Dict[str, Any]) -> "GrpcRoute.RouteMatch": @dataclasses.dataclass(frozen=True) class Destination: service_name: str - weight: Optional[int] + weight: int | None @classmethod def from_response(cls, d: Dict[str, Any]) -> "GrpcRoute.Destination": @@ -188,10 +188,10 @@ def from_response( class HttpRoute: @dataclasses.dataclass(frozen=True) class MethodMatch: - type: Optional[str] - http_service: Optional[str] - http_method: Optional[str] - case_sensitive: Optional[bool] + type: str | None + http_service: str | None + http_method: str | None + case_sensitive: bool | None @classmethod def from_response(cls, d: Dict[str, Any]) -> "HttpRoute.MethodMatch": @@ -204,7 +204,7 @@ def from_response(cls, d: Dict[str, Any]) -> "HttpRoute.MethodMatch": @dataclasses.dataclass(frozen=True) class HeaderMatch: - type: Optional[str] + type: str | None key: str value: str @@ -218,7 +218,7 @@ def from_response(cls, d: Dict[str, Any]) -> "HttpRoute.HeaderMatch": @dataclasses.dataclass(frozen=True) class RouteMatch: - method: Optional["HttpRoute.MethodMatch"] + method: "HttpRoute.MethodMatch" | None headers: Tuple["HttpRoute.HeaderMatch"] @classmethod @@ -237,7 +237,7 @@ def from_response(cls, d: Dict[str, Any]) -> "HttpRoute.RouteMatch": @dataclasses.dataclass(frozen=True) class Destination: service_name: str - weight: Optional[int] + weight: int | None @classmethod def from_response(cls, d: Dict[str, Any]) -> "HttpRoute.Destination": @@ -249,7 +249,7 @@ def from_response(cls, d: Dict[str, Any]) -> "HttpRoute.Destination": @dataclasses.dataclass(frozen=True) class RouteAction: destinations: List["HttpRoute.Destination"] - stateful_session_affinity: Optional["HttpRoute.StatefulSessionAffinity"] + stateful_session_affinity: "HttpRoute.StatefulSessionAffinity" | None @classmethod def from_response(cls, d: Dict[str, Any]) -> "HttpRoute.RouteAction": @@ -275,7 +275,7 @@ def from_response(cls, d: Dict[str, Any]) -> "HttpRoute.RouteAction": @dataclasses.dataclass(frozen=True) class StatefulSessionAffinity: - cookie_ttl: Optional[str] + cookie_ttl: str | None @classmethod def from_response( diff --git a/framework/infrastructure/k8s.py b/framework/infrastructure/k8s.py index 8562f16e..0e897dc8 100644 --- a/framework/infrastructure/k8s.py +++ b/framework/infrastructure/k8s.py @@ -438,7 +438,7 @@ def _get_resource(self, method: Callable[[Any], object], *args, **kwargs): def _get_dyn_resource( self, api: dynamic_res.Resource, name, *args, **kwargs - ) -> Optional[DynResourceInstance]: + ) -> DynResourceInstance | None: try: return api.get(name=name, namespace=self.name, *args, **kwargs) except dynamic_exc.NotFoundError: @@ -457,7 +457,7 @@ def _execute(self, method: Callable[[Any], object], *args, **kwargs): return retryer(method, *args, **kwargs) raise - def _handle_exception(self, err: Exception) -> Optional[retryers.Retrying]: + def _handle_exception(self, err: Exception) -> retryers.Retrying | None: # TODO(sergiitk): replace returns with match/case when we use to py3.10. # pylint: disable=too-many-return-statements @@ -502,7 +502,7 @@ def _handle_exception(self, err: Exception) -> Optional[retryers.Retrying]: def _handle_api_exception( self, err: _ApiException - ) -> Optional[retryers.Retrying]: + ) -> retryers.Retrying | None: # TODO(sergiitk): replace returns with match/case when we use to py3.10. # pylint: disable=too-many-return-statements @@ -593,25 +593,25 @@ def get_service(self, name) -> V1Service: self._api.core.read_namespaced_service, name, self.name ) - def get_gamma_mesh(self, name) -> Optional[GammaMesh]: + def get_gamma_mesh(self, name) -> GammaMesh | None: return self._get_dyn_resource(self.api_gke_mesh, name) def get_gamma_route( self, name: str, *, kind: RouteKind - ) -> Optional[GammaXRoute]: + ) -> GammaXRoute | None: return self._get_dyn_resource(self.gamma_route_apis[kind], name) def get_session_affinity_policy( self, name - ) -> Optional[GcpSessionAffinityPolicy]: + ) -> GcpSessionAffinityPolicy | None: return self._get_dyn_resource(self.api_session_affinity_policy, name) def get_session_affinity_filter( self, name - ) -> Optional[GcpSessionAffinityFilter]: + ) -> GcpSessionAffinityFilter | None: return self._get_dyn_resource(self.api_session_affinity_filter, name) - def get_backend_policy(self, name) -> Optional[GcpBackendPolicy]: + def get_backend_policy(self, name) -> GcpBackendPolicy | None: return self._get_dyn_resource(self.api_backend_policy, name) def get_service_account(self, name) -> V1Service: @@ -733,7 +733,7 @@ def delete_pod( self, name: str, *, - grace_period: Optional[_timedelta] = DELETE_GRACE_PERIOD, + grace_period: _timedelta | None = DELETE_GRACE_PERIOD, ) -> None: delete_options = client.V1DeleteOptions(propagation_policy="Foreground") @@ -872,8 +872,8 @@ def wait_for_service_account_deleted( def wait_for_namespace_deleted( self, - timeout_sec: Optional[int] = None, - wait_sec: Optional[int] = None, + timeout_sec: int | None = None, + wait_sec: int | None = None, ) -> None: if timeout_sec is None: if self.wait_for_namespace_deleted_timeout_sec is not None: @@ -1076,8 +1076,8 @@ def port_forward_pod( self, pod: V1Pod, remote_port: int, - local_port: Optional[int] = None, - local_address: Optional[str] = None, + local_port: int | None = None, + local_address: str | None = None, ) -> k8s_port_forwarder.PortForwarder: destination = f"pod/{pod.metadata.name}" logger.info( @@ -1120,7 +1120,7 @@ def pod_start_logging( def pretty_format_statuses( self, - k8s_objects: List[Optional[object]], + k8s_objects: List[object | None], *, highlight: bool = True, ) -> str: @@ -1131,14 +1131,14 @@ def pretty_format_statuses( def pretty_format_status( self, - k8s_object: Optional[object], + k8s_object: object | None, highlight: bool = True, ) -> str: if k8s_object is None: return "No data" result = [] - metadata: Optional[V1ObjectMeta] = None + metadata: V1ObjectMeta | None = None if isinstance(getattr(k8s_object, "metadata", None), V1ObjectMeta): # Parse the name if present. metadata: V1ObjectMeta = k8s_object.metadata @@ -1185,7 +1185,7 @@ def pretty_format_status( def pretty_format_metadata( self, - k8s_object: Optional[object], + k8s_object: object | None, *, highlight: bool = True, managed_fields: bool = False, @@ -1226,7 +1226,7 @@ def _pretty_format( @classmethod def _check_service_neg_status_annotation( - cls, service: Optional[V1Service] + cls, service: V1Service | None ) -> bool: return ( isinstance(service, V1Service) diff --git a/framework/infrastructure/k8s_internal/k8s_log_collector.py b/framework/infrastructure/k8s_internal/k8s_log_collector.py index 1b0832d3..9205825a 100644 --- a/framework/infrastructure/k8s_internal/k8s_log_collector.py +++ b/framework/infrastructure/k8s_internal/k8s_log_collector.py @@ -35,8 +35,8 @@ class PodLogCollector(threading.Thread): log_to_stdout: bool log_timestamps: bool error_backoff_sec: int - _out_stream: Optional[TextIO] - _watcher: Optional[watch.Watch] + _out_stream: TextIO | None + _watcher: watch.Watch | None _read_pod_log_fn: Callable[..., Any] def __init__( diff --git a/framework/infrastructure/k8s_internal/k8s_port_forwarder.py b/framework/infrastructure/k8s_internal/k8s_port_forwarder.py index 37081fed..f46176a0 100644 --- a/framework/infrastructure/k8s_internal/k8s_port_forwarder.py +++ b/framework/infrastructure/k8s_internal/k8s_port_forwarder.py @@ -33,16 +33,16 @@ def __init__( namespace: str, destination: str, remote_port: int, - local_port: Optional[int] = None, - local_address: Optional[str] = None, + local_port: int | None = None, + local_address: str | None = None, ): self.context = context self.namespace = namespace self.destination = destination self.remote_port = remote_port self.local_address = local_address or self.PORT_FORWARD_LOCAL_ADDRESS - self.local_port: Optional[int] = local_port - self.subprocess: Optional[subprocess.Popen] = None + self.local_port: int | None = local_port + self.subprocess: subprocess.Popen | None = None def connect(self) -> None: if self.local_port: diff --git a/framework/infrastructure/traffic_director.py b/framework/infrastructure/traffic_director.py index 0004ad9d..da519a61 100644 --- a/framework/infrastructure/traffic_director.py +++ b/framework/infrastructure/traffic_director.py @@ -88,9 +88,9 @@ class TrafficDirectorManager: # pylint: disable=too-many-public-methods alternative_backends: set[NegGcpResource] # Backend Serivices - backend_service: Optional[GcpResource] = None - affinity_backend_service: Optional[GcpResource] = None - alternative_backend_service: Optional[GcpResource] = None + backend_service: GcpResource | None = None + affinity_backend_service: GcpResource | None = None + alternative_backend_service: GcpResource | None = None # TODO(sergiitk): move these flags to backend service dataclass backend_service_protocol: BackendServiceProtocol = _BackendUnset @@ -127,19 +127,19 @@ def __init__( self.enable_dualstack: bool = enable_dualstack # Managed resources - self.health_check: Optional[GcpResource] = None - self.url_map: Optional[GcpResource] = None - self.alternative_url_map: Optional[GcpResource] = None - self.firewall_rule: Optional[GcpResource] = None - self.firewall_rule_ipv6: Optional[GcpResource] = None - self.target_proxy: Optional[GcpResource] = None - self.target_proxy_ipv6: Optional[GcpResource] = None + self.health_check: GcpResource | None = None + self.url_map: GcpResource | None = None + self.alternative_url_map: GcpResource | None = None + self.firewall_rule: GcpResource | None = None + self.firewall_rule_ipv6: GcpResource | None = None + self.target_proxy: GcpResource | None = None + self.target_proxy_ipv6: GcpResource | None = None # TODO(sergiitk): remove this flag once target proxy resource loaded self.target_proxy_is_http: bool = False - self.alternative_target_proxy: Optional[GcpResource] = None - self.forwarding_rule: Optional[GcpResource] = None - self.forwarding_rule_ipv6: Optional[GcpResource] = None - self.alternative_forwarding_rule: Optional[GcpResource] = None + self.alternative_target_proxy: GcpResource | None = None + self.forwarding_rule: GcpResource | None = None + self.forwarding_rule_ipv6: GcpResource | None = None + self.alternative_forwarding_rule: GcpResource | None = None # Backends. self.backends = set() @@ -155,8 +155,8 @@ def setup_for_grpc( service_host, service_port, *, - backend_protocol: Optional[BackendServiceProtocol] = _BackendGRPC, - health_check_port: Optional[int] = None, + backend_protocol: BackendServiceProtocol | None = _BackendGRPC, + health_check_port: int | None = None, ): self.setup_backend_for_grpc( protocol=backend_protocol, health_check_port=health_check_port @@ -166,8 +166,8 @@ def setup_for_grpc( def setup_backend_for_grpc( self, *, - protocol: Optional[BackendServiceProtocol] = _BackendGRPC, - health_check_port: Optional[int] = None, + protocol: BackendServiceProtocol | None = _BackendGRPC, + health_check_port: int | None = None, ): self.create_health_check(port=health_check_port) self.create_backend_service(protocol) @@ -211,8 +211,8 @@ def make_resource_name(self, name: str) -> str: def create_health_check( self, *, - protocol: Optional[HealthCheckProtocol] = _HealthCheckGRPC, - port: Optional[int] = None, + protocol: HealthCheckProtocol | None = _HealthCheckGRPC, + port: int | None = None, ): if self.health_check: raise ValueError( @@ -240,11 +240,11 @@ def delete_health_check(self, force=False): def create_backend_service( self, - protocol: Optional[BackendServiceProtocol] = _BackendGRPC, - subset_size: Optional[int] = None, - affinity_header: Optional[str] = None, + protocol: BackendServiceProtocol | None = _BackendGRPC, + subset_size: int | None = None, + affinity_header: str | None = None, locality_lb_policies: Optional[List[dict]] = None, - outlier_detection: Optional[dict] = None, + outlier_detection: dict | None = None, ): if protocol is None: protocol = _BackendGRPC @@ -285,7 +285,7 @@ def backend_service_add_neg_backends( name: str, zones: list[str], *, - max_rate_per_endpoint: Optional[int] = None, + max_rate_per_endpoint: int | None = None, ) -> None: self.backends |= self._get_gcp_negs_in_zones(name, zones) if not self.backends: @@ -308,7 +308,7 @@ def backend_service_remove_neg_backends(self, name, zones): def backend_service_patch_backends( self, - max_rate_per_endpoint: Optional[int] = None, + max_rate_per_endpoint: int | None = None, *, circuit_breakers: Optional[dict[str, int]] = None, ): @@ -342,7 +342,7 @@ def wait_for_backends_healthy_status(self, replica_count: int = 1): ) def create_alternative_backend_service( - self, protocol: Optional[BackendServiceProtocol] = _BackendGRPC + self, protocol: BackendServiceProtocol | None = _BackendGRPC ): if protocol is None: protocol = _BackendGRPC @@ -422,7 +422,7 @@ def wait_for_alternative_backends_healthy_status( ) def create_affinity_backend_service( - self, protocol: Optional[BackendServiceProtocol] = _BackendGRPC + self, protocol: BackendServiceProtocol | None = _BackendGRPC ): if protocol is None: protocol = _BackendGRPC @@ -500,7 +500,7 @@ def _generate_url_map_body( matcher_name: str, src_hosts, dst_default_backend_service: GcpResource, - dst_host_rule_match_backend_service: Optional[GcpResource] = None, + dst_host_rule_match_backend_service: GcpResource | None = None, ) -> Dict[str, Any]: if dst_host_rule_match_backend_service is None: dst_host_rule_match_backend_service = dst_default_backend_service @@ -579,7 +579,7 @@ def create_alternative_url_map( self, src_host: str, src_port: int, - backend_service: Optional[GcpResource] = None, + backend_service: GcpResource | None = None, ) -> GcpResource: name = self.make_resource_name(self.ALTERNATIVE_URL_MAP_NAME) src_address = f"{src_host}:{src_port}" @@ -916,7 +916,7 @@ def __init__( project: str, *, resource_prefix: str, - resource_suffix: Optional[str] = None, + resource_suffix: str | None = None, network: str = "default", compute_api_version: str = "v1", enable_dualstack: bool = False, @@ -938,9 +938,9 @@ def __init__( # Managed resources # TODO(gnossen) PTAL at the pylint error - self.grpc_route: Optional[GrpcRoute] = None - self.http_route: Optional[HttpRoute] = None - self.mesh: Optional[Mesh] = None + self.grpc_route: GrpcRoute | None = None + self.http_route: HttpRoute | None = None + self.mesh: Mesh | None = None def create_mesh(self) -> GcpResource: name = self.make_resource_name(self.MESH_NAME) @@ -1042,7 +1042,7 @@ def __init__( project: str, *, resource_prefix: str, - resource_suffix: Optional[str] = None, + resource_suffix: str | None = None, network: str = "default", compute_api_version: str = "v1", enable_dualstack: bool = False, @@ -1062,10 +1062,10 @@ def __init__( self.netsvc = _NetworkServicesV1Beta1(gcp_api_manager, project) # Managed resources - self.server_tls_policy: Optional[ServerTlsPolicy] = None - self.client_tls_policy: Optional[ClientTlsPolicy] = None - self.authz_policy: Optional[AuthorizationPolicy] = None - self.endpoint_policy: Optional[EndpointPolicy] = None + self.server_tls_policy: ServerTlsPolicy | None = None + self.client_tls_policy: ClientTlsPolicy | None = None + self.authz_policy: AuthorizationPolicy | None = None + self.endpoint_policy: EndpointPolicy | None = None def setup_server_security( self, *, server_namespace, server_name, server_port, tls=True, mtls=True diff --git a/framework/rpc/grpc.py b/framework/rpc/grpc.py index b6799111..9a010ef4 100644 --- a/framework/rpc/grpc.py +++ b/framework/rpc/grpc.py @@ -44,7 +44,7 @@ def __init__( channel: grpc.Channel, stub_class: Any, *, - log_target: Optional[str] = "", + log_target: str | None = "", ): self.channel = channel self.stub = stub_class(channel) @@ -58,8 +58,8 @@ def call_unary_with_deadline( *, rpc: str, req: Message, - deadline_sec: Optional[int] = DEFAULT_RPC_DEADLINE_SEC, - log_level: Optional[int] = logging.DEBUG, + deadline_sec: int | None = DEFAULT_RPC_DEADLINE_SEC, + log_level: int | None = logging.DEBUG, ) -> Message: if deadline_sec is None: deadline_sec = self.DEFAULT_RPC_DEADLINE_SEC diff --git a/framework/rpc/grpc_channelz.py b/framework/rpc/grpc_channelz.py index e5060917..5e5a0401 100644 --- a/framework/rpc/grpc_channelz.py +++ b/framework/rpc/grpc_channelz.py @@ -58,9 +58,7 @@ class ChannelzServiceClient(framework.rpc.grpc.GrpcClientHelper): stub: channelz_pb2_grpc.ChannelzStub - def __init__( - self, channel: grpc.Channel, *, log_target: Optional[str] = "" - ): + def __init__(self, channel: grpc.Channel, *, log_target: str | None = ""): super().__init__( channel, channelz_pb2_grpc.ChannelzStub, log_target=log_target ) @@ -139,7 +137,7 @@ def find_channels_for_target( def find_server_listening_on_port( self, port: int, **kwargs - ) -> Optional[Server]: + ) -> Server | None: for server in self.list_servers(**kwargs): listen_socket_ref: SocketRef for listen_socket_ref in server.listen_socket: @@ -162,7 +160,7 @@ def list_channels(self, **kwargs) -> Iterator[Channel]: This does not include subchannels nor non-top level channels. """ start: int = -1 - response: Optional[_GetTopChannelsResponse] = None + response: _GetTopChannelsResponse | None = None while start < 0 or not response.end: # From proto: To request subsequent pages, the client generates this # value by adding 1 to the highest seen result ID. @@ -199,7 +197,7 @@ def get_channel(self, channel_id, **kwargs) -> Channel: def list_servers(self, **kwargs) -> Iterator[Server]: """Iterate over all pages of all servers that exist in the process.""" start: int = -1 - response: Optional[_GetServersResponse] = None + response: _GetServersResponse | None = None while start < 0 or not response.end: # From proto: To request subsequent pages, the client generates this # value by adding 1 to the highest seen result ID. @@ -219,7 +217,7 @@ def list_server_sockets(self, server: Server, **kwargs) -> Iterator[Socket]: Iterating over the results will resolve additional pages automatically. """ start: int = -1 - response: Optional[_GetServerSocketsResponse] = None + response: _GetServerSocketsResponse | None = None while start < 0 or not response.end: # From proto: To request subsequent pages, the client generates this # value by adding 1 to the highest seen result ID. diff --git a/framework/rpc/grpc_csds.py b/framework/rpc/grpc_csds.py index df2460c9..7e5c0768 100644 --- a/framework/rpc/grpc_csds.py +++ b/framework/rpc/grpc_csds.py @@ -163,7 +163,7 @@ class CsdsClient(framework.rpc.grpc.GrpcClientHelper): DEFAULT_RPC_DEADLINE: Final[dt.timedelta] = dt.timedelta(seconds=30) def __init__( - self, channel: grpc.Channel, *, log_target: Optional[str] = "" + self, channel: grpc.Channel, *, log_target: str | None = "" ) -> None: super().__init__(channel, self.STUB_CLASS, log_target=log_target) @@ -172,7 +172,7 @@ def fetch_client_status( *, timeout: dt.timedelta = DEFAULT_RPC_DEADLINE, log_level: int = logging.INFO, - ) -> Optional[ClientConfig]: + ) -> ClientConfig | None: """Fetches the active xDS configurations.""" response: ClientStatusResponse = self.call_unary_with_deadline( rpc="FetchClientStatus", @@ -188,7 +188,7 @@ def fetch_client_status( return None return response.config[0] - def fetch_client_status_parsed(self, **kwargs) -> Optional[DumpedXdsConfig]: + def fetch_client_status_parsed(self, **kwargs) -> DumpedXdsConfig | None: """Same as fetch_client_status, but also parses.""" client_config = self.fetch_client_status(**kwargs) if client_config: diff --git a/framework/rpc/grpc_testing.py b/framework/rpc/grpc_testing.py index 80d19da6..b3c87ee2 100644 --- a/framework/rpc/grpc_testing.py +++ b/framework/rpc/grpc_testing.py @@ -135,9 +135,7 @@ class LoadBalancerStatsServiceClient(framework.rpc.grpc.GrpcClientHelper): STATS_PARTIAL_RESULTS_TIMEOUT_SEC = 1200 STATS_ACCUMULATED_RESULTS_TIMEOUT_SEC = 600 - def __init__( - self, channel: grpc.Channel, *, log_target: Optional[str] = "" - ): + def __init__(self, channel: grpc.Channel, *, log_target: str | None = ""): super().__init__( channel, test_pb2_grpc.LoadBalancerStatsServiceStub, @@ -148,7 +146,7 @@ def get_client_stats( self, *, num_rpcs: int, - timeout_sec: Optional[int] = STATS_PARTIAL_RESULTS_TIMEOUT_SEC, + timeout_sec: int | None = STATS_PARTIAL_RESULTS_TIMEOUT_SEC, metadata_keys: Optional[tuple[str, ...]] = None, ) -> LoadBalancerStatsResponse: if timeout_sec is None: @@ -167,7 +165,7 @@ def get_client_stats( return cast(LoadBalancerStatsResponse, stats) def get_client_accumulated_stats( - self, *, timeout_sec: Optional[int] = None + self, *, timeout_sec: int | None = None ) -> LoadBalancerAccumulatedStatsResponse: if timeout_sec is None: timeout_sec = self.STATS_ACCUMULATED_RESULTS_TIMEOUT_SEC @@ -187,9 +185,7 @@ class XdsUpdateClientConfigureServiceClient( stub: test_pb2_grpc.XdsUpdateClientConfigureServiceStub CONFIGURE_TIMEOUT_SEC: Final[int] = 5 - def __init__( - self, channel: grpc.Channel, *, log_target: Optional[str] = "" - ): + def __init__(self, channel: grpc.Channel, *, log_target: str | None = ""): super().__init__( channel, test_pb2_grpc.XdsUpdateClientConfigureServiceStub, @@ -200,9 +196,9 @@ def configure( self, *, rpc_types: Sequence[str], - metadata: Optional[ConfigureMetadata] = None, - app_timeout: Optional[int] = None, - timeout_sec: Optional[int] = CONFIGURE_TIMEOUT_SEC, + metadata: ConfigureMetadata | None = None, + app_timeout: int | None = None, + timeout_sec: int | None = CONFIGURE_TIMEOUT_SEC, ) -> None: request = messages_pb2.ClientConfigureRequest() for rpc_type in rpc_types: @@ -236,9 +232,9 @@ def configure( def configure_unary( self, *, - metadata: Optional[ConfigureMetadata] = None, - app_timeout: Optional[int] = None, - timeout_sec: Optional[int] = CONFIGURE_TIMEOUT_SEC, + metadata: ConfigureMetadata | None = None, + app_timeout: int | None = None, + timeout_sec: int | None = CONFIGURE_TIMEOUT_SEC, ) -> None: self.configure( rpc_types=(RPC_TYPE_UNARY_CALL,), @@ -250,9 +246,9 @@ def configure_unary( def configure_empty( self, *, - metadata: Optional[ConfigureMetadata] = None, - app_timeout: Optional[int] = None, - timeout_sec: Optional[int] = CONFIGURE_TIMEOUT_SEC, + metadata: ConfigureMetadata | None = None, + app_timeout: int | None = None, + timeout_sec: int | None = CONFIGURE_TIMEOUT_SEC, ) -> None: self.configure( rpc_types=(RPC_TYPE_EMPTY_CALL,), @@ -265,7 +261,7 @@ def configure_empty( class XdsUpdateHealthServiceClient(framework.rpc.grpc.GrpcClientHelper): stub: test_pb2_grpc.XdsUpdateHealthServiceStub - def __init__(self, channel: grpc.Channel, log_target: Optional[str] = ""): + def __init__(self, channel: grpc.Channel, log_target: str | None = ""): super().__init__( channel, test_pb2_grpc.XdsUpdateHealthServiceStub, @@ -289,7 +285,7 @@ class HookServiceClient(framework.rpc.grpc.GrpcClientHelper): # Override the default deadline: all requests expected to be short. DEFAULT_RPC_DEADLINE: Final[dt.timedelta] = dt.timedelta(seconds=10) - def __init__(self, channel: grpc.Channel, log_target: Optional[str] = ""): + def __init__(self, channel: grpc.Channel, log_target: str | None = ""): super().__init__(channel, self.STUB_CLASS, log_target=log_target) def set_return_status( @@ -321,7 +317,7 @@ def clear_return_status( class HealthClient(framework.rpc.grpc.GrpcClientHelper): stub: health_pb2_grpc.HealthStub - def __init__(self, channel: grpc.Channel, log_target: Optional[str] = ""): + def __init__(self, channel: grpc.Channel, log_target: str | None = ""): super().__init__( channel, health_pb2_grpc.HealthStub, log_target=log_target ) diff --git a/framework/test_app/client_app.py b/framework/test_app/client_app.py index 7af242ff..0e8e35f8 100644 --- a/framework/test_app/client_app.py +++ b/framework/test_app/client_app.py @@ -65,9 +65,9 @@ def __init__( rpc_port: int, server_target: str, hostname: str, - rpc_host: Optional[str] = None, - maintenance_port: Optional[int] = None, - monitoring_port: Optional[int] = None, + rpc_host: str | None = None, + maintenance_port: int | None = None, + monitoring_port: int | None = None, ): super().__init__(rpc_host=(rpc_host or ip)) self.ip = ip @@ -109,7 +109,7 @@ def csds(self) -> _CsdsClient: log_target=f"{self.hostname}:{self.maintenance_port}", ) - def get_csds_parsed(self, **kwargs) -> Optional[grpc_csds.DumpedXdsConfig]: + def get_csds_parsed(self, **kwargs) -> grpc_csds.DumpedXdsConfig | None: return self.csds.fetch_client_status_parsed(**kwargs) def get_load_balancer_stats( @@ -117,7 +117,7 @@ def get_load_balancer_stats( *, num_rpcs: int, metadata_keys: Optional[tuple[str, ...]] = None, - timeout_sec: Optional[int] = None, + timeout_sec: int | None = None, ) -> grpc_testing.LoadBalancerStatsResponse: """ Shortcut to LoadBalancerStatsServiceClient.get_client_stats() @@ -131,7 +131,7 @@ def get_load_balancer_stats( def get_load_balancer_accumulated_stats( self, *, - timeout_sec: Optional[int] = None, + timeout_sec: int | None = None, ) -> grpc_testing.LoadBalancerAccumulatedStatsResponse: """Shortcut to LoadBalancerStatsServiceClient.get_client_accumulated_stats()""" return self.load_balancer_stats.get_client_accumulated_stats( @@ -141,8 +141,8 @@ def get_load_balancer_accumulated_stats( def wait_for_server_channel_ready( self, *, - timeout: Optional[_timedelta] = None, - rpc_deadline: Optional[_timedelta] = None, + timeout: _timedelta | None = None, + rpc_deadline: _timedelta | None = None, ) -> _ChannelzChannel: """Wait for the channel to the server to transition to READY. @@ -169,9 +169,9 @@ def wait_for_server_channel_ready( def wait_for_active_xds_channel( self, *, - xds_server_uri: Optional[str] = None, - timeout: Optional[_timedelta] = None, - rpc_deadline: Optional[_timedelta] = None, + xds_server_uri: str | None = None, + timeout: _timedelta | None = None, + rpc_deadline: _timedelta | None = None, ) -> _ChannelzChannel: """Wait until the xds channel is active or timeout. @@ -236,8 +236,8 @@ def wait_for_server_channel_state( self, state: _ChannelzChannelState, *, - timeout: Optional[_timedelta] = None, - rpc_deadline: Optional[_timedelta] = None, + timeout: _timedelta | None = None, + rpc_deadline: _timedelta | None = None, ) -> _ChannelzChannel: # When polling for a state, prefer smaller wait times to avoid # exhausting all allowed time on a single long RPC. @@ -274,9 +274,9 @@ def wait_for_server_channel_state( def wait_for_xds_channel_active( self, *, - xds_server_uri: Optional[str] = None, - timeout: Optional[_timedelta] = None, - rpc_deadline: Optional[_timedelta] = None, + xds_server_uri: str | None = None, + timeout: _timedelta | None = None, + rpc_deadline: _timedelta | None = None, ) -> _ChannelzChannel: if not xds_server_uri: xds_server_uri = DEFAULT_TD_XDS_URI @@ -312,7 +312,7 @@ def find_active_xds_channel( self, xds_server_uri: str, *, - rpc_deadline: Optional[_timedelta] = None, + rpc_deadline: _timedelta | None = None, ) -> _ChannelzChannel: rpc_params = {} if rpc_deadline is not None: @@ -366,7 +366,7 @@ def find_server_channel_with_state( self, expected_state: _ChannelzChannelState, *, - rpc_deadline: Optional[_timedelta] = None, + rpc_deadline: _timedelta | None = None, check_subchannel=True, ) -> _ChannelzChannel: rpc_params = {} @@ -450,9 +450,9 @@ def check_channel_in_flight_calls( self, channel: _ChannelzChannel, *, - wait_between_checks: Optional[_timedelta] = None, + wait_between_checks: _timedelta | None = None, **rpc_params, - ) -> Optional[_ChannelzChannel]: + ) -> _ChannelzChannel | None: """Checks if the channel has calls that started, but didn't complete. We consider the channel is active if channel is in READY state and diff --git a/framework/test_app/runners/base_runner.py b/framework/test_app/runners/base_runner.py index 24d470e2..5fffb898 100644 --- a/framework/test_app/runners/base_runner.py +++ b/framework/test_app/runners/base_runner.py @@ -36,8 +36,8 @@ class RunnerError(Exception): class BaseRunner(metaclass=ABCMeta): - _logs_subdir: Optional[pathlib.Path] = None - _log_stop_event: Optional[threading.Event] = None + _logs_subdir: pathlib.Path | None = None + _log_stop_event: threading.Event | None = None def __init__(self): if xds_flags.COLLECT_APP_LOGS.value: diff --git a/framework/test_app/runners/k8s/gamma_server_runner.py b/framework/test_app/runners/k8s/gamma_server_runner.py index 4971a476..2e84b2e5 100644 --- a/framework/test_app/runners/k8s/gamma_server_runner.py +++ b/framework/test_app/runners/k8s/gamma_server_runner.py @@ -41,11 +41,11 @@ class ServerDeploymentArgs(k8s_xds_server_runner.ServerDeploymentArgs): class GammaServerRunner(KubernetesServerRunner): # Mutable state. - route: Optional[k8s.GammaHttpRoute] = None - frontend_service: Optional[k8s.V1Service] = None - session_affinity_filter: Optional[k8s.GcpSessionAffinityFilter] = None - session_affinity_policy: Optional[k8s.GcpSessionAffinityPolicy] = None - backend_policy: Optional[k8s.GcpBackendPolicy] = None + route: k8s.GammaHttpRoute | None = None + frontend_service: k8s.V1Service | None = None + session_affinity_filter: k8s.GcpSessionAffinityFilter | None = None + session_affinity_policy: k8s.GcpSessionAffinityPolicy | None = None + backend_policy: k8s.GcpBackendPolicy | None = None route_kind: Final[RouteKind] route_name: Final[str] @@ -65,23 +65,23 @@ def __init__( td_bootstrap_image: str, app_label: str = "", network: str = "default", - xds_server_uri: Optional[str] = None, + xds_server_uri: str | None = None, gcp_api_manager: gcp.api.GcpApiManager, gcp_project: str, gcp_service_account: str, - service_account_name: Optional[str] = None, - service_name: Optional[str] = None, + service_account_name: str | None = None, + service_name: str | None = None, route_kind: k8s.RouteKind = k8s.RouteKind.HTTP, - neg_name: Optional[str] = None, + neg_name: str | None = None, deployment_template: str = "server.deployment.yaml", service_account_template: str = "service-account.yaml", service_template: str = "gamma/service.yaml", reuse_service: bool = False, reuse_namespace: bool = False, - namespace_template: Optional[str] = None, + namespace_template: str | None = None, debug_use_port_forwarding: bool = False, enable_workload_identity: bool = True, - deployment_args: Optional[ServerDeploymentArgs] = None, + deployment_args: ServerDeploymentArgs | None = None, ): # pylint: disable=too-many-locals super().__init__( @@ -118,11 +118,11 @@ def run( # pylint: disable=arguments-differ self, *, test_port: int = KubernetesServerRunner.DEFAULT_TEST_PORT, - maintenance_port: Optional[int] = None, + maintenance_port: int | None = None, secure_mode: bool = False, replica_count: int = 1, log_to_stdout: bool = False, - bootstrap_version: Optional[str] = None, + bootstrap_version: str | None = None, route_template: str = "gamma/route_http.yaml", generate_mesh_id: bool = False, ) -> list[XdsTestServer]: @@ -266,7 +266,7 @@ def create_session_affinity_filter(self): def create_backend_policy( self, *, - draining_timeout: Optional[datetime.timedelta] = None, + draining_timeout: datetime.timedelta | None = None, ): draining_timeout_sec: int = 0 if draining_timeout: diff --git a/framework/test_app/runners/k8s/k8s_base_runner.py b/framework/test_app/runners/k8s/k8s_base_runner.py index bcdd2035..a2bc09d7 100644 --- a/framework/test_app/runners/k8s/k8s_base_runner.py +++ b/framework/test_app/runners/k8s/k8s_base_runner.py @@ -54,7 +54,7 @@ class RunHistory: deployment_id: str time_start_requested: _datetime - time_start_completed: Optional[_datetime] + time_start_completed: _datetime | None time_stopped: _datetime @@ -100,10 +100,10 @@ class KubernetesBaseRunner(base_runner.BaseRunner, metaclass=ABCMeta): run_history: collections.deque[RunHistory] # Below is mutable state associated with the current run. - namespace: Optional[k8s.V1Namespace] = None - deployment: Optional[k8s.V1Deployment] = None - deployment_id: Optional[str] = None - service_account: Optional[k8s.V1ServiceAccount] = None + namespace: k8s.V1Namespace | None = None + deployment: k8s.V1Deployment | None = None + deployment_id: str | None = None + service_account: k8s.V1ServiceAccount | None = None # A map of pod names to pod objects as they were at the moment # of deployment creation. @@ -129,9 +129,9 @@ class KubernetesBaseRunner(base_runner.BaseRunner, metaclass=ABCMeta): pod_log_collectors: list[k8s.PodLogCollector] # Current run metadata. - time_start_requested: Optional[_datetime] = None - time_start_completed: Optional[_datetime] = None - time_stopped: Optional[_datetime] = None + time_start_requested: _datetime | None = None + time_start_completed: _datetime | None = None + time_stopped: _datetime | None = None def __init__( self, @@ -143,7 +143,7 @@ def __init__( gcp_service_account: str, gcp_ui_url: str, app_label: str = "", - namespace_template: Optional[str] = "namespace.yaml", + namespace_template: str | None = "namespace.yaml", reuse_namespace: bool = False, ): super().__init__() @@ -520,7 +520,7 @@ def delete_pod( self, name: str, *, - grace_period: Optional[dt.timedelta] = None, + grace_period: dt.timedelta | None = None, ignore_errors: bool = True, wait_for_deletion: bool = True, ) -> bool: @@ -1133,10 +1133,10 @@ def _logs_explorer_link( namespace_name: str, gcp_project: str, gcp_ui_url: str, - deployment_id: Optional[str] = None, - start_time: Optional[_datetime] = None, - end_time: Optional[_datetime] = None, - cursor_time: Optional[_datetime] = None, + deployment_id: str | None = None, + start_time: _datetime | None = None, + end_time: _datetime | None = None, + cursor_time: _datetime | None = None, ): """Output the link to test server/client logs in GCP Logs Explorer.""" if not start_time: diff --git a/framework/test_app/runners/k8s/k8s_xds_client_runner.py b/framework/test_app/runners/k8s/k8s_xds_client_runner.py index b1f4e142..9ce15db1 100644 --- a/framework/test_app/runners/k8s/k8s_xds_client_runner.py +++ b/framework/test_app/runners/k8s/k8s_xds_client_runner.py @@ -51,11 +51,11 @@ class KubernetesClientRunner(k8s_base_runner.KubernetesBaseRunner): deployment_args: ClientDeploymentArgs # Optional fields. - service_account_name: Optional[str] = None - service_account_template: Optional[str] = None - gcp_iam: Optional[gcp.iam.IamV1] = None - pod_monitoring: Optional[k8s.PodMonitoring] = None - pod_monitoring_name: Optional[str] = None + service_account_name: str | None = None + service_account_template: str | None = None + gcp_iam: gcp.iam.IamV1 | None = None + pod_monitoring: k8s.PodMonitoring | None = None + pod_monitoring_name: str | None = None def __init__( # pylint: disable=too-many-locals self, @@ -66,19 +66,19 @@ def __init__( # pylint: disable=too-many-locals td_bootstrap_image: str, app_label: str = "", network="default", - xds_server_uri: Optional[str] = None, + xds_server_uri: str | None = None, gcp_api_manager: gcp.api.GcpApiManager, gcp_project: str, gcp_service_account: str, - service_account_name: Optional[str] = None, + service_account_name: str | None = None, stats_port: int = 8079, deployment_template: str = "client.deployment.yaml", service_account_template: str = "service-account.yaml", reuse_namespace: bool = False, - namespace_template: Optional[str] = None, + namespace_template: str | None = None, debug_use_port_forwarding: bool = False, enable_workload_identity: bool = True, - deployment_args: Optional[ClientDeploymentArgs] = None, + deployment_args: ClientDeploymentArgs | None = None, ): super().__init__( k8s_namespace, diff --git a/framework/test_app/runners/k8s/k8s_xds_server_runner.py b/framework/test_app/runners/k8s/k8s_xds_server_runner.py index 9b492d6e..1860612b 100644 --- a/framework/test_app/runners/k8s/k8s_xds_server_runner.py +++ b/framework/test_app/runners/k8s/k8s_xds_server_runner.py @@ -73,15 +73,15 @@ class KubernetesServerRunner(k8s_base_runner.KubernetesBaseRunner): deployment_args: ServerDeploymentArgs # Optional fields. - service_account_name: Optional[str] = None - service_account_template: Optional[str] = None - gcp_iam: Optional[gcp.iam.IamV1] = None + service_account_name: str | None = None + service_account_template: str | None = None + gcp_iam: gcp.iam.IamV1 | None = None # Below is mutable state associated with the current run. - service: Optional[k8s.V1Service] = None + service: k8s.V1Service | None = None replica_count: int = 0 - pod_monitoring: Optional[k8s.PodMonitoring] = None - pod_monitoring_name: Optional[str] = None + pod_monitoring: k8s.PodMonitoring | None = None + pod_monitoring_name: str | None = None # A map from pod names to the server app. pods_to_servers: dict[str, XdsTestServer] @@ -95,22 +95,22 @@ def __init__( # pylint: disable=too-many-locals td_bootstrap_image: str, app_label: str = "", network: str = "default", - xds_server_uri: Optional[str] = None, + xds_server_uri: str | None = None, gcp_api_manager: gcp.api.GcpApiManager, gcp_project: str, gcp_service_account: str, - service_account_name: Optional[str] = None, - service_name: Optional[str] = None, - neg_name: Optional[str] = None, + service_account_name: str | None = None, + service_name: str | None = None, + neg_name: str | None = None, deployment_template: str = "server.deployment.yaml", service_account_template: str = "service-account.yaml", service_template: str = "server.service.yaml", reuse_service: bool = False, reuse_namespace: bool = False, - namespace_template: Optional[str] = None, + namespace_template: str | None = None, debug_use_port_forwarding: bool = False, enable_workload_identity: bool = True, - deployment_args: Optional[ServerDeploymentArgs] = None, + deployment_args: ServerDeploymentArgs | None = None, ): super().__init__( k8s_namespace, @@ -170,12 +170,12 @@ def run( # pylint: disable=arguments-differ,too-many-branches self, *, test_port: int = DEFAULT_TEST_PORT, - maintenance_port: Optional[int] = None, + maintenance_port: int | None = None, secure_mode: bool = False, address_type: str = "", replica_count: int = 1, log_to_stdout: bool = False, - bootstrap_version: Optional[str] = None, + bootstrap_version: str | None = None, ) -> List[XdsTestServer]: if not maintenance_port: maintenance_port = self._get_default_maintenance_port(secure_mode) @@ -338,9 +338,9 @@ def _xds_test_server_for_pod( pod: k8s.V1Pod, *, test_port: int = DEFAULT_TEST_PORT, - maintenance_port: Optional[int] = None, + maintenance_port: int | None = None, secure_mode: bool = False, - monitoring_port: Optional[int] = None, + monitoring_port: int | None = None, ) -> XdsTestServer: if maintenance_port is None: maintenance_port = self._get_default_maintenance_port(secure_mode) diff --git a/framework/test_app/server_app.py b/framework/test_app/server_app.py index 1bde8143..e9d2bd70 100644 --- a/framework/test_app/server_app.py +++ b/framework/test_app/server_app.py @@ -47,12 +47,12 @@ def __init__( ip: str, rpc_port: int, hostname: str, - maintenance_port: Optional[int] = None, - secure_mode: Optional[bool] = False, - xds_host: Optional[str] = None, - xds_port: Optional[int] = None, - rpc_host: Optional[str] = None, - monitoring_port: Optional[str] = None, + maintenance_port: int | None = None, + secure_mode: bool | None = False, + xds_host: str | None = None, + xds_port: int | None = None, + rpc_host: str | None = None, + monitoring_port: str | None = None, ): super().__init__(rpc_host=(rpc_host or ip)) self.ip = ip @@ -127,7 +127,7 @@ def release_prestop_hook(self, **kwargs): ) self.hook_service_client.set_return_status(**kwargs) - def set_xds_address(self, xds_host, xds_port: Optional[int] = None): + def set_xds_address(self, xds_host, xds_port: int | None = None): self.xds_host, self.xds_port = xds_host, xds_port @property diff --git a/framework/test_cases/base_testcase.py b/framework/test_cases/base_testcase.py index 389bb1f8..d96e5169 100644 --- a/framework/test_cases/base_testcase.py +++ b/framework/test_cases/base_testcase.py @@ -23,7 +23,7 @@ class BaseTestCase(absltest.TestCase): # @override - def run(self, result: Optional[unittest.TestResult] = None) -> None: + def run(self, result: unittest.TestResult | None = None) -> None: super().run(result) # TODO(sergiitk): should this method be returning result? See # super().run and xds_k8s_testcase.XdsKubernetesBaseTestCase.subTest diff --git a/framework/xds_k8s_testcase.py b/framework/xds_k8s_testcase.py index c302af89..263214ce 100644 --- a/framework/xds_k8s_testcase.py +++ b/framework/xds_k8s_testcase.py @@ -82,7 +82,7 @@ MetadataByPeer: list[str, RpcMetadata] # pylint complains about signal.Signals for some reason. _SignalNum = Union[int, signal.Signals] # pylint: disable=no-member -_SignalHandler = Callable[[_SignalNum, Optional[FrameType]], Any] +_SignalHandler = Callable[[_SignalNum, FrameType | None], Any] TD_CONFIG_MAX_WAIT: Final[dt.timedelta] = dt.timedelta(minutes=10) # TODO(sergiitk): get rid of the seconds constant, use timedelta @@ -127,9 +127,9 @@ class XdsKubernetesBaseTestCase(base_testcase.BaseTestCase): firewall_source_range_ipv6: str = "" force_cleanup: bool gcp_api_manager: gcp.api.GcpApiManager - gcp_service_account: Optional[str] + gcp_service_account: str | None k8s_api_manager: k8s.KubernetesApiManager - secondary_k8s_api_manager: Optional[k8s.KubernetesApiManager] = None + secondary_k8s_api_manager: k8s.KubernetesApiManager | None = None network: str project: str resource_prefix: str @@ -137,14 +137,14 @@ class XdsKubernetesBaseTestCase(base_testcase.BaseTestCase): # Whether to randomize resources names for each test by appending a # unique suffix. resource_suffix_randomize: bool = True - server_maintenance_port: Optional[int] + server_maintenance_port: int | None server_namespace: str server_runner: KubernetesServerRunner server_xds_host: str - server_xds_port: Optional[int] + server_xds_port: int | None td: TrafficDirectorManager td_bootstrap_image: str - _prev_sigint_handler: Optional[_SignalHandler] = None + _prev_sigint_handler: _SignalHandler | None = None _handling_sigint: bool = False yaml_highlighter: framework.helpers.highlighter.HighlighterYaml = None enable_dualstack: bool = False @@ -275,7 +275,7 @@ def setUp(self): ) def handle_sigint( - self, signalnum: _SignalNum, frame: Optional[FrameType] + self, signalnum: _SignalNum, frame: FrameType | None ) -> None: # TODO(sergiitk): move to base_testcase.BaseTestCase if self._handling_sigint: @@ -329,7 +329,7 @@ def setupServerBackends( *, wait_for_healthy_status=True, server_runner=None, - max_rate_per_endpoint: Optional[int] = None, + max_rate_per_endpoint: int | None = None, ): if server_runner is None: server_runner = self.server_runner @@ -659,7 +659,7 @@ def assertDrainingEndpointsCount( ) def assertFailedRpcs( - self, test_client: XdsTestClient, num_rpcs: Optional[int] = 100 + self, test_client: XdsTestClient, num_rpcs: int | None = 100 ): lb_stats = self.getClientRpcStats(test_client, num_rpcs) failed = int(lb_stats.num_failures) @@ -908,8 +908,8 @@ def _start_test_client( *, wait_for_active_ads: bool = True, wait_for_server_channel_ready: bool = True, - wait_for_active_ads_timeout: Optional[_timedelta] = None, - wait_for_server_channel_ready_timeout: Optional[_timedelta] = None, + wait_for_active_ads_timeout: _timedelta | None = None, + wait_for_server_channel_ready_timeout: _timedelta | None = None, **kwargs, ) -> XdsTestClient: test_client = self.client_runner.run( @@ -1301,8 +1301,8 @@ def assertClientCannotReachServerRepeatedly( self, test_client: XdsTestClient, *, - times: Optional[int] = None, - delay: Optional[_timedelta] = None, + times: int | None = None, + delay: _timedelta | None = None, ): """ Asserts that the client repeatedly cannot reach the server. diff --git a/framework/xds_url_map_testcase.py b/framework/xds_url_map_testcase.py index 89818f0c..ce2a3f95 100644 --- a/framework/xds_url_map_testcase.py +++ b/framework/xds_url_map_testcase.py @@ -126,7 +126,7 @@ class XdsUrlMapTestCase( - rpc_distribution_validate: Validates if the routing behavior is correct """ - test_client_runner: Optional[_KubernetesClientRunner] = None + test_client_runner: _KubernetesClientRunner | None = None @staticmethod def is_supported(config: skips.TestConfig) -> bool: @@ -363,8 +363,8 @@ def configure_and_send( test_client: XdsTestClient, *, rpc_types: Sequence[str], - metadata: Optional[grpc_testing.ConfigureMetadata] = None, - app_timeout: Optional[int] = None, + metadata: grpc_testing.ConfigureMetadata | None = None, + app_timeout: int | None = None, num_rpcs: int, ) -> grpc_testing.RpcDistributionStats: test_client.update_config.configure( diff --git a/tests/authz_test.py b/tests/authz_test.py index e13ef1da..a227fd31 100644 --- a/tests/authz_test.py +++ b/tests/authz_test.py @@ -61,7 +61,7 @@ def is_supported(config: skips.TestConfig) -> bool: def setUp(self): super().setUp() - self.next_rpc_type: Optional[int] = None + self.next_rpc_type: int | None = None def authz_rules(self): return [ @@ -193,7 +193,7 @@ def authz_rules(self): def configure_and_assert( self, test_client: _XdsTestClient, - test_metadata_val: Optional[str], + test_metadata_val: str | None, status_code: grpc.StatusCode, ) -> None: # Swap method type every sub-test to avoid mixing results diff --git a/tests/unit/helpers/skips_test.py b/tests/unit/helpers/skips_test.py index 7c297c8b..1175e395 100644 --- a/tests/unit/helpers/skips_test.py +++ b/tests/unit/helpers/skips_test.py @@ -192,7 +192,7 @@ def test_special_case_left_dev_prefix_ignored( *INVALID_VERSIONS, *VALID_DEV_VERSIONS, ) - def test_right_invalid_version(self, version_right: Optional[str]): + def test_right_invalid_version(self, version_right: str | None): """ Verifies that invalid versions on the right raise InvalidVersion. @@ -204,7 +204,7 @@ def test_right_invalid_version(self, version_right: Optional[str]): test_config.version_gte(version_right) @parameterized.parameters(*INVALID_VERSIONS) - def test_left_invalid_version(self, version_left: Optional[str]): + def test_left_invalid_version(self, version_left: str | None): """ Verifies that invalid versions on the left raise InvalidVersion. """ @@ -217,7 +217,7 @@ def test_left_invalid_version(self, version_left: Optional[str]): *VALID_DEV_VERSIONS, None, ) - def test_left_valid_version(self, version_left: Optional[str]): + def test_left_valid_version(self, version_left: str | None): """ Verifies that valid versions on the left don't raise InvalidVersion. """ @@ -230,7 +230,7 @@ def test_left_valid_version(self, version_left: Optional[str]): ) @parameterized.parameters(*VALID_VERSIONS) - def test_right_valid_version(self, version_right: Optional[str]): + def test_right_valid_version(self, version_right: str | None): """ Verifies that valid versions on the right don't raise InvalidVersion. """ From bf8de5e9333c954fbb4110fbe03a605bf41dad74 Mon Sep 17 00:00:00 2001 From: Sergii Tkachenko Date: Wed, 9 Oct 2024 13:13:54 -0700 Subject: [PATCH 2/3] Replace Optional: part 1, nested types --- framework/infrastructure/gcp/compute.py | 4 ++-- framework/infrastructure/gcp/network_services.py | 6 +++--- framework/infrastructure/traffic_director.py | 6 +++--- framework/rpc/grpc_testing.py | 2 +- framework/test_app/client_app.py | 2 +- framework/test_app/runners/base_runner.py | 2 +- framework/xds_k8s_testcase.py | 2 +- tests/app_net_ssa_test.py | 2 +- tests/gamma/affinity_session_drain_test.py | 2 +- tests/gamma/affinity_test.py | 2 +- 10 files changed, 15 insertions(+), 15 deletions(-) diff --git a/framework/infrastructure/gcp/compute.py b/framework/infrastructure/gcp/compute.py index ff61d115..aa713441 100644 --- a/framework/infrastructure/gcp/compute.py +++ b/framework/infrastructure/gcp/compute.py @@ -149,7 +149,7 @@ def create_backend_service_traffic_director( affinity_header: str | None = None, protocol: BackendServiceProtocol | None = None, subset_size: int | None = None, - locality_lb_policies: Optional[List[dict]] = None, + locality_lb_policies: List[dict] | None = None, outlier_detection: dict | None = None, enable_dualstack: bool = False, ) -> "GcpResource": @@ -203,7 +203,7 @@ def backend_service_patch_backends( backends, max_rate_per_endpoint: int | None = None, *, - circuit_breakers: Optional[dict[str, int]] = None, + circuit_breakers: dict[str, int] | None = None, ): if max_rate_per_endpoint is None: max_rate_per_endpoint = 5 diff --git a/framework/infrastructure/gcp/network_services.py b/framework/infrastructure/gcp/network_services.py index 975002cb..e142f52c 100644 --- a/framework/infrastructure/gcp/network_services.py +++ b/framework/infrastructure/gcp/network_services.py @@ -61,7 +61,7 @@ def from_response( class Mesh: name: str url: str - routes: Optional[List[str]] + routes: List[str] | None @classmethod def from_response(cls, name: str, d: Dict[str, Any]) -> "Mesh": @@ -169,7 +169,7 @@ def from_response(cls, d: Dict[str, Any]) -> "GrpcRoute.RouteRule": url: str hostnames: Tuple[str] rules: Tuple["GrpcRoute.RouteRule"] - meshes: Optional[Tuple[str]] + meshes: Tuple[str] | None @classmethod def from_response( @@ -304,7 +304,7 @@ def from_response(cls, d: Dict[str, Any]) -> "HttpRoute.RouteRule": url: str hostnames: Tuple[str] rules: Tuple["HttpRoute.RouteRule"] - meshes: Optional[Tuple[str]] + meshes: Tuple[str] | None @classmethod def from_response(cls, name: str, d: Dict[str, Any]) -> "HttpRoute": diff --git a/framework/infrastructure/traffic_director.py b/framework/infrastructure/traffic_director.py index da519a61..271dafd2 100644 --- a/framework/infrastructure/traffic_director.py +++ b/framework/infrastructure/traffic_director.py @@ -243,7 +243,7 @@ def create_backend_service( protocol: BackendServiceProtocol | None = _BackendGRPC, subset_size: int | None = None, affinity_header: str | None = None, - locality_lb_policies: Optional[List[dict]] = None, + locality_lb_policies: List[dict] | None = None, outlier_detection: dict | None = None, ): if protocol is None: @@ -310,7 +310,7 @@ def backend_service_patch_backends( self, max_rate_per_endpoint: int | None = None, *, - circuit_breakers: Optional[dict[str, int]] = None, + circuit_breakers: dict[str, int] | None = None, ): logging.info( "Adding backends to Backend Service %s: %r", @@ -384,7 +384,7 @@ def alternative_backend_service_add_neg_backends(self, name, zones): self.alternative_backend_service_patch_backends() def alternative_backend_service_patch_backends( - self, *, circuit_breakers: Optional[dict[str, int]] = None + self, *, circuit_breakers: dict[str, int] | None = None ): logging.info( "Adding backends to Alternative Backend Service %s: %r", diff --git a/framework/rpc/grpc_testing.py b/framework/rpc/grpc_testing.py index b3c87ee2..ce47bfbe 100644 --- a/framework/rpc/grpc_testing.py +++ b/framework/rpc/grpc_testing.py @@ -147,7 +147,7 @@ def get_client_stats( *, num_rpcs: int, timeout_sec: int | None = STATS_PARTIAL_RESULTS_TIMEOUT_SEC, - metadata_keys: Optional[tuple[str, ...]] = None, + metadata_keys: tuple[str, ...] | None = None, ) -> LoadBalancerStatsResponse: if timeout_sec is None: timeout_sec = self.STATS_PARTIAL_RESULTS_TIMEOUT_SEC diff --git a/framework/test_app/client_app.py b/framework/test_app/client_app.py index 0e8e35f8..0c6dded0 100644 --- a/framework/test_app/client_app.py +++ b/framework/test_app/client_app.py @@ -116,7 +116,7 @@ def get_load_balancer_stats( self, *, num_rpcs: int, - metadata_keys: Optional[tuple[str, ...]] = None, + metadata_keys: tuple[str, ...] | None = None, timeout_sec: int | None = None, ) -> grpc_testing.LoadBalancerStatsResponse: """ diff --git a/framework/test_app/runners/base_runner.py b/framework/test_app/runners/base_runner.py index 5fffb898..c66695f4 100644 --- a/framework/test_app/runners/base_runner.py +++ b/framework/test_app/runners/base_runner.py @@ -86,7 +86,7 @@ def _logs_explorer_link_from_params( gcp_ui_url: str, gcp_project: str, query: Dict[str, str], - request: Optional[Dict[str, str]] = None, + request: Dict[str, str] | None = None, ) -> str: req_merged = {"query": cls._logs_explorer_query(query)} if request is not None: diff --git a/framework/xds_k8s_testcase.py b/framework/xds_k8s_testcase.py index 263214ce..6bee3ff7 100644 --- a/framework/xds_k8s_testcase.py +++ b/framework/xds_k8s_testcase.py @@ -674,7 +674,7 @@ def getClientRpcStats( test_client: XdsTestClient, num_rpcs: int, *, - metadata_keys: Optional[tuple[str, ...]] = None, + metadata_keys: tuple[str, ...] | None = None, ) -> _LoadBalancerStatsResponse: lb_stats = test_client.get_load_balancer_stats( num_rpcs=num_rpcs, diff --git a/tests/app_net_ssa_test.py b/tests/app_net_ssa_test.py index 3e1a2f8b..98f3f7d7 100644 --- a/tests/app_net_ssa_test.py +++ b/tests/app_net_ssa_test.py @@ -49,7 +49,7 @@ def getClientRpcStats( test_client: _XdsTestClient, num_rpcs: int, *, - metadata_keys: Optional[tuple[str, ...]] = None, + metadata_keys: tuple[str, ...] | None = None, ) -> grpc_testing.LoadBalancerStatsResponse: """Load all metadata_keys by default.""" return super().getClientRpcStats( diff --git a/tests/gamma/affinity_session_drain_test.py b/tests/gamma/affinity_session_drain_test.py index da0eb8f8..0f1f88ed 100644 --- a/tests/gamma/affinity_session_drain_test.py +++ b/tests/gamma/affinity_session_drain_test.py @@ -85,7 +85,7 @@ def getClientRpcStats( test_client: client_app.XdsTestClient, num_rpcs: int, *, - metadata_keys: Optional[tuple[str, ...]] = None, + metadata_keys: tuple[str, ...] | None = None, ) -> grpc_testing.LoadBalancerStatsResponse: """Load all metadata_keys by default.""" if not metadata_keys: diff --git a/tests/gamma/affinity_test.py b/tests/gamma/affinity_test.py index 16b44ee3..4caf37d5 100644 --- a/tests/gamma/affinity_test.py +++ b/tests/gamma/affinity_test.py @@ -50,7 +50,7 @@ def getClientRpcStats( test_client: _XdsTestClient, num_rpcs: int, *, - metadata_keys: Optional[tuple[str, ...]] = None, + metadata_keys: tuple[str, ...] | None = None, ) -> grpc_testing.LoadBalancerStatsResponse: """Load all metadata_keys by default.""" return super().getClientRpcStats( From 0619591383b153090036cf2b28424e38db171b81 Mon Sep 17 00:00:00 2001 From: Sergii Tkachenko Date: Wed, 9 Oct 2024 13:15:29 -0700 Subject: [PATCH 3/3] Remove Optional from imports --- bin/cleanup/cleanup.py | 2 +- framework/bootstrap_generator_testcase.py | 1 - framework/helpers/datetime.py | 2 +- framework/helpers/grpc.py | 1 - framework/helpers/highlighter.py | 1 - framework/helpers/retryers.py | 2 +- framework/helpers/skips.py | 1 - framework/infrastructure/gcp/api.py | 2 +- framework/infrastructure/gcp/compute.py | 2 +- framework/infrastructure/gcp/iam.py | 2 +- framework/infrastructure/gcp/network_services.py | 2 +- framework/infrastructure/k8s.py | 2 +- framework/infrastructure/k8s_internal/k8s_log_collector.py | 2 +- framework/infrastructure/k8s_internal/k8s_port_forwarder.py | 1 - framework/infrastructure/traffic_director.py | 2 +- framework/rpc/grpc.py | 2 +- framework/rpc/grpc_channelz.py | 2 +- framework/rpc/grpc_csds.py | 2 +- framework/rpc/grpc_testing.py | 2 +- framework/test_app/client_app.py | 2 +- framework/test_app/runners/base_runner.py | 2 +- framework/test_app/runners/k8s/gamma_server_runner.py | 2 +- framework/test_app/runners/k8s/k8s_base_runner.py | 2 +- framework/test_app/runners/k8s/k8s_xds_client_runner.py | 1 - framework/test_app/runners/k8s/k8s_xds_server_runner.py | 2 +- framework/test_app/server_app.py | 2 +- framework/test_cases/base_testcase.py | 2 +- framework/xds_k8s_testcase.py | 2 +- framework/xds_url_map_testcase.py | 2 +- tests/app_net_ssa_test.py | 2 +- tests/authz_test.py | 1 - tests/gamma/affinity_session_drain_test.py | 2 +- tests/gamma/affinity_test.py | 2 +- tests/unit/helpers/skips_test.py | 1 - tests/unit/test_app/client_app_test.py | 1 - tests/unit/test_app/server_app_test.py | 1 - 36 files changed, 26 insertions(+), 36 deletions(-) diff --git a/bin/cleanup/cleanup.py b/bin/cleanup/cleanup.py index c719d54f..2b6dbe07 100644 --- a/bin/cleanup/cleanup.py +++ b/bin/cleanup/cleanup.py @@ -31,7 +31,7 @@ import re import subprocess import sys -from typing import Any, Callable, List, Optional +from typing import Any, Callable, List from absl import app from absl import flags diff --git a/framework/bootstrap_generator_testcase.py b/framework/bootstrap_generator_testcase.py index 9ac8a69c..d9aa947e 100644 --- a/framework/bootstrap_generator_testcase.py +++ b/framework/bootstrap_generator_testcase.py @@ -12,7 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. import logging -from typing import Optional from typing_extensions import override diff --git a/framework/helpers/datetime.py b/framework/helpers/datetime.py index ebddf2e1..832ec10d 100644 --- a/framework/helpers/datetime.py +++ b/framework/helpers/datetime.py @@ -14,7 +14,7 @@ """This contains common helpers for working with dates and time.""" import datetime import re -from typing import Optional, Pattern +from typing import Pattern import dateutil.parser diff --git a/framework/helpers/grpc.py b/framework/helpers/grpc.py index c34c9c3e..d2801409 100644 --- a/framework/helpers/grpc.py +++ b/framework/helpers/grpc.py @@ -15,7 +15,6 @@ import collections import dataclasses import functools -from typing import Optional import grpc from typing_extensions import TypeAlias diff --git a/framework/helpers/highlighter.py b/framework/helpers/highlighter.py index 8093e27f..b3ccfb69 100644 --- a/framework/helpers/highlighter.py +++ b/framework/helpers/highlighter.py @@ -19,7 +19,6 @@ TODO(sergiitk): This can be used to output protobuf responses formatted as JSON. """ import logging -from typing import Optional from absl import flags import pygments diff --git a/framework/helpers/retryers.py b/framework/helpers/retryers.py index ac2473ea..67449caa 100644 --- a/framework/helpers/retryers.py +++ b/framework/helpers/retryers.py @@ -22,7 +22,7 @@ """ import datetime import logging -from typing import Any, Callable, List, Optional, Tuple, Type +from typing import Any, Callable, List, Tuple, Type import tenacity from tenacity import _utils as tenacity_utils diff --git a/framework/helpers/skips.py b/framework/helpers/skips.py index 0a99e62f..8431ff2b 100644 --- a/framework/helpers/skips.py +++ b/framework/helpers/skips.py @@ -16,7 +16,6 @@ import enum import logging import re -from typing import Optional from packaging import version as pkg_version diff --git a/framework/infrastructure/gcp/api.py b/framework/infrastructure/gcp/api.py index e0dcbeba..38f6454d 100644 --- a/framework/infrastructure/gcp/api.py +++ b/framework/infrastructure/gcp/api.py @@ -16,7 +16,7 @@ import functools import json import logging -from typing import Any, Dict, List, Optional +from typing import Any, Dict, List from absl import flags from google.cloud import secretmanager_v1 diff --git a/framework/infrastructure/gcp/compute.py b/framework/infrastructure/gcp/compute.py index aa713441..7b2160ad 100644 --- a/framework/infrastructure/gcp/compute.py +++ b/framework/infrastructure/gcp/compute.py @@ -15,7 +15,7 @@ import datetime import enum import logging -from typing import Any, Dict, List, Optional, Set +from typing import Any, Dict, List, Set from googleapiclient import discovery import googleapiclient.errors diff --git a/framework/infrastructure/gcp/iam.py b/framework/infrastructure/gcp/iam.py index d103e37e..dcfbd721 100644 --- a/framework/infrastructure/gcp/iam.py +++ b/framework/infrastructure/gcp/iam.py @@ -15,7 +15,7 @@ import datetime import functools import logging -from typing import Any, Dict, FrozenSet, Optional +from typing import Any, Dict, FrozenSet from framework.helpers import retryers from framework.infrastructure import gcp diff --git a/framework/infrastructure/gcp/network_services.py b/framework/infrastructure/gcp/network_services.py index e142f52c..f570a36c 100644 --- a/framework/infrastructure/gcp/network_services.py +++ b/framework/infrastructure/gcp/network_services.py @@ -15,7 +15,7 @@ import abc import dataclasses import logging -from typing import Any, Dict, List, Optional, Tuple +from typing import Any, Dict, List, Tuple from google.rpc import code_pb2 import tenacity diff --git a/framework/infrastructure/k8s.py b/framework/infrastructure/k8s.py index 0e897dc8..01c33914 100644 --- a/framework/infrastructure/k8s.py +++ b/framework/infrastructure/k8s.py @@ -21,7 +21,7 @@ import logging import pathlib import threading -from typing import Any, Callable, Final, List, Optional, Tuple, Union +from typing import Any, Callable, Final, List, Tuple, Union import warnings from kubernetes import client diff --git a/framework/infrastructure/k8s_internal/k8s_log_collector.py b/framework/infrastructure/k8s_internal/k8s_log_collector.py index 9205825a..93f9c712 100644 --- a/framework/infrastructure/k8s_internal/k8s_log_collector.py +++ b/framework/infrastructure/k8s_internal/k8s_log_collector.py @@ -16,7 +16,7 @@ import os import pathlib import threading -from typing import Any, Callable, Optional, TextIO +from typing import Any, Callable, TextIO from kubernetes import client from kubernetes.watch import watch diff --git a/framework/infrastructure/k8s_internal/k8s_port_forwarder.py b/framework/infrastructure/k8s_internal/k8s_port_forwarder.py index f46176a0..ee3b5c6c 100644 --- a/framework/infrastructure/k8s_internal/k8s_port_forwarder.py +++ b/framework/infrastructure/k8s_internal/k8s_port_forwarder.py @@ -15,7 +15,6 @@ import re import subprocess import time -from typing import Optional logger = logging.getLogger(__name__) diff --git a/framework/infrastructure/traffic_director.py b/framework/infrastructure/traffic_director.py index 271dafd2..ed694b9b 100644 --- a/framework/infrastructure/traffic_director.py +++ b/framework/infrastructure/traffic_director.py @@ -14,7 +14,7 @@ import functools import logging import random -from typing import Any, Dict, Final, List, Optional +from typing import Any, Dict, Final, List import googleapiclient.errors from typing_extensions import TypeAlias diff --git a/framework/rpc/grpc.py b/framework/rpc/grpc.py index 9a010ef4..ba9bed93 100644 --- a/framework/rpc/grpc.py +++ b/framework/rpc/grpc.py @@ -13,7 +13,7 @@ # limitations under the License. import logging import re -from typing import Any, Dict, Optional +from typing import Any, Dict from google.protobuf import json_format import google.protobuf.message diff --git a/framework/rpc/grpc_channelz.py b/framework/rpc/grpc_channelz.py index 5e5a0401..e1da1c65 100644 --- a/framework/rpc/grpc_channelz.py +++ b/framework/rpc/grpc_channelz.py @@ -17,7 +17,7 @@ """ import ipaddress import logging -from typing import Iterator, Optional +from typing import Iterator import grpc from grpc_channelz.v1 import channelz_pb2 diff --git a/framework/rpc/grpc_csds.py b/framework/rpc/grpc_csds.py index 7e5c0768..9e1d5e09 100644 --- a/framework/rpc/grpc_csds.py +++ b/framework/rpc/grpc_csds.py @@ -19,7 +19,7 @@ import json import logging import re -from typing import Any, Final, Optional, Type, cast +from typing import Any, Final, Type, cast from google.protobuf import json_format from typing_extensions import TypeAlias diff --git a/framework/rpc/grpc_testing.py b/framework/rpc/grpc_testing.py index ce47bfbe..6c996dcd 100644 --- a/framework/rpc/grpc_testing.py +++ b/framework/rpc/grpc_testing.py @@ -18,7 +18,7 @@ from collections.abc import Sequence import datetime as dt import logging -from typing import Any, Final, Optional, cast +from typing import Any, Final, cast from google.protobuf import json_format import grpc diff --git a/framework/test_app/client_app.py b/framework/test_app/client_app.py index 0c6dded0..8eddbdb9 100644 --- a/framework/test_app/client_app.py +++ b/framework/test_app/client_app.py @@ -18,7 +18,7 @@ import functools import logging import time -from typing import Iterable, List, Optional +from typing import Iterable, List import framework.errors from framework.helpers import retryers diff --git a/framework/test_app/runners/base_runner.py b/framework/test_app/runners/base_runner.py index c66695f4..6359aefb 100644 --- a/framework/test_app/runners/base_runner.py +++ b/framework/test_app/runners/base_runner.py @@ -19,7 +19,7 @@ import functools import pathlib import threading -from typing import Dict, Optional +from typing import Dict import urllib.parse from absl import flags diff --git a/framework/test_app/runners/k8s/gamma_server_runner.py b/framework/test_app/runners/k8s/gamma_server_runner.py index 2e84b2e5..5e5d8c35 100644 --- a/framework/test_app/runners/k8s/gamma_server_runner.py +++ b/framework/test_app/runners/k8s/gamma_server_runner.py @@ -17,7 +17,7 @@ import dataclasses import datetime import logging -from typing import Final, Optional +from typing import Final from typing_extensions import override diff --git a/framework/test_app/runners/k8s/k8s_base_runner.py b/framework/test_app/runners/k8s/k8s_base_runner.py index a2bc09d7..5535f8b5 100644 --- a/framework/test_app/runners/k8s/k8s_base_runner.py +++ b/framework/test_app/runners/k8s/k8s_base_runner.py @@ -22,7 +22,7 @@ import functools import logging import pathlib -from typing import List, Optional, cast +from typing import List, cast import absl.logging import mako.lookup diff --git a/framework/test_app/runners/k8s/k8s_xds_client_runner.py b/framework/test_app/runners/k8s/k8s_xds_client_runner.py index 9ce15db1..9b8cb54e 100644 --- a/framework/test_app/runners/k8s/k8s_xds_client_runner.py +++ b/framework/test_app/runners/k8s/k8s_xds_client_runner.py @@ -16,7 +16,6 @@ """ import dataclasses import logging -from typing import Optional from framework.infrastructure import gcp from framework.infrastructure import k8s diff --git a/framework/test_app/runners/k8s/k8s_xds_server_runner.py b/framework/test_app/runners/k8s/k8s_xds_server_runner.py index 1860612b..310af63f 100644 --- a/framework/test_app/runners/k8s/k8s_xds_server_runner.py +++ b/framework/test_app/runners/k8s/k8s_xds_server_runner.py @@ -17,7 +17,7 @@ import dataclasses import datetime as dt import logging -from typing import List, Optional +from typing import List from typing_extensions import override diff --git a/framework/test_app/server_app.py b/framework/test_app/server_app.py index e9d2bd70..aa3f4a63 100644 --- a/framework/test_app/server_app.py +++ b/framework/test_app/server_app.py @@ -16,7 +16,7 @@ """ import functools import logging -from typing import Iterator, Optional +from typing import Iterator import framework.rpc from framework.rpc import grpc_channelz diff --git a/framework/test_cases/base_testcase.py b/framework/test_cases/base_testcase.py index d96e5169..607d6e80 100644 --- a/framework/test_cases/base_testcase.py +++ b/framework/test_cases/base_testcase.py @@ -14,7 +14,7 @@ """Base test case used for xds test suites.""" import inspect import traceback -from typing import Optional, Union +from typing import Union import unittest from absl import logging diff --git a/framework/xds_k8s_testcase.py b/framework/xds_k8s_testcase.py index 6bee3ff7..fc166833 100644 --- a/framework/xds_k8s_testcase.py +++ b/framework/xds_k8s_testcase.py @@ -22,7 +22,7 @@ import signal import time from types import FrameType -from typing import Any, Callable, Final, List, Optional, Tuple, Union +from typing import Any, Callable, Final, List, Tuple, Union from absl import flags from absl.testing import absltest diff --git a/framework/xds_url_map_testcase.py b/framework/xds_url_map_testcase.py index ce2a3f95..ae3bcfec 100644 --- a/framework/xds_url_map_testcase.py +++ b/framework/xds_url_map_testcase.py @@ -19,7 +19,7 @@ import os import sys import time -from typing import Any, Iterable, Mapping, Optional, Sequence, Tuple +from typing import Any, Iterable, Mapping, Sequence, Tuple import unittest from absl import flags diff --git a/tests/app_net_ssa_test.py b/tests/app_net_ssa_test.py index 98f3f7d7..2773b508 100644 --- a/tests/app_net_ssa_test.py +++ b/tests/app_net_ssa_test.py @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. import logging -from typing import Final, List, Optional +from typing import Final, List from absl import flags from absl.testing import absltest diff --git a/tests/authz_test.py b/tests/authz_test.py index a227fd31..bc48a842 100644 --- a/tests/authz_test.py +++ b/tests/authz_test.py @@ -14,7 +14,6 @@ import datetime import time -from typing import Optional from absl import flags from absl.testing import absltest diff --git a/tests/gamma/affinity_session_drain_test.py b/tests/gamma/affinity_session_drain_test.py index 0f1f88ed..919c339b 100644 --- a/tests/gamma/affinity_session_drain_test.py +++ b/tests/gamma/affinity_session_drain_test.py @@ -13,7 +13,7 @@ # limitations under the License. import datetime as dt import logging -from typing import Final, Optional +from typing import Final from absl import flags from absl.testing import absltest diff --git a/tests/gamma/affinity_test.py b/tests/gamma/affinity_test.py index 4caf37d5..a2cd9dd2 100644 --- a/tests/gamma/affinity_test.py +++ b/tests/gamma/affinity_test.py @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. import logging -from typing import List, Optional +from typing import List from absl import flags from absl.testing import absltest diff --git a/tests/unit/helpers/skips_test.py b/tests/unit/helpers/skips_test.py index 1175e395..5d005111 100644 --- a/tests/unit/helpers/skips_test.py +++ b/tests/unit/helpers/skips_test.py @@ -11,7 +11,6 @@ # 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. -from typing import Optional from absl.testing import absltest from absl.testing import parameterized diff --git a/tests/unit/test_app/client_app_test.py b/tests/unit/test_app/client_app_test.py index a309e5d5..656e4e13 100644 --- a/tests/unit/test_app/client_app_test.py +++ b/tests/unit/test_app/client_app_test.py @@ -11,7 +11,6 @@ # 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. -from typing import Optional from absl.testing import absltest diff --git a/tests/unit/test_app/server_app_test.py b/tests/unit/test_app/server_app_test.py index b43acff2..e6e0b88e 100644 --- a/tests/unit/test_app/server_app_test.py +++ b/tests/unit/test_app/server_app_test.py @@ -11,7 +11,6 @@ # 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. -from typing import Optional from absl.testing import absltest