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.
- flwr/cli/log.py +3 -3
- flwr/cli/login/login.py +3 -7
- flwr/cli/ls.py +3 -3
- flwr/cli/run/run.py +2 -6
- flwr/cli/stop.py +2 -2
- flwr/cli/utils.py +5 -4
- flwr/client/grpc_rere_client/connection.py +2 -0
- flwr/client/message_handler/message_handler.py +1 -1
- flwr/common/auth_plugin/__init__.py +2 -0
- flwr/common/auth_plugin/auth_plugin.py +18 -0
- flwr/common/constant.py +3 -0
- flwr/common/inflatable.py +33 -2
- flwr/common/message.py +5 -1
- flwr/common/record/array.py +38 -1
- flwr/common/record/arrayrecord.py +34 -0
- flwr/common/serde.py +6 -1
- flwr/compat/client/app.py +9 -151
- flwr/proto/fleet_pb2.py +25 -13
- flwr/proto/fleet_pb2.pyi +60 -3
- flwr/proto/message_pb2.py +22 -19
- flwr/proto/message_pb2.pyi +25 -2
- flwr/proto/serverappio_pb2.py +31 -19
- flwr/proto/serverappio_pb2.pyi +60 -3
- flwr/server/app.py +44 -1
- flwr/server/grid/grpc_grid.py +2 -1
- flwr/server/grid/inmemory_grid.py +5 -4
- flwr/server/superlink/fleet/message_handler/message_handler.py +1 -2
- flwr/server/superlink/fleet/vce/vce_api.py +3 -0
- flwr/server/superlink/linkstate/in_memory_linkstate.py +14 -25
- flwr/server/superlink/linkstate/linkstate.py +9 -10
- flwr/server/superlink/linkstate/sqlite_linkstate.py +11 -21
- flwr/server/superlink/linkstate/utils.py +23 -23
- flwr/server/superlink/serverappio/serverappio_servicer.py +6 -10
- flwr/server/utils/validator.py +2 -2
- flwr/supercore/object_store/in_memory_object_store.py +30 -4
- flwr/supercore/object_store/object_store.py +48 -1
- flwr/superexec/exec_servicer.py +1 -2
- {flwr_nightly-1.19.0.dev20250526.dist-info → flwr_nightly-1.19.0.dev20250528.dist-info}/METADATA +1 -1
- {flwr_nightly-1.19.0.dev20250526.dist-info → flwr_nightly-1.19.0.dev20250528.dist-info}/RECORD +41 -41
- {flwr_nightly-1.19.0.dev20250526.dist-info → flwr_nightly-1.19.0.dev20250528.dist-info}/WHEEL +0 -0
- {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\"
|
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=
|
42
|
-
_globals['_PULLMESSAGESRESPONSE']._serialized_end=
|
43
|
-
_globals['
|
44
|
-
_globals['
|
45
|
-
_globals['
|
46
|
-
_globals['
|
47
|
-
_globals['
|
48
|
-
_globals['
|
49
|
-
_globals['
|
50
|
-
_globals['
|
51
|
-
_globals['
|
52
|
-
_globals['
|
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\"
|
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=
|
32
|
-
_globals['_MESSAGE']._serialized_end=
|
33
|
-
_globals['_CONTEXT']._serialized_start=
|
34
|
-
_globals['_CONTEXT']._serialized_end=
|
35
|
-
_globals['_CONTEXT_NODECONFIGENTRY']._serialized_start=
|
36
|
-
_globals['_CONTEXT_NODECONFIGENTRY']._serialized_end=
|
37
|
-
_globals['_CONTEXT_RUNCONFIGENTRY']._serialized_start=
|
38
|
-
_globals['_CONTEXT_RUNCONFIGENTRY']._serialized_end=
|
39
|
-
_globals['_METADATA']._serialized_start=
|
40
|
-
_globals['_METADATA']._serialized_end=
|
41
|
-
_globals['
|
42
|
-
_globals['
|
43
|
-
_globals['
|
44
|
-
_globals['
|
45
|
-
_globals['
|
46
|
-
_globals['
|
47
|
-
_globals['
|
48
|
-
_globals['
|
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)
|
flwr/proto/message_pb2.pyi
CHANGED
@@ -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
|
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
|
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):
|
flwr/proto/serverappio_pb2.py
CHANGED
@@ -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\"
|
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=
|
35
|
-
_globals['_PUSHINSMESSAGESREQUEST']._serialized_end=
|
36
|
-
_globals['
|
37
|
-
_globals['
|
38
|
-
_globals['
|
39
|
-
_globals['
|
40
|
-
_globals['
|
41
|
-
_globals['
|
42
|
-
_globals['
|
43
|
-
_globals['
|
44
|
-
_globals['
|
45
|
-
_globals['
|
46
|
-
_globals['
|
47
|
-
_globals['
|
48
|
-
_globals['
|
49
|
-
_globals['
|
50
|
-
_globals['
|
51
|
-
_globals['
|
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)
|
flwr/proto/serverappio_pb2.pyi
CHANGED
@@ -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:
|
flwr/server/grid/grpc_grid.py
CHANGED
@@ -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
|