flwr-nightly 1.19.0.dev20250526__py3-none-any.whl → 1.19.0.dev20250528__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 (41) hide show
  1. flwr/cli/log.py +3 -3
  2. flwr/cli/login/login.py +3 -7
  3. flwr/cli/ls.py +3 -3
  4. flwr/cli/run/run.py +2 -6
  5. flwr/cli/stop.py +2 -2
  6. flwr/cli/utils.py +5 -4
  7. flwr/client/grpc_rere_client/connection.py +2 -0
  8. flwr/client/message_handler/message_handler.py +1 -1
  9. flwr/common/auth_plugin/__init__.py +2 -0
  10. flwr/common/auth_plugin/auth_plugin.py +18 -0
  11. flwr/common/constant.py +3 -0
  12. flwr/common/inflatable.py +33 -2
  13. flwr/common/message.py +5 -1
  14. flwr/common/record/array.py +38 -1
  15. flwr/common/record/arrayrecord.py +34 -0
  16. flwr/common/serde.py +6 -1
  17. flwr/compat/client/app.py +9 -151
  18. flwr/proto/fleet_pb2.py +25 -13
  19. flwr/proto/fleet_pb2.pyi +60 -3
  20. flwr/proto/message_pb2.py +22 -19
  21. flwr/proto/message_pb2.pyi +25 -2
  22. flwr/proto/serverappio_pb2.py +31 -19
  23. flwr/proto/serverappio_pb2.pyi +60 -3
  24. flwr/server/app.py +44 -1
  25. flwr/server/grid/grpc_grid.py +2 -1
  26. flwr/server/grid/inmemory_grid.py +5 -4
  27. flwr/server/superlink/fleet/message_handler/message_handler.py +1 -2
  28. flwr/server/superlink/fleet/vce/vce_api.py +3 -0
  29. flwr/server/superlink/linkstate/in_memory_linkstate.py +14 -25
  30. flwr/server/superlink/linkstate/linkstate.py +9 -10
  31. flwr/server/superlink/linkstate/sqlite_linkstate.py +11 -21
  32. flwr/server/superlink/linkstate/utils.py +23 -23
  33. flwr/server/superlink/serverappio/serverappio_servicer.py +6 -10
  34. flwr/server/utils/validator.py +2 -2
  35. flwr/supercore/object_store/in_memory_object_store.py +30 -4
  36. flwr/supercore/object_store/object_store.py +48 -1
  37. flwr/superexec/exec_servicer.py +1 -2
  38. {flwr_nightly-1.19.0.dev20250526.dist-info → flwr_nightly-1.19.0.dev20250528.dist-info}/METADATA +1 -1
  39. {flwr_nightly-1.19.0.dev20250526.dist-info → flwr_nightly-1.19.0.dev20250528.dist-info}/RECORD +41 -41
  40. {flwr_nightly-1.19.0.dev20250526.dist-info → flwr_nightly-1.19.0.dev20250528.dist-info}/WHEEL +0 -0
  41. {flwr_nightly-1.19.0.dev20250526.dist-info → flwr_nightly-1.19.0.dev20250528.dist-info}/entry_points.txt +0 -0
flwr/proto/fleet_pb2.py CHANGED
@@ -19,15 +19,21 @@ from flwr.proto import fab_pb2 as flwr_dot_proto_dot_fab__pb2
19
19
  from flwr.proto import message_pb2 as flwr_dot_proto_dot_message__pb2
20
20
 
21
21
 
22
- DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x16\x66lwr/proto/fleet.proto\x12\nflwr.proto\x1a\x1a\x66lwr/proto/heartbeat.proto\x1a\x15\x66lwr/proto/node.proto\x1a\x14\x66lwr/proto/run.proto\x1a\x14\x66lwr/proto/fab.proto\x1a\x18\x66lwr/proto/message.proto\"/\n\x11\x43reateNodeRequest\x12\x1a\n\x12heartbeat_interval\x18\x01 \x01(\x01\"4\n\x12\x43reateNodeResponse\x12\x1e\n\x04node\x18\x01 \x01(\x0b\x32\x10.flwr.proto.Node\"3\n\x11\x44\x65leteNodeRequest\x12\x1e\n\x04node\x18\x01 \x01(\x0b\x32\x10.flwr.proto.Node\"\x14\n\x12\x44\x65leteNodeResponse\"J\n\x13PullMessagesRequest\x12\x1e\n\x04node\x18\x01 \x01(\x0b\x32\x10.flwr.proto.Node\x12\x13\n\x0bmessage_ids\x18\x02 \x03(\t\"l\n\x14PullMessagesResponse\x12(\n\treconnect\x18\x01 \x01(\x0b\x32\x15.flwr.proto.Reconnect\x12*\n\rmessages_list\x18\x02 \x03(\x0b\x32\x13.flwr.proto.Message\"a\n\x13PushMessagesRequest\x12\x1e\n\x04node\x18\x01 \x01(\x0b\x32\x10.flwr.proto.Node\x12*\n\rmessages_list\x18\x02 \x03(\x0b\x32\x13.flwr.proto.Message\"\xb0\x01\n\x14PushMessagesResponse\x12(\n\treconnect\x18\x01 \x01(\x0b\x32\x15.flwr.proto.Reconnect\x12>\n\x07results\x18\x02 \x03(\x0b\x32-.flwr.proto.PushMessagesResponse.ResultsEntry\x1a.\n\x0cResultsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\r:\x02\x38\x01\"\x1e\n\tReconnect\x12\x11\n\treconnect\x18\x01 \x01(\x04\x32\xd7\x05\n\x05\x46leet\x12M\n\nCreateNode\x12\x1d.flwr.proto.CreateNodeRequest\x1a\x1e.flwr.proto.CreateNodeResponse\"\x00\x12M\n\nDeleteNode\x12\x1d.flwr.proto.DeleteNodeRequest\x1a\x1e.flwr.proto.DeleteNodeResponse\"\x00\x12\x62\n\x11SendNodeHeartbeat\x12$.flwr.proto.SendNodeHeartbeatRequest\x1a%.flwr.proto.SendNodeHeartbeatResponse\"\x00\x12S\n\x0cPullMessages\x12\x1f.flwr.proto.PullMessagesRequest\x1a .flwr.proto.PullMessagesResponse\"\x00\x12S\n\x0cPushMessages\x12\x1f.flwr.proto.PushMessagesRequest\x1a .flwr.proto.PushMessagesResponse\"\x00\x12\x41\n\x06GetRun\x12\x19.flwr.proto.GetRunRequest\x1a\x1a.flwr.proto.GetRunResponse\"\x00\x12\x41\n\x06GetFab\x12\x19.flwr.proto.GetFabRequest\x1a\x1a.flwr.proto.GetFabResponse\"\x00\x12M\n\nPushObject\x12\x1d.flwr.proto.PushObjectRequest\x1a\x1e.flwr.proto.PushObjectResponse\"\x00\x12M\n\nPullObject\x12\x1d.flwr.proto.PullObjectRequest\x1a\x1e.flwr.proto.PullObjectResponse\"\x00\x62\x06proto3')
22
+ DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x16\x66lwr/proto/fleet.proto\x12\nflwr.proto\x1a\x1a\x66lwr/proto/heartbeat.proto\x1a\x15\x66lwr/proto/node.proto\x1a\x14\x66lwr/proto/run.proto\x1a\x14\x66lwr/proto/fab.proto\x1a\x18\x66lwr/proto/message.proto\"/\n\x11\x43reateNodeRequest\x12\x1a\n\x12heartbeat_interval\x18\x01 \x01(\x01\"4\n\x12\x43reateNodeResponse\x12\x1e\n\x04node\x18\x01 \x01(\x0b\x32\x10.flwr.proto.Node\"3\n\x11\x44\x65leteNodeRequest\x12\x1e\n\x04node\x18\x01 \x01(\x0b\x32\x10.flwr.proto.Node\"\x14\n\x12\x44\x65leteNodeResponse\"J\n\x13PullMessagesRequest\x12\x1e\n\x04node\x18\x01 \x01(\x0b\x32\x10.flwr.proto.Node\x12\x13\n\x0bmessage_ids\x18\x02 \x03(\t\"\x87\x02\n\x14PullMessagesResponse\x12(\n\treconnect\x18\x01 \x01(\x0b\x32\x15.flwr.proto.Reconnect\x12*\n\rmessages_list\x18\x02 \x03(\x0b\x32\x13.flwr.proto.Message\x12L\n\x0fobjects_to_pull\x18\x03 \x03(\x0b\x32\x33.flwr.proto.PullMessagesResponse.ObjectsToPullEntry\x1aK\n\x12ObjectsToPullEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12$\n\x05value\x18\x02 \x01(\x0b\x32\x15.flwr.proto.ObjectIDs:\x02\x38\x01\"\x91\x02\n\x13PushMessagesRequest\x12\x1e\n\x04node\x18\x01 \x01(\x0b\x32\x10.flwr.proto.Node\x12*\n\rmessages_list\x18\x02 \x03(\x0b\x32\x13.flwr.proto.Message\x12Z\n\x17msg_to_children_mapping\x18\x03 \x03(\x0b\x32\x39.flwr.proto.PushMessagesRequest.MsgToChildrenMappingEntry\x1aR\n\x19MsgToChildrenMappingEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12$\n\x05value\x18\x02 \x01(\x0b\x32\x15.flwr.proto.ObjectIDs:\x02\x38\x01\"\xcb\x02\n\x14PushMessagesResponse\x12(\n\treconnect\x18\x01 \x01(\x0b\x32\x15.flwr.proto.Reconnect\x12>\n\x07results\x18\x02 \x03(\x0b\x32-.flwr.proto.PushMessagesResponse.ResultsEntry\x12L\n\x0fobjects_to_push\x18\x03 \x03(\x0b\x32\x33.flwr.proto.PushMessagesResponse.ObjectsToPushEntry\x1a.\n\x0cResultsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\r:\x02\x38\x01\x1aK\n\x12ObjectsToPushEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12$\n\x05value\x18\x02 \x01(\x0b\x32\x15.flwr.proto.ObjectIDs:\x02\x38\x01\"\x1e\n\tReconnect\x12\x11\n\treconnect\x18\x01 \x01(\x04\x32\xd7\x05\n\x05\x46leet\x12M\n\nCreateNode\x12\x1d.flwr.proto.CreateNodeRequest\x1a\x1e.flwr.proto.CreateNodeResponse\"\x00\x12M\n\nDeleteNode\x12\x1d.flwr.proto.DeleteNodeRequest\x1a\x1e.flwr.proto.DeleteNodeResponse\"\x00\x12\x62\n\x11SendNodeHeartbeat\x12$.flwr.proto.SendNodeHeartbeatRequest\x1a%.flwr.proto.SendNodeHeartbeatResponse\"\x00\x12S\n\x0cPullMessages\x12\x1f.flwr.proto.PullMessagesRequest\x1a .flwr.proto.PullMessagesResponse\"\x00\x12S\n\x0cPushMessages\x12\x1f.flwr.proto.PushMessagesRequest\x1a .flwr.proto.PushMessagesResponse\"\x00\x12\x41\n\x06GetRun\x12\x19.flwr.proto.GetRunRequest\x1a\x1a.flwr.proto.GetRunResponse\"\x00\x12\x41\n\x06GetFab\x12\x19.flwr.proto.GetFabRequest\x1a\x1a.flwr.proto.GetFabResponse\"\x00\x12M\n\nPushObject\x12\x1d.flwr.proto.PushObjectRequest\x1a\x1e.flwr.proto.PushObjectResponse\"\x00\x12M\n\nPullObject\x12\x1d.flwr.proto.PullObjectRequest\x1a\x1e.flwr.proto.PullObjectResponse\"\x00\x62\x06proto3')
23
23
 
24
24
  _globals = globals()
25
25
  _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
26
26
  _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'flwr.proto.fleet_pb2', _globals)
27
27
  if _descriptor._USE_C_DESCRIPTORS == False:
28
28
  DESCRIPTOR._options = None
29
+ _globals['_PULLMESSAGESRESPONSE_OBJECTSTOPULLENTRY']._options = None
30
+ _globals['_PULLMESSAGESRESPONSE_OBJECTSTOPULLENTRY']._serialized_options = b'8\001'
31
+ _globals['_PUSHMESSAGESREQUEST_MSGTOCHILDRENMAPPINGENTRY']._options = None
32
+ _globals['_PUSHMESSAGESREQUEST_MSGTOCHILDRENMAPPINGENTRY']._serialized_options = b'8\001'
29
33
  _globals['_PUSHMESSAGESRESPONSE_RESULTSENTRY']._options = None
30
34
  _globals['_PUSHMESSAGESRESPONSE_RESULTSENTRY']._serialized_options = b'8\001'
35
+ _globals['_PUSHMESSAGESRESPONSE_OBJECTSTOPUSHENTRY']._options = None
36
+ _globals['_PUSHMESSAGESRESPONSE_OBJECTSTOPUSHENTRY']._serialized_options = b'8\001'
31
37
  _globals['_CREATENODEREQUEST']._serialized_start=159
32
38
  _globals['_CREATENODEREQUEST']._serialized_end=206
33
39
  _globals['_CREATENODERESPONSE']._serialized_start=208
@@ -38,16 +44,22 @@ if _descriptor._USE_C_DESCRIPTORS == False:
38
44
  _globals['_DELETENODERESPONSE']._serialized_end=335
39
45
  _globals['_PULLMESSAGESREQUEST']._serialized_start=337
40
46
  _globals['_PULLMESSAGESREQUEST']._serialized_end=411
41
- _globals['_PULLMESSAGESRESPONSE']._serialized_start=413
42
- _globals['_PULLMESSAGESRESPONSE']._serialized_end=521
43
- _globals['_PUSHMESSAGESREQUEST']._serialized_start=523
44
- _globals['_PUSHMESSAGESREQUEST']._serialized_end=620
45
- _globals['_PUSHMESSAGESRESPONSE']._serialized_start=623
46
- _globals['_PUSHMESSAGESRESPONSE']._serialized_end=799
47
- _globals['_PUSHMESSAGESRESPONSE_RESULTSENTRY']._serialized_start=753
48
- _globals['_PUSHMESSAGESRESPONSE_RESULTSENTRY']._serialized_end=799
49
- _globals['_RECONNECT']._serialized_start=801
50
- _globals['_RECONNECT']._serialized_end=831
51
- _globals['_FLEET']._serialized_start=834
52
- _globals['_FLEET']._serialized_end=1561
47
+ _globals['_PULLMESSAGESRESPONSE']._serialized_start=414
48
+ _globals['_PULLMESSAGESRESPONSE']._serialized_end=677
49
+ _globals['_PULLMESSAGESRESPONSE_OBJECTSTOPULLENTRY']._serialized_start=602
50
+ _globals['_PULLMESSAGESRESPONSE_OBJECTSTOPULLENTRY']._serialized_end=677
51
+ _globals['_PUSHMESSAGESREQUEST']._serialized_start=680
52
+ _globals['_PUSHMESSAGESREQUEST']._serialized_end=953
53
+ _globals['_PUSHMESSAGESREQUEST_MSGTOCHILDRENMAPPINGENTRY']._serialized_start=871
54
+ _globals['_PUSHMESSAGESREQUEST_MSGTOCHILDRENMAPPINGENTRY']._serialized_end=953
55
+ _globals['_PUSHMESSAGESRESPONSE']._serialized_start=956
56
+ _globals['_PUSHMESSAGESRESPONSE']._serialized_end=1287
57
+ _globals['_PUSHMESSAGESRESPONSE_RESULTSENTRY']._serialized_start=1164
58
+ _globals['_PUSHMESSAGESRESPONSE_RESULTSENTRY']._serialized_end=1210
59
+ _globals['_PUSHMESSAGESRESPONSE_OBJECTSTOPUSHENTRY']._serialized_start=1212
60
+ _globals['_PUSHMESSAGESRESPONSE_OBJECTSTOPUSHENTRY']._serialized_end=1287
61
+ _globals['_RECONNECT']._serialized_start=1289
62
+ _globals['_RECONNECT']._serialized_end=1319
63
+ _globals['_FLEET']._serialized_start=1322
64
+ _globals['_FLEET']._serialized_end=2049
53
65
  # @@protoc_insertion_point(module_scope)
flwr/proto/fleet_pb2.pyi CHANGED
@@ -78,37 +78,75 @@ global___PullMessagesRequest = PullMessagesRequest
78
78
 
79
79
  class PullMessagesResponse(google.protobuf.message.Message):
80
80
  DESCRIPTOR: google.protobuf.descriptor.Descriptor
81
+ class ObjectsToPullEntry(google.protobuf.message.Message):
82
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
83
+ KEY_FIELD_NUMBER: builtins.int
84
+ VALUE_FIELD_NUMBER: builtins.int
85
+ key: typing.Text
86
+ @property
87
+ def value(self) -> flwr.proto.message_pb2.ObjectIDs: ...
88
+ def __init__(self,
89
+ *,
90
+ key: typing.Text = ...,
91
+ value: typing.Optional[flwr.proto.message_pb2.ObjectIDs] = ...,
92
+ ) -> None: ...
93
+ def HasField(self, field_name: typing_extensions.Literal["value",b"value"]) -> builtins.bool: ...
94
+ def ClearField(self, field_name: typing_extensions.Literal["key",b"key","value",b"value"]) -> None: ...
95
+
81
96
  RECONNECT_FIELD_NUMBER: builtins.int
82
97
  MESSAGES_LIST_FIELD_NUMBER: builtins.int
98
+ OBJECTS_TO_PULL_FIELD_NUMBER: builtins.int
83
99
  @property
84
100
  def reconnect(self) -> global___Reconnect: ...
85
101
  @property
86
102
  def messages_list(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[flwr.proto.message_pb2.Message]: ...
103
+ @property
104
+ def objects_to_pull(self) -> google.protobuf.internal.containers.MessageMap[typing.Text, flwr.proto.message_pb2.ObjectIDs]: ...
87
105
  def __init__(self,
88
106
  *,
89
107
  reconnect: typing.Optional[global___Reconnect] = ...,
90
108
  messages_list: typing.Optional[typing.Iterable[flwr.proto.message_pb2.Message]] = ...,
109
+ objects_to_pull: typing.Optional[typing.Mapping[typing.Text, flwr.proto.message_pb2.ObjectIDs]] = ...,
91
110
  ) -> None: ...
92
111
  def HasField(self, field_name: typing_extensions.Literal["reconnect",b"reconnect"]) -> builtins.bool: ...
93
- def ClearField(self, field_name: typing_extensions.Literal["messages_list",b"messages_list","reconnect",b"reconnect"]) -> None: ...
112
+ def ClearField(self, field_name: typing_extensions.Literal["messages_list",b"messages_list","objects_to_pull",b"objects_to_pull","reconnect",b"reconnect"]) -> None: ...
94
113
  global___PullMessagesResponse = PullMessagesResponse
95
114
 
96
115
  class PushMessagesRequest(google.protobuf.message.Message):
97
116
  """PushMessages messages"""
98
117
  DESCRIPTOR: google.protobuf.descriptor.Descriptor
118
+ class MsgToChildrenMappingEntry(google.protobuf.message.Message):
119
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
120
+ KEY_FIELD_NUMBER: builtins.int
121
+ VALUE_FIELD_NUMBER: builtins.int
122
+ key: typing.Text
123
+ @property
124
+ def value(self) -> flwr.proto.message_pb2.ObjectIDs: ...
125
+ def __init__(self,
126
+ *,
127
+ key: typing.Text = ...,
128
+ value: typing.Optional[flwr.proto.message_pb2.ObjectIDs] = ...,
129
+ ) -> None: ...
130
+ def HasField(self, field_name: typing_extensions.Literal["value",b"value"]) -> builtins.bool: ...
131
+ def ClearField(self, field_name: typing_extensions.Literal["key",b"key","value",b"value"]) -> None: ...
132
+
99
133
  NODE_FIELD_NUMBER: builtins.int
100
134
  MESSAGES_LIST_FIELD_NUMBER: builtins.int
135
+ MSG_TO_CHILDREN_MAPPING_FIELD_NUMBER: builtins.int
101
136
  @property
102
137
  def node(self) -> flwr.proto.node_pb2.Node: ...
103
138
  @property
104
139
  def messages_list(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[flwr.proto.message_pb2.Message]: ...
140
+ @property
141
+ def msg_to_children_mapping(self) -> google.protobuf.internal.containers.MessageMap[typing.Text, flwr.proto.message_pb2.ObjectIDs]: ...
105
142
  def __init__(self,
106
143
  *,
107
144
  node: typing.Optional[flwr.proto.node_pb2.Node] = ...,
108
145
  messages_list: typing.Optional[typing.Iterable[flwr.proto.message_pb2.Message]] = ...,
146
+ msg_to_children_mapping: typing.Optional[typing.Mapping[typing.Text, flwr.proto.message_pb2.ObjectIDs]] = ...,
109
147
  ) -> None: ...
110
148
  def HasField(self, field_name: typing_extensions.Literal["node",b"node"]) -> builtins.bool: ...
111
- def ClearField(self, field_name: typing_extensions.Literal["messages_list",b"messages_list","node",b"node"]) -> None: ...
149
+ def ClearField(self, field_name: typing_extensions.Literal["messages_list",b"messages_list","msg_to_children_mapping",b"msg_to_children_mapping","node",b"node"]) -> None: ...
112
150
  global___PushMessagesRequest = PushMessagesRequest
113
151
 
114
152
  class PushMessagesResponse(google.protobuf.message.Message):
@@ -126,19 +164,38 @@ class PushMessagesResponse(google.protobuf.message.Message):
126
164
  ) -> None: ...
127
165
  def ClearField(self, field_name: typing_extensions.Literal["key",b"key","value",b"value"]) -> None: ...
128
166
 
167
+ class ObjectsToPushEntry(google.protobuf.message.Message):
168
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
169
+ KEY_FIELD_NUMBER: builtins.int
170
+ VALUE_FIELD_NUMBER: builtins.int
171
+ key: typing.Text
172
+ @property
173
+ def value(self) -> flwr.proto.message_pb2.ObjectIDs: ...
174
+ def __init__(self,
175
+ *,
176
+ key: typing.Text = ...,
177
+ value: typing.Optional[flwr.proto.message_pb2.ObjectIDs] = ...,
178
+ ) -> None: ...
179
+ def HasField(self, field_name: typing_extensions.Literal["value",b"value"]) -> builtins.bool: ...
180
+ def ClearField(self, field_name: typing_extensions.Literal["key",b"key","value",b"value"]) -> None: ...
181
+
129
182
  RECONNECT_FIELD_NUMBER: builtins.int
130
183
  RESULTS_FIELD_NUMBER: builtins.int
184
+ OBJECTS_TO_PUSH_FIELD_NUMBER: builtins.int
131
185
  @property
132
186
  def reconnect(self) -> global___Reconnect: ...
133
187
  @property
134
188
  def results(self) -> google.protobuf.internal.containers.ScalarMap[typing.Text, builtins.int]: ...
189
+ @property
190
+ def objects_to_push(self) -> google.protobuf.internal.containers.MessageMap[typing.Text, flwr.proto.message_pb2.ObjectIDs]: ...
135
191
  def __init__(self,
136
192
  *,
137
193
  reconnect: typing.Optional[global___Reconnect] = ...,
138
194
  results: typing.Optional[typing.Mapping[typing.Text, builtins.int]] = ...,
195
+ objects_to_push: typing.Optional[typing.Mapping[typing.Text, flwr.proto.message_pb2.ObjectIDs]] = ...,
139
196
  ) -> None: ...
140
197
  def HasField(self, field_name: typing_extensions.Literal["reconnect",b"reconnect"]) -> builtins.bool: ...
141
- def ClearField(self, field_name: typing_extensions.Literal["reconnect",b"reconnect","results",b"results"]) -> None: ...
198
+ def ClearField(self, field_name: typing_extensions.Literal["objects_to_push",b"objects_to_push","reconnect",b"reconnect","results",b"results"]) -> None: ...
142
199
  global___PushMessagesResponse = PushMessagesResponse
143
200
 
144
201
  class Reconnect(google.protobuf.message.Message):
flwr/proto/message_pb2.py CHANGED
@@ -15,9 +15,10 @@ _sym_db = _symbol_database.Default()
15
15
  from flwr.proto import error_pb2 as flwr_dot_proto_dot_error__pb2
16
16
  from flwr.proto import recorddict_pb2 as flwr_dot_proto_dot_recorddict__pb2
17
17
  from flwr.proto import transport_pb2 as flwr_dot_proto_dot_transport__pb2
18
+ from flwr.proto import node_pb2 as flwr_dot_proto_dot_node__pb2
18
19
 
19
20
 
20
- DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x18\x66lwr/proto/message.proto\x12\nflwr.proto\x1a\x16\x66lwr/proto/error.proto\x1a\x1b\x66lwr/proto/recorddict.proto\x1a\x1a\x66lwr/proto/transport.proto\"|\n\x07Message\x12&\n\x08metadata\x18\x01 \x01(\x0b\x32\x14.flwr.proto.Metadata\x12\'\n\x07\x63ontent\x18\x02 \x01(\x0b\x32\x16.flwr.proto.RecordDict\x12 \n\x05\x65rror\x18\x03 \x01(\x0b\x32\x11.flwr.proto.Error\"\xd0\x02\n\x07\x43ontext\x12\x0e\n\x06run_id\x18\x01 \x01(\x04\x12\x0f\n\x07node_id\x18\x02 \x01(\x04\x12\x38\n\x0bnode_config\x18\x03 \x03(\x0b\x32#.flwr.proto.Context.NodeConfigEntry\x12%\n\x05state\x18\x04 \x01(\x0b\x32\x16.flwr.proto.RecordDict\x12\x36\n\nrun_config\x18\x05 \x03(\x0b\x32\".flwr.proto.Context.RunConfigEntry\x1a\x45\n\x0fNodeConfigEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12!\n\x05value\x18\x02 \x01(\x0b\x32\x12.flwr.proto.Scalar:\x02\x38\x01\x1a\x44\n\x0eRunConfigEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12!\n\x05value\x18\x02 \x01(\x0b\x32\x12.flwr.proto.Scalar:\x02\x38\x01\"\xbe\x01\n\x08Metadata\x12\x0e\n\x06run_id\x18\x01 \x01(\x04\x12\x12\n\nmessage_id\x18\x02 \x01(\t\x12\x13\n\x0bsrc_node_id\x18\x03 \x01(\x04\x12\x13\n\x0b\x64st_node_id\x18\x04 \x01(\x04\x12\x1b\n\x13reply_to_message_id\x18\x05 \x01(\t\x12\x10\n\x08group_id\x18\x06 \x01(\t\x12\x0b\n\x03ttl\x18\x07 \x01(\x01\x12\x14\n\x0cmessage_type\x18\x08 \x01(\t\x12\x12\n\ncreated_at\x18\t \x01(\x01\">\n\x11PushObjectRequest\x12\x11\n\tobject_id\x18\x01 \x01(\t\x12\x16\n\x0eobject_content\x18\x02 \x01(\x0c\"\x14\n\x12PushObjectResponse\"&\n\x11PullObjectRequest\x12\x11\n\tobject_id\x18\x01 \x01(\t\",\n\x12PullObjectResponse\x12\x16\n\x0eobject_content\x18\x01 \x01(\x0c\x62\x06proto3')
21
+ DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x18\x66lwr/proto/message.proto\x12\nflwr.proto\x1a\x16\x66lwr/proto/error.proto\x1a\x1b\x66lwr/proto/recorddict.proto\x1a\x1a\x66lwr/proto/transport.proto\x1a\x15\x66lwr/proto/node.proto\"|\n\x07Message\x12&\n\x08metadata\x18\x01 \x01(\x0b\x32\x14.flwr.proto.Metadata\x12\'\n\x07\x63ontent\x18\x02 \x01(\x0b\x32\x16.flwr.proto.RecordDict\x12 \n\x05\x65rror\x18\x03 \x01(\x0b\x32\x11.flwr.proto.Error\"\xd0\x02\n\x07\x43ontext\x12\x0e\n\x06run_id\x18\x01 \x01(\x04\x12\x0f\n\x07node_id\x18\x02 \x01(\x04\x12\x38\n\x0bnode_config\x18\x03 \x03(\x0b\x32#.flwr.proto.Context.NodeConfigEntry\x12%\n\x05state\x18\x04 \x01(\x0b\x32\x16.flwr.proto.RecordDict\x12\x36\n\nrun_config\x18\x05 \x03(\x0b\x32\".flwr.proto.Context.RunConfigEntry\x1a\x45\n\x0fNodeConfigEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12!\n\x05value\x18\x02 \x01(\x0b\x32\x12.flwr.proto.Scalar:\x02\x38\x01\x1a\x44\n\x0eRunConfigEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12!\n\x05value\x18\x02 \x01(\x0b\x32\x12.flwr.proto.Scalar:\x02\x38\x01\"\xbe\x01\n\x08Metadata\x12\x0e\n\x06run_id\x18\x01 \x01(\x04\x12\x12\n\nmessage_id\x18\x02 \x01(\t\x12\x13\n\x0bsrc_node_id\x18\x03 \x01(\x04\x12\x13\n\x0b\x64st_node_id\x18\x04 \x01(\x04\x12\x1b\n\x13reply_to_message_id\x18\x05 \x01(\t\x12\x10\n\x08group_id\x18\x06 \x01(\t\x12\x0b\n\x03ttl\x18\x07 \x01(\x01\x12\x14\n\x0cmessage_type\x18\x08 \x01(\t\x12\x12\n\ncreated_at\x18\t \x01(\x01\"\x1e\n\tObjectIDs\x12\x11\n\tobject_id\x18\x01 \x03(\t\"^\n\x11PushObjectRequest\x12\x1e\n\x04node\x18\x01 \x01(\x0b\x32\x10.flwr.proto.Node\x12\x11\n\tobject_id\x18\x02 \x01(\t\x12\x16\n\x0eobject_content\x18\x03 \x01(\x0c\"\x14\n\x12PushObjectResponse\"F\n\x11PullObjectRequest\x12\x1e\n\x04node\x18\x01 \x01(\x0b\x32\x10.flwr.proto.Node\x12\x11\n\tobject_id\x18\x02 \x01(\t\",\n\x12PullObjectResponse\x12\x16\n\x0eobject_content\x18\x01 \x01(\x0c\x62\x06proto3')
21
22
 
22
23
  _globals = globals()
23
24
  _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
@@ -28,22 +29,24 @@ if _descriptor._USE_C_DESCRIPTORS == False:
28
29
  _globals['_CONTEXT_NODECONFIGENTRY']._serialized_options = b'8\001'
29
30
  _globals['_CONTEXT_RUNCONFIGENTRY']._options = None
30
31
  _globals['_CONTEXT_RUNCONFIGENTRY']._serialized_options = b'8\001'
31
- _globals['_MESSAGE']._serialized_start=121
32
- _globals['_MESSAGE']._serialized_end=245
33
- _globals['_CONTEXT']._serialized_start=248
34
- _globals['_CONTEXT']._serialized_end=584
35
- _globals['_CONTEXT_NODECONFIGENTRY']._serialized_start=445
36
- _globals['_CONTEXT_NODECONFIGENTRY']._serialized_end=514
37
- _globals['_CONTEXT_RUNCONFIGENTRY']._serialized_start=516
38
- _globals['_CONTEXT_RUNCONFIGENTRY']._serialized_end=584
39
- _globals['_METADATA']._serialized_start=587
40
- _globals['_METADATA']._serialized_end=777
41
- _globals['_PUSHOBJECTREQUEST']._serialized_start=779
42
- _globals['_PUSHOBJECTREQUEST']._serialized_end=841
43
- _globals['_PUSHOBJECTRESPONSE']._serialized_start=843
44
- _globals['_PUSHOBJECTRESPONSE']._serialized_end=863
45
- _globals['_PULLOBJECTREQUEST']._serialized_start=865
46
- _globals['_PULLOBJECTREQUEST']._serialized_end=903
47
- _globals['_PULLOBJECTRESPONSE']._serialized_start=905
48
- _globals['_PULLOBJECTRESPONSE']._serialized_end=949
32
+ _globals['_MESSAGE']._serialized_start=144
33
+ _globals['_MESSAGE']._serialized_end=268
34
+ _globals['_CONTEXT']._serialized_start=271
35
+ _globals['_CONTEXT']._serialized_end=607
36
+ _globals['_CONTEXT_NODECONFIGENTRY']._serialized_start=468
37
+ _globals['_CONTEXT_NODECONFIGENTRY']._serialized_end=537
38
+ _globals['_CONTEXT_RUNCONFIGENTRY']._serialized_start=539
39
+ _globals['_CONTEXT_RUNCONFIGENTRY']._serialized_end=607
40
+ _globals['_METADATA']._serialized_start=610
41
+ _globals['_METADATA']._serialized_end=800
42
+ _globals['_OBJECTIDS']._serialized_start=802
43
+ _globals['_OBJECTIDS']._serialized_end=832
44
+ _globals['_PUSHOBJECTREQUEST']._serialized_start=834
45
+ _globals['_PUSHOBJECTREQUEST']._serialized_end=928
46
+ _globals['_PUSHOBJECTRESPONSE']._serialized_start=930
47
+ _globals['_PUSHOBJECTRESPONSE']._serialized_end=950
48
+ _globals['_PULLOBJECTREQUEST']._serialized_start=952
49
+ _globals['_PULLOBJECTREQUEST']._serialized_end=1022
50
+ _globals['_PULLOBJECTRESPONSE']._serialized_start=1024
51
+ _globals['_PULLOBJECTRESPONSE']._serialized_end=1068
49
52
  # @@protoc_insertion_point(module_scope)
@@ -4,6 +4,7 @@ isort:skip_file
4
4
  """
5
5
  import builtins
6
6
  import flwr.proto.error_pb2
7
+ import flwr.proto.node_pb2
7
8
  import flwr.proto.recorddict_pb2
8
9
  import flwr.proto.transport_pb2
9
10
  import google.protobuf.descriptor
@@ -127,19 +128,36 @@ class Metadata(google.protobuf.message.Message):
127
128
  def ClearField(self, field_name: typing_extensions.Literal["created_at",b"created_at","dst_node_id",b"dst_node_id","group_id",b"group_id","message_id",b"message_id","message_type",b"message_type","reply_to_message_id",b"reply_to_message_id","run_id",b"run_id","src_node_id",b"src_node_id","ttl",b"ttl"]) -> None: ...
128
129
  global___Metadata = Metadata
129
130
 
131
+ class ObjectIDs(google.protobuf.message.Message):
132
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
133
+ OBJECT_ID_FIELD_NUMBER: builtins.int
134
+ @property
135
+ def object_id(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[typing.Text]: ...
136
+ def __init__(self,
137
+ *,
138
+ object_id: typing.Optional[typing.Iterable[typing.Text]] = ...,
139
+ ) -> None: ...
140
+ def ClearField(self, field_name: typing_extensions.Literal["object_id",b"object_id"]) -> None: ...
141
+ global___ObjectIDs = ObjectIDs
142
+
130
143
  class PushObjectRequest(google.protobuf.message.Message):
131
144
  """PushObject messages"""
132
145
  DESCRIPTOR: google.protobuf.descriptor.Descriptor
146
+ NODE_FIELD_NUMBER: builtins.int
133
147
  OBJECT_ID_FIELD_NUMBER: builtins.int
134
148
  OBJECT_CONTENT_FIELD_NUMBER: builtins.int
149
+ @property
150
+ def node(self) -> flwr.proto.node_pb2.Node: ...
135
151
  object_id: typing.Text
136
152
  object_content: builtins.bytes
137
153
  def __init__(self,
138
154
  *,
155
+ node: typing.Optional[flwr.proto.node_pb2.Node] = ...,
139
156
  object_id: typing.Text = ...,
140
157
  object_content: builtins.bytes = ...,
141
158
  ) -> None: ...
142
- def ClearField(self, field_name: typing_extensions.Literal["object_content",b"object_content","object_id",b"object_id"]) -> None: ...
159
+ def HasField(self, field_name: typing_extensions.Literal["node",b"node"]) -> builtins.bool: ...
160
+ def ClearField(self, field_name: typing_extensions.Literal["node",b"node","object_content",b"object_content","object_id",b"object_id"]) -> None: ...
143
161
  global___PushObjectRequest = PushObjectRequest
144
162
 
145
163
  class PushObjectResponse(google.protobuf.message.Message):
@@ -151,13 +169,18 @@ global___PushObjectResponse = PushObjectResponse
151
169
  class PullObjectRequest(google.protobuf.message.Message):
152
170
  """PullObject messages"""
153
171
  DESCRIPTOR: google.protobuf.descriptor.Descriptor
172
+ NODE_FIELD_NUMBER: builtins.int
154
173
  OBJECT_ID_FIELD_NUMBER: builtins.int
174
+ @property
175
+ def node(self) -> flwr.proto.node_pb2.Node: ...
155
176
  object_id: typing.Text
156
177
  def __init__(self,
157
178
  *,
179
+ node: typing.Optional[flwr.proto.node_pb2.Node] = ...,
158
180
  object_id: typing.Text = ...,
159
181
  ) -> None: ...
160
- def ClearField(self, field_name: typing_extensions.Literal["object_id",b"object_id"]) -> None: ...
182
+ def HasField(self, field_name: typing_extensions.Literal["node",b"node"]) -> builtins.bool: ...
183
+ def ClearField(self, field_name: typing_extensions.Literal["node",b"node","object_id",b"object_id"]) -> None: ...
161
184
  global___PullObjectRequest = PullObjectRequest
162
185
 
163
186
  class PullObjectResponse(google.protobuf.message.Message):
@@ -20,33 +20,45 @@ from flwr.proto import run_pb2 as flwr_dot_proto_dot_run__pb2
20
20
  from flwr.proto import fab_pb2 as flwr_dot_proto_dot_fab__pb2
21
21
 
22
22
 
23
- DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1c\x66lwr/proto/serverappio.proto\x12\nflwr.proto\x1a\x1a\x66lwr/proto/heartbeat.proto\x1a\x14\x66lwr/proto/log.proto\x1a\x15\x66lwr/proto/node.proto\x1a\x18\x66lwr/proto/message.proto\x1a\x14\x66lwr/proto/run.proto\x1a\x14\x66lwr/proto/fab.proto\"!\n\x0fGetNodesRequest\x12\x0e\n\x06run_id\x18\x01 \x01(\x04\"3\n\x10GetNodesResponse\x12\x1f\n\x05nodes\x18\x01 \x03(\x0b\x32\x10.flwr.proto.Node\"T\n\x16PushInsMessagesRequest\x12*\n\rmessages_list\x18\x01 \x03(\x0b\x32\x13.flwr.proto.Message\x12\x0e\n\x06run_id\x18\x02 \x01(\x04\".\n\x17PushInsMessagesResponse\x12\x13\n\x0bmessage_ids\x18\x01 \x03(\t\"=\n\x16PullResMessagesRequest\x12\x13\n\x0bmessage_ids\x18\x01 \x03(\t\x12\x0e\n\x06run_id\x18\x02 \x01(\x04\"E\n\x17PullResMessagesResponse\x12*\n\rmessages_list\x18\x01 \x03(\x0b\x32\x13.flwr.proto.Message\"\x1c\n\x1aPullServerAppInputsRequest\"\x7f\n\x1bPullServerAppInputsResponse\x12$\n\x07\x63ontext\x18\x01 \x01(\x0b\x32\x13.flwr.proto.Context\x12\x1c\n\x03run\x18\x02 \x01(\x0b\x32\x0f.flwr.proto.Run\x12\x1c\n\x03\x66\x61\x62\x18\x03 \x01(\x0b\x32\x0f.flwr.proto.Fab\"S\n\x1bPushServerAppOutputsRequest\x12\x0e\n\x06run_id\x18\x01 \x01(\x04\x12$\n\x07\x63ontext\x18\x02 \x01(\x0b\x32\x13.flwr.proto.Context\"\x1e\n\x1cPushServerAppOutputsResponse2\xe4\x08\n\x0bServerAppIo\x12G\n\x08GetNodes\x12\x1b.flwr.proto.GetNodesRequest\x1a\x1c.flwr.proto.GetNodesResponse\"\x00\x12Y\n\x0cPushMessages\x12\".flwr.proto.PushInsMessagesRequest\x1a#.flwr.proto.PushInsMessagesResponse\"\x00\x12Y\n\x0cPullMessages\x12\".flwr.proto.PullResMessagesRequest\x1a#.flwr.proto.PullResMessagesResponse\"\x00\x12\x41\n\x06GetRun\x12\x19.flwr.proto.GetRunRequest\x1a\x1a.flwr.proto.GetRunResponse\"\x00\x12\x41\n\x06GetFab\x12\x19.flwr.proto.GetFabRequest\x1a\x1a.flwr.proto.GetFabResponse\"\x00\x12h\n\x13PullServerAppInputs\x12&.flwr.proto.PullServerAppInputsRequest\x1a\'.flwr.proto.PullServerAppInputsResponse\"\x00\x12k\n\x14PushServerAppOutputs\x12\'.flwr.proto.PushServerAppOutputsRequest\x1a(.flwr.proto.PushServerAppOutputsResponse\"\x00\x12\\\n\x0fUpdateRunStatus\x12\".flwr.proto.UpdateRunStatusRequest\x1a#.flwr.proto.UpdateRunStatusResponse\"\x00\x12S\n\x0cGetRunStatus\x12\x1f.flwr.proto.GetRunStatusRequest\x1a .flwr.proto.GetRunStatusResponse\"\x00\x12G\n\x08PushLogs\x12\x1b.flwr.proto.PushLogsRequest\x1a\x1c.flwr.proto.PushLogsResponse\"\x00\x12_\n\x10SendAppHeartbeat\x12#.flwr.proto.SendAppHeartbeatRequest\x1a$.flwr.proto.SendAppHeartbeatResponse\"\x00\x12M\n\nPushObject\x12\x1d.flwr.proto.PushObjectRequest\x1a\x1e.flwr.proto.PushObjectResponse\"\x00\x12M\n\nPullObject\x12\x1d.flwr.proto.PullObjectRequest\x1a\x1e.flwr.proto.PullObjectResponse\"\x00\x62\x06proto3')
23
+ DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1c\x66lwr/proto/serverappio.proto\x12\nflwr.proto\x1a\x1a\x66lwr/proto/heartbeat.proto\x1a\x14\x66lwr/proto/log.proto\x1a\x15\x66lwr/proto/node.proto\x1a\x18\x66lwr/proto/message.proto\x1a\x14\x66lwr/proto/run.proto\x1a\x14\x66lwr/proto/fab.proto\"!\n\x0fGetNodesRequest\x12\x0e\n\x06run_id\x18\x01 \x01(\x04\"3\n\x10GetNodesResponse\x12\x1f\n\x05nodes\x18\x01 \x03(\x0b\x32\x10.flwr.proto.Node\"\x87\x02\n\x16PushInsMessagesRequest\x12*\n\rmessages_list\x18\x01 \x03(\x0b\x32\x13.flwr.proto.Message\x12\x0e\n\x06run_id\x18\x02 \x01(\x04\x12]\n\x17msg_to_children_mapping\x18\x03 \x03(\x0b\x32<.flwr.proto.PushInsMessagesRequest.MsgToChildrenMappingEntry\x1aR\n\x19MsgToChildrenMappingEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12$\n\x05value\x18\x02 \x01(\x0b\x32\x15.flwr.proto.ObjectIDs:\x02\x38\x01\"\xcc\x01\n\x17PushInsMessagesResponse\x12\x13\n\x0bmessage_ids\x18\x01 \x03(\t\x12O\n\x0fobjects_to_push\x18\x02 \x03(\x0b\x32\x36.flwr.proto.PushInsMessagesResponse.ObjectsToPushEntry\x1aK\n\x12ObjectsToPushEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12$\n\x05value\x18\x02 \x01(\x0b\x32\x15.flwr.proto.ObjectIDs:\x02\x38\x01\"=\n\x16PullResMessagesRequest\x12\x13\n\x0bmessage_ids\x18\x01 \x03(\t\x12\x0e\n\x06run_id\x18\x02 \x01(\x04\"\xe3\x01\n\x17PullResMessagesResponse\x12*\n\rmessages_list\x18\x01 \x03(\x0b\x32\x13.flwr.proto.Message\x12O\n\x0fobjects_to_pull\x18\x02 \x03(\x0b\x32\x36.flwr.proto.PullResMessagesResponse.ObjectsToPullEntry\x1aK\n\x12ObjectsToPullEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12$\n\x05value\x18\x02 \x01(\x0b\x32\x15.flwr.proto.ObjectIDs:\x02\x38\x01\"\x1c\n\x1aPullServerAppInputsRequest\"\x7f\n\x1bPullServerAppInputsResponse\x12$\n\x07\x63ontext\x18\x01 \x01(\x0b\x32\x13.flwr.proto.Context\x12\x1c\n\x03run\x18\x02 \x01(\x0b\x32\x0f.flwr.proto.Run\x12\x1c\n\x03\x66\x61\x62\x18\x03 \x01(\x0b\x32\x0f.flwr.proto.Fab\"S\n\x1bPushServerAppOutputsRequest\x12\x0e\n\x06run_id\x18\x01 \x01(\x04\x12$\n\x07\x63ontext\x18\x02 \x01(\x0b\x32\x13.flwr.proto.Context\"\x1e\n\x1cPushServerAppOutputsResponse2\xe4\x08\n\x0bServerAppIo\x12G\n\x08GetNodes\x12\x1b.flwr.proto.GetNodesRequest\x1a\x1c.flwr.proto.GetNodesResponse\"\x00\x12Y\n\x0cPushMessages\x12\".flwr.proto.PushInsMessagesRequest\x1a#.flwr.proto.PushInsMessagesResponse\"\x00\x12Y\n\x0cPullMessages\x12\".flwr.proto.PullResMessagesRequest\x1a#.flwr.proto.PullResMessagesResponse\"\x00\x12\x41\n\x06GetRun\x12\x19.flwr.proto.GetRunRequest\x1a\x1a.flwr.proto.GetRunResponse\"\x00\x12\x41\n\x06GetFab\x12\x19.flwr.proto.GetFabRequest\x1a\x1a.flwr.proto.GetFabResponse\"\x00\x12h\n\x13PullServerAppInputs\x12&.flwr.proto.PullServerAppInputsRequest\x1a\'.flwr.proto.PullServerAppInputsResponse\"\x00\x12k\n\x14PushServerAppOutputs\x12\'.flwr.proto.PushServerAppOutputsRequest\x1a(.flwr.proto.PushServerAppOutputsResponse\"\x00\x12\\\n\x0fUpdateRunStatus\x12\".flwr.proto.UpdateRunStatusRequest\x1a#.flwr.proto.UpdateRunStatusResponse\"\x00\x12S\n\x0cGetRunStatus\x12\x1f.flwr.proto.GetRunStatusRequest\x1a .flwr.proto.GetRunStatusResponse\"\x00\x12G\n\x08PushLogs\x12\x1b.flwr.proto.PushLogsRequest\x1a\x1c.flwr.proto.PushLogsResponse\"\x00\x12_\n\x10SendAppHeartbeat\x12#.flwr.proto.SendAppHeartbeatRequest\x1a$.flwr.proto.SendAppHeartbeatResponse\"\x00\x12M\n\nPushObject\x12\x1d.flwr.proto.PushObjectRequest\x1a\x1e.flwr.proto.PushObjectResponse\"\x00\x12M\n\nPullObject\x12\x1d.flwr.proto.PullObjectRequest\x1a\x1e.flwr.proto.PullObjectResponse\"\x00\x62\x06proto3')
24
24
 
25
25
  _globals = globals()
26
26
  _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
27
27
  _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'flwr.proto.serverappio_pb2', _globals)
28
28
  if _descriptor._USE_C_DESCRIPTORS == False:
29
29
  DESCRIPTOR._options = None
30
+ _globals['_PUSHINSMESSAGESREQUEST_MSGTOCHILDRENMAPPINGENTRY']._options = None
31
+ _globals['_PUSHINSMESSAGESREQUEST_MSGTOCHILDRENMAPPINGENTRY']._serialized_options = b'8\001'
32
+ _globals['_PUSHINSMESSAGESRESPONSE_OBJECTSTOPUSHENTRY']._options = None
33
+ _globals['_PUSHINSMESSAGESRESPONSE_OBJECTSTOPUSHENTRY']._serialized_options = b'8\001'
34
+ _globals['_PULLRESMESSAGESRESPONSE_OBJECTSTOPULLENTRY']._options = None
35
+ _globals['_PULLRESMESSAGESRESPONSE_OBJECTSTOPULLENTRY']._serialized_options = b'8\001'
30
36
  _globals['_GETNODESREQUEST']._serialized_start=187
31
37
  _globals['_GETNODESREQUEST']._serialized_end=220
32
38
  _globals['_GETNODESRESPONSE']._serialized_start=222
33
39
  _globals['_GETNODESRESPONSE']._serialized_end=273
34
- _globals['_PUSHINSMESSAGESREQUEST']._serialized_start=275
35
- _globals['_PUSHINSMESSAGESREQUEST']._serialized_end=359
36
- _globals['_PUSHINSMESSAGESRESPONSE']._serialized_start=361
37
- _globals['_PUSHINSMESSAGESRESPONSE']._serialized_end=407
38
- _globals['_PULLRESMESSAGESREQUEST']._serialized_start=409
39
- _globals['_PULLRESMESSAGESREQUEST']._serialized_end=470
40
- _globals['_PULLRESMESSAGESRESPONSE']._serialized_start=472
41
- _globals['_PULLRESMESSAGESRESPONSE']._serialized_end=541
42
- _globals['_PULLSERVERAPPINPUTSREQUEST']._serialized_start=543
43
- _globals['_PULLSERVERAPPINPUTSREQUEST']._serialized_end=571
44
- _globals['_PULLSERVERAPPINPUTSRESPONSE']._serialized_start=573
45
- _globals['_PULLSERVERAPPINPUTSRESPONSE']._serialized_end=700
46
- _globals['_PUSHSERVERAPPOUTPUTSREQUEST']._serialized_start=702
47
- _globals['_PUSHSERVERAPPOUTPUTSREQUEST']._serialized_end=785
48
- _globals['_PUSHSERVERAPPOUTPUTSRESPONSE']._serialized_start=787
49
- _globals['_PUSHSERVERAPPOUTPUTSRESPONSE']._serialized_end=817
50
- _globals['_SERVERAPPIO']._serialized_start=820
51
- _globals['_SERVERAPPIO']._serialized_end=1944
40
+ _globals['_PUSHINSMESSAGESREQUEST']._serialized_start=276
41
+ _globals['_PUSHINSMESSAGESREQUEST']._serialized_end=539
42
+ _globals['_PUSHINSMESSAGESREQUEST_MSGTOCHILDRENMAPPINGENTRY']._serialized_start=457
43
+ _globals['_PUSHINSMESSAGESREQUEST_MSGTOCHILDRENMAPPINGENTRY']._serialized_end=539
44
+ _globals['_PUSHINSMESSAGESRESPONSE']._serialized_start=542
45
+ _globals['_PUSHINSMESSAGESRESPONSE']._serialized_end=746
46
+ _globals['_PUSHINSMESSAGESRESPONSE_OBJECTSTOPUSHENTRY']._serialized_start=671
47
+ _globals['_PUSHINSMESSAGESRESPONSE_OBJECTSTOPUSHENTRY']._serialized_end=746
48
+ _globals['_PULLRESMESSAGESREQUEST']._serialized_start=748
49
+ _globals['_PULLRESMESSAGESREQUEST']._serialized_end=809
50
+ _globals['_PULLRESMESSAGESRESPONSE']._serialized_start=812
51
+ _globals['_PULLRESMESSAGESRESPONSE']._serialized_end=1039
52
+ _globals['_PULLRESMESSAGESRESPONSE_OBJECTSTOPULLENTRY']._serialized_start=964
53
+ _globals['_PULLRESMESSAGESRESPONSE_OBJECTSTOPULLENTRY']._serialized_end=1039
54
+ _globals['_PULLSERVERAPPINPUTSREQUEST']._serialized_start=1041
55
+ _globals['_PULLSERVERAPPINPUTSREQUEST']._serialized_end=1069
56
+ _globals['_PULLSERVERAPPINPUTSRESPONSE']._serialized_start=1071
57
+ _globals['_PULLSERVERAPPINPUTSRESPONSE']._serialized_end=1198
58
+ _globals['_PUSHSERVERAPPOUTPUTSREQUEST']._serialized_start=1200
59
+ _globals['_PUSHSERVERAPPOUTPUTSREQUEST']._serialized_end=1283
60
+ _globals['_PUSHSERVERAPPOUTPUTSRESPONSE']._serialized_start=1285
61
+ _globals['_PUSHSERVERAPPOUTPUTSRESPONSE']._serialized_end=1315
62
+ _globals['_SERVERAPPIO']._serialized_start=1318
63
+ _globals['_SERVERAPPIO']._serialized_end=2442
52
64
  # @@protoc_insertion_point(module_scope)
@@ -42,29 +42,67 @@ global___GetNodesResponse = GetNodesResponse
42
42
  class PushInsMessagesRequest(google.protobuf.message.Message):
43
43
  """PushMessages messages"""
44
44
  DESCRIPTOR: google.protobuf.descriptor.Descriptor
45
+ class MsgToChildrenMappingEntry(google.protobuf.message.Message):
46
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
47
+ KEY_FIELD_NUMBER: builtins.int
48
+ VALUE_FIELD_NUMBER: builtins.int
49
+ key: typing.Text
50
+ @property
51
+ def value(self) -> flwr.proto.message_pb2.ObjectIDs: ...
52
+ def __init__(self,
53
+ *,
54
+ key: typing.Text = ...,
55
+ value: typing.Optional[flwr.proto.message_pb2.ObjectIDs] = ...,
56
+ ) -> None: ...
57
+ def HasField(self, field_name: typing_extensions.Literal["value",b"value"]) -> builtins.bool: ...
58
+ def ClearField(self, field_name: typing_extensions.Literal["key",b"key","value",b"value"]) -> None: ...
59
+
45
60
  MESSAGES_LIST_FIELD_NUMBER: builtins.int
46
61
  RUN_ID_FIELD_NUMBER: builtins.int
62
+ MSG_TO_CHILDREN_MAPPING_FIELD_NUMBER: builtins.int
47
63
  @property
48
64
  def messages_list(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[flwr.proto.message_pb2.Message]: ...
49
65
  run_id: builtins.int
66
+ @property
67
+ def msg_to_children_mapping(self) -> google.protobuf.internal.containers.MessageMap[typing.Text, flwr.proto.message_pb2.ObjectIDs]: ...
50
68
  def __init__(self,
51
69
  *,
52
70
  messages_list: typing.Optional[typing.Iterable[flwr.proto.message_pb2.Message]] = ...,
53
71
  run_id: builtins.int = ...,
72
+ msg_to_children_mapping: typing.Optional[typing.Mapping[typing.Text, flwr.proto.message_pb2.ObjectIDs]] = ...,
54
73
  ) -> None: ...
55
- def ClearField(self, field_name: typing_extensions.Literal["messages_list",b"messages_list","run_id",b"run_id"]) -> None: ...
74
+ def ClearField(self, field_name: typing_extensions.Literal["messages_list",b"messages_list","msg_to_children_mapping",b"msg_to_children_mapping","run_id",b"run_id"]) -> None: ...
56
75
  global___PushInsMessagesRequest = PushInsMessagesRequest
57
76
 
58
77
  class PushInsMessagesResponse(google.protobuf.message.Message):
59
78
  DESCRIPTOR: google.protobuf.descriptor.Descriptor
79
+ class ObjectsToPushEntry(google.protobuf.message.Message):
80
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
81
+ KEY_FIELD_NUMBER: builtins.int
82
+ VALUE_FIELD_NUMBER: builtins.int
83
+ key: typing.Text
84
+ @property
85
+ def value(self) -> flwr.proto.message_pb2.ObjectIDs: ...
86
+ def __init__(self,
87
+ *,
88
+ key: typing.Text = ...,
89
+ value: typing.Optional[flwr.proto.message_pb2.ObjectIDs] = ...,
90
+ ) -> None: ...
91
+ def HasField(self, field_name: typing_extensions.Literal["value",b"value"]) -> builtins.bool: ...
92
+ def ClearField(self, field_name: typing_extensions.Literal["key",b"key","value",b"value"]) -> None: ...
93
+
60
94
  MESSAGE_IDS_FIELD_NUMBER: builtins.int
95
+ OBJECTS_TO_PUSH_FIELD_NUMBER: builtins.int
61
96
  @property
62
97
  def message_ids(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[typing.Text]: ...
98
+ @property
99
+ def objects_to_push(self) -> google.protobuf.internal.containers.MessageMap[typing.Text, flwr.proto.message_pb2.ObjectIDs]: ...
63
100
  def __init__(self,
64
101
  *,
65
102
  message_ids: typing.Optional[typing.Iterable[typing.Text]] = ...,
103
+ objects_to_push: typing.Optional[typing.Mapping[typing.Text, flwr.proto.message_pb2.ObjectIDs]] = ...,
66
104
  ) -> None: ...
67
- def ClearField(self, field_name: typing_extensions.Literal["message_ids",b"message_ids"]) -> None: ...
105
+ def ClearField(self, field_name: typing_extensions.Literal["message_ids",b"message_ids","objects_to_push",b"objects_to_push"]) -> None: ...
68
106
  global___PushInsMessagesResponse = PushInsMessagesResponse
69
107
 
70
108
  class PullResMessagesRequest(google.protobuf.message.Message):
@@ -85,14 +123,33 @@ global___PullResMessagesRequest = PullResMessagesRequest
85
123
 
86
124
  class PullResMessagesResponse(google.protobuf.message.Message):
87
125
  DESCRIPTOR: google.protobuf.descriptor.Descriptor
126
+ class ObjectsToPullEntry(google.protobuf.message.Message):
127
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
128
+ KEY_FIELD_NUMBER: builtins.int
129
+ VALUE_FIELD_NUMBER: builtins.int
130
+ key: typing.Text
131
+ @property
132
+ def value(self) -> flwr.proto.message_pb2.ObjectIDs: ...
133
+ def __init__(self,
134
+ *,
135
+ key: typing.Text = ...,
136
+ value: typing.Optional[flwr.proto.message_pb2.ObjectIDs] = ...,
137
+ ) -> None: ...
138
+ def HasField(self, field_name: typing_extensions.Literal["value",b"value"]) -> builtins.bool: ...
139
+ def ClearField(self, field_name: typing_extensions.Literal["key",b"key","value",b"value"]) -> None: ...
140
+
88
141
  MESSAGES_LIST_FIELD_NUMBER: builtins.int
142
+ OBJECTS_TO_PULL_FIELD_NUMBER: builtins.int
89
143
  @property
90
144
  def messages_list(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[flwr.proto.message_pb2.Message]: ...
145
+ @property
146
+ def objects_to_pull(self) -> google.protobuf.internal.containers.MessageMap[typing.Text, flwr.proto.message_pb2.ObjectIDs]: ...
91
147
  def __init__(self,
92
148
  *,
93
149
  messages_list: typing.Optional[typing.Iterable[flwr.proto.message_pb2.Message]] = ...,
150
+ objects_to_pull: typing.Optional[typing.Mapping[typing.Text, flwr.proto.message_pb2.ObjectIDs]] = ...,
94
151
  ) -> None: ...
95
- def ClearField(self, field_name: typing_extensions.Literal["messages_list",b"messages_list"]) -> None: ...
152
+ def ClearField(self, field_name: typing_extensions.Literal["messages_list",b"messages_list","objects_to_pull",b"objects_to_pull"]) -> None: ...
96
153
  global___PullResMessagesResponse = PullResMessagesResponse
97
154
 
98
155
  class PullServerAppInputsRequest(google.protobuf.message.Message):
flwr/server/app.py CHANGED
@@ -37,10 +37,11 @@ from cryptography.hazmat.primitives.serialization import load_ssh_public_key
37
37
  from flwr.common import GRPC_MAX_MESSAGE_LENGTH, EventType, event
38
38
  from flwr.common.address import parse_address
39
39
  from flwr.common.args import try_obtain_server_certificates
40
- from flwr.common.auth_plugin import ExecAuthPlugin
40
+ from flwr.common.auth_plugin import ExecAuthPlugin, ExecAuthzPlugin
41
41
  from flwr.common.config import get_flwr_dir, parse_config_args
42
42
  from flwr.common.constant import (
43
43
  AUTH_TYPE_YAML_KEY,
44
+ AUTHZ_TYPE_YAML_KEY,
44
45
  CLIENT_OCTET,
45
46
  EXEC_API_DEFAULT_SERVER_ADDRESS,
46
47
  FLEET_API_GRPC_RERE_DEFAULT_ADDRESS,
@@ -91,6 +92,7 @@ try:
91
92
  add_ee_args_superlink,
92
93
  get_dashboard_server,
93
94
  get_exec_auth_plugins,
95
+ get_exec_authz_plugins,
94
96
  get_exec_event_log_writer_plugins,
95
97
  get_fleet_event_log_writer_plugins,
96
98
  )
@@ -104,6 +106,10 @@ except ImportError:
104
106
  """Return all Exec API authentication plugins."""
105
107
  raise NotImplementedError("No authentication plugins are currently supported.")
106
108
 
109
+ def get_exec_authz_plugins() -> dict[str, type[ExecAuthzPlugin]]:
110
+ """Return all Exec API authorization plugins."""
111
+ raise NotImplementedError("No authorization plugins are currently supported.")
112
+
107
113
  def get_exec_event_log_writer_plugins() -> dict[str, type[EventLogWriterPlugin]]:
108
114
  """Return all Exec API event log writer plugins."""
109
115
  raise NotImplementedError(
@@ -145,6 +151,7 @@ def run_superlink() -> None:
145
151
  verify_tls_cert = not getattr(args, "disable_oidc_tls_cert_verification", None)
146
152
 
147
153
  auth_plugin: Optional[ExecAuthPlugin] = None
154
+ authz_plugin: Optional[ExecAuthzPlugin] = None # pylint: disable=unused-variable
148
155
  event_log_plugin: Optional[EventLogWriterPlugin] = None
149
156
  # Load the auth plugin if the args.user_auth_config is provided
150
157
  if cfg_path := getattr(args, "user_auth_config", None):
@@ -152,6 +159,13 @@ def run_superlink() -> None:
152
159
  # Enable event logging if the args.enable_event_log is True
153
160
  if args.enable_event_log:
154
161
  event_log_plugin = _try_obtain_exec_event_log_writer_plugin()
162
+ # Enable authorization if the args.enable_authorization is True
163
+ if args.enable_authorization:
164
+ # pylint: disable=unused-variable
165
+ authz_plugin = _try_obtain_exec_authz_plugin( # noqa: F841
166
+ Path(cfg_path), verify_tls_cert
167
+ )
168
+ # pylint: enable=unused-variable
155
169
 
156
170
  # Initialize StateFactory
157
171
  state_factory = LinkStateFactory(args.database)
@@ -498,6 +512,35 @@ def _try_obtain_exec_auth_plugin(
498
512
  sys.exit("No authentication plugins are currently supported.")
499
513
 
500
514
 
515
+ def _try_obtain_exec_authz_plugin(
516
+ config_path: Path, verify_tls_cert: bool
517
+ ) -> Optional[ExecAuthzPlugin]:
518
+ # Load YAML file
519
+ with config_path.open("r", encoding="utf-8") as file:
520
+ config: dict[str, Any] = yaml.safe_load(file)
521
+
522
+ # Load authentication configuration
523
+ authz_config: dict[str, Any] = config.get("authorization", {})
524
+ authz_type: str = authz_config.get(AUTHZ_TYPE_YAML_KEY, "")
525
+
526
+ # Load authorization plugin
527
+ try:
528
+ all_plugins: dict[str, type[ExecAuthzPlugin]] = get_exec_authz_plugins()
529
+ authz_plugin_class = all_plugins[authz_type]
530
+ return authz_plugin_class(
531
+ user_authz_config_path=config_path, verify_tls_cert=verify_tls_cert
532
+ )
533
+ except KeyError:
534
+ if authz_type != "":
535
+ sys.exit(
536
+ f'Authentication type "{authz_type}" is not supported. '
537
+ "Please provide a valid authorization type in the configuration."
538
+ )
539
+ sys.exit("No authorization type is provided in the configuration.")
540
+ except NotImplementedError:
541
+ sys.exit("No authorization plugins are currently supported.")
542
+
543
+
501
544
  def _try_obtain_exec_event_log_writer_plugin() -> Optional[EventLogWriterPlugin]:
502
545
  """Return an instance of the event log writer plugin."""
503
546
  try:
@@ -163,7 +163,7 @@ class GrpcGrid(Grid):
163
163
  def _check_message(self, message: Message) -> None:
164
164
  # Check if the message is valid
165
165
  if not (
166
- message.metadata.message_id == ""
166
+ message.metadata.message_id != ""
167
167
  and message.metadata.reply_to_message_id == ""
168
168
  and message.metadata.ttl > 0
169
169
  ):
@@ -211,6 +211,7 @@ class GrpcGrid(Grid):
211
211
  # Populate metadata
212
212
  msg.metadata.__dict__["_run_id"] = run_id
213
213
  msg.metadata.__dict__["_src_node_id"] = self.node.node_id
214
+ msg.metadata.__dict__["_message_id"] = msg.object_id
214
215
  # Check message
215
216
  self._check_message(msg)
216
217
  # Convert to proto