Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -106,9 +106,11 @@ def __init__(
*,
connection_name: str,
local_metadata: RuntimeVersionMetadata,
send_warning_metadata: bool = True,
) -> None:
self._connection_name = connection_name
self._local_metadata = local_metadata
self._send_warning_metadata = send_warning_metadata

def intercept_service(
self,
Expand All @@ -131,7 +133,7 @@ def intercept_service(

# Prepare trailing metadata
trailing_metadata: tuple[tuple[str, str], ...] = ()
if incompat_details:
if incompat_details and self._send_warning_metadata:
incompat_message = (
"Runtime version compatibility check failed for "
f"{self._connection_name}. {incompat_details}"
Expand Down Expand Up @@ -179,9 +181,11 @@ def wrapped_stream(

def create_serverappio_runtime_version_server_interceptor(
connection_name: str = "Caller <-> SuperLink ServerAppIo API",
send_warning_metadata: bool = False,
) -> RuntimeVersionServerInterceptor:
"""Create the default runtime version interceptor for ServerAppIo."""
return RuntimeVersionServerInterceptor(
connection_name=connection_name,
local_metadata=RuntimeVersionMetadata.from_local_component("SuperLink"),
send_warning_metadata=send_warning_metadata,
)
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@
from flwr.supercore.interceptors import (
RuntimeVersionClientInterceptor,
RuntimeVersionServerInterceptor,
create_serverappio_runtime_version_server_interceptor,
)
from flwr.supercore.runtime_version_compatibility import RuntimeVersionMetadata

Expand Down Expand Up @@ -202,7 +203,7 @@ def test_missing_metadata_is_tolerated(self) -> None:
context.set_trailing_metadata.assert_not_called()

def test_unparseable_peer_version_is_warned(self) -> None:
"""Explicit unparseable peer versions should be warned."""
"""Explicit unparseable peer versions should set trailing metadata."""
intercepted = self._intercept(
"/flwr.proto.ServerAppIo/GetNodes",
_make_runtime_metadata("main"),
Expand All @@ -214,7 +215,7 @@ def test_unparseable_peer_version_is_warned(self) -> None:
context.set_trailing_metadata.assert_called_once()

def test_incompatible_metadata_is_warned(self) -> None:
"""Different major.minor versions should still be warned."""
"""Different major.minor versions should set trailing metadata."""
intercepted = self._intercept(
"/flwr.proto.ServerAppIo/GetNodes",
_make_runtime_metadata("1.30.1"),
Expand All @@ -225,6 +226,19 @@ def test_incompatible_metadata_is_warned(self) -> None:
self.assertEqual(response, "ok")
context.set_trailing_metadata.assert_called_once()

def test_serverappio_factory_observes_by_default(self) -> None:
"""ServerAppIo factory should not return warning metadata by default."""
self.interceptor = create_serverappio_runtime_version_server_interceptor()
intercepted = self._intercept(
"/flwr.proto.ServerAppIo/GetNodes",
_make_runtime_metadata("1.30.1"),
)

context = Mock()
response = intercepted.unary_unary(GetNodesRequest(run_id=1), context)
self.assertEqual(response, "ok")
context.set_trailing_metadata.assert_not_called()

def test_compatible_metadata_is_accepted(self) -> None:
"""Compatible peer version should not set trailing metadata for unary
handlers."""
Expand Down
Loading