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

Files changed (58) hide show
  1. flwr/cli/app.py +2 -0
  2. flwr/cli/build.py +37 -0
  3. flwr/cli/install.py +5 -3
  4. flwr/cli/ls.py +228 -0
  5. flwr/cli/run/run.py +16 -5
  6. flwr/client/app.py +68 -19
  7. flwr/client/clientapp/app.py +51 -35
  8. flwr/client/grpc_rere_client/connection.py +2 -12
  9. flwr/client/nodestate/__init__.py +25 -0
  10. flwr/client/nodestate/in_memory_nodestate.py +38 -0
  11. flwr/client/nodestate/nodestate.py +30 -0
  12. flwr/client/nodestate/nodestate_factory.py +37 -0
  13. flwr/client/rest_client/connection.py +4 -14
  14. flwr/client/supernode/app.py +57 -53
  15. flwr/common/args.py +148 -0
  16. flwr/common/config.py +10 -0
  17. flwr/common/constant.py +21 -7
  18. flwr/common/date.py +18 -0
  19. flwr/common/logger.py +6 -2
  20. flwr/common/object_ref.py +47 -16
  21. flwr/common/serde.py +10 -0
  22. flwr/common/typing.py +32 -11
  23. flwr/proto/exec_pb2.py +23 -17
  24. flwr/proto/exec_pb2.pyi +50 -20
  25. flwr/proto/exec_pb2_grpc.py +34 -0
  26. flwr/proto/exec_pb2_grpc.pyi +13 -0
  27. flwr/proto/run_pb2.py +32 -27
  28. flwr/proto/run_pb2.pyi +44 -1
  29. flwr/proto/simulationio_pb2.py +2 -2
  30. flwr/proto/simulationio_pb2_grpc.py +34 -0
  31. flwr/proto/simulationio_pb2_grpc.pyi +13 -0
  32. flwr/server/app.py +83 -87
  33. flwr/server/driver/driver.py +1 -1
  34. flwr/server/driver/grpc_driver.py +6 -20
  35. flwr/server/driver/inmemory_driver.py +1 -3
  36. flwr/server/run_serverapp.py +8 -238
  37. flwr/server/serverapp/app.py +44 -89
  38. flwr/server/strategy/aggregate.py +4 -4
  39. flwr/server/superlink/fleet/rest_rere/rest_api.py +10 -9
  40. flwr/server/superlink/linkstate/in_memory_linkstate.py +76 -62
  41. flwr/server/superlink/linkstate/linkstate.py +24 -9
  42. flwr/server/superlink/linkstate/sqlite_linkstate.py +87 -128
  43. flwr/server/superlink/linkstate/utils.py +191 -32
  44. flwr/server/superlink/simulation/simulationio_servicer.py +22 -1
  45. flwr/simulation/__init__.py +3 -1
  46. flwr/simulation/app.py +245 -352
  47. flwr/simulation/legacy_app.py +402 -0
  48. flwr/simulation/run_simulation.py +8 -19
  49. flwr/simulation/simulationio_connection.py +2 -2
  50. flwr/superexec/deployment.py +13 -7
  51. flwr/superexec/exec_servicer.py +32 -3
  52. flwr/superexec/executor.py +4 -3
  53. flwr/superexec/simulation.py +52 -145
  54. {flwr_nightly-1.13.0.dev20241106.dist-info → flwr_nightly-1.13.0.dev20241117.dist-info}/METADATA +10 -7
  55. {flwr_nightly-1.13.0.dev20241106.dist-info → flwr_nightly-1.13.0.dev20241117.dist-info}/RECORD +58 -51
  56. {flwr_nightly-1.13.0.dev20241106.dist-info → flwr_nightly-1.13.0.dev20241117.dist-info}/entry_points.txt +1 -0
  57. {flwr_nightly-1.13.0.dev20241106.dist-info → flwr_nightly-1.13.0.dev20241117.dist-info}/LICENSE +0 -0
  58. {flwr_nightly-1.13.0.dev20241106.dist-info → flwr_nightly-1.13.0.dev20241117.dist-info}/WHEEL +0 -0
flwr/common/constant.py CHANGED
@@ -38,17 +38,30 @@ TRANSPORT_TYPES = [
38
38
  ]
39
39
 
40
40
  # Addresses
41
+ # Ports
42
+ CLIENTAPPIO_PORT = "9094"
43
+ SERVERAPPIO_PORT = "9091"
44
+ FLEETAPI_GRPC_RERE_PORT = "9092"
45
+ FLEETAPI_PORT = "9095"
46
+ EXEC_API_PORT = "9093"
47
+ SIMULATIONIO_PORT = "9096"
48
+ # Octets
49
+ SERVER_OCTET = "0.0.0.0"
50
+ CLIENT_OCTET = "127.0.0.1"
41
51
  # SuperNode
42
- CLIENTAPPIO_API_DEFAULT_ADDRESS = "0.0.0.0:9094"
52
+ CLIENTAPPIO_API_DEFAULT_SERVER_ADDRESS = f"{SERVER_OCTET}:{CLIENTAPPIO_PORT}"
53
+ CLIENTAPPIO_API_DEFAULT_CLIENT_ADDRESS = f"{CLIENT_OCTET}:{CLIENTAPPIO_PORT}"
43
54
  # SuperLink
44
- SERVERAPPIO_API_DEFAULT_ADDRESS = "0.0.0.0:9091"
45
- FLEET_API_GRPC_RERE_DEFAULT_ADDRESS = "0.0.0.0:9092"
55
+ SERVERAPPIO_API_DEFAULT_SERVER_ADDRESS = f"{SERVER_OCTET}:{SERVERAPPIO_PORT}"
56
+ SERVERAPPIO_API_DEFAULT_CLIENT_ADDRESS = f"{CLIENT_OCTET}:{SERVERAPPIO_PORT}"
57
+ FLEET_API_GRPC_RERE_DEFAULT_ADDRESS = f"{SERVER_OCTET}:{FLEETAPI_GRPC_RERE_PORT}"
46
58
  FLEET_API_GRPC_BIDI_DEFAULT_ADDRESS = (
47
59
  "[::]:8080" # IPv6 to keep start_server compatible
48
60
  )
49
- FLEET_API_REST_DEFAULT_ADDRESS = "0.0.0.0:9095"
50
- EXEC_API_DEFAULT_ADDRESS = "0.0.0.0:9093"
51
- SIMULATIONIO_API_DEFAULT_ADDRESS = "0.0.0.0:9096"
61
+ FLEET_API_REST_DEFAULT_ADDRESS = f"{SERVER_OCTET}:{FLEETAPI_PORT}"
62
+ EXEC_API_DEFAULT_SERVER_ADDRESS = f"{SERVER_OCTET}:{EXEC_API_PORT}"
63
+ SIMULATIONIO_API_DEFAULT_SERVER_ADDRESS = f"{SERVER_OCTET}:{SIMULATIONIO_PORT}"
64
+ SIMULATIONIO_API_DEFAULT_CLIENT_ADDRESS = f"{CLIENT_OCTET}:{SIMULATIONIO_PORT}"
52
65
 
53
66
  # Constants for ping
54
67
  PING_DEFAULT_INTERVAL = 30
@@ -134,7 +147,8 @@ class ErrorCode:
134
147
  UNKNOWN = 0
135
148
  LOAD_CLIENT_APP_EXCEPTION = 1
136
149
  CLIENT_APP_RAISED_EXCEPTION = 2
137
- NODE_UNAVAILABLE = 3
150
+ MESSAGE_UNAVAILABLE = 3
151
+ REPLY_MESSAGE_UNAVAILABLE = 4
138
152
 
139
153
  def __new__(cls) -> ErrorCode:
140
154
  """Prevent instantiation."""
flwr/common/date.py CHANGED
@@ -21,3 +21,21 @@ import datetime
21
21
  def now() -> datetime.datetime:
22
22
  """Construct a datetime from time.time() with time zone set to UTC."""
23
23
  return datetime.datetime.now(tz=datetime.timezone.utc)
24
+
25
+
26
+ def format_timedelta(td: datetime.timedelta) -> str:
27
+ """Format a timedelta as a string."""
28
+ days = td.days
29
+ hours, remainder = divmod(td.seconds, 3600)
30
+ minutes, seconds = divmod(remainder, 60)
31
+
32
+ if days > 0:
33
+ return f"{days}d {hours:02}:{minutes:02}:{seconds:02}"
34
+ return f"{hours:02}:{minutes:02}:{seconds:02}"
35
+
36
+
37
+ def isoformat8601_utc(dt: datetime.datetime) -> str:
38
+ """Return the datetime formatted as an ISO 8601 string with a trailing 'Z'."""
39
+ if dt.tzinfo != datetime.timezone.utc:
40
+ raise ValueError("Expected datetime with timezone set to UTC")
41
+ return dt.isoformat(timespec="seconds").replace("+00:00", "Z")
flwr/common/logger.py CHANGED
@@ -22,13 +22,14 @@ import time
22
22
  from logging import WARN, LogRecord
23
23
  from logging.handlers import HTTPHandler
24
24
  from queue import Empty, Queue
25
- from typing import TYPE_CHECKING, Any, Optional, TextIO
25
+ from typing import TYPE_CHECKING, Any, Optional, TextIO, Union
26
26
 
27
27
  import grpc
28
28
 
29
29
  from flwr.proto.log_pb2 import PushLogsRequest # pylint: disable=E0611
30
30
  from flwr.proto.node_pb2 import Node # pylint: disable=E0611
31
31
  from flwr.proto.serverappio_pb2_grpc import ServerAppIoStub # pylint: disable=E0611
32
+ from flwr.proto.simulationio_pb2_grpc import SimulationIoStub # pylint: disable=E0611
32
33
 
33
34
  from .constant import LOG_UPLOAD_INTERVAL
34
35
 
@@ -346,7 +347,10 @@ def _log_uploader(
346
347
 
347
348
 
348
349
  def start_log_uploader(
349
- log_queue: Queue[Optional[str]], node_id: int, run_id: int, stub: ServerAppIoStub
350
+ log_queue: Queue[Optional[str]],
351
+ node_id: int,
352
+ run_id: int,
353
+ stub: Union[ServerAppIoStub, SimulationIoStub],
350
354
  ) -> threading.Thread:
351
355
  """Start the log uploader thread and return it."""
352
356
  thread = threading.Thread(
flwr/common/object_ref.py CHANGED
@@ -55,8 +55,8 @@ def validate(
55
55
  specified attribute within it.
56
56
  project_dir : Optional[Union[str, Path]] (default: None)
57
57
  The directory containing the module. If None, the current working directory
58
- is used. If `check_module` is True, the `project_dir` will be inserted into
59
- the system path, and the previously inserted `project_dir` will be removed.
58
+ is used. If `check_module` is True, the `project_dir` will be temporarily
59
+ inserted into the system path and then removed after the validation is complete.
60
60
 
61
61
  Returns
62
62
  -------
@@ -66,8 +66,8 @@ def validate(
66
66
 
67
67
  Note
68
68
  ----
69
- This function will modify `sys.path` by inserting the provided `project_dir`
70
- and removing the previously inserted `project_dir`.
69
+ This function will temporarily modify `sys.path` by inserting the provided
70
+ `project_dir`, which will be removed after the validation is complete.
71
71
  """
72
72
  module_str, _, attributes_str = module_attribute_str.partition(":")
73
73
  if not module_str:
@@ -82,11 +82,19 @@ def validate(
82
82
  )
83
83
 
84
84
  if check_module:
85
+ if project_dir is None:
86
+ project_dir = Path.cwd()
87
+ project_dir = Path(project_dir).absolute()
85
88
  # Set the system path
86
- _set_sys_path(project_dir)
89
+ sys.path.insert(0, str(project_dir))
87
90
 
88
91
  # Load module
89
92
  module = find_spec(module_str)
93
+
94
+ # Unset the system path
95
+ sys.path.remove(str(project_dir))
96
+
97
+ # Check if the module and the attribute exist
90
98
  if module and module.origin:
91
99
  if not _find_attribute_in_module(module.origin, attributes_str):
92
100
  return (
@@ -133,8 +141,10 @@ def load_app( # pylint: disable= too-many-branches
133
141
 
134
142
  Note
135
143
  ----
136
- This function will modify `sys.path` by inserting the provided `project_dir`
137
- and removing the previously inserted `project_dir`.
144
+ - This function will unload all modules in the previously provided `project_dir`,
145
+ if it is invoked again.
146
+ - This function will modify `sys.path` by inserting the provided `project_dir`
147
+ and removing the previously inserted `project_dir`.
138
148
  """
139
149
  valid, error_msg = validate(module_attribute_str, check_module=False)
140
150
  if not valid and error_msg:
@@ -143,8 +153,19 @@ def load_app( # pylint: disable= too-many-branches
143
153
  module_str, _, attributes_str = module_attribute_str.partition(":")
144
154
 
145
155
  try:
156
+ # Initialize project path
157
+ if project_dir is None:
158
+ project_dir = Path.cwd()
159
+ project_dir = Path(project_dir).absolute()
160
+
161
+ # Unload modules if the project directory has changed
162
+ if _current_sys_path and _current_sys_path != str(project_dir):
163
+ _unload_modules(Path(_current_sys_path))
164
+
165
+ # Set the system path
146
166
  _set_sys_path(project_dir)
147
167
 
168
+ # Import the module
148
169
  if module_str not in sys.modules:
149
170
  module = importlib.import_module(module_str)
150
171
  # Hack: `tabnet` does not work with `importlib.reload`
@@ -160,15 +181,7 @@ def load_app( # pylint: disable= too-many-branches
160
181
  module = sys.modules[module_str]
161
182
  else:
162
183
  module = sys.modules[module_str]
163
-
164
- if project_dir is None:
165
- project_dir = Path.cwd()
166
-
167
- # Reload cached modules in the project directory
168
- for m in list(sys.modules.values()):
169
- path: Optional[str] = getattr(m, "__file__", None)
170
- if path is not None and path.startswith(str(project_dir)):
171
- importlib.reload(m)
184
+ _reload_modules(project_dir)
172
185
 
173
186
  except ModuleNotFoundError as err:
174
187
  raise error_type(
@@ -189,6 +202,24 @@ def load_app( # pylint: disable= too-many-branches
189
202
  return attribute
190
203
 
191
204
 
205
+ def _unload_modules(project_dir: Path) -> None:
206
+ """Unload modules from the project directory."""
207
+ dir_str = str(project_dir.absolute())
208
+ for name, m in list(sys.modules.items()):
209
+ path: Optional[str] = getattr(m, "__file__", None)
210
+ if path is not None and path.startswith(dir_str):
211
+ del sys.modules[name]
212
+
213
+
214
+ def _reload_modules(project_dir: Path) -> None:
215
+ """Reload modules from the project directory."""
216
+ dir_str = str(project_dir.absolute())
217
+ for m in list(sys.modules.values()):
218
+ path: Optional[str] = getattr(m, "__file__", None)
219
+ if path is not None and path.startswith(dir_str):
220
+ importlib.reload(m)
221
+
222
+
192
223
  def _set_sys_path(directory: Optional[Union[str, Path]]) -> None:
193
224
  """Set the system path."""
194
225
  if directory is None:
flwr/common/serde.py CHANGED
@@ -872,6 +872,11 @@ def run_to_proto(run: typing.Run) -> ProtoRun:
872
872
  fab_version=run.fab_version,
873
873
  fab_hash=run.fab_hash,
874
874
  override_config=user_config_to_proto(run.override_config),
875
+ pending_at=run.pending_at,
876
+ starting_at=run.starting_at,
877
+ running_at=run.running_at,
878
+ finished_at=run.finished_at,
879
+ status=run_status_to_proto(run.status),
875
880
  )
876
881
  return proto
877
882
 
@@ -884,6 +889,11 @@ def run_from_proto(run_proto: ProtoRun) -> typing.Run:
884
889
  fab_version=run_proto.fab_version,
885
890
  fab_hash=run_proto.fab_hash,
886
891
  override_config=user_config_from_proto(run_proto.override_config),
892
+ pending_at=run_proto.pending_at,
893
+ starting_at=run_proto.starting_at,
894
+ running_at=run_proto.running_at,
895
+ finished_at=run_proto.finished_at,
896
+ status=run_status_from_proto(run_proto.status),
887
897
  )
888
898
  return run
889
899
 
flwr/common/typing.py CHANGED
@@ -24,7 +24,7 @@ import numpy.typing as npt
24
24
 
25
25
  NDArray = npt.NDArray[Any]
26
26
  NDArrayInt = npt.NDArray[np.int_]
27
- NDArrayFloat = npt.NDArray[np.float_]
27
+ NDArrayFloat = npt.NDArray[np.float64]
28
28
  NDArrays = list[NDArray]
29
29
 
30
30
  # The following union type contains Python types corresponding to ProtoBuf types that
@@ -208,7 +208,16 @@ class ClientMessage:
208
208
 
209
209
 
210
210
  @dataclass
211
- class Run:
211
+ class RunStatus:
212
+ """Run status information."""
213
+
214
+ status: str
215
+ sub_status: str
216
+ details: str
217
+
218
+
219
+ @dataclass
220
+ class Run: # pylint: disable=too-many-instance-attributes
212
221
  """Run details."""
213
222
 
214
223
  run_id: int
@@ -216,15 +225,27 @@ class Run:
216
225
  fab_version: str
217
226
  fab_hash: str
218
227
  override_config: UserConfig
219
-
220
-
221
- @dataclass
222
- class RunStatus:
223
- """Run status information."""
224
-
225
- status: str
226
- sub_status: str
227
- details: str
228
+ pending_at: str
229
+ starting_at: str
230
+ running_at: str
231
+ finished_at: str
232
+ status: RunStatus
233
+
234
+ @classmethod
235
+ def create_empty(cls, run_id: int) -> "Run":
236
+ """Return an empty Run instance."""
237
+ return cls(
238
+ run_id=run_id,
239
+ fab_id="",
240
+ fab_version="",
241
+ fab_hash="",
242
+ override_config={},
243
+ pending_at="",
244
+ starting_at="",
245
+ running_at="",
246
+ finished_at="",
247
+ status=RunStatus(status="", sub_status="", details=""),
248
+ )
228
249
 
229
250
 
230
251
  @dataclass
flwr/proto/exec_pb2.py CHANGED
@@ -14,9 +14,11 @@ _sym_db = _symbol_database.Default()
14
14
 
15
15
  from flwr.proto import fab_pb2 as flwr_dot_proto_dot_fab__pb2
16
16
  from flwr.proto import transport_pb2 as flwr_dot_proto_dot_transport__pb2
17
+ from flwr.proto import recordset_pb2 as flwr_dot_proto_dot_recordset__pb2
18
+ from flwr.proto import run_pb2 as flwr_dot_proto_dot_run__pb2
17
19
 
18
20
 
19
- DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x15\x66lwr/proto/exec.proto\x12\nflwr.proto\x1a\x14\x66lwr/proto/fab.proto\x1a\x1a\x66lwr/proto/transport.proto\"\xdf\x02\n\x0fStartRunRequest\x12\x1c\n\x03\x66\x61\x62\x18\x01 \x01(\x0b\x32\x0f.flwr.proto.Fab\x12H\n\x0foverride_config\x18\x02 \x03(\x0b\x32/.flwr.proto.StartRunRequest.OverrideConfigEntry\x12L\n\x11\x66\x65\x64\x65ration_config\x18\x03 \x03(\x0b\x32\x31.flwr.proto.StartRunRequest.FederationConfigEntry\x1aI\n\x13OverrideConfigEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12!\n\x05value\x18\x02 \x01(\x0b\x32\x12.flwr.proto.Scalar:\x02\x38\x01\x1aK\n\x15\x46\x65\x64\x65rationConfigEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12!\n\x05value\x18\x02 \x01(\x0b\x32\x12.flwr.proto.Scalar:\x02\x38\x01\"\"\n\x10StartRunResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\x04\"<\n\x11StreamLogsRequest\x12\x0e\n\x06run_id\x18\x01 \x01(\x04\x12\x17\n\x0f\x61\x66ter_timestamp\x18\x02 \x01(\x01\"B\n\x12StreamLogsResponse\x12\x12\n\nlog_output\x18\x01 \x01(\t\x12\x18\n\x10latest_timestamp\x18\x02 \x01(\x01\x32\xa0\x01\n\x04\x45xec\x12G\n\x08StartRun\x12\x1b.flwr.proto.StartRunRequest\x1a\x1c.flwr.proto.StartRunResponse\"\x00\x12O\n\nStreamLogs\x12\x1d.flwr.proto.StreamLogsRequest\x1a\x1e.flwr.proto.StreamLogsResponse\"\x00\x30\x01\x62\x06proto3')
21
+ DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x15\x66lwr/proto/exec.proto\x12\nflwr.proto\x1a\x14\x66lwr/proto/fab.proto\x1a\x1a\x66lwr/proto/transport.proto\x1a\x1a\x66lwr/proto/recordset.proto\x1a\x14\x66lwr/proto/run.proto\"\xfb\x01\n\x0fStartRunRequest\x12\x1c\n\x03\x66\x61\x62\x18\x01 \x01(\x0b\x32\x0f.flwr.proto.Fab\x12H\n\x0foverride_config\x18\x02 \x03(\x0b\x32/.flwr.proto.StartRunRequest.OverrideConfigEntry\x12\x35\n\x12\x66\x65\x64\x65ration_options\x18\x03 \x01(\x0b\x32\x19.flwr.proto.ConfigsRecord\x1aI\n\x13OverrideConfigEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12!\n\x05value\x18\x02 \x01(\x0b\x32\x12.flwr.proto.Scalar:\x02\x38\x01\"\"\n\x10StartRunResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\x04\"<\n\x11StreamLogsRequest\x12\x0e\n\x06run_id\x18\x01 \x01(\x04\x12\x17\n\x0f\x61\x66ter_timestamp\x18\x02 \x01(\x01\"B\n\x12StreamLogsResponse\x12\x12\n\nlog_output\x18\x01 \x01(\t\x12\x18\n\x10latest_timestamp\x18\x02 \x01(\x01\"1\n\x0fListRunsRequest\x12\x13\n\x06run_id\x18\x01 \x01(\x04H\x00\x88\x01\x01\x42\t\n\x07_run_id\"\x9d\x01\n\x10ListRunsResponse\x12;\n\x08run_dict\x18\x01 \x03(\x0b\x32).flwr.proto.ListRunsResponse.RunDictEntry\x12\x0b\n\x03now\x18\x02 \x01(\t\x1a?\n\x0cRunDictEntry\x12\x0b\n\x03key\x18\x01 \x01(\x04\x12\x1e\n\x05value\x18\x02 \x01(\x0b\x32\x0f.flwr.proto.Run:\x02\x38\x01\x32\xe9\x01\n\x04\x45xec\x12G\n\x08StartRun\x12\x1b.flwr.proto.StartRunRequest\x1a\x1c.flwr.proto.StartRunResponse\"\x00\x12O\n\nStreamLogs\x12\x1d.flwr.proto.StreamLogsRequest\x1a\x1e.flwr.proto.StreamLogsResponse\"\x00\x30\x01\x12G\n\x08ListRuns\x12\x1b.flwr.proto.ListRunsRequest\x1a\x1c.flwr.proto.ListRunsResponse\"\x00\x62\x06proto3')
20
22
 
21
23
  _globals = globals()
22
24
  _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
@@ -25,20 +27,24 @@ if _descriptor._USE_C_DESCRIPTORS == False:
25
27
  DESCRIPTOR._options = None
26
28
  _globals['_STARTRUNREQUEST_OVERRIDECONFIGENTRY']._options = None
27
29
  _globals['_STARTRUNREQUEST_OVERRIDECONFIGENTRY']._serialized_options = b'8\001'
28
- _globals['_STARTRUNREQUEST_FEDERATIONCONFIGENTRY']._options = None
29
- _globals['_STARTRUNREQUEST_FEDERATIONCONFIGENTRY']._serialized_options = b'8\001'
30
- _globals['_STARTRUNREQUEST']._serialized_start=88
31
- _globals['_STARTRUNREQUEST']._serialized_end=439
32
- _globals['_STARTRUNREQUEST_OVERRIDECONFIGENTRY']._serialized_start=289
33
- _globals['_STARTRUNREQUEST_OVERRIDECONFIGENTRY']._serialized_end=362
34
- _globals['_STARTRUNREQUEST_FEDERATIONCONFIGENTRY']._serialized_start=364
35
- _globals['_STARTRUNREQUEST_FEDERATIONCONFIGENTRY']._serialized_end=439
36
- _globals['_STARTRUNRESPONSE']._serialized_start=441
37
- _globals['_STARTRUNRESPONSE']._serialized_end=475
38
- _globals['_STREAMLOGSREQUEST']._serialized_start=477
39
- _globals['_STREAMLOGSREQUEST']._serialized_end=537
40
- _globals['_STREAMLOGSRESPONSE']._serialized_start=539
41
- _globals['_STREAMLOGSRESPONSE']._serialized_end=605
42
- _globals['_EXEC']._serialized_start=608
43
- _globals['_EXEC']._serialized_end=768
30
+ _globals['_LISTRUNSRESPONSE_RUNDICTENTRY']._options = None
31
+ _globals['_LISTRUNSRESPONSE_RUNDICTENTRY']._serialized_options = b'8\001'
32
+ _globals['_STARTRUNREQUEST']._serialized_start=138
33
+ _globals['_STARTRUNREQUEST']._serialized_end=389
34
+ _globals['_STARTRUNREQUEST_OVERRIDECONFIGENTRY']._serialized_start=316
35
+ _globals['_STARTRUNREQUEST_OVERRIDECONFIGENTRY']._serialized_end=389
36
+ _globals['_STARTRUNRESPONSE']._serialized_start=391
37
+ _globals['_STARTRUNRESPONSE']._serialized_end=425
38
+ _globals['_STREAMLOGSREQUEST']._serialized_start=427
39
+ _globals['_STREAMLOGSREQUEST']._serialized_end=487
40
+ _globals['_STREAMLOGSRESPONSE']._serialized_start=489
41
+ _globals['_STREAMLOGSRESPONSE']._serialized_end=555
42
+ _globals['_LISTRUNSREQUEST']._serialized_start=557
43
+ _globals['_LISTRUNSREQUEST']._serialized_end=606
44
+ _globals['_LISTRUNSRESPONSE']._serialized_start=609
45
+ _globals['_LISTRUNSRESPONSE']._serialized_end=766
46
+ _globals['_LISTRUNSRESPONSE_RUNDICTENTRY']._serialized_start=703
47
+ _globals['_LISTRUNSRESPONSE_RUNDICTENTRY']._serialized_end=766
48
+ _globals['_EXEC']._serialized_start=769
49
+ _globals['_EXEC']._serialized_end=1002
44
50
  # @@protoc_insertion_point(module_scope)
flwr/proto/exec_pb2.pyi CHANGED
@@ -4,6 +4,8 @@ isort:skip_file
4
4
  """
5
5
  import builtins
6
6
  import flwr.proto.fab_pb2
7
+ import flwr.proto.recordset_pb2
8
+ import flwr.proto.run_pb2
7
9
  import flwr.proto.transport_pb2
8
10
  import google.protobuf.descriptor
9
11
  import google.protobuf.internal.containers
@@ -30,38 +32,23 @@ class StartRunRequest(google.protobuf.message.Message):
30
32
  def HasField(self, field_name: typing_extensions.Literal["value",b"value"]) -> builtins.bool: ...
31
33
  def ClearField(self, field_name: typing_extensions.Literal["key",b"key","value",b"value"]) -> None: ...
32
34
 
33
- class FederationConfigEntry(google.protobuf.message.Message):
34
- DESCRIPTOR: google.protobuf.descriptor.Descriptor
35
- KEY_FIELD_NUMBER: builtins.int
36
- VALUE_FIELD_NUMBER: builtins.int
37
- key: typing.Text
38
- @property
39
- def value(self) -> flwr.proto.transport_pb2.Scalar: ...
40
- def __init__(self,
41
- *,
42
- key: typing.Text = ...,
43
- value: typing.Optional[flwr.proto.transport_pb2.Scalar] = ...,
44
- ) -> None: ...
45
- def HasField(self, field_name: typing_extensions.Literal["value",b"value"]) -> builtins.bool: ...
46
- def ClearField(self, field_name: typing_extensions.Literal["key",b"key","value",b"value"]) -> None: ...
47
-
48
35
  FAB_FIELD_NUMBER: builtins.int
49
36
  OVERRIDE_CONFIG_FIELD_NUMBER: builtins.int
50
- FEDERATION_CONFIG_FIELD_NUMBER: builtins.int
37
+ FEDERATION_OPTIONS_FIELD_NUMBER: builtins.int
51
38
  @property
52
39
  def fab(self) -> flwr.proto.fab_pb2.Fab: ...
53
40
  @property
54
41
  def override_config(self) -> google.protobuf.internal.containers.MessageMap[typing.Text, flwr.proto.transport_pb2.Scalar]: ...
55
42
  @property
56
- def federation_config(self) -> google.protobuf.internal.containers.MessageMap[typing.Text, flwr.proto.transport_pb2.Scalar]: ...
43
+ def federation_options(self) -> flwr.proto.recordset_pb2.ConfigsRecord: ...
57
44
  def __init__(self,
58
45
  *,
59
46
  fab: typing.Optional[flwr.proto.fab_pb2.Fab] = ...,
60
47
  override_config: typing.Optional[typing.Mapping[typing.Text, flwr.proto.transport_pb2.Scalar]] = ...,
61
- federation_config: typing.Optional[typing.Mapping[typing.Text, flwr.proto.transport_pb2.Scalar]] = ...,
48
+ federation_options: typing.Optional[flwr.proto.recordset_pb2.ConfigsRecord] = ...,
62
49
  ) -> None: ...
63
- def HasField(self, field_name: typing_extensions.Literal["fab",b"fab"]) -> builtins.bool: ...
64
- def ClearField(self, field_name: typing_extensions.Literal["fab",b"fab","federation_config",b"federation_config","override_config",b"override_config"]) -> None: ...
50
+ def HasField(self, field_name: typing_extensions.Literal["fab",b"fab","federation_options",b"federation_options"]) -> builtins.bool: ...
51
+ def ClearField(self, field_name: typing_extensions.Literal["fab",b"fab","federation_options",b"federation_options","override_config",b"override_config"]) -> None: ...
65
52
  global___StartRunRequest = StartRunRequest
66
53
 
67
54
  class StartRunResponse(google.protobuf.message.Message):
@@ -102,3 +89,46 @@ class StreamLogsResponse(google.protobuf.message.Message):
102
89
  ) -> None: ...
103
90
  def ClearField(self, field_name: typing_extensions.Literal["latest_timestamp",b"latest_timestamp","log_output",b"log_output"]) -> None: ...
104
91
  global___StreamLogsResponse = StreamLogsResponse
92
+
93
+ class ListRunsRequest(google.protobuf.message.Message):
94
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
95
+ RUN_ID_FIELD_NUMBER: builtins.int
96
+ run_id: builtins.int
97
+ def __init__(self,
98
+ *,
99
+ run_id: typing.Optional[builtins.int] = ...,
100
+ ) -> None: ...
101
+ def HasField(self, field_name: typing_extensions.Literal["_run_id",b"_run_id","run_id",b"run_id"]) -> builtins.bool: ...
102
+ def ClearField(self, field_name: typing_extensions.Literal["_run_id",b"_run_id","run_id",b"run_id"]) -> None: ...
103
+ def WhichOneof(self, oneof_group: typing_extensions.Literal["_run_id",b"_run_id"]) -> typing.Optional[typing_extensions.Literal["run_id"]]: ...
104
+ global___ListRunsRequest = ListRunsRequest
105
+
106
+ class ListRunsResponse(google.protobuf.message.Message):
107
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
108
+ class RunDictEntry(google.protobuf.message.Message):
109
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
110
+ KEY_FIELD_NUMBER: builtins.int
111
+ VALUE_FIELD_NUMBER: builtins.int
112
+ key: builtins.int
113
+ @property
114
+ def value(self) -> flwr.proto.run_pb2.Run: ...
115
+ def __init__(self,
116
+ *,
117
+ key: builtins.int = ...,
118
+ value: typing.Optional[flwr.proto.run_pb2.Run] = ...,
119
+ ) -> None: ...
120
+ def HasField(self, field_name: typing_extensions.Literal["value",b"value"]) -> builtins.bool: ...
121
+ def ClearField(self, field_name: typing_extensions.Literal["key",b"key","value",b"value"]) -> None: ...
122
+
123
+ RUN_DICT_FIELD_NUMBER: builtins.int
124
+ NOW_FIELD_NUMBER: builtins.int
125
+ @property
126
+ def run_dict(self) -> google.protobuf.internal.containers.MessageMap[builtins.int, flwr.proto.run_pb2.Run]: ...
127
+ now: typing.Text
128
+ def __init__(self,
129
+ *,
130
+ run_dict: typing.Optional[typing.Mapping[builtins.int, flwr.proto.run_pb2.Run]] = ...,
131
+ now: typing.Text = ...,
132
+ ) -> None: ...
133
+ def ClearField(self, field_name: typing_extensions.Literal["now",b"now","run_dict",b"run_dict"]) -> None: ...
134
+ global___ListRunsResponse = ListRunsResponse
@@ -24,6 +24,11 @@ class ExecStub(object):
24
24
  request_serializer=flwr_dot_proto_dot_exec__pb2.StreamLogsRequest.SerializeToString,
25
25
  response_deserializer=flwr_dot_proto_dot_exec__pb2.StreamLogsResponse.FromString,
26
26
  )
27
+ self.ListRuns = channel.unary_unary(
28
+ '/flwr.proto.Exec/ListRuns',
29
+ request_serializer=flwr_dot_proto_dot_exec__pb2.ListRunsRequest.SerializeToString,
30
+ response_deserializer=flwr_dot_proto_dot_exec__pb2.ListRunsResponse.FromString,
31
+ )
27
32
 
28
33
 
29
34
  class ExecServicer(object):
@@ -43,6 +48,13 @@ class ExecServicer(object):
43
48
  context.set_details('Method not implemented!')
44
49
  raise NotImplementedError('Method not implemented!')
45
50
 
51
+ def ListRuns(self, request, context):
52
+ """flwr ls command
53
+ """
54
+ context.set_code(grpc.StatusCode.UNIMPLEMENTED)
55
+ context.set_details('Method not implemented!')
56
+ raise NotImplementedError('Method not implemented!')
57
+
46
58
 
47
59
  def add_ExecServicer_to_server(servicer, server):
48
60
  rpc_method_handlers = {
@@ -56,6 +68,11 @@ def add_ExecServicer_to_server(servicer, server):
56
68
  request_deserializer=flwr_dot_proto_dot_exec__pb2.StreamLogsRequest.FromString,
57
69
  response_serializer=flwr_dot_proto_dot_exec__pb2.StreamLogsResponse.SerializeToString,
58
70
  ),
71
+ 'ListRuns': grpc.unary_unary_rpc_method_handler(
72
+ servicer.ListRuns,
73
+ request_deserializer=flwr_dot_proto_dot_exec__pb2.ListRunsRequest.FromString,
74
+ response_serializer=flwr_dot_proto_dot_exec__pb2.ListRunsResponse.SerializeToString,
75
+ ),
59
76
  }
60
77
  generic_handler = grpc.method_handlers_generic_handler(
61
78
  'flwr.proto.Exec', rpc_method_handlers)
@@ -99,3 +116,20 @@ class Exec(object):
99
116
  flwr_dot_proto_dot_exec__pb2.StreamLogsResponse.FromString,
100
117
  options, channel_credentials,
101
118
  insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
119
+
120
+ @staticmethod
121
+ def ListRuns(request,
122
+ target,
123
+ options=(),
124
+ channel_credentials=None,
125
+ call_credentials=None,
126
+ insecure=False,
127
+ compression=None,
128
+ wait_for_ready=None,
129
+ timeout=None,
130
+ metadata=None):
131
+ return grpc.experimental.unary_unary(request, target, '/flwr.proto.Exec/ListRuns',
132
+ flwr_dot_proto_dot_exec__pb2.ListRunsRequest.SerializeToString,
133
+ flwr_dot_proto_dot_exec__pb2.ListRunsResponse.FromString,
134
+ options, channel_credentials,
135
+ insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
@@ -19,6 +19,11 @@ class ExecStub:
19
19
  flwr.proto.exec_pb2.StreamLogsResponse]
20
20
  """Start log stream upon request"""
21
21
 
22
+ ListRuns: grpc.UnaryUnaryMultiCallable[
23
+ flwr.proto.exec_pb2.ListRunsRequest,
24
+ flwr.proto.exec_pb2.ListRunsResponse]
25
+ """flwr ls command"""
26
+
22
27
 
23
28
  class ExecServicer(metaclass=abc.ABCMeta):
24
29
  @abc.abstractmethod
@@ -37,5 +42,13 @@ class ExecServicer(metaclass=abc.ABCMeta):
37
42
  """Start log stream upon request"""
38
43
  pass
39
44
 
45
+ @abc.abstractmethod
46
+ def ListRuns(self,
47
+ request: flwr.proto.exec_pb2.ListRunsRequest,
48
+ context: grpc.ServicerContext,
49
+ ) -> flwr.proto.exec_pb2.ListRunsResponse:
50
+ """flwr ls command"""
51
+ pass
52
+
40
53
 
41
54
  def add_ExecServicer_to_server(servicer: ExecServicer, server: grpc.Server) -> None: ...
flwr/proto/run_pb2.py CHANGED
@@ -14,10 +14,11 @@ _sym_db = _symbol_database.Default()
14
14
 
15
15
  from flwr.proto import fab_pb2 as flwr_dot_proto_dot_fab__pb2
16
16
  from flwr.proto import node_pb2 as flwr_dot_proto_dot_node__pb2
17
+ from flwr.proto import recordset_pb2 as flwr_dot_proto_dot_recordset__pb2
17
18
  from flwr.proto import transport_pb2 as flwr_dot_proto_dot_transport__pb2
18
19
 
19
20
 
20
- DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x14\x66lwr/proto/run.proto\x12\nflwr.proto\x1a\x14\x66lwr/proto/fab.proto\x1a\x15\x66lwr/proto/node.proto\x1a\x1a\x66lwr/proto/transport.proto\"\xd5\x01\n\x03Run\x12\x0e\n\x06run_id\x18\x01 \x01(\x04\x12\x0e\n\x06\x66\x61\x62_id\x18\x02 \x01(\t\x12\x13\n\x0b\x66\x61\x62_version\x18\x03 \x01(\t\x12<\n\x0foverride_config\x18\x04 \x03(\x0b\x32#.flwr.proto.Run.OverrideConfigEntry\x12\x10\n\x08\x66\x61\x62_hash\x18\x05 \x01(\t\x1aI\n\x13OverrideConfigEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12!\n\x05value\x18\x02 \x01(\x0b\x32\x12.flwr.proto.Scalar:\x02\x38\x01\"@\n\tRunStatus\x12\x0e\n\x06status\x18\x01 \x01(\t\x12\x12\n\nsub_status\x18\x02 \x01(\t\x12\x0f\n\x07\x64\x65tails\x18\x03 \x01(\t\"\xeb\x01\n\x10\x43reateRunRequest\x12\x0e\n\x06\x66\x61\x62_id\x18\x01 \x01(\t\x12\x13\n\x0b\x66\x61\x62_version\x18\x02 \x01(\t\x12I\n\x0foverride_config\x18\x03 \x03(\x0b\x32\x30.flwr.proto.CreateRunRequest.OverrideConfigEntry\x12\x1c\n\x03\x66\x61\x62\x18\x04 \x01(\x0b\x32\x0f.flwr.proto.Fab\x1aI\n\x13OverrideConfigEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12!\n\x05value\x18\x02 \x01(\x0b\x32\x12.flwr.proto.Scalar:\x02\x38\x01\"#\n\x11\x43reateRunResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\x04\"?\n\rGetRunRequest\x12\x1e\n\x04node\x18\x01 \x01(\x0b\x32\x10.flwr.proto.Node\x12\x0e\n\x06run_id\x18\x02 \x01(\x04\".\n\x0eGetRunResponse\x12\x1c\n\x03run\x18\x01 \x01(\x0b\x32\x0f.flwr.proto.Run\"S\n\x16UpdateRunStatusRequest\x12\x0e\n\x06run_id\x18\x01 \x01(\x04\x12)\n\nrun_status\x18\x02 \x01(\x0b\x32\x15.flwr.proto.RunStatus\"\x19\n\x17UpdateRunStatusResponse\"F\n\x13GetRunStatusRequest\x12\x1e\n\x04node\x18\x01 \x01(\x0b\x32\x10.flwr.proto.Node\x12\x0f\n\x07run_ids\x18\x02 \x03(\x04\"\xb1\x01\n\x14GetRunStatusResponse\x12L\n\x0frun_status_dict\x18\x01 \x03(\x0b\x32\x33.flwr.proto.GetRunStatusResponse.RunStatusDictEntry\x1aK\n\x12RunStatusDictEntry\x12\x0b\n\x03key\x18\x01 \x01(\x04\x12$\n\x05value\x18\x02 \x01(\x0b\x32\x15.flwr.proto.RunStatus:\x02\x38\x01\x62\x06proto3')
21
+ DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x14\x66lwr/proto/run.proto\x12\nflwr.proto\x1a\x14\x66lwr/proto/fab.proto\x1a\x15\x66lwr/proto/node.proto\x1a\x1a\x66lwr/proto/recordset.proto\x1a\x1a\x66lwr/proto/transport.proto\"\xce\x02\n\x03Run\x12\x0e\n\x06run_id\x18\x01 \x01(\x04\x12\x0e\n\x06\x66\x61\x62_id\x18\x02 \x01(\t\x12\x13\n\x0b\x66\x61\x62_version\x18\x03 \x01(\t\x12<\n\x0foverride_config\x18\x04 \x03(\x0b\x32#.flwr.proto.Run.OverrideConfigEntry\x12\x10\n\x08\x66\x61\x62_hash\x18\x05 \x01(\t\x12\x12\n\npending_at\x18\x06 \x01(\t\x12\x13\n\x0bstarting_at\x18\x07 \x01(\t\x12\x12\n\nrunning_at\x18\x08 \x01(\t\x12\x13\n\x0b\x66inished_at\x18\t \x01(\t\x12%\n\x06status\x18\n \x01(\x0b\x32\x15.flwr.proto.RunStatus\x1aI\n\x13OverrideConfigEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12!\n\x05value\x18\x02 \x01(\x0b\x32\x12.flwr.proto.Scalar:\x02\x38\x01\"@\n\tRunStatus\x12\x0e\n\x06status\x18\x01 \x01(\t\x12\x12\n\nsub_status\x18\x02 \x01(\t\x12\x0f\n\x07\x64\x65tails\x18\x03 \x01(\t\"\xeb\x01\n\x10\x43reateRunRequest\x12\x0e\n\x06\x66\x61\x62_id\x18\x01 \x01(\t\x12\x13\n\x0b\x66\x61\x62_version\x18\x02 \x01(\t\x12I\n\x0foverride_config\x18\x03 \x03(\x0b\x32\x30.flwr.proto.CreateRunRequest.OverrideConfigEntry\x12\x1c\n\x03\x66\x61\x62\x18\x04 \x01(\x0b\x32\x0f.flwr.proto.Fab\x1aI\n\x13OverrideConfigEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12!\n\x05value\x18\x02 \x01(\x0b\x32\x12.flwr.proto.Scalar:\x02\x38\x01\"#\n\x11\x43reateRunResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\x04\"?\n\rGetRunRequest\x12\x1e\n\x04node\x18\x01 \x01(\x0b\x32\x10.flwr.proto.Node\x12\x0e\n\x06run_id\x18\x02 \x01(\x04\".\n\x0eGetRunResponse\x12\x1c\n\x03run\x18\x01 \x01(\x0b\x32\x0f.flwr.proto.Run\"S\n\x16UpdateRunStatusRequest\x12\x0e\n\x06run_id\x18\x01 \x01(\x04\x12)\n\nrun_status\x18\x02 \x01(\x0b\x32\x15.flwr.proto.RunStatus\"\x19\n\x17UpdateRunStatusResponse\"F\n\x13GetRunStatusRequest\x12\x1e\n\x04node\x18\x01 \x01(\x0b\x32\x10.flwr.proto.Node\x12\x0f\n\x07run_ids\x18\x02 \x03(\x04\"\xb1\x01\n\x14GetRunStatusResponse\x12L\n\x0frun_status_dict\x18\x01 \x03(\x0b\x32\x33.flwr.proto.GetRunStatusResponse.RunStatusDictEntry\x1aK\n\x12RunStatusDictEntry\x12\x0b\n\x03key\x18\x01 \x01(\x04\x12$\n\x05value\x18\x02 \x01(\x0b\x32\x15.flwr.proto.RunStatus:\x02\x38\x01\"-\n\x1bGetFederationOptionsRequest\x12\x0e\n\x06run_id\x18\x01 \x01(\x04\"U\n\x1cGetFederationOptionsResponse\x12\x35\n\x12\x66\x65\x64\x65ration_options\x18\x01 \x01(\x0b\x32\x19.flwr.proto.ConfigsRecordb\x06proto3')
21
22
 
22
23
  _globals = globals()
23
24
  _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
@@ -30,30 +31,34 @@ if _descriptor._USE_C_DESCRIPTORS == False:
30
31
  _globals['_CREATERUNREQUEST_OVERRIDECONFIGENTRY']._serialized_options = b'8\001'
31
32
  _globals['_GETRUNSTATUSRESPONSE_RUNSTATUSDICTENTRY']._options = None
32
33
  _globals['_GETRUNSTATUSRESPONSE_RUNSTATUSDICTENTRY']._serialized_options = b'8\001'
33
- _globals['_RUN']._serialized_start=110
34
- _globals['_RUN']._serialized_end=323
35
- _globals['_RUN_OVERRIDECONFIGENTRY']._serialized_start=250
36
- _globals['_RUN_OVERRIDECONFIGENTRY']._serialized_end=323
37
- _globals['_RUNSTATUS']._serialized_start=325
38
- _globals['_RUNSTATUS']._serialized_end=389
39
- _globals['_CREATERUNREQUEST']._serialized_start=392
40
- _globals['_CREATERUNREQUEST']._serialized_end=627
41
- _globals['_CREATERUNREQUEST_OVERRIDECONFIGENTRY']._serialized_start=250
42
- _globals['_CREATERUNREQUEST_OVERRIDECONFIGENTRY']._serialized_end=323
43
- _globals['_CREATERUNRESPONSE']._serialized_start=629
44
- _globals['_CREATERUNRESPONSE']._serialized_end=664
45
- _globals['_GETRUNREQUEST']._serialized_start=666
46
- _globals['_GETRUNREQUEST']._serialized_end=729
47
- _globals['_GETRUNRESPONSE']._serialized_start=731
48
- _globals['_GETRUNRESPONSE']._serialized_end=777
49
- _globals['_UPDATERUNSTATUSREQUEST']._serialized_start=779
50
- _globals['_UPDATERUNSTATUSREQUEST']._serialized_end=862
51
- _globals['_UPDATERUNSTATUSRESPONSE']._serialized_start=864
52
- _globals['_UPDATERUNSTATUSRESPONSE']._serialized_end=889
53
- _globals['_GETRUNSTATUSREQUEST']._serialized_start=891
54
- _globals['_GETRUNSTATUSREQUEST']._serialized_end=961
55
- _globals['_GETRUNSTATUSRESPONSE']._serialized_start=964
56
- _globals['_GETRUNSTATUSRESPONSE']._serialized_end=1141
57
- _globals['_GETRUNSTATUSRESPONSE_RUNSTATUSDICTENTRY']._serialized_start=1066
58
- _globals['_GETRUNSTATUSRESPONSE_RUNSTATUSDICTENTRY']._serialized_end=1141
34
+ _globals['_RUN']._serialized_start=138
35
+ _globals['_RUN']._serialized_end=472
36
+ _globals['_RUN_OVERRIDECONFIGENTRY']._serialized_start=399
37
+ _globals['_RUN_OVERRIDECONFIGENTRY']._serialized_end=472
38
+ _globals['_RUNSTATUS']._serialized_start=474
39
+ _globals['_RUNSTATUS']._serialized_end=538
40
+ _globals['_CREATERUNREQUEST']._serialized_start=541
41
+ _globals['_CREATERUNREQUEST']._serialized_end=776
42
+ _globals['_CREATERUNREQUEST_OVERRIDECONFIGENTRY']._serialized_start=399
43
+ _globals['_CREATERUNREQUEST_OVERRIDECONFIGENTRY']._serialized_end=472
44
+ _globals['_CREATERUNRESPONSE']._serialized_start=778
45
+ _globals['_CREATERUNRESPONSE']._serialized_end=813
46
+ _globals['_GETRUNREQUEST']._serialized_start=815
47
+ _globals['_GETRUNREQUEST']._serialized_end=878
48
+ _globals['_GETRUNRESPONSE']._serialized_start=880
49
+ _globals['_GETRUNRESPONSE']._serialized_end=926
50
+ _globals['_UPDATERUNSTATUSREQUEST']._serialized_start=928
51
+ _globals['_UPDATERUNSTATUSREQUEST']._serialized_end=1011
52
+ _globals['_UPDATERUNSTATUSRESPONSE']._serialized_start=1013
53
+ _globals['_UPDATERUNSTATUSRESPONSE']._serialized_end=1038
54
+ _globals['_GETRUNSTATUSREQUEST']._serialized_start=1040
55
+ _globals['_GETRUNSTATUSREQUEST']._serialized_end=1110
56
+ _globals['_GETRUNSTATUSRESPONSE']._serialized_start=1113
57
+ _globals['_GETRUNSTATUSRESPONSE']._serialized_end=1290
58
+ _globals['_GETRUNSTATUSRESPONSE_RUNSTATUSDICTENTRY']._serialized_start=1215
59
+ _globals['_GETRUNSTATUSRESPONSE_RUNSTATUSDICTENTRY']._serialized_end=1290
60
+ _globals['_GETFEDERATIONOPTIONSREQUEST']._serialized_start=1292
61
+ _globals['_GETFEDERATIONOPTIONSREQUEST']._serialized_end=1337
62
+ _globals['_GETFEDERATIONOPTIONSRESPONSE']._serialized_start=1339
63
+ _globals['_GETFEDERATIONOPTIONSRESPONSE']._serialized_end=1424
59
64
  # @@protoc_insertion_point(module_scope)