flwr-nightly 1.15.0.dev20250127__py3-none-any.whl → 1.15.0.dev20250129__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 (27) hide show
  1. flwr/cli/utils.py +5 -8
  2. flwr/client/clientapp/app.py +15 -19
  3. flwr/client/grpc_client/connection.py +1 -6
  4. flwr/client/grpc_rere_client/connection.py +12 -12
  5. flwr/client/grpc_rere_client/grpc_adapter.py +0 -16
  6. flwr/client/message_handler/task_handler.py +0 -17
  7. flwr/client/supernode/app.py +0 -24
  8. flwr/common/differential_privacy.py +2 -1
  9. flwr/common/grpc.py +6 -1
  10. flwr/proto/fleet_pb2.py +27 -40
  11. flwr/proto/fleet_pb2.pyi +0 -84
  12. flwr/proto/fleet_pb2_grpc.py +5 -93
  13. flwr/proto/fleet_pb2_grpc.pyi +12 -38
  14. flwr/server/app.py +6 -2
  15. flwr/server/driver/grpc_driver.py +5 -4
  16. flwr/server/serverapp/app.py +7 -4
  17. flwr/server/superlink/driver/serverappio_servicer.py +4 -2
  18. flwr/server/superlink/fleet/grpc_rere/fleet_servicer.py +6 -43
  19. flwr/server/superlink/fleet/grpc_rere/server_interceptor.py +2 -0
  20. flwr/server/superlink/fleet/message_handler/message_handler.py +1 -49
  21. flwr/server/superlink/fleet/rest_rere/rest_api.py +0 -27
  22. flwr/simulation/simulationio_connection.py +2 -1
  23. {flwr_nightly-1.15.0.dev20250127.dist-info → flwr_nightly-1.15.0.dev20250129.dist-info}/METADATA +1 -1
  24. {flwr_nightly-1.15.0.dev20250127.dist-info → flwr_nightly-1.15.0.dev20250129.dist-info}/RECORD +27 -27
  25. {flwr_nightly-1.15.0.dev20250127.dist-info → flwr_nightly-1.15.0.dev20250129.dist-info}/LICENSE +0 -0
  26. {flwr_nightly-1.15.0.dev20250127.dist-info → flwr_nightly-1.15.0.dev20250129.dist-info}/WHEEL +0 -0
  27. {flwr_nightly-1.15.0.dev20250127.dist-info → flwr_nightly-1.15.0.dev20250129.dist-info}/entry_points.txt +0 -0
flwr/cli/utils.py CHANGED
@@ -20,7 +20,6 @@ import json
20
20
  import re
21
21
  from collections.abc import Iterator
22
22
  from contextlib import contextmanager
23
- from logging import DEBUG
24
23
  from pathlib import Path
25
24
  from typing import Any, Callable, Optional, Union, cast
26
25
 
@@ -30,8 +29,11 @@ import typer
30
29
  from flwr.cli.cli_user_auth_interceptor import CliUserAuthInterceptor
31
30
  from flwr.common.auth_plugin import CliAuthPlugin
32
31
  from flwr.common.constant import AUTH_TYPE_KEY, CREDENTIALS_DIR, FLWR_DIR
33
- from flwr.common.grpc import GRPC_MAX_MESSAGE_LENGTH, create_channel
34
- from flwr.common.logger import log
32
+ from flwr.common.grpc import (
33
+ GRPC_MAX_MESSAGE_LENGTH,
34
+ create_channel,
35
+ on_channel_state_change,
36
+ )
35
37
 
36
38
  from .auth_plugin import get_cli_auth_plugins
37
39
  from .config_utils import validate_certificate_in_federation_config
@@ -264,11 +266,6 @@ def init_channel(
264
266
  app: Path, federation_config: dict[str, Any], auth_plugin: Optional[CliAuthPlugin]
265
267
  ) -> grpc.Channel:
266
268
  """Initialize gRPC channel to the Exec API."""
267
-
268
- def on_channel_state_change(channel_connectivity: str) -> None:
269
- """Log channel connectivity."""
270
- log(DEBUG, channel_connectivity)
271
-
272
269
  insecure, root_certificates_bytes = validate_certificate_in_federation_config(
273
270
  app, federation_config
274
271
  )
@@ -29,7 +29,7 @@ from flwr.common.args import add_args_flwr_app_common
29
29
  from flwr.common.config import get_flwr_dir
30
30
  from flwr.common.constant import CLIENTAPPIO_API_DEFAULT_CLIENT_ADDRESS, ErrorCode
31
31
  from flwr.common.exit import ExitCode, flwr_exit
32
- from flwr.common.grpc import create_channel
32
+ from flwr.common.grpc import create_channel, on_channel_state_change
33
33
  from flwr.common.logger import log
34
34
  from flwr.common.message import Error
35
35
  from flwr.common.retry_invoker import _make_simple_grpc_retry_invoker, _wrap_stub
@@ -66,11 +66,11 @@ def flwr_clientapp() -> None:
66
66
  "flwr-clientapp does not support TLS yet.",
67
67
  )
68
68
 
69
- log(INFO, "Starting Flower ClientApp")
69
+ log(INFO, "Start `flwr-clientapp` process")
70
70
  log(
71
71
  DEBUG,
72
- "Starting isolated `ClientApp` connected to SuperNode's ClientAppIo API at %s "
73
- "with token %s",
72
+ "`flwr-clientapp` will attempt to connect to SuperNode's "
73
+ "ClientAppIo API at %s with token %s",
74
74
  args.clientappio_api_address,
75
75
  args.token,
76
76
  )
@@ -83,11 +83,6 @@ def flwr_clientapp() -> None:
83
83
  )
84
84
 
85
85
 
86
- def on_channel_state_change(channel_connectivity: str) -> None:
87
- """Log channel connectivity."""
88
- log(DEBUG, channel_connectivity)
89
-
90
-
91
86
  def run_clientapp( # pylint: disable=R0914
92
87
  clientappio_api_address: str,
93
88
  run_once: bool,
@@ -116,11 +111,11 @@ def run_clientapp( # pylint: disable=R0914
116
111
  time.sleep(1)
117
112
 
118
113
  # Pull Message, Context, Run and (optional) FAB from SuperNode
119
- message, context, run, fab = pull_message(stub=stub, token=token)
114
+ message, context, run, fab = pull_clientappinputs(stub=stub, token=token)
120
115
 
121
116
  # Install FAB, if provided
122
117
  if fab:
123
- log(DEBUG, "Flower ClientApp starts FAB installation.")
118
+ log(DEBUG, "[flwr-clientapp] Start FAB installation.")
124
119
  install_from_fab(fab.content, flwr_dir=flwr_dir_, skip_prompt=True)
125
120
 
126
121
  load_client_app_fn = get_load_client_app_fn(
@@ -132,6 +127,7 @@ def run_clientapp( # pylint: disable=R0914
132
127
 
133
128
  try:
134
129
  # Load ClientApp
130
+ log(DEBUG, "[flwr-clientapp] Start `ClientApp` Loading.")
135
131
  client_app: ClientApp = load_client_app_fn(
136
132
  run.fab_id, run.fab_version, fab.hash_str if fab else ""
137
133
  )
@@ -160,7 +156,7 @@ def run_clientapp( # pylint: disable=R0914
160
156
  )
161
157
 
162
158
  # Push Message and Context to SuperNode
163
- _ = push_message(
159
+ _ = push_clientappoutputs(
164
160
  stub=stub, token=token, message=reply_message, context=context
165
161
  )
166
162
 
@@ -183,7 +179,7 @@ def run_clientapp( # pylint: disable=R0914
183
179
 
184
180
  def get_token(stub: grpc.Channel) -> Optional[int]:
185
181
  """Get a token from SuperNode."""
186
- log(DEBUG, "Flower ClientApp process requests token")
182
+ log(DEBUG, "[flwr-clientapp] Request token")
187
183
  try:
188
184
  res: GetTokenResponse = stub.GetToken(GetTokenRequest())
189
185
  log(DEBUG, "[GetToken] Received token: %s", res.token)
@@ -196,11 +192,11 @@ def get_token(stub: grpc.Channel) -> Optional[int]:
196
192
  return None
197
193
 
198
194
 
199
- def pull_message(
195
+ def pull_clientappinputs(
200
196
  stub: grpc.Channel, token: int
201
197
  ) -> tuple[Message, Context, Run, Optional[Fab]]:
202
- """Pull message from SuperNode to ClientApp."""
203
- log(INFO, "Pulling ClientAppInputs for token %s", token)
198
+ """Pull ClientAppInputs from SuperNode."""
199
+ log(INFO, "[flwr-clientapp] Pull `ClientAppInputs` for token %s", token)
204
200
  try:
205
201
  res: PullClientAppInputsResponse = stub.PullClientAppInputs(
206
202
  PullClientAppInputsRequest(token=token)
@@ -215,11 +211,11 @@ def pull_message(
215
211
  raise e
216
212
 
217
213
 
218
- def push_message(
214
+ def push_clientappoutputs(
219
215
  stub: grpc.Channel, token: int, message: Message, context: Context
220
216
  ) -> PushClientAppOutputsResponse:
221
- """Push message to SuperNode from ClientApp."""
222
- log(INFO, "Pushing ClientAppOutputs for token %s", token)
217
+ """Push ClientAppOutputs to SuperNode."""
218
+ log(INFO, "[flwr-clientapp] Push `ClientAppOutputs` for token %s", token)
223
219
  proto_message = message_to_proto(message)
224
220
  proto_context = context_to_proto(context)
225
221
 
@@ -36,7 +36,7 @@ from flwr.common import (
36
36
  from flwr.common import recordset_compat as compat
37
37
  from flwr.common import serde
38
38
  from flwr.common.constant import MessageType, MessageTypeLegacy
39
- from flwr.common.grpc import create_channel
39
+ from flwr.common.grpc import create_channel, on_channel_state_change
40
40
  from flwr.common.logger import log
41
41
  from flwr.common.retry_invoker import RetryInvoker
42
42
  from flwr.common.typing import Fab, Run
@@ -48,11 +48,6 @@ from flwr.proto.transport_pb2 import ( # pylint: disable=E0611
48
48
  from flwr.proto.transport_pb2_grpc import FlowerServiceStub # pylint: disable=E0611
49
49
 
50
50
 
51
- def on_channel_state_change(channel_connectivity: str) -> None:
52
- """Log channel connectivity."""
53
- log(DEBUG, channel_connectivity)
54
-
55
-
56
51
  @contextmanager
57
52
  def grpc_connection( # pylint: disable=R0913,R0915,too-many-positional-arguments
58
53
  server_address: str,
@@ -20,7 +20,7 @@ import threading
20
20
  from collections.abc import Iterator, Sequence
21
21
  from contextlib import contextmanager
22
22
  from copy import copy
23
- from logging import DEBUG, ERROR
23
+ from logging import ERROR
24
24
  from pathlib import Path
25
25
  from typing import Callable, Optional, Union, cast
26
26
 
@@ -36,10 +36,13 @@ from flwr.common.constant import (
36
36
  PING_DEFAULT_INTERVAL,
37
37
  PING_RANDOM_RANGE,
38
38
  )
39
- from flwr.common.grpc import create_channel
39
+ from flwr.common.grpc import create_channel, on_channel_state_change
40
40
  from flwr.common.logger import log
41
41
  from flwr.common.message import Message, Metadata
42
42
  from flwr.common.retry_invoker import RetryInvoker
43
+ from flwr.common.secure_aggregation.crypto.symmetric_encryption import (
44
+ generate_key_pairs,
45
+ )
43
46
  from flwr.common.serde import message_from_proto, message_to_proto, run_from_proto
44
47
  from flwr.common.typing import Fab, Run, RunNotRunningException
45
48
  from flwr.proto.fab_pb2 import GetFabRequest, GetFabResponse # pylint: disable=E0611
@@ -60,11 +63,6 @@ from .client_interceptor import AuthenticateClientInterceptor
60
63
  from .grpc_adapter import GrpcAdapter
61
64
 
62
65
 
63
- def on_channel_state_change(channel_connectivity: str) -> None:
64
- """Log channel connectivity."""
65
- log(DEBUG, channel_connectivity)
66
-
67
-
68
66
  @contextmanager
69
67
  def grpc_request_response( # pylint: disable=R0913,R0914,R0915,R0917
70
68
  server_address: str,
@@ -130,12 +128,14 @@ def grpc_request_response( # pylint: disable=R0913,R0914,R0915,R0917
130
128
  if isinstance(root_certificates, str):
131
129
  root_certificates = Path(root_certificates).read_bytes()
132
130
 
133
- interceptors: Optional[Sequence[grpc.UnaryUnaryClientInterceptor]] = None
134
- if authentication_keys is not None:
135
- interceptors = AuthenticateClientInterceptor(
136
- authentication_keys[0], authentication_keys[1]
137
- )
131
+ # Automatic node auth: generate keys if user didn't provide any
132
+ if authentication_keys is None:
133
+ authentication_keys = generate_key_pairs()
138
134
 
135
+ # Always configure auth interceptor, with either user-provided or generated keys
136
+ interceptors: Sequence[grpc.UnaryUnaryClientInterceptor] = [
137
+ AuthenticateClientInterceptor(*authentication_keys),
138
+ ]
139
139
  channel = create_channel(
140
140
  server_address=server_address,
141
141
  insecure=insecure,
@@ -42,12 +42,8 @@ from flwr.proto.fleet_pb2 import ( # pylint: disable=E0611
42
42
  PingResponse,
43
43
  PullMessagesRequest,
44
44
  PullMessagesResponse,
45
- PullTaskInsRequest,
46
- PullTaskInsResponse,
47
45
  PushMessagesRequest,
48
46
  PushMessagesResponse,
49
- PushTaskResRequest,
50
- PushTaskResResponse,
51
47
  )
52
48
  from flwr.proto.grpcadapter_pb2 import MessageContainer # pylint: disable=E0611
53
49
  from flwr.proto.grpcadapter_pb2_grpc import GrpcAdapterStub
@@ -130,24 +126,12 @@ class GrpcAdapter:
130
126
  """."""
131
127
  return self._send_and_receive(request, PingResponse, **kwargs)
132
128
 
133
- def PullTaskIns( # pylint: disable=C0103
134
- self, request: PullTaskInsRequest, **kwargs: Any
135
- ) -> PullTaskInsResponse:
136
- """."""
137
- return self._send_and_receive(request, PullTaskInsResponse, **kwargs)
138
-
139
129
  def PullMessages( # pylint: disable=C0103
140
130
  self, request: PullMessagesRequest, **kwargs: Any
141
131
  ) -> PullMessagesResponse:
142
132
  """."""
143
133
  return self._send_and_receive(request, PullMessagesResponse, **kwargs)
144
134
 
145
- def PushTaskRes( # pylint: disable=C0103
146
- self, request: PushTaskResRequest, **kwargs: Any
147
- ) -> PushTaskResResponse:
148
- """."""
149
- return self._send_and_receive(request, PushTaskResResponse, **kwargs)
150
-
151
135
  def PushMessages( # pylint: disable=C0103
152
136
  self, request: PushMessagesRequest, **kwargs: Any
153
137
  ) -> PushMessagesResponse:
@@ -15,9 +15,6 @@
15
15
  """Task handling."""
16
16
 
17
17
 
18
- from typing import Optional
19
-
20
- from flwr.proto.fleet_pb2 import PullTaskInsResponse # pylint: disable=E0611
21
18
  from flwr.proto.task_pb2 import TaskIns # pylint: disable=E0611
22
19
 
23
20
 
@@ -38,17 +35,3 @@ def validate_task_ins(task_ins: TaskIns) -> bool:
38
35
  if not (task_ins.HasField("task") and task_ins.task.HasField("recordset")):
39
36
  return False
40
37
  return True
41
-
42
-
43
- def get_task_ins(
44
- pull_task_ins_response: PullTaskInsResponse,
45
- ) -> Optional[TaskIns]:
46
- """Get the first TaskIns, if available."""
47
- # Extract a single ServerMessage from the response, if possible
48
- if len(pull_task_ins_response.task_ins_list) == 0:
49
- return None
50
-
51
- # Only evaluate the first message
52
- task_ins: TaskIns = pull_task_ins_response.task_ins_list[0]
53
-
54
- return task_ins
@@ -16,7 +16,6 @@
16
16
 
17
17
 
18
18
  import argparse
19
- import sys
20
19
  from logging import DEBUG, ERROR, INFO, WARN
21
20
  from pathlib import Path
22
21
  from typing import Optional
@@ -65,17 +64,6 @@ def run_supernode() -> None:
65
64
  "Ignoring `--flwr-dir`.",
66
65
  )
67
66
 
68
- # Exit if unsupported argument is passed by the user
69
- if args.app is not None:
70
- log(
71
- ERROR,
72
- "The `app` argument is deprecated. The SuperNode now automatically "
73
- "uses the ClientApp delivered from the SuperLink. Providing the app "
74
- "directory manually is no longer supported. Please remove the `app` "
75
- "argument from your command.",
76
- )
77
- sys.exit(1)
78
-
79
67
  root_certificates = try_obtain_root_certificates(args, args.superlink)
80
68
  load_fn = get_load_client_app_fn(
81
69
  default_app_ref="",
@@ -146,18 +134,6 @@ def _parse_args_run_supernode() -> argparse.ArgumentParser:
146
134
  parser = argparse.ArgumentParser(
147
135
  description="Start a Flower SuperNode",
148
136
  )
149
-
150
- parser.add_argument(
151
- "app",
152
- nargs="?",
153
- default=None,
154
- help=(
155
- "(REMOVED) This argument is removed. The SuperNode now automatically "
156
- "uses the ClientApp delivered from the SuperLink, so there is no need to "
157
- "provide the app directory manually. This argument will be removed in a "
158
- "future version."
159
- ),
160
- )
161
137
  _parse_args_common(parser)
162
138
  parser.add_argument(
163
139
  "--flwr-dir",
@@ -39,7 +39,8 @@ def get_norm(input_arrays: NDArrays) -> float:
39
39
  def add_gaussian_noise_inplace(input_arrays: NDArrays, std_dev: float) -> None:
40
40
  """Add Gaussian noise to each element of the input arrays."""
41
41
  for array in input_arrays:
42
- array += np.random.normal(0, std_dev, array.shape)
42
+ noise = np.random.normal(0, std_dev, array.shape).astype(array.dtype)
43
+ array += noise
43
44
 
44
45
 
45
46
  def clip_inputs_inplace(input_arrays: NDArrays, clipping_norm: float) -> None:
flwr/common/grpc.py CHANGED
@@ -80,7 +80,7 @@ def create_channel(
80
80
  log(DEBUG, "Opened secure gRPC connection using certificates")
81
81
 
82
82
  if interceptors is not None:
83
- channel = grpc.intercept_channel(channel, interceptors)
83
+ channel = grpc.intercept_channel(channel, *interceptors)
84
84
 
85
85
  return channel
86
86
 
@@ -224,3 +224,8 @@ def generic_create_grpc_server( # pylint: disable=too-many-arguments,R0917
224
224
  server.add_insecure_port(server_address)
225
225
 
226
226
  return server
227
+
228
+
229
+ def on_channel_state_change(channel_connectivity: str) -> None:
230
+ """Log channel connectivity."""
231
+ log(DEBUG, channel_connectivity)
flwr/proto/fleet_pb2.py CHANGED
@@ -23,57 +23,44 @@ _sym_db = _symbol_database.Default()
23
23
 
24
24
 
25
25
  from flwr.proto import node_pb2 as flwr_dot_proto_dot_node__pb2
26
- from flwr.proto import task_pb2 as flwr_dot_proto_dot_task__pb2
27
26
  from flwr.proto import run_pb2 as flwr_dot_proto_dot_run__pb2
28
27
  from flwr.proto import fab_pb2 as flwr_dot_proto_dot_fab__pb2
29
28
  from flwr.proto import message_pb2 as flwr_dot_proto_dot_message__pb2
30
29
 
31
30
 
32
- DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x16\x66lwr/proto/fleet.proto\x12\nflwr.proto\x1a\x15\x66lwr/proto/node.proto\x1a\x15\x66lwr/proto/task.proto\x1a\x14\x66lwr/proto/run.proto\x1a\x14\x66lwr/proto/fab.proto\x1a\x18\x66lwr/proto/message.proto\"*\n\x11\x43reateNodeRequest\x12\x15\n\rping_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\"D\n\x0bPingRequest\x12\x1e\n\x04node\x18\x01 \x01(\x0b\x32\x10.flwr.proto.Node\x12\x15\n\rping_interval\x18\x02 \x01(\x01\"\x1f\n\x0cPingResponse\x12\x0f\n\x07success\x18\x01 \x01(\x08\"F\n\x12PullTaskInsRequest\x12\x1e\n\x04node\x18\x01 \x01(\x0b\x32\x10.flwr.proto.Node\x12\x10\n\x08task_ids\x18\x02 \x03(\t\"k\n\x13PullTaskInsResponse\x12(\n\treconnect\x18\x01 \x01(\x0b\x32\x15.flwr.proto.Reconnect\x12*\n\rtask_ins_list\x18\x02 \x03(\x0b\x32\x13.flwr.proto.TaskIns\"`\n\x12PushTaskResRequest\x12\x1e\n\x04node\x18\x01 \x01(\x0b\x32\x10.flwr.proto.Node\x12*\n\rtask_res_list\x18\x02 \x03(\x0b\x32\x13.flwr.proto.TaskRes\"\xae\x01\n\x13PushTaskResResponse\x12(\n\treconnect\x18\x01 \x01(\x0b\x32\x15.flwr.proto.Reconnect\x12=\n\x07results\x18\x02 \x03(\x0b\x32,.flwr.proto.PushTaskResResponse.ResultsEntry\x1a.\n\x0cResultsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\r:\x02\x38\x01\"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\xb6\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;\n\x04Ping\x12\x17.flwr.proto.PingRequest\x1a\x18.flwr.proto.PingResponse\"\x00\x12P\n\x0bPullTaskIns\x12\x1e.flwr.proto.PullTaskInsRequest\x1a\x1f.flwr.proto.PullTaskInsResponse\"\x00\x12S\n\x0cPullMessages\x12\x1f.flwr.proto.PullMessagesRequest\x1a .flwr.proto.PullMessagesResponse\"\x00\x12P\n\x0bPushTaskRes\x12\x1e.flwr.proto.PushTaskResRequest\x1a\x1f.flwr.proto.PushTaskResResponse\"\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\x62\x06proto3')
31
+ DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x16\x66lwr/proto/fleet.proto\x12\nflwr.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\x15\n\rping_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\"D\n\x0bPingRequest\x12\x1e\n\x04node\x18\x01 \x01(\x0b\x32\x10.flwr.proto.Node\x12\x15\n\rping_interval\x18\x02 \x01(\x01\"\x1f\n\x0cPingResponse\x12\x0f\n\x07success\x18\x01 \x01(\x08\"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\x92\x04\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;\n\x04Ping\x12\x17.flwr.proto.PingRequest\x1a\x18.flwr.proto.PingResponse\"\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\x62\x06proto3')
33
32
 
34
33
  _globals = globals()
35
34
  _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
36
35
  _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'flwr.proto.fleet_pb2', _globals)
37
36
  if not _descriptor._USE_C_DESCRIPTORS:
38
37
  DESCRIPTOR._loaded_options = None
39
- _globals['_PUSHTASKRESRESPONSE_RESULTSENTRY']._loaded_options = None
40
- _globals['_PUSHTASKRESRESPONSE_RESULTSENTRY']._serialized_options = b'8\001'
41
38
  _globals['_PUSHMESSAGESRESPONSE_RESULTSENTRY']._loaded_options = None
42
39
  _globals['_PUSHMESSAGESRESPONSE_RESULTSENTRY']._serialized_options = b'8\001'
43
- _globals['_CREATENODEREQUEST']._serialized_start=154
44
- _globals['_CREATENODEREQUEST']._serialized_end=196
45
- _globals['_CREATENODERESPONSE']._serialized_start=198
46
- _globals['_CREATENODERESPONSE']._serialized_end=250
47
- _globals['_DELETENODEREQUEST']._serialized_start=252
48
- _globals['_DELETENODEREQUEST']._serialized_end=303
49
- _globals['_DELETENODERESPONSE']._serialized_start=305
50
- _globals['_DELETENODERESPONSE']._serialized_end=325
51
- _globals['_PINGREQUEST']._serialized_start=327
52
- _globals['_PINGREQUEST']._serialized_end=395
53
- _globals['_PINGRESPONSE']._serialized_start=397
54
- _globals['_PINGRESPONSE']._serialized_end=428
55
- _globals['_PULLTASKINSREQUEST']._serialized_start=430
56
- _globals['_PULLTASKINSREQUEST']._serialized_end=500
57
- _globals['_PULLTASKINSRESPONSE']._serialized_start=502
58
- _globals['_PULLTASKINSRESPONSE']._serialized_end=609
59
- _globals['_PUSHTASKRESREQUEST']._serialized_start=611
60
- _globals['_PUSHTASKRESREQUEST']._serialized_end=707
61
- _globals['_PUSHTASKRESRESPONSE']._serialized_start=710
62
- _globals['_PUSHTASKRESRESPONSE']._serialized_end=884
63
- _globals['_PUSHTASKRESRESPONSE_RESULTSENTRY']._serialized_start=838
64
- _globals['_PUSHTASKRESRESPONSE_RESULTSENTRY']._serialized_end=884
65
- _globals['_PULLMESSAGESREQUEST']._serialized_start=886
66
- _globals['_PULLMESSAGESREQUEST']._serialized_end=960
67
- _globals['_PULLMESSAGESRESPONSE']._serialized_start=962
68
- _globals['_PULLMESSAGESRESPONSE']._serialized_end=1070
69
- _globals['_PUSHMESSAGESREQUEST']._serialized_start=1072
70
- _globals['_PUSHMESSAGESREQUEST']._serialized_end=1169
71
- _globals['_PUSHMESSAGESRESPONSE']._serialized_start=1172
72
- _globals['_PUSHMESSAGESRESPONSE']._serialized_end=1348
73
- _globals['_PUSHMESSAGESRESPONSE_RESULTSENTRY']._serialized_start=838
74
- _globals['_PUSHMESSAGESRESPONSE_RESULTSENTRY']._serialized_end=884
75
- _globals['_RECONNECT']._serialized_start=1350
76
- _globals['_RECONNECT']._serialized_end=1380
77
- _globals['_FLEET']._serialized_start=1383
78
- _globals['_FLEET']._serialized_end=2077
40
+ _globals['_CREATENODEREQUEST']._serialized_start=131
41
+ _globals['_CREATENODEREQUEST']._serialized_end=173
42
+ _globals['_CREATENODERESPONSE']._serialized_start=175
43
+ _globals['_CREATENODERESPONSE']._serialized_end=227
44
+ _globals['_DELETENODEREQUEST']._serialized_start=229
45
+ _globals['_DELETENODEREQUEST']._serialized_end=280
46
+ _globals['_DELETENODERESPONSE']._serialized_start=282
47
+ _globals['_DELETENODERESPONSE']._serialized_end=302
48
+ _globals['_PINGREQUEST']._serialized_start=304
49
+ _globals['_PINGREQUEST']._serialized_end=372
50
+ _globals['_PINGRESPONSE']._serialized_start=374
51
+ _globals['_PINGRESPONSE']._serialized_end=405
52
+ _globals['_PULLMESSAGESREQUEST']._serialized_start=407
53
+ _globals['_PULLMESSAGESREQUEST']._serialized_end=481
54
+ _globals['_PULLMESSAGESRESPONSE']._serialized_start=483
55
+ _globals['_PULLMESSAGESRESPONSE']._serialized_end=591
56
+ _globals['_PUSHMESSAGESREQUEST']._serialized_start=593
57
+ _globals['_PUSHMESSAGESREQUEST']._serialized_end=690
58
+ _globals['_PUSHMESSAGESRESPONSE']._serialized_start=693
59
+ _globals['_PUSHMESSAGESRESPONSE']._serialized_end=869
60
+ _globals['_PUSHMESSAGESRESPONSE_RESULTSENTRY']._serialized_start=823
61
+ _globals['_PUSHMESSAGESRESPONSE_RESULTSENTRY']._serialized_end=869
62
+ _globals['_RECONNECT']._serialized_start=871
63
+ _globals['_RECONNECT']._serialized_end=901
64
+ _globals['_FLEET']._serialized_start=904
65
+ _globals['_FLEET']._serialized_end=1434
79
66
  # @@protoc_insertion_point(module_scope)
flwr/proto/fleet_pb2.pyi CHANGED
@@ -5,7 +5,6 @@ isort:skip_file
5
5
  import builtins
6
6
  import flwr.proto.message_pb2
7
7
  import flwr.proto.node_pb2
8
- import flwr.proto.task_pb2
9
8
  import google.protobuf.descriptor
10
9
  import google.protobuf.internal.containers
11
10
  import google.protobuf.message
@@ -87,89 +86,6 @@ class PingResponse(google.protobuf.message.Message):
87
86
  def ClearField(self, field_name: typing_extensions.Literal["success",b"success"]) -> None: ...
88
87
  global___PingResponse = PingResponse
89
88
 
90
- class PullTaskInsRequest(google.protobuf.message.Message):
91
- """PullTaskIns messages"""
92
- DESCRIPTOR: google.protobuf.descriptor.Descriptor
93
- NODE_FIELD_NUMBER: builtins.int
94
- TASK_IDS_FIELD_NUMBER: builtins.int
95
- @property
96
- def node(self) -> flwr.proto.node_pb2.Node: ...
97
- @property
98
- def task_ids(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[typing.Text]: ...
99
- def __init__(self,
100
- *,
101
- node: typing.Optional[flwr.proto.node_pb2.Node] = ...,
102
- task_ids: typing.Optional[typing.Iterable[typing.Text]] = ...,
103
- ) -> None: ...
104
- def HasField(self, field_name: typing_extensions.Literal["node",b"node"]) -> builtins.bool: ...
105
- def ClearField(self, field_name: typing_extensions.Literal["node",b"node","task_ids",b"task_ids"]) -> None: ...
106
- global___PullTaskInsRequest = PullTaskInsRequest
107
-
108
- class PullTaskInsResponse(google.protobuf.message.Message):
109
- DESCRIPTOR: google.protobuf.descriptor.Descriptor
110
- RECONNECT_FIELD_NUMBER: builtins.int
111
- TASK_INS_LIST_FIELD_NUMBER: builtins.int
112
- @property
113
- def reconnect(self) -> global___Reconnect: ...
114
- @property
115
- def task_ins_list(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[flwr.proto.task_pb2.TaskIns]: ...
116
- def __init__(self,
117
- *,
118
- reconnect: typing.Optional[global___Reconnect] = ...,
119
- task_ins_list: typing.Optional[typing.Iterable[flwr.proto.task_pb2.TaskIns]] = ...,
120
- ) -> None: ...
121
- def HasField(self, field_name: typing_extensions.Literal["reconnect",b"reconnect"]) -> builtins.bool: ...
122
- def ClearField(self, field_name: typing_extensions.Literal["reconnect",b"reconnect","task_ins_list",b"task_ins_list"]) -> None: ...
123
- global___PullTaskInsResponse = PullTaskInsResponse
124
-
125
- class PushTaskResRequest(google.protobuf.message.Message):
126
- """PushTaskRes messages"""
127
- DESCRIPTOR: google.protobuf.descriptor.Descriptor
128
- NODE_FIELD_NUMBER: builtins.int
129
- TASK_RES_LIST_FIELD_NUMBER: builtins.int
130
- @property
131
- def node(self) -> flwr.proto.node_pb2.Node: ...
132
- @property
133
- def task_res_list(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[flwr.proto.task_pb2.TaskRes]: ...
134
- def __init__(self,
135
- *,
136
- node: typing.Optional[flwr.proto.node_pb2.Node] = ...,
137
- task_res_list: typing.Optional[typing.Iterable[flwr.proto.task_pb2.TaskRes]] = ...,
138
- ) -> None: ...
139
- def HasField(self, field_name: typing_extensions.Literal["node",b"node"]) -> builtins.bool: ...
140
- def ClearField(self, field_name: typing_extensions.Literal["node",b"node","task_res_list",b"task_res_list"]) -> None: ...
141
- global___PushTaskResRequest = PushTaskResRequest
142
-
143
- class PushTaskResResponse(google.protobuf.message.Message):
144
- DESCRIPTOR: google.protobuf.descriptor.Descriptor
145
- class ResultsEntry(google.protobuf.message.Message):
146
- DESCRIPTOR: google.protobuf.descriptor.Descriptor
147
- KEY_FIELD_NUMBER: builtins.int
148
- VALUE_FIELD_NUMBER: builtins.int
149
- key: typing.Text
150
- value: builtins.int
151
- def __init__(self,
152
- *,
153
- key: typing.Text = ...,
154
- value: builtins.int = ...,
155
- ) -> None: ...
156
- def ClearField(self, field_name: typing_extensions.Literal["key",b"key","value",b"value"]) -> None: ...
157
-
158
- RECONNECT_FIELD_NUMBER: builtins.int
159
- RESULTS_FIELD_NUMBER: builtins.int
160
- @property
161
- def reconnect(self) -> global___Reconnect: ...
162
- @property
163
- def results(self) -> google.protobuf.internal.containers.ScalarMap[typing.Text, builtins.int]: ...
164
- def __init__(self,
165
- *,
166
- reconnect: typing.Optional[global___Reconnect] = ...,
167
- results: typing.Optional[typing.Mapping[typing.Text, builtins.int]] = ...,
168
- ) -> None: ...
169
- def HasField(self, field_name: typing_extensions.Literal["reconnect",b"reconnect"]) -> builtins.bool: ...
170
- def ClearField(self, field_name: typing_extensions.Literal["reconnect",b"reconnect","results",b"results"]) -> None: ...
171
- global___PushTaskResResponse = PushTaskResResponse
172
-
173
89
  class PullMessagesRequest(google.protobuf.message.Message):
174
90
  """PullMessages messages"""
175
91
  DESCRIPTOR: google.protobuf.descriptor.Descriptor