flwr-nightly 1.13.0.dev20241025__py3-none-any.whl → 1.13.0.dev20241028__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.

Potentially problematic release.


This version of flwr-nightly might be problematic. Click here for more details.

flwr/server/app.py CHANGED
@@ -50,7 +50,6 @@ from flwr.common.constant import (
50
50
  TRANSPORT_TYPE_GRPC_ADAPTER,
51
51
  TRANSPORT_TYPE_GRPC_RERE,
52
52
  TRANSPORT_TYPE_REST,
53
- Status,
54
53
  )
55
54
  from flwr.common.exit_handlers import register_exit_handlers
56
55
  from flwr.common.logger import log
@@ -58,7 +57,6 @@ from flwr.common.secure_aggregation.crypto.symmetric_encryption import (
58
57
  private_key_to_bytes,
59
58
  public_key_to_bytes,
60
59
  )
61
- from flwr.common.typing import RunStatus
62
60
  from flwr.proto.fleet_pb2_grpc import ( # pylint: disable=E0611
63
61
  add_FleetServicer_to_server,
64
62
  )
@@ -345,7 +343,7 @@ def run_superlink() -> None:
345
343
  # Scheduler thread
346
344
  scheduler_th = threading.Thread(
347
345
  target=_flwr_serverapp_scheduler,
348
- args=(state_factory, args.driver_api_address),
346
+ args=(state_factory, args.driver_api_address, args.ssl_ca_certfile),
349
347
  )
350
348
  scheduler_th.start()
351
349
  bckg_threads.append(scheduler_th)
@@ -367,7 +365,9 @@ def run_superlink() -> None:
367
365
 
368
366
 
369
367
  def _flwr_serverapp_scheduler(
370
- state_factory: LinkStateFactory, driver_api_address: str
368
+ state_factory: LinkStateFactory,
369
+ driver_api_address: str,
370
+ ssl_ca_certfile: Optional[str],
371
371
  ) -> None:
372
372
  log(DEBUG, "Started flwr-serverapp scheduler thread.")
373
373
 
@@ -380,10 +380,6 @@ def _flwr_serverapp_scheduler(
380
380
 
381
381
  if pending_run_id:
382
382
 
383
- # Set run as starting
384
- state.update_run_status(
385
- run_id=pending_run_id, new_status=RunStatus(Status.STARTING, "", "")
386
- )
387
383
  log(
388
384
  INFO,
389
385
  "Launching `flwr-serverapp` subprocess with run-id %d. "
@@ -399,6 +395,12 @@ def _flwr_serverapp_scheduler(
399
395
  "--run-id",
400
396
  str(pending_run_id),
401
397
  ]
398
+ if ssl_ca_certfile:
399
+ command.append("--root-certificates")
400
+ command.append(ssl_ca_certfile)
401
+ else:
402
+ command.append("--insecure")
403
+
402
404
  subprocess.run(
403
405
  command,
404
406
  stdout=None,
@@ -15,7 +15,10 @@
15
15
  """Flower ServerApp process."""
16
16
 
17
17
  import argparse
18
- from logging import DEBUG, INFO
18
+ import sys
19
+ from logging import DEBUG, INFO, WARN
20
+ from os.path import isfile
21
+ from pathlib import Path
19
22
  from typing import Optional
20
23
 
21
24
  from flwr.common.logger import log
@@ -41,8 +44,35 @@ def flwr_serverapp() -> None:
41
44
  help="Id of the Run this process should start. If not supplied, this "
42
45
  "function will request a pending run to the LinkState.",
43
46
  )
47
+ parser.add_argument(
48
+ "--flwr-dir",
49
+ default=None,
50
+ help="""The path containing installed Flower Apps.
51
+ By default, this value is equal to:
52
+
53
+ - `$FLWR_HOME/` if `$FLWR_HOME` is defined
54
+ - `$XDG_DATA_HOME/.flwr/` if `$XDG_DATA_HOME` is defined
55
+ - `$HOME/.flwr/` in all other cases
56
+ """,
57
+ )
58
+ parser.add_argument(
59
+ "--insecure",
60
+ action="store_true",
61
+ help="Run the server without HTTPS, regardless of whether certificate "
62
+ "paths are provided. By default, the server runs with HTTPS enabled. "
63
+ "Use this flag only if you understand the risks.",
64
+ )
65
+ parser.add_argument(
66
+ "--root-certificates",
67
+ metavar="ROOT_CERT",
68
+ type=str,
69
+ help="Specifies the path to the PEM-encoded root certificate file for "
70
+ "establishing secure HTTPS connections.",
71
+ )
44
72
  args = parser.parse_args()
45
73
 
74
+ certificates = _try_obtain_certificates(args)
75
+
46
76
  log(
47
77
  DEBUG,
48
78
  "Staring isolated `ServerApp` connected to SuperLink DriverAPI at %s "
@@ -50,29 +80,62 @@ def flwr_serverapp() -> None:
50
80
  args.superlink,
51
81
  args.run_id,
52
82
  )
53
- run_serverapp(superlink=args.superlink, run_id=args.run_id)
83
+ run_serverapp(
84
+ superlink=args.superlink,
85
+ run_id=args.run_id,
86
+ flwr_dir_=args.flwr_dir,
87
+ certificates=certificates,
88
+ )
89
+
90
+
91
+ def _try_obtain_certificates(
92
+ args: argparse.Namespace,
93
+ ) -> Optional[bytes]:
94
+
95
+ if args.insecure:
96
+ if args.root_certificates is not None:
97
+ sys.exit(
98
+ "Conflicting options: The '--insecure' flag disables HTTPS, "
99
+ "but '--root-certificates' was also specified. Please remove "
100
+ "the '--root-certificates' option when running in insecure mode, "
101
+ "or omit '--insecure' to use HTTPS."
102
+ )
103
+ log(
104
+ WARN,
105
+ "Option `--insecure` was set. Starting insecure HTTP channel to %s.",
106
+ args.superlink,
107
+ )
108
+ root_certificates = None
109
+ else:
110
+ # Load the certificates if provided, or load the system certificates
111
+ if not isfile(args.root_certificates):
112
+ sys.exit("Path argument `--root-certificates` does not point to a file.")
113
+ root_certificates = Path(args.root_certificates).read_bytes()
114
+ log(
115
+ DEBUG,
116
+ "Starting secure HTTPS channel to %s "
117
+ "with the following certificates: %s.",
118
+ args.superlink,
119
+ args.root_certificates,
120
+ )
121
+ return root_certificates
54
122
 
55
123
 
56
124
  def run_serverapp( # pylint: disable=R0914
57
125
  superlink: str,
58
126
  run_id: Optional[int] = None,
127
+ flwr_dir_: Optional[str] = None,
128
+ certificates: Optional[bytes] = None,
59
129
  ) -> None:
60
- """Run Flower ServerApp process.
61
-
62
- Parameters
63
- ----------
64
- superlink : str
65
- Address of SuperLink
66
- run_id : Optional[int] (default: None)
67
- Unique identifier of a Run registered at the LinkState. If not supplied,
68
- this function will request a pending run to the LinkState.
69
- """
130
+ """Run Flower ServerApp process."""
70
131
  _ = GrpcDriver(
71
132
  run_id=run_id if run_id else 0,
72
133
  driver_service_address=superlink,
73
- root_certificates=None,
134
+ root_certificates=certificates,
74
135
  )
75
136
 
137
+ log(INFO, "%s", flwr_dir_)
138
+
76
139
  # Then, GetServerInputs
77
140
 
78
141
  # Then, run ServerApp
@@ -22,6 +22,7 @@ from typing import Optional
22
22
  from uuid import UUID
23
23
 
24
24
  import grpc
25
+ from google.protobuf.message import Message as GrpcMessage
25
26
 
26
27
  from flwr.common.constant import Status
27
28
  from flwr.common.logger import log
@@ -212,7 +213,7 @@ class DriverServicer(driver_pb2_grpc.DriverServicer):
212
213
  # Lock access to LinkState, preventing obtaining the same pending run_id
213
214
  with self.lock:
214
215
  # If run_id is provided, use it, otherwise use the pending run_id
215
- if request.HasField("run_id"):
216
+ if _has_field(request, "run_id"):
216
217
  run_id: Optional[int] = request.run_id
217
218
  else:
218
219
  run_id = state.get_pending_run_id()
@@ -256,3 +257,8 @@ class DriverServicer(driver_pb2_grpc.DriverServicer):
256
257
  def _raise_if(validation_error: bool, detail: str) -> None:
257
258
  if validation_error:
258
259
  raise ValueError(f"Malformed PushTaskInsRequest: {detail}")
260
+
261
+
262
+ def _has_field(message: GrpcMessage, field_name: str) -> bool:
263
+ """Check if a certain field is set for the message, including scalar fields."""
264
+ return field_name in {fld.name for fld, _ in message.ListFields()}
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: flwr-nightly
3
- Version: 1.13.0.dev20241025
3
+ Version: 1.13.0.dev20241028
4
4
  Summary: Flower: A Friendly Federated Learning Framework
5
5
  Home-page: https://flower.ai
6
6
  License: Apache-2.0
@@ -199,7 +199,7 @@ flwr/proto/transport_pb2_grpc.py,sha256=vLN3EHtx2aEEMCO4f1Upu-l27BPzd3-5pV-u8wPc
199
199
  flwr/proto/transport_pb2_grpc.pyi,sha256=AGXf8RiIiW2J5IKMlm_3qT3AzcDa4F3P5IqUjve_esA,766
200
200
  flwr/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
201
201
  flwr/server/__init__.py,sha256=cEg1oecBu4cKB69iJCqWEylC8b5XW47bl7rQiJsdTvM,1528
202
- flwr/server/app.py,sha256=p3uTuj4tIRK67d6FCyNIwEVKkfhZBIuuhZt86gDqmv8,28315
202
+ flwr/server/app.py,sha256=7mV0p6Ej7GHyAnSyTOaaPJC2UuXpXfgNLuoDvLemsRM,28353
203
203
  flwr/server/client_manager.py,sha256=7Ese0tgrH-i-ms363feYZJKwB8gWnXSmg_hYF2Bju4U,6227
204
204
  flwr/server/client_proxy.py,sha256=4G-oTwhb45sfWLx2uZdcXD98IZwdTS6F88xe3akCdUg,2399
205
205
  flwr/server/compat/__init__.py,sha256=VxnJtJyOjNFQXMNi9hIuzNlZM5n0Hj1p3aq_Pm2udw4,892
@@ -218,7 +218,7 @@ flwr/server/server.py,sha256=1ZsFEptmAV-L2vP2etNC9Ed5CLSxpuKzUFkAPQ4l5Xc,17893
218
218
  flwr/server/server_app.py,sha256=RsgS6PRS5Z74cMUAHzsm8r3LWddwn00MjRs6rlacHt8,6297
219
219
  flwr/server/server_config.py,sha256=CZaHVAsMvGLjpWVcLPkiYxgJN4xfIyAiUrCI3fETKY4,1349
220
220
  flwr/server/serverapp/__init__.py,sha256=L0K-94UDdTyEZ8LDtYybGIIIv3HW6AhSVjXMUfYJQnQ,800
221
- flwr/server/serverapp/app.py,sha256=qrkJVCORJbDQN0I5JR_7t26GGwLLlApELQBWdbgButo,2353
221
+ flwr/server/serverapp/app.py,sha256=4c_aoB8v8qIr5_IQCg4PocCSiTt7Nsf0wYPNwUymUuo,4485
222
222
  flwr/server/serverapp_components.py,sha256=-IV_CitOfrJclJj2jNdbN1Q65PyFmtKtrTIg1hc6WQw,2118
223
223
  flwr/server/strategy/__init__.py,sha256=tQer2SwjDnvgFFuJMZM-S01Z615N5XK6MaCvpm4BMU0,2836
224
224
  flwr/server/strategy/aggregate.py,sha256=iFZ8lp7PV_a2m9kywV-FK0iM33ofxavOs5TIaEQY8nU,13961
@@ -247,7 +247,7 @@ flwr/server/strategy/strategy.py,sha256=cXapkD5uDrt5C-RbmWDn9FLoap3Q41i7GKvbmfbC
247
247
  flwr/server/superlink/__init__.py,sha256=8tHYCfodUlRD8PCP9fHgvu8cz5N31A2QoRVL0jDJ15E,707
248
248
  flwr/server/superlink/driver/__init__.py,sha256=_JaRW-FdyikHc7souUrnk3mwTGViraEJCeUBY_M_ocs,712
249
249
  flwr/server/superlink/driver/driver_grpc.py,sha256=melAgaV37Y0B9bZe5bRWQOobItZZ9DIzlcbVE8B01wo,2060
250
- flwr/server/superlink/driver/driver_servicer.py,sha256=u0dphm1MtmhovRLAjs_z-TVtrBA52OcidUFzV7_smG8,9390
250
+ flwr/server/superlink/driver/driver_servicer.py,sha256=JDkUcj1HDtjyxupsXDKw9BErJcngb-V87VLKQw3gMjI,9672
251
251
  flwr/server/superlink/ffs/__init__.py,sha256=FAY-zShcfPmOxosok2QyT6hTNMNctG8cH9s_nIl8jkI,840
252
252
  flwr/server/superlink/ffs/disk_ffs.py,sha256=yCN6CCzegnJIOaHr5nIu49wZQa4g5BByiSKshz50RKU,3296
253
253
  flwr/server/superlink/ffs/ffs.py,sha256=qLI1UfosJugu2BKOJWqHIhafTm-YiuKqGf3OGWPH0NM,2395
@@ -302,8 +302,8 @@ flwr/superexec/exec_grpc.py,sha256=OuhBAk7hiky9rjGceinLGIXqchtzGPQThZnwyYv6Ei0,2
302
302
  flwr/superexec/exec_servicer.py,sha256=9MdFODQkLK_942XwaqwwIi1OP0Tiv3Mh7smj4mbreBE,5124
303
303
  flwr/superexec/executor.py,sha256=125FvdpjT_awBCREm_YkLMg0YgToarVg7Y3wPt5tXQA,3126
304
304
  flwr/superexec/simulation.py,sha256=PGADPXcfFVOss4uwPvFq_6vrIlkxezHppnBPAYWUBuU,7739
305
- flwr_nightly-1.13.0.dev20241025.dist-info/LICENSE,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358
306
- flwr_nightly-1.13.0.dev20241025.dist-info/METADATA,sha256=Hn_YtwhziCOgtOHvRAZcksYd8Irj4Te0D9fVAcNf_Ic,15618
307
- flwr_nightly-1.13.0.dev20241025.dist-info/WHEEL,sha256=FMvqSimYX_P7y0a7UY-_Mc83r5zkBZsCYPm7Lr0Bsq4,88
308
- flwr_nightly-1.13.0.dev20241025.dist-info/entry_points.txt,sha256=FxJQ96pmcNF2OvkTH6XF-Ip2PNrHvykjArkvkjQC7Mk,486
309
- flwr_nightly-1.13.0.dev20241025.dist-info/RECORD,,
305
+ flwr_nightly-1.13.0.dev20241028.dist-info/LICENSE,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358
306
+ flwr_nightly-1.13.0.dev20241028.dist-info/METADATA,sha256=WXI84xjpiOMmUBA16dNB8_CIZybwX9HBfTFdisf91Dw,15618
307
+ flwr_nightly-1.13.0.dev20241028.dist-info/WHEEL,sha256=FMvqSimYX_P7y0a7UY-_Mc83r5zkBZsCYPm7Lr0Bsq4,88
308
+ flwr_nightly-1.13.0.dev20241028.dist-info/entry_points.txt,sha256=FxJQ96pmcNF2OvkTH6XF-Ip2PNrHvykjArkvkjQC7Mk,486
309
+ flwr_nightly-1.13.0.dev20241028.dist-info/RECORD,,