flwr 1.22.0__py3-none-any.whl → 1.23.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (108) hide show
  1. flwr/cli/app.py +15 -1
  2. flwr/cli/auth_plugin/__init__.py +15 -6
  3. flwr/cli/auth_plugin/auth_plugin.py +95 -0
  4. flwr/cli/auth_plugin/noop_auth_plugin.py +58 -0
  5. flwr/cli/auth_plugin/oidc_cli_plugin.py +16 -25
  6. flwr/cli/build.py +118 -47
  7. flwr/cli/{cli_user_auth_interceptor.py → cli_account_auth_interceptor.py} +6 -5
  8. flwr/cli/log.py +2 -2
  9. flwr/cli/login/login.py +34 -23
  10. flwr/cli/ls.py +13 -9
  11. flwr/cli/new/new.py +187 -35
  12. flwr/cli/new/templates/app/pyproject.baseline.toml.tpl +1 -1
  13. flwr/cli/new/templates/app/pyproject.flowertune.toml.tpl +1 -1
  14. flwr/cli/new/templates/app/pyproject.huggingface.toml.tpl +1 -1
  15. flwr/cli/new/templates/app/pyproject.jax.toml.tpl +1 -1
  16. flwr/cli/new/templates/app/pyproject.mlx.toml.tpl +1 -1
  17. flwr/cli/new/templates/app/pyproject.numpy.toml.tpl +1 -1
  18. flwr/cli/new/templates/app/pyproject.pytorch.toml.tpl +1 -1
  19. flwr/cli/new/templates/app/pyproject.pytorch_legacy_api.toml.tpl +1 -1
  20. flwr/cli/new/templates/app/pyproject.sklearn.toml.tpl +1 -1
  21. flwr/cli/new/templates/app/pyproject.tensorflow.toml.tpl +1 -1
  22. flwr/cli/new/templates/app/pyproject.xgboost.toml.tpl +1 -1
  23. flwr/cli/pull.py +2 -2
  24. flwr/cli/run/run.py +11 -7
  25. flwr/cli/stop.py +2 -2
  26. flwr/cli/supernode/__init__.py +25 -0
  27. flwr/cli/supernode/ls.py +260 -0
  28. flwr/cli/supernode/register.py +185 -0
  29. flwr/cli/supernode/unregister.py +138 -0
  30. flwr/cli/utils.py +92 -69
  31. flwr/client/__init__.py +2 -1
  32. flwr/client/grpc_adapter_client/connection.py +6 -8
  33. flwr/client/grpc_rere_client/connection.py +59 -31
  34. flwr/client/grpc_rere_client/grpc_adapter.py +28 -12
  35. flwr/client/grpc_rere_client/{client_interceptor.py → node_auth_client_interceptor.py} +3 -6
  36. flwr/client/mod/secure_aggregation/secaggplus_mod.py +7 -5
  37. flwr/client/rest_client/connection.py +82 -37
  38. flwr/clientapp/__init__.py +1 -2
  39. flwr/{client/clientapp → clientapp}/utils.py +1 -1
  40. flwr/common/constant.py +53 -13
  41. flwr/common/exit/exit_code.py +20 -10
  42. flwr/common/inflatable_utils.py +10 -10
  43. flwr/common/record/array.py +3 -3
  44. flwr/common/record/arrayrecord.py +10 -1
  45. flwr/common/secure_aggregation/crypto/symmetric_encryption.py +1 -89
  46. flwr/common/serde.py +4 -2
  47. flwr/common/typing.py +7 -6
  48. flwr/compat/client/app.py +1 -1
  49. flwr/compat/client/grpc_client/connection.py +2 -2
  50. flwr/proto/control_pb2.py +48 -35
  51. flwr/proto/control_pb2.pyi +71 -5
  52. flwr/proto/control_pb2_grpc.py +102 -0
  53. flwr/proto/control_pb2_grpc.pyi +39 -0
  54. flwr/proto/fab_pb2.py +11 -7
  55. flwr/proto/fab_pb2.pyi +21 -1
  56. flwr/proto/fleet_pb2.py +31 -23
  57. flwr/proto/fleet_pb2.pyi +63 -23
  58. flwr/proto/fleet_pb2_grpc.py +98 -28
  59. flwr/proto/fleet_pb2_grpc.pyi +45 -13
  60. flwr/proto/node_pb2.py +3 -1
  61. flwr/proto/node_pb2.pyi +48 -0
  62. flwr/server/app.py +139 -114
  63. flwr/server/superlink/fleet/grpc_adapter/grpc_adapter_servicer.py +17 -7
  64. flwr/server/superlink/fleet/grpc_rere/fleet_servicer.py +132 -38
  65. flwr/server/superlink/fleet/grpc_rere/{server_interceptor.py → node_auth_server_interceptor.py} +27 -51
  66. flwr/server/superlink/fleet/message_handler/message_handler.py +67 -22
  67. flwr/server/superlink/fleet/rest_rere/rest_api.py +52 -31
  68. flwr/server/superlink/fleet/vce/backend/backend.py +1 -1
  69. flwr/server/superlink/fleet/vce/backend/raybackend.py +1 -1
  70. flwr/server/superlink/fleet/vce/vce_api.py +18 -5
  71. flwr/server/superlink/linkstate/in_memory_linkstate.py +167 -73
  72. flwr/server/superlink/linkstate/linkstate.py +107 -24
  73. flwr/server/superlink/linkstate/linkstate_factory.py +2 -1
  74. flwr/server/superlink/linkstate/sqlite_linkstate.py +306 -255
  75. flwr/server/superlink/linkstate/utils.py +3 -54
  76. flwr/server/superlink/serverappio/serverappio_servicer.py +2 -2
  77. flwr/server/superlink/simulation/simulationio_servicer.py +1 -1
  78. flwr/server/utils/validator.py +2 -3
  79. flwr/server/workflow/secure_aggregation/secaggplus_workflow.py +4 -2
  80. flwr/simulation/ray_transport/ray_actor.py +1 -1
  81. flwr/simulation/ray_transport/ray_client_proxy.py +1 -1
  82. flwr/simulation/run_simulation.py +3 -2
  83. flwr/supercore/constant.py +22 -0
  84. flwr/supercore/object_store/in_memory_object_store.py +0 -4
  85. flwr/supercore/object_store/object_store_factory.py +26 -6
  86. flwr/supercore/object_store/sqlite_object_store.py +252 -0
  87. flwr/{client/clientapp → supercore/primitives}/__init__.py +1 -1
  88. flwr/supercore/primitives/asymmetric.py +117 -0
  89. flwr/supercore/primitives/asymmetric_ed25519.py +165 -0
  90. flwr/supercore/sqlite_mixin.py +156 -0
  91. flwr/supercore/utils.py +20 -0
  92. flwr/{common → superlink}/auth_plugin/__init__.py +6 -6
  93. flwr/superlink/auth_plugin/auth_plugin.py +91 -0
  94. flwr/superlink/auth_plugin/noop_auth_plugin.py +87 -0
  95. flwr/superlink/servicer/control/{control_user_auth_interceptor.py → control_account_auth_interceptor.py} +19 -19
  96. flwr/superlink/servicer/control/control_event_log_interceptor.py +1 -1
  97. flwr/superlink/servicer/control/control_grpc.py +13 -11
  98. flwr/superlink/servicer/control/control_servicer.py +152 -60
  99. flwr/supernode/cli/flower_supernode.py +19 -26
  100. flwr/supernode/runtime/run_clientapp.py +2 -2
  101. flwr/supernode/servicer/clientappio/clientappio_servicer.py +1 -1
  102. flwr/supernode/start_client_internal.py +17 -9
  103. {flwr-1.22.0.dist-info → flwr-1.23.0.dist-info}/METADATA +1 -1
  104. {flwr-1.22.0.dist-info → flwr-1.23.0.dist-info}/RECORD +107 -96
  105. flwr/common/auth_plugin/auth_plugin.py +0 -149
  106. /flwr/{client → clientapp}/client_app.py +0 -0
  107. {flwr-1.22.0.dist-info → flwr-1.23.0.dist-info}/WHEEL +0 -0
  108. {flwr-1.22.0.dist-info → flwr-1.23.0.dist-info}/entry_points.txt +0 -0
flwr/common/serde.py CHANGED
@@ -501,12 +501,14 @@ def recorddict_from_proto(recorddict_proto: ProtoRecordDict) -> RecordDict:
501
501
 
502
502
  def fab_to_proto(fab: typing.Fab) -> ProtoFab:
503
503
  """Create a proto Fab object from a Python Fab."""
504
- return ProtoFab(hash_str=fab.hash_str, content=fab.content)
504
+ return ProtoFab(
505
+ hash_str=fab.hash_str, content=fab.content, verifications=fab.verifications
506
+ )
505
507
 
506
508
 
507
509
  def fab_from_proto(fab: ProtoFab) -> typing.Fab:
508
510
  """Create a Python Fab object from a proto Fab."""
509
- return typing.Fab(fab.hash_str, fab.content)
511
+ return typing.Fab(fab.hash_str, fab.content, dict(fab.verifications))
510
512
 
511
513
 
512
514
  # === User configs ===
flwr/common/typing.py CHANGED
@@ -256,6 +256,7 @@ class Fab:
256
256
 
257
257
  hash_str: str
258
258
  content: bytes
259
+ verifications: dict[str, str]
259
260
 
260
261
 
261
262
  class RunNotRunningException(BaseException):
@@ -270,12 +271,12 @@ class InvalidRunStatusException(BaseException):
270
271
  self.message = message
271
272
 
272
273
 
273
- # OIDC user authentication types
274
+ # OIDC account authentication types
274
275
  @dataclass
275
- class UserAuthLoginDetails:
276
- """User authentication login details."""
276
+ class AccountAuthLoginDetails:
277
+ """Account authentication login details."""
277
278
 
278
- auth_type: str
279
+ authn_type: str
279
280
  device_code: str
280
281
  verification_uri_complete: str
281
282
  expires_in: int
@@ -283,8 +284,8 @@ class UserAuthLoginDetails:
283
284
 
284
285
 
285
286
  @dataclass
286
- class UserAuthCredentials:
287
- """User authentication tokens."""
287
+ class AccountAuthCredentials:
288
+ """Account authentication tokens."""
288
289
 
289
290
  access_token: str
290
291
  refresh_token: str
flwr/compat/client/app.py CHANGED
@@ -28,11 +28,11 @@ from flwr.app.error import Error
28
28
  from flwr.cli.config_utils import get_fab_metadata
29
29
  from flwr.cli.install import install_from_fab
30
30
  from flwr.client.client import Client
31
- from flwr.client.client_app import ClientApp, LoadClientAppError
32
31
  from flwr.client.message_handler.message_handler import handle_control_message
33
32
  from flwr.client.numpy_client import NumPyClient
34
33
  from flwr.client.run_info_store import DeprecatedRunInfoStore
35
34
  from flwr.client.typing import ClientFnExt
35
+ from flwr.clientapp.client_app import ClientApp, LoadClientAppError
36
36
  from flwr.common import GRPC_MAX_MESSAGE_LENGTH, Context, EventType, Message, event
37
37
  from flwr.common.address import parse_address
38
38
  from flwr.common.constant import (
@@ -96,7 +96,7 @@ def grpc_connection( # pylint: disable=R0913,R0915,too-many-positional-argument
96
96
  If provided, a secure connection using the certificates will be
97
97
  established to an SSL-enabled Flower server.
98
98
  authentication_keys : Optional[Tuple[PrivateKey, PublicKey]] (default: None)
99
- Client authentication is not supported for this transport type.
99
+ SuperNode authentication is not supported for this transport type.
100
100
 
101
101
  Returns
102
102
  -------
@@ -120,7 +120,7 @@ def grpc_connection( # pylint: disable=R0913,R0915,too-many-positional-argument
120
120
  if isinstance(root_certificates, str):
121
121
  root_certificates = Path(root_certificates).read_bytes()
122
122
  if authentication_keys is not None:
123
- log(ERROR, "Client authentication is not supported for this transport type.")
123
+ log(ERROR, "SuperNode authentication is not supported for this transport type.")
124
124
 
125
125
  channel = create_channel(
126
126
  server_address=server_address,
flwr/proto/control_pb2.py CHANGED
@@ -16,9 +16,10 @@ from flwr.proto import fab_pb2 as flwr_dot_proto_dot_fab__pb2
16
16
  from flwr.proto import transport_pb2 as flwr_dot_proto_dot_transport__pb2
17
17
  from flwr.proto import recorddict_pb2 as flwr_dot_proto_dot_recorddict__pb2
18
18
  from flwr.proto import run_pb2 as flwr_dot_proto_dot_run__pb2
19
+ from flwr.proto import node_pb2 as flwr_dot_proto_dot_node__pb2
19
20
 
20
21
 
21
- DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x18\x66lwr/proto/control.proto\x12\nflwr.proto\x1a\x14\x66lwr/proto/fab.proto\x1a\x1a\x66lwr/proto/transport.proto\x1a\x1b\x66lwr/proto/recorddict.proto\x1a\x14\x66lwr/proto/run.proto\"\xfa\x01\n\x0fStartRunRequest\x12\x1c\n\x03\x66\x61\x62\x18\x01 \x01(\x0b\x32\x0f.flwr.proto.Fab\x12H\n\x0foverride_config\x18\x02 \x03(\x0b\x32/.flwr.proto.StartRunRequest.OverrideConfigEntry\x12\x34\n\x12\x66\x65\x64\x65ration_options\x18\x03 \x01(\x0b\x32\x18.flwr.proto.ConfigRecord\x1aI\n\x13OverrideConfigEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12!\n\x05value\x18\x02 \x01(\x0b\x32\x12.flwr.proto.Scalar:\x02\x38\x01\"2\n\x10StartRunResponse\x12\x13\n\x06run_id\x18\x01 \x01(\x04H\x00\x88\x01\x01\x42\t\n\x07_run_id\"<\n\x11StreamLogsRequest\x12\x0e\n\x06run_id\x18\x01 \x01(\x04\x12\x17\n\x0f\x61\x66ter_timestamp\x18\x02 \x01(\x01\"B\n\x12StreamLogsResponse\x12\x12\n\nlog_output\x18\x01 \x01(\t\x12\x18\n\x10latest_timestamp\x18\x02 \x01(\x01\"1\n\x0fListRunsRequest\x12\x13\n\x06run_id\x18\x01 \x01(\x04H\x00\x88\x01\x01\x42\t\n\x07_run_id\"\x9d\x01\n\x10ListRunsResponse\x12;\n\x08run_dict\x18\x01 \x03(\x0b\x32).flwr.proto.ListRunsResponse.RunDictEntry\x12\x0b\n\x03now\x18\x02 \x01(\t\x1a?\n\x0cRunDictEntry\x12\x0b\n\x03key\x18\x01 \x01(\x04\x12\x1e\n\x05value\x18\x02 \x01(\x0b\x32\x0f.flwr.proto.Run:\x02\x38\x01\"\x18\n\x16GetLoginDetailsRequest\"\x8a\x01\n\x17GetLoginDetailsResponse\x12\x11\n\tauth_type\x18\x01 \x01(\t\x12\x13\n\x0b\x64\x65vice_code\x18\x02 \x01(\t\x12!\n\x19verification_uri_complete\x18\x03 \x01(\t\x12\x12\n\nexpires_in\x18\x04 \x01(\x03\x12\x10\n\x08interval\x18\x05 \x01(\x03\"+\n\x14GetAuthTokensRequest\x12\x13\n\x0b\x64\x65vice_code\x18\x01 \x01(\t\"D\n\x15GetAuthTokensResponse\x12\x14\n\x0c\x61\x63\x63\x65ss_token\x18\x01 \x01(\t\x12\x15\n\rrefresh_token\x18\x02 \x01(\t\" \n\x0eStopRunRequest\x12\x0e\n\x06run_id\x18\x01 \x01(\x04\"\"\n\x0fStopRunResponse\x12\x0f\n\x07success\x18\x01 \x01(\x08\"&\n\x14PullArtifactsRequest\x12\x0e\n\x06run_id\x18\x01 \x01(\x04\"1\n\x15PullArtifactsResponse\x12\x10\n\x03url\x18\x01 \x01(\tH\x00\x88\x01\x01\x42\x06\n\x04_url2\xc0\x04\n\x07\x43ontrol\x12G\n\x08StartRun\x12\x1b.flwr.proto.StartRunRequest\x1a\x1c.flwr.proto.StartRunResponse\"\x00\x12\x44\n\x07StopRun\x12\x1a.flwr.proto.StopRunRequest\x1a\x1b.flwr.proto.StopRunResponse\"\x00\x12O\n\nStreamLogs\x12\x1d.flwr.proto.StreamLogsRequest\x1a\x1e.flwr.proto.StreamLogsResponse\"\x00\x30\x01\x12G\n\x08ListRuns\x12\x1b.flwr.proto.ListRunsRequest\x1a\x1c.flwr.proto.ListRunsResponse\"\x00\x12\\\n\x0fGetLoginDetails\x12\".flwr.proto.GetLoginDetailsRequest\x1a#.flwr.proto.GetLoginDetailsResponse\"\x00\x12V\n\rGetAuthTokens\x12 .flwr.proto.GetAuthTokensRequest\x1a!.flwr.proto.GetAuthTokensResponse\"\x00\x12V\n\rPullArtifacts\x12 .flwr.proto.PullArtifactsRequest\x1a!.flwr.proto.PullArtifactsResponse\"\x00\x62\x06proto3')
22
+ DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x18\x66lwr/proto/control.proto\x12\nflwr.proto\x1a\x14\x66lwr/proto/fab.proto\x1a\x1a\x66lwr/proto/transport.proto\x1a\x1b\x66lwr/proto/recorddict.proto\x1a\x14\x66lwr/proto/run.proto\x1a\x15\x66lwr/proto/node.proto\"\x8a\x02\n\x0fStartRunRequest\x12\x1c\n\x03\x66\x61\x62\x18\x01 \x01(\x0b\x32\x0f.flwr.proto.Fab\x12H\n\x0foverride_config\x18\x02 \x03(\x0b\x32/.flwr.proto.StartRunRequest.OverrideConfigEntry\x12\x34\n\x12\x66\x65\x64\x65ration_options\x18\x03 \x01(\x0b\x32\x18.flwr.proto.ConfigRecord\x12\x0e\n\x06\x61pp_id\x18\x04 \x01(\t\x1aI\n\x13OverrideConfigEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12!\n\x05value\x18\x02 \x01(\x0b\x32\x12.flwr.proto.Scalar:\x02\x38\x01\"2\n\x10StartRunResponse\x12\x13\n\x06run_id\x18\x01 \x01(\x04H\x00\x88\x01\x01\x42\t\n\x07_run_id\"<\n\x11StreamLogsRequest\x12\x0e\n\x06run_id\x18\x01 \x01(\x04\x12\x17\n\x0f\x61\x66ter_timestamp\x18\x02 \x01(\x01\"B\n\x12StreamLogsResponse\x12\x12\n\nlog_output\x18\x01 \x01(\t\x12\x18\n\x10latest_timestamp\x18\x02 \x01(\x01\"1\n\x0fListRunsRequest\x12\x13\n\x06run_id\x18\x01 \x01(\x04H\x00\x88\x01\x01\x42\t\n\x07_run_id\"\x9d\x01\n\x10ListRunsResponse\x12;\n\x08run_dict\x18\x01 \x03(\x0b\x32).flwr.proto.ListRunsResponse.RunDictEntry\x12\x0b\n\x03now\x18\x02 \x01(\t\x1a?\n\x0cRunDictEntry\x12\x0b\n\x03key\x18\x01 \x01(\x04\x12\x1e\n\x05value\x18\x02 \x01(\x0b\x32\x0f.flwr.proto.Run:\x02\x38\x01\"\x18\n\x16GetLoginDetailsRequest\"\x8b\x01\n\x17GetLoginDetailsResponse\x12\x12\n\nauthn_type\x18\x01 \x01(\t\x12\x13\n\x0b\x64\x65vice_code\x18\x02 \x01(\t\x12!\n\x19verification_uri_complete\x18\x03 \x01(\t\x12\x12\n\nexpires_in\x18\x04 \x01(\x03\x12\x10\n\x08interval\x18\x05 \x01(\x03\"+\n\x14GetAuthTokensRequest\x12\x13\n\x0b\x64\x65vice_code\x18\x01 \x01(\t\"D\n\x15GetAuthTokensResponse\x12\x14\n\x0c\x61\x63\x63\x65ss_token\x18\x01 \x01(\t\x12\x15\n\rrefresh_token\x18\x02 \x01(\t\" \n\x0eStopRunRequest\x12\x0e\n\x06run_id\x18\x01 \x01(\x04\"\"\n\x0fStopRunResponse\x12\x0f\n\x07success\x18\x01 \x01(\x08\"&\n\x14PullArtifactsRequest\x12\x0e\n\x06run_id\x18\x01 \x01(\x04\"1\n\x15PullArtifactsResponse\x12\x10\n\x03url\x18\x01 \x01(\tH\x00\x88\x01\x01\x42\x06\n\x04_url\")\n\x13RegisterNodeRequest\x12\x12\n\npublic_key\x18\x01 \x01(\x0c\"8\n\x14RegisterNodeResponse\x12\x14\n\x07node_id\x18\x01 \x01(\x04H\x00\x88\x01\x01\x42\n\n\x08_node_id\"(\n\x15UnregisterNodeRequest\x12\x0f\n\x07node_id\x18\x01 \x01(\x04\"\x18\n\x16UnregisterNodeResponse\"\x12\n\x10ListNodesRequest\"J\n\x11ListNodesResponse\x12(\n\nnodes_info\x18\x01 \x03(\x0b\x32\x14.flwr.proto.NodeInfo\x12\x0b\n\x03now\x18\x02 \x01(\t2\xbc\x06\n\x07\x43ontrol\x12G\n\x08StartRun\x12\x1b.flwr.proto.StartRunRequest\x1a\x1c.flwr.proto.StartRunResponse\"\x00\x12\x44\n\x07StopRun\x12\x1a.flwr.proto.StopRunRequest\x1a\x1b.flwr.proto.StopRunResponse\"\x00\x12O\n\nStreamLogs\x12\x1d.flwr.proto.StreamLogsRequest\x1a\x1e.flwr.proto.StreamLogsResponse\"\x00\x30\x01\x12G\n\x08ListRuns\x12\x1b.flwr.proto.ListRunsRequest\x1a\x1c.flwr.proto.ListRunsResponse\"\x00\x12\\\n\x0fGetLoginDetails\x12\".flwr.proto.GetLoginDetailsRequest\x1a#.flwr.proto.GetLoginDetailsResponse\"\x00\x12V\n\rGetAuthTokens\x12 .flwr.proto.GetAuthTokensRequest\x1a!.flwr.proto.GetAuthTokensResponse\"\x00\x12V\n\rPullArtifacts\x12 .flwr.proto.PullArtifactsRequest\x1a!.flwr.proto.PullArtifactsResponse\"\x00\x12S\n\x0cRegisterNode\x12\x1f.flwr.proto.RegisterNodeRequest\x1a .flwr.proto.RegisterNodeResponse\"\x00\x12Y\n\x0eUnregisterNode\x12!.flwr.proto.UnregisterNodeRequest\x1a\".flwr.proto.UnregisterNodeResponse\"\x00\x12J\n\tListNodes\x12\x1c.flwr.proto.ListNodesRequest\x1a\x1d.flwr.proto.ListNodesResponse\"\x00\x62\x06proto3')
22
23
 
23
24
  _globals = globals()
24
25
  _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
@@ -29,38 +30,50 @@ if _descriptor._USE_C_DESCRIPTORS == False:
29
30
  _globals['_STARTRUNREQUEST_OVERRIDECONFIGENTRY']._serialized_options = b'8\001'
30
31
  _globals['_LISTRUNSRESPONSE_RUNDICTENTRY']._options = None
31
32
  _globals['_LISTRUNSRESPONSE_RUNDICTENTRY']._serialized_options = b'8\001'
32
- _globals['_STARTRUNREQUEST']._serialized_start=142
33
- _globals['_STARTRUNREQUEST']._serialized_end=392
34
- _globals['_STARTRUNREQUEST_OVERRIDECONFIGENTRY']._serialized_start=319
35
- _globals['_STARTRUNREQUEST_OVERRIDECONFIGENTRY']._serialized_end=392
36
- _globals['_STARTRUNRESPONSE']._serialized_start=394
37
- _globals['_STARTRUNRESPONSE']._serialized_end=444
38
- _globals['_STREAMLOGSREQUEST']._serialized_start=446
39
- _globals['_STREAMLOGSREQUEST']._serialized_end=506
40
- _globals['_STREAMLOGSRESPONSE']._serialized_start=508
41
- _globals['_STREAMLOGSRESPONSE']._serialized_end=574
42
- _globals['_LISTRUNSREQUEST']._serialized_start=576
43
- _globals['_LISTRUNSREQUEST']._serialized_end=625
44
- _globals['_LISTRUNSRESPONSE']._serialized_start=628
45
- _globals['_LISTRUNSRESPONSE']._serialized_end=785
46
- _globals['_LISTRUNSRESPONSE_RUNDICTENTRY']._serialized_start=722
47
- _globals['_LISTRUNSRESPONSE_RUNDICTENTRY']._serialized_end=785
48
- _globals['_GETLOGINDETAILSREQUEST']._serialized_start=787
49
- _globals['_GETLOGINDETAILSREQUEST']._serialized_end=811
50
- _globals['_GETLOGINDETAILSRESPONSE']._serialized_start=814
51
- _globals['_GETLOGINDETAILSRESPONSE']._serialized_end=952
52
- _globals['_GETAUTHTOKENSREQUEST']._serialized_start=954
53
- _globals['_GETAUTHTOKENSREQUEST']._serialized_end=997
54
- _globals['_GETAUTHTOKENSRESPONSE']._serialized_start=999
55
- _globals['_GETAUTHTOKENSRESPONSE']._serialized_end=1067
56
- _globals['_STOPRUNREQUEST']._serialized_start=1069
57
- _globals['_STOPRUNREQUEST']._serialized_end=1101
58
- _globals['_STOPRUNRESPONSE']._serialized_start=1103
59
- _globals['_STOPRUNRESPONSE']._serialized_end=1137
60
- _globals['_PULLARTIFACTSREQUEST']._serialized_start=1139
61
- _globals['_PULLARTIFACTSREQUEST']._serialized_end=1177
62
- _globals['_PULLARTIFACTSRESPONSE']._serialized_start=1179
63
- _globals['_PULLARTIFACTSRESPONSE']._serialized_end=1228
64
- _globals['_CONTROL']._serialized_start=1231
65
- _globals['_CONTROL']._serialized_end=1807
33
+ _globals['_STARTRUNREQUEST']._serialized_start=165
34
+ _globals['_STARTRUNREQUEST']._serialized_end=431
35
+ _globals['_STARTRUNREQUEST_OVERRIDECONFIGENTRY']._serialized_start=358
36
+ _globals['_STARTRUNREQUEST_OVERRIDECONFIGENTRY']._serialized_end=431
37
+ _globals['_STARTRUNRESPONSE']._serialized_start=433
38
+ _globals['_STARTRUNRESPONSE']._serialized_end=483
39
+ _globals['_STREAMLOGSREQUEST']._serialized_start=485
40
+ _globals['_STREAMLOGSREQUEST']._serialized_end=545
41
+ _globals['_STREAMLOGSRESPONSE']._serialized_start=547
42
+ _globals['_STREAMLOGSRESPONSE']._serialized_end=613
43
+ _globals['_LISTRUNSREQUEST']._serialized_start=615
44
+ _globals['_LISTRUNSREQUEST']._serialized_end=664
45
+ _globals['_LISTRUNSRESPONSE']._serialized_start=667
46
+ _globals['_LISTRUNSRESPONSE']._serialized_end=824
47
+ _globals['_LISTRUNSRESPONSE_RUNDICTENTRY']._serialized_start=761
48
+ _globals['_LISTRUNSRESPONSE_RUNDICTENTRY']._serialized_end=824
49
+ _globals['_GETLOGINDETAILSREQUEST']._serialized_start=826
50
+ _globals['_GETLOGINDETAILSREQUEST']._serialized_end=850
51
+ _globals['_GETLOGINDETAILSRESPONSE']._serialized_start=853
52
+ _globals['_GETLOGINDETAILSRESPONSE']._serialized_end=992
53
+ _globals['_GETAUTHTOKENSREQUEST']._serialized_start=994
54
+ _globals['_GETAUTHTOKENSREQUEST']._serialized_end=1037
55
+ _globals['_GETAUTHTOKENSRESPONSE']._serialized_start=1039
56
+ _globals['_GETAUTHTOKENSRESPONSE']._serialized_end=1107
57
+ _globals['_STOPRUNREQUEST']._serialized_start=1109
58
+ _globals['_STOPRUNREQUEST']._serialized_end=1141
59
+ _globals['_STOPRUNRESPONSE']._serialized_start=1143
60
+ _globals['_STOPRUNRESPONSE']._serialized_end=1177
61
+ _globals['_PULLARTIFACTSREQUEST']._serialized_start=1179
62
+ _globals['_PULLARTIFACTSREQUEST']._serialized_end=1217
63
+ _globals['_PULLARTIFACTSRESPONSE']._serialized_start=1219
64
+ _globals['_PULLARTIFACTSRESPONSE']._serialized_end=1268
65
+ _globals['_REGISTERNODEREQUEST']._serialized_start=1270
66
+ _globals['_REGISTERNODEREQUEST']._serialized_end=1311
67
+ _globals['_REGISTERNODERESPONSE']._serialized_start=1313
68
+ _globals['_REGISTERNODERESPONSE']._serialized_end=1369
69
+ _globals['_UNREGISTERNODEREQUEST']._serialized_start=1371
70
+ _globals['_UNREGISTERNODEREQUEST']._serialized_end=1411
71
+ _globals['_UNREGISTERNODERESPONSE']._serialized_start=1413
72
+ _globals['_UNREGISTERNODERESPONSE']._serialized_end=1437
73
+ _globals['_LISTNODESREQUEST']._serialized_start=1439
74
+ _globals['_LISTNODESREQUEST']._serialized_end=1457
75
+ _globals['_LISTNODESRESPONSE']._serialized_start=1459
76
+ _globals['_LISTNODESRESPONSE']._serialized_end=1533
77
+ _globals['_CONTROL']._serialized_start=1536
78
+ _globals['_CONTROL']._serialized_end=2364
66
79
  # @@protoc_insertion_point(module_scope)
@@ -4,6 +4,7 @@ isort:skip_file
4
4
  """
5
5
  import builtins
6
6
  import flwr.proto.fab_pb2
7
+ import flwr.proto.node_pb2
7
8
  import flwr.proto.recorddict_pb2
8
9
  import flwr.proto.run_pb2
9
10
  import flwr.proto.transport_pb2
@@ -35,20 +36,23 @@ class StartRunRequest(google.protobuf.message.Message):
35
36
  FAB_FIELD_NUMBER: builtins.int
36
37
  OVERRIDE_CONFIG_FIELD_NUMBER: builtins.int
37
38
  FEDERATION_OPTIONS_FIELD_NUMBER: builtins.int
39
+ APP_ID_FIELD_NUMBER: builtins.int
38
40
  @property
39
41
  def fab(self) -> flwr.proto.fab_pb2.Fab: ...
40
42
  @property
41
43
  def override_config(self) -> google.protobuf.internal.containers.MessageMap[typing.Text, flwr.proto.transport_pb2.Scalar]: ...
42
44
  @property
43
45
  def federation_options(self) -> flwr.proto.recorddict_pb2.ConfigRecord: ...
46
+ app_id: typing.Text
44
47
  def __init__(self,
45
48
  *,
46
49
  fab: typing.Optional[flwr.proto.fab_pb2.Fab] = ...,
47
50
  override_config: typing.Optional[typing.Mapping[typing.Text, flwr.proto.transport_pb2.Scalar]] = ...,
48
51
  federation_options: typing.Optional[flwr.proto.recorddict_pb2.ConfigRecord] = ...,
52
+ app_id: typing.Text = ...,
49
53
  ) -> None: ...
50
54
  def HasField(self, field_name: typing_extensions.Literal["fab",b"fab","federation_options",b"federation_options"]) -> builtins.bool: ...
51
- def ClearField(self, field_name: typing_extensions.Literal["fab",b"fab","federation_options",b"federation_options","override_config",b"override_config"]) -> None: ...
55
+ def ClearField(self, field_name: typing_extensions.Literal["app_id",b"app_id","fab",b"fab","federation_options",b"federation_options","override_config",b"override_config"]) -> None: ...
52
56
  global___StartRunRequest = StartRunRequest
53
57
 
54
58
  class StartRunResponse(google.protobuf.message.Message):
@@ -143,25 +147,25 @@ global___GetLoginDetailsRequest = GetLoginDetailsRequest
143
147
 
144
148
  class GetLoginDetailsResponse(google.protobuf.message.Message):
145
149
  DESCRIPTOR: google.protobuf.descriptor.Descriptor
146
- AUTH_TYPE_FIELD_NUMBER: builtins.int
150
+ AUTHN_TYPE_FIELD_NUMBER: builtins.int
147
151
  DEVICE_CODE_FIELD_NUMBER: builtins.int
148
152
  VERIFICATION_URI_COMPLETE_FIELD_NUMBER: builtins.int
149
153
  EXPIRES_IN_FIELD_NUMBER: builtins.int
150
154
  INTERVAL_FIELD_NUMBER: builtins.int
151
- auth_type: typing.Text
155
+ authn_type: typing.Text
152
156
  device_code: typing.Text
153
157
  verification_uri_complete: typing.Text
154
158
  expires_in: builtins.int
155
159
  interval: builtins.int
156
160
  def __init__(self,
157
161
  *,
158
- auth_type: typing.Text = ...,
162
+ authn_type: typing.Text = ...,
159
163
  device_code: typing.Text = ...,
160
164
  verification_uri_complete: typing.Text = ...,
161
165
  expires_in: builtins.int = ...,
162
166
  interval: builtins.int = ...,
163
167
  ) -> None: ...
164
- def ClearField(self, field_name: typing_extensions.Literal["auth_type",b"auth_type","device_code",b"device_code","expires_in",b"expires_in","interval",b"interval","verification_uri_complete",b"verification_uri_complete"]) -> None: ...
168
+ def ClearField(self, field_name: typing_extensions.Literal["authn_type",b"authn_type","device_code",b"device_code","expires_in",b"expires_in","interval",b"interval","verification_uri_complete",b"verification_uri_complete"]) -> None: ...
165
169
  global___GetLoginDetailsResponse = GetLoginDetailsResponse
166
170
 
167
171
  class GetAuthTokensRequest(google.protobuf.message.Message):
@@ -234,3 +238,65 @@ class PullArtifactsResponse(google.protobuf.message.Message):
234
238
  def ClearField(self, field_name: typing_extensions.Literal["_url",b"_url","url",b"url"]) -> None: ...
235
239
  def WhichOneof(self, oneof_group: typing_extensions.Literal["_url",b"_url"]) -> typing.Optional[typing_extensions.Literal["url"]]: ...
236
240
  global___PullArtifactsResponse = PullArtifactsResponse
241
+
242
+ class RegisterNodeRequest(google.protobuf.message.Message):
243
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
244
+ PUBLIC_KEY_FIELD_NUMBER: builtins.int
245
+ public_key: builtins.bytes
246
+ def __init__(self,
247
+ *,
248
+ public_key: builtins.bytes = ...,
249
+ ) -> None: ...
250
+ def ClearField(self, field_name: typing_extensions.Literal["public_key",b"public_key"]) -> None: ...
251
+ global___RegisterNodeRequest = RegisterNodeRequest
252
+
253
+ class RegisterNodeResponse(google.protobuf.message.Message):
254
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
255
+ NODE_ID_FIELD_NUMBER: builtins.int
256
+ node_id: builtins.int
257
+ def __init__(self,
258
+ *,
259
+ node_id: typing.Optional[builtins.int] = ...,
260
+ ) -> None: ...
261
+ def HasField(self, field_name: typing_extensions.Literal["_node_id",b"_node_id","node_id",b"node_id"]) -> builtins.bool: ...
262
+ def ClearField(self, field_name: typing_extensions.Literal["_node_id",b"_node_id","node_id",b"node_id"]) -> None: ...
263
+ def WhichOneof(self, oneof_group: typing_extensions.Literal["_node_id",b"_node_id"]) -> typing.Optional[typing_extensions.Literal["node_id"]]: ...
264
+ global___RegisterNodeResponse = RegisterNodeResponse
265
+
266
+ class UnregisterNodeRequest(google.protobuf.message.Message):
267
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
268
+ NODE_ID_FIELD_NUMBER: builtins.int
269
+ node_id: builtins.int
270
+ def __init__(self,
271
+ *,
272
+ node_id: builtins.int = ...,
273
+ ) -> None: ...
274
+ def ClearField(self, field_name: typing_extensions.Literal["node_id",b"node_id"]) -> None: ...
275
+ global___UnregisterNodeRequest = UnregisterNodeRequest
276
+
277
+ class UnregisterNodeResponse(google.protobuf.message.Message):
278
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
279
+ def __init__(self,
280
+ ) -> None: ...
281
+ global___UnregisterNodeResponse = UnregisterNodeResponse
282
+
283
+ class ListNodesRequest(google.protobuf.message.Message):
284
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
285
+ def __init__(self,
286
+ ) -> None: ...
287
+ global___ListNodesRequest = ListNodesRequest
288
+
289
+ class ListNodesResponse(google.protobuf.message.Message):
290
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
291
+ NODES_INFO_FIELD_NUMBER: builtins.int
292
+ NOW_FIELD_NUMBER: builtins.int
293
+ @property
294
+ def nodes_info(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[flwr.proto.node_pb2.NodeInfo]: ...
295
+ now: typing.Text
296
+ def __init__(self,
297
+ *,
298
+ nodes_info: typing.Optional[typing.Iterable[flwr.proto.node_pb2.NodeInfo]] = ...,
299
+ now: typing.Text = ...,
300
+ ) -> None: ...
301
+ def ClearField(self, field_name: typing_extensions.Literal["nodes_info",b"nodes_info","now",b"now"]) -> None: ...
302
+ global___ListNodesResponse = ListNodesResponse
@@ -49,6 +49,21 @@ class ControlStub(object):
49
49
  request_serializer=flwr_dot_proto_dot_control__pb2.PullArtifactsRequest.SerializeToString,
50
50
  response_deserializer=flwr_dot_proto_dot_control__pb2.PullArtifactsResponse.FromString,
51
51
  )
52
+ self.RegisterNode = channel.unary_unary(
53
+ '/flwr.proto.Control/RegisterNode',
54
+ request_serializer=flwr_dot_proto_dot_control__pb2.RegisterNodeRequest.SerializeToString,
55
+ response_deserializer=flwr_dot_proto_dot_control__pb2.RegisterNodeResponse.FromString,
56
+ )
57
+ self.UnregisterNode = channel.unary_unary(
58
+ '/flwr.proto.Control/UnregisterNode',
59
+ request_serializer=flwr_dot_proto_dot_control__pb2.UnregisterNodeRequest.SerializeToString,
60
+ response_deserializer=flwr_dot_proto_dot_control__pb2.UnregisterNodeResponse.FromString,
61
+ )
62
+ self.ListNodes = channel.unary_unary(
63
+ '/flwr.proto.Control/ListNodes',
64
+ request_serializer=flwr_dot_proto_dot_control__pb2.ListNodesRequest.SerializeToString,
65
+ response_deserializer=flwr_dot_proto_dot_control__pb2.ListNodesResponse.FromString,
66
+ )
52
67
 
53
68
 
54
69
  class ControlServicer(object):
@@ -103,6 +118,27 @@ class ControlServicer(object):
103
118
  context.set_details('Method not implemented!')
104
119
  raise NotImplementedError('Method not implemented!')
105
120
 
121
+ def RegisterNode(self, request, context):
122
+ """Register SuperNode
123
+ """
124
+ context.set_code(grpc.StatusCode.UNIMPLEMENTED)
125
+ context.set_details('Method not implemented!')
126
+ raise NotImplementedError('Method not implemented!')
127
+
128
+ def UnregisterNode(self, request, context):
129
+ """Unregister SuperNode
130
+ """
131
+ context.set_code(grpc.StatusCode.UNIMPLEMENTED)
132
+ context.set_details('Method not implemented!')
133
+ raise NotImplementedError('Method not implemented!')
134
+
135
+ def ListNodes(self, request, context):
136
+ """List SuperNodes
137
+ """
138
+ context.set_code(grpc.StatusCode.UNIMPLEMENTED)
139
+ context.set_details('Method not implemented!')
140
+ raise NotImplementedError('Method not implemented!')
141
+
106
142
 
107
143
  def add_ControlServicer_to_server(servicer, server):
108
144
  rpc_method_handlers = {
@@ -141,6 +177,21 @@ def add_ControlServicer_to_server(servicer, server):
141
177
  request_deserializer=flwr_dot_proto_dot_control__pb2.PullArtifactsRequest.FromString,
142
178
  response_serializer=flwr_dot_proto_dot_control__pb2.PullArtifactsResponse.SerializeToString,
143
179
  ),
180
+ 'RegisterNode': grpc.unary_unary_rpc_method_handler(
181
+ servicer.RegisterNode,
182
+ request_deserializer=flwr_dot_proto_dot_control__pb2.RegisterNodeRequest.FromString,
183
+ response_serializer=flwr_dot_proto_dot_control__pb2.RegisterNodeResponse.SerializeToString,
184
+ ),
185
+ 'UnregisterNode': grpc.unary_unary_rpc_method_handler(
186
+ servicer.UnregisterNode,
187
+ request_deserializer=flwr_dot_proto_dot_control__pb2.UnregisterNodeRequest.FromString,
188
+ response_serializer=flwr_dot_proto_dot_control__pb2.UnregisterNodeResponse.SerializeToString,
189
+ ),
190
+ 'ListNodes': grpc.unary_unary_rpc_method_handler(
191
+ servicer.ListNodes,
192
+ request_deserializer=flwr_dot_proto_dot_control__pb2.ListNodesRequest.FromString,
193
+ response_serializer=flwr_dot_proto_dot_control__pb2.ListNodesResponse.SerializeToString,
194
+ ),
144
195
  }
145
196
  generic_handler = grpc.method_handlers_generic_handler(
146
197
  'flwr.proto.Control', rpc_method_handlers)
@@ -269,3 +320,54 @@ class Control(object):
269
320
  flwr_dot_proto_dot_control__pb2.PullArtifactsResponse.FromString,
270
321
  options, channel_credentials,
271
322
  insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
323
+
324
+ @staticmethod
325
+ def RegisterNode(request,
326
+ target,
327
+ options=(),
328
+ channel_credentials=None,
329
+ call_credentials=None,
330
+ insecure=False,
331
+ compression=None,
332
+ wait_for_ready=None,
333
+ timeout=None,
334
+ metadata=None):
335
+ return grpc.experimental.unary_unary(request, target, '/flwr.proto.Control/RegisterNode',
336
+ flwr_dot_proto_dot_control__pb2.RegisterNodeRequest.SerializeToString,
337
+ flwr_dot_proto_dot_control__pb2.RegisterNodeResponse.FromString,
338
+ options, channel_credentials,
339
+ insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
340
+
341
+ @staticmethod
342
+ def UnregisterNode(request,
343
+ target,
344
+ options=(),
345
+ channel_credentials=None,
346
+ call_credentials=None,
347
+ insecure=False,
348
+ compression=None,
349
+ wait_for_ready=None,
350
+ timeout=None,
351
+ metadata=None):
352
+ return grpc.experimental.unary_unary(request, target, '/flwr.proto.Control/UnregisterNode',
353
+ flwr_dot_proto_dot_control__pb2.UnregisterNodeRequest.SerializeToString,
354
+ flwr_dot_proto_dot_control__pb2.UnregisterNodeResponse.FromString,
355
+ options, channel_credentials,
356
+ insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
357
+
358
+ @staticmethod
359
+ def ListNodes(request,
360
+ target,
361
+ options=(),
362
+ channel_credentials=None,
363
+ call_credentials=None,
364
+ insecure=False,
365
+ compression=None,
366
+ wait_for_ready=None,
367
+ timeout=None,
368
+ metadata=None):
369
+ return grpc.experimental.unary_unary(request, target, '/flwr.proto.Control/ListNodes',
370
+ flwr_dot_proto_dot_control__pb2.ListNodesRequest.SerializeToString,
371
+ flwr_dot_proto_dot_control__pb2.ListNodesResponse.FromString,
372
+ options, channel_credentials,
373
+ insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
@@ -44,6 +44,21 @@ class ControlStub:
44
44
  flwr.proto.control_pb2.PullArtifactsResponse]
45
45
  """Pull artifacts generated during a run (flwr pull)"""
46
46
 
47
+ RegisterNode: grpc.UnaryUnaryMultiCallable[
48
+ flwr.proto.control_pb2.RegisterNodeRequest,
49
+ flwr.proto.control_pb2.RegisterNodeResponse]
50
+ """Register SuperNode"""
51
+
52
+ UnregisterNode: grpc.UnaryUnaryMultiCallable[
53
+ flwr.proto.control_pb2.UnregisterNodeRequest,
54
+ flwr.proto.control_pb2.UnregisterNodeResponse]
55
+ """Unregister SuperNode"""
56
+
57
+ ListNodes: grpc.UnaryUnaryMultiCallable[
58
+ flwr.proto.control_pb2.ListNodesRequest,
59
+ flwr.proto.control_pb2.ListNodesResponse]
60
+ """List SuperNodes"""
61
+
47
62
 
48
63
  class ControlServicer(metaclass=abc.ABCMeta):
49
64
  @abc.abstractmethod
@@ -102,5 +117,29 @@ class ControlServicer(metaclass=abc.ABCMeta):
102
117
  """Pull artifacts generated during a run (flwr pull)"""
103
118
  pass
104
119
 
120
+ @abc.abstractmethod
121
+ def RegisterNode(self,
122
+ request: flwr.proto.control_pb2.RegisterNodeRequest,
123
+ context: grpc.ServicerContext,
124
+ ) -> flwr.proto.control_pb2.RegisterNodeResponse:
125
+ """Register SuperNode"""
126
+ pass
127
+
128
+ @abc.abstractmethod
129
+ def UnregisterNode(self,
130
+ request: flwr.proto.control_pb2.UnregisterNodeRequest,
131
+ context: grpc.ServicerContext,
132
+ ) -> flwr.proto.control_pb2.UnregisterNodeResponse:
133
+ """Unregister SuperNode"""
134
+ pass
135
+
136
+ @abc.abstractmethod
137
+ def ListNodes(self,
138
+ request: flwr.proto.control_pb2.ListNodesRequest,
139
+ context: grpc.ServicerContext,
140
+ ) -> flwr.proto.control_pb2.ListNodesResponse:
141
+ """List SuperNodes"""
142
+ pass
143
+
105
144
 
106
145
  def add_ControlServicer_to_server(servicer: ControlServicer, server: grpc.Server) -> None: ...
flwr/proto/fab_pb2.py CHANGED
@@ -15,17 +15,21 @@ _sym_db = _symbol_database.Default()
15
15
  from flwr.proto import node_pb2 as flwr_dot_proto_dot_node__pb2
16
16
 
17
17
 
18
- DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x14\x66lwr/proto/fab.proto\x12\nflwr.proto\x1a\x15\x66lwr/proto/node.proto\"(\n\x03\x46\x61\x62\x12\x10\n\x08hash_str\x18\x01 \x01(\t\x12\x0f\n\x07\x63ontent\x18\x02 \x01(\x0c\"Q\n\rGetFabRequest\x12\x1e\n\x04node\x18\x01 \x01(\x0b\x32\x10.flwr.proto.Node\x12\x10\n\x08hash_str\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\x04\".\n\x0eGetFabResponse\x12\x1c\n\x03\x66\x61\x62\x18\x01 \x01(\x0b\x32\x0f.flwr.proto.Fabb\x06proto3')
18
+ DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x14\x66lwr/proto/fab.proto\x12\nflwr.proto\x1a\x15\x66lwr/proto/node.proto\"\x99\x01\n\x03\x46\x61\x62\x12\x10\n\x08hash_str\x18\x01 \x01(\t\x12\x0f\n\x07\x63ontent\x18\x02 \x01(\x0c\x12\x39\n\rverifications\x18\x03 \x03(\x0b\x32\".flwr.proto.Fab.VerificationsEntry\x1a\x34\n\x12VerificationsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"Q\n\rGetFabRequest\x12\x1e\n\x04node\x18\x01 \x01(\x0b\x32\x10.flwr.proto.Node\x12\x10\n\x08hash_str\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\x04\".\n\x0eGetFabResponse\x12\x1c\n\x03\x66\x61\x62\x18\x01 \x01(\x0b\x32\x0f.flwr.proto.Fabb\x06proto3')
19
19
 
20
20
  _globals = globals()
21
21
  _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
22
22
  _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'flwr.proto.fab_pb2', _globals)
23
23
  if _descriptor._USE_C_DESCRIPTORS == False:
24
24
  DESCRIPTOR._options = None
25
- _globals['_FAB']._serialized_start=59
26
- _globals['_FAB']._serialized_end=99
27
- _globals['_GETFABREQUEST']._serialized_start=101
28
- _globals['_GETFABREQUEST']._serialized_end=182
29
- _globals['_GETFABRESPONSE']._serialized_start=184
30
- _globals['_GETFABRESPONSE']._serialized_end=230
25
+ _globals['_FAB_VERIFICATIONSENTRY']._options = None
26
+ _globals['_FAB_VERIFICATIONSENTRY']._serialized_options = b'8\001'
27
+ _globals['_FAB']._serialized_start=60
28
+ _globals['_FAB']._serialized_end=213
29
+ _globals['_FAB_VERIFICATIONSENTRY']._serialized_start=161
30
+ _globals['_FAB_VERIFICATIONSENTRY']._serialized_end=213
31
+ _globals['_GETFABREQUEST']._serialized_start=215
32
+ _globals['_GETFABREQUEST']._serialized_end=296
33
+ _globals['_GETFABRESPONSE']._serialized_start=298
34
+ _globals['_GETFABRESPONSE']._serialized_end=344
31
35
  # @@protoc_insertion_point(module_scope)
flwr/proto/fab_pb2.pyi CHANGED
@@ -5,6 +5,7 @@ isort:skip_file
5
5
  import builtins
6
6
  import flwr.proto.node_pb2
7
7
  import google.protobuf.descriptor
8
+ import google.protobuf.internal.containers
8
9
  import google.protobuf.message
9
10
  import typing
10
11
  import typing_extensions
@@ -13,8 +14,22 @@ DESCRIPTOR: google.protobuf.descriptor.FileDescriptor
13
14
 
14
15
  class Fab(google.protobuf.message.Message):
15
16
  DESCRIPTOR: google.protobuf.descriptor.Descriptor
17
+ class VerificationsEntry(google.protobuf.message.Message):
18
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
19
+ KEY_FIELD_NUMBER: builtins.int
20
+ VALUE_FIELD_NUMBER: builtins.int
21
+ key: typing.Text
22
+ value: typing.Text
23
+ def __init__(self,
24
+ *,
25
+ key: typing.Text = ...,
26
+ value: typing.Text = ...,
27
+ ) -> None: ...
28
+ def ClearField(self, field_name: typing_extensions.Literal["key",b"key","value",b"value"]) -> None: ...
29
+
16
30
  HASH_STR_FIELD_NUMBER: builtins.int
17
31
  CONTENT_FIELD_NUMBER: builtins.int
32
+ VERIFICATIONS_FIELD_NUMBER: builtins.int
18
33
  hash_str: typing.Text
19
34
  """This field is the hash of the data field. It is used to identify the data.
20
35
  The hash is calculated using the SHA-256 algorithm and is represented as a
@@ -24,12 +39,17 @@ class Fab(google.protobuf.message.Message):
24
39
  content: builtins.bytes
25
40
  """This field contains the fab file contents a one bytes blob."""
26
41
 
42
+ @property
43
+ def verifications(self) -> google.protobuf.internal.containers.ScalarMap[typing.Text, typing.Text]:
44
+ """Verifications."""
45
+ pass
27
46
  def __init__(self,
28
47
  *,
29
48
  hash_str: typing.Text = ...,
30
49
  content: builtins.bytes = ...,
50
+ verifications: typing.Optional[typing.Mapping[typing.Text, typing.Text]] = ...,
31
51
  ) -> None: ...
32
- def ClearField(self, field_name: typing_extensions.Literal["content",b"content","hash_str",b"hash_str"]) -> None: ...
52
+ def ClearField(self, field_name: typing_extensions.Literal["content",b"content","hash_str",b"hash_str","verifications",b"verifications"]) -> None: ...
33
53
  global___Fab = Fab
34
54
 
35
55
  class GetFabRequest(google.protobuf.message.Message):