flwr 1.22.0__py3-none-any.whl → 1.23.0__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 (108) hide show
  1. flwr/cli/app.py +15 -1
  2. flwr/cli/auth_plugin/__init__.py +15 -6
  3. flwr/cli/auth_plugin/auth_plugin.py +95 -0
  4. flwr/cli/auth_plugin/noop_auth_plugin.py +58 -0
  5. flwr/cli/auth_plugin/oidc_cli_plugin.py +16 -25
  6. flwr/cli/build.py +118 -47
  7. flwr/cli/{cli_user_auth_interceptor.py → cli_account_auth_interceptor.py} +6 -5
  8. flwr/cli/log.py +2 -2
  9. flwr/cli/login/login.py +34 -23
  10. flwr/cli/ls.py +13 -9
  11. flwr/cli/new/new.py +187 -35
  12. flwr/cli/new/templates/app/pyproject.baseline.toml.tpl +1 -1
  13. flwr/cli/new/templates/app/pyproject.flowertune.toml.tpl +1 -1
  14. flwr/cli/new/templates/app/pyproject.huggingface.toml.tpl +1 -1
  15. flwr/cli/new/templates/app/pyproject.jax.toml.tpl +1 -1
  16. flwr/cli/new/templates/app/pyproject.mlx.toml.tpl +1 -1
  17. flwr/cli/new/templates/app/pyproject.numpy.toml.tpl +1 -1
  18. flwr/cli/new/templates/app/pyproject.pytorch.toml.tpl +1 -1
  19. flwr/cli/new/templates/app/pyproject.pytorch_legacy_api.toml.tpl +1 -1
  20. flwr/cli/new/templates/app/pyproject.sklearn.toml.tpl +1 -1
  21. flwr/cli/new/templates/app/pyproject.tensorflow.toml.tpl +1 -1
  22. flwr/cli/new/templates/app/pyproject.xgboost.toml.tpl +1 -1
  23. flwr/cli/pull.py +2 -2
  24. flwr/cli/run/run.py +11 -7
  25. flwr/cli/stop.py +2 -2
  26. flwr/cli/supernode/__init__.py +25 -0
  27. flwr/cli/supernode/ls.py +260 -0
  28. flwr/cli/supernode/register.py +185 -0
  29. flwr/cli/supernode/unregister.py +138 -0
  30. flwr/cli/utils.py +92 -69
  31. flwr/client/__init__.py +2 -1
  32. flwr/client/grpc_adapter_client/connection.py +6 -8
  33. flwr/client/grpc_rere_client/connection.py +59 -31
  34. flwr/client/grpc_rere_client/grpc_adapter.py +28 -12
  35. flwr/client/grpc_rere_client/{client_interceptor.py → node_auth_client_interceptor.py} +3 -6
  36. flwr/client/mod/secure_aggregation/secaggplus_mod.py +7 -5
  37. flwr/client/rest_client/connection.py +82 -37
  38. flwr/clientapp/__init__.py +1 -2
  39. flwr/{client/clientapp → clientapp}/utils.py +1 -1
  40. flwr/common/constant.py +53 -13
  41. flwr/common/exit/exit_code.py +20 -10
  42. flwr/common/inflatable_utils.py +10 -10
  43. flwr/common/record/array.py +3 -3
  44. flwr/common/record/arrayrecord.py +10 -1
  45. flwr/common/secure_aggregation/crypto/symmetric_encryption.py +1 -89
  46. flwr/common/serde.py +4 -2
  47. flwr/common/typing.py +7 -6
  48. flwr/compat/client/app.py +1 -1
  49. flwr/compat/client/grpc_client/connection.py +2 -2
  50. flwr/proto/control_pb2.py +48 -35
  51. flwr/proto/control_pb2.pyi +71 -5
  52. flwr/proto/control_pb2_grpc.py +102 -0
  53. flwr/proto/control_pb2_grpc.pyi +39 -0
  54. flwr/proto/fab_pb2.py +11 -7
  55. flwr/proto/fab_pb2.pyi +21 -1
  56. flwr/proto/fleet_pb2.py +31 -23
  57. flwr/proto/fleet_pb2.pyi +63 -23
  58. flwr/proto/fleet_pb2_grpc.py +98 -28
  59. flwr/proto/fleet_pb2_grpc.pyi +45 -13
  60. flwr/proto/node_pb2.py +3 -1
  61. flwr/proto/node_pb2.pyi +48 -0
  62. flwr/server/app.py +139 -114
  63. flwr/server/superlink/fleet/grpc_adapter/grpc_adapter_servicer.py +17 -7
  64. flwr/server/superlink/fleet/grpc_rere/fleet_servicer.py +132 -38
  65. flwr/server/superlink/fleet/grpc_rere/{server_interceptor.py → node_auth_server_interceptor.py} +27 -51
  66. flwr/server/superlink/fleet/message_handler/message_handler.py +67 -22
  67. flwr/server/superlink/fleet/rest_rere/rest_api.py +52 -31
  68. flwr/server/superlink/fleet/vce/backend/backend.py +1 -1
  69. flwr/server/superlink/fleet/vce/backend/raybackend.py +1 -1
  70. flwr/server/superlink/fleet/vce/vce_api.py +18 -5
  71. flwr/server/superlink/linkstate/in_memory_linkstate.py +167 -73
  72. flwr/server/superlink/linkstate/linkstate.py +107 -24
  73. flwr/server/superlink/linkstate/linkstate_factory.py +2 -1
  74. flwr/server/superlink/linkstate/sqlite_linkstate.py +306 -255
  75. flwr/server/superlink/linkstate/utils.py +3 -54
  76. flwr/server/superlink/serverappio/serverappio_servicer.py +2 -2
  77. flwr/server/superlink/simulation/simulationio_servicer.py +1 -1
  78. flwr/server/utils/validator.py +2 -3
  79. flwr/server/workflow/secure_aggregation/secaggplus_workflow.py +4 -2
  80. flwr/simulation/ray_transport/ray_actor.py +1 -1
  81. flwr/simulation/ray_transport/ray_client_proxy.py +1 -1
  82. flwr/simulation/run_simulation.py +3 -2
  83. flwr/supercore/constant.py +22 -0
  84. flwr/supercore/object_store/in_memory_object_store.py +0 -4
  85. flwr/supercore/object_store/object_store_factory.py +26 -6
  86. flwr/supercore/object_store/sqlite_object_store.py +252 -0
  87. flwr/{client/clientapp → supercore/primitives}/__init__.py +1 -1
  88. flwr/supercore/primitives/asymmetric.py +117 -0
  89. flwr/supercore/primitives/asymmetric_ed25519.py +165 -0
  90. flwr/supercore/sqlite_mixin.py +156 -0
  91. flwr/supercore/utils.py +20 -0
  92. flwr/{common → superlink}/auth_plugin/__init__.py +6 -6
  93. flwr/superlink/auth_plugin/auth_plugin.py +91 -0
  94. flwr/superlink/auth_plugin/noop_auth_plugin.py +87 -0
  95. flwr/superlink/servicer/control/{control_user_auth_interceptor.py → control_account_auth_interceptor.py} +19 -19
  96. flwr/superlink/servicer/control/control_event_log_interceptor.py +1 -1
  97. flwr/superlink/servicer/control/control_grpc.py +13 -11
  98. flwr/superlink/servicer/control/control_servicer.py +152 -60
  99. flwr/supernode/cli/flower_supernode.py +19 -26
  100. flwr/supernode/runtime/run_clientapp.py +2 -2
  101. flwr/supernode/servicer/clientappio/clientappio_servicer.py +1 -1
  102. flwr/supernode/start_client_internal.py +17 -9
  103. {flwr-1.22.0.dist-info → flwr-1.23.0.dist-info}/METADATA +1 -1
  104. {flwr-1.22.0.dist-info → flwr-1.23.0.dist-info}/RECORD +107 -96
  105. flwr/common/auth_plugin/auth_plugin.py +0 -149
  106. /flwr/{client → clientapp}/client_app.py +0 -0
  107. {flwr-1.22.0.dist-info → flwr-1.23.0.dist-info}/WHEEL +0 -0
  108. {flwr-1.22.0.dist-info → flwr-1.23.0.dist-info}/entry_points.txt +0 -0
flwr/proto/fleet_pb2.py CHANGED
@@ -19,7 +19,7 @@ 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\"\xa2\x01\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\x12\x34\n\x14message_object_trees\x18\x03 \x03(\x0b\x32\x16.flwr.proto.ObjectTree\"\x97\x01\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\x12\x34\n\x14message_object_trees\x18\x03 \x03(\x0b\x32\x16.flwr.proto.ObjectTree\"\xc9\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\x12\x17\n\x0fobjects_to_push\x18\x03 \x03(\t\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\xca\x06\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\x12q\n\x16\x43onfirmMessageReceived\x12).flwr.proto.ConfirmMessageReceivedRequest\x1a*.flwr.proto.ConfirmMessageReceivedResponse\"\x00\x62\x06proto3')
22
+ DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x16\x66lwr/proto/fleet.proto\x12\nflwr.proto\x1a\x1a\x66lwr/proto/heartbeat.proto\x1a\x15\x66lwr/proto/node.proto\x1a\x14\x66lwr/proto/run.proto\x1a\x14\x66lwr/proto/fab.proto\x1a\x18\x66lwr/proto/message.proto\".\n\x18RegisterNodeFleetRequest\x12\x12\n\npublic_key\x18\x01 \x01(\x0c\",\n\x19RegisterNodeFleetResponse\x12\x0f\n\x07node_id\x18\x01 \x01(\x04\"E\n\x13\x41\x63tivateNodeRequest\x12\x12\n\npublic_key\x18\x01 \x01(\x0c\x12\x1a\n\x12heartbeat_interval\x18\x02 \x01(\x01\"\'\n\x14\x41\x63tivateNodeResponse\x12\x0f\n\x07node_id\x18\x01 \x01(\x04\"(\n\x15\x44\x65\x61\x63tivateNodeRequest\x12\x0f\n\x07node_id\x18\x01 \x01(\x04\"\x18\n\x16\x44\x65\x61\x63tivateNodeResponse\"-\n\x1aUnregisterNodeFleetRequest\x12\x0f\n\x07node_id\x18\x01 \x01(\x04\"\x1d\n\x1bUnregisterNodeFleetResponse\"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\"\xa2\x01\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\x12\x34\n\x14message_object_trees\x18\x03 \x03(\x0b\x32\x16.flwr.proto.ObjectTree\"\x97\x01\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\x12\x34\n\x14message_object_trees\x18\x03 \x03(\x0b\x32\x16.flwr.proto.ObjectTree\"\xc9\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\x12\x17\n\x0fobjects_to_push\x18\x03 \x03(\t\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\xa0\x08\n\x05\x46leet\x12]\n\x0cRegisterNode\x12$.flwr.proto.RegisterNodeFleetRequest\x1a%.flwr.proto.RegisterNodeFleetResponse\"\x00\x12S\n\x0c\x41\x63tivateNode\x12\x1f.flwr.proto.ActivateNodeRequest\x1a .flwr.proto.ActivateNodeResponse\"\x00\x12Y\n\x0e\x44\x65\x61\x63tivateNode\x12!.flwr.proto.DeactivateNodeRequest\x1a\".flwr.proto.DeactivateNodeResponse\"\x00\x12\x63\n\x0eUnregisterNode\x12&.flwr.proto.UnregisterNodeFleetRequest\x1a\'.flwr.proto.UnregisterNodeFleetResponse\"\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\x12q\n\x16\x43onfirmMessageReceived\x12).flwr.proto.ConfirmMessageReceivedRequest\x1a*.flwr.proto.ConfirmMessageReceivedResponse\"\x00\x62\x06proto3')
23
23
 
24
24
  _globals = globals()
25
25
  _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
@@ -28,26 +28,34 @@ if _descriptor._USE_C_DESCRIPTORS == False:
28
28
  DESCRIPTOR._options = None
29
29
  _globals['_PUSHMESSAGESRESPONSE_RESULTSENTRY']._options = None
30
30
  _globals['_PUSHMESSAGESRESPONSE_RESULTSENTRY']._serialized_options = b'8\001'
31
- _globals['_CREATENODEREQUEST']._serialized_start=159
32
- _globals['_CREATENODEREQUEST']._serialized_end=206
33
- _globals['_CREATENODERESPONSE']._serialized_start=208
34
- _globals['_CREATENODERESPONSE']._serialized_end=260
35
- _globals['_DELETENODEREQUEST']._serialized_start=262
36
- _globals['_DELETENODEREQUEST']._serialized_end=313
37
- _globals['_DELETENODERESPONSE']._serialized_start=315
38
- _globals['_DELETENODERESPONSE']._serialized_end=335
39
- _globals['_PULLMESSAGESREQUEST']._serialized_start=337
40
- _globals['_PULLMESSAGESREQUEST']._serialized_end=411
41
- _globals['_PULLMESSAGESRESPONSE']._serialized_start=414
42
- _globals['_PULLMESSAGESRESPONSE']._serialized_end=576
43
- _globals['_PUSHMESSAGESREQUEST']._serialized_start=579
44
- _globals['_PUSHMESSAGESREQUEST']._serialized_end=730
45
- _globals['_PUSHMESSAGESRESPONSE']._serialized_start=733
46
- _globals['_PUSHMESSAGESRESPONSE']._serialized_end=934
47
- _globals['_PUSHMESSAGESRESPONSE_RESULTSENTRY']._serialized_start=888
48
- _globals['_PUSHMESSAGESRESPONSE_RESULTSENTRY']._serialized_end=934
49
- _globals['_RECONNECT']._serialized_start=936
50
- _globals['_RECONNECT']._serialized_end=966
51
- _globals['_FLEET']._serialized_start=969
52
- _globals['_FLEET']._serialized_end=1811
31
+ _globals['_REGISTERNODEFLEETREQUEST']._serialized_start=159
32
+ _globals['_REGISTERNODEFLEETREQUEST']._serialized_end=205
33
+ _globals['_REGISTERNODEFLEETRESPONSE']._serialized_start=207
34
+ _globals['_REGISTERNODEFLEETRESPONSE']._serialized_end=251
35
+ _globals['_ACTIVATENODEREQUEST']._serialized_start=253
36
+ _globals['_ACTIVATENODEREQUEST']._serialized_end=322
37
+ _globals['_ACTIVATENODERESPONSE']._serialized_start=324
38
+ _globals['_ACTIVATENODERESPONSE']._serialized_end=363
39
+ _globals['_DEACTIVATENODEREQUEST']._serialized_start=365
40
+ _globals['_DEACTIVATENODEREQUEST']._serialized_end=405
41
+ _globals['_DEACTIVATENODERESPONSE']._serialized_start=407
42
+ _globals['_DEACTIVATENODERESPONSE']._serialized_end=431
43
+ _globals['_UNREGISTERNODEFLEETREQUEST']._serialized_start=433
44
+ _globals['_UNREGISTERNODEFLEETREQUEST']._serialized_end=478
45
+ _globals['_UNREGISTERNODEFLEETRESPONSE']._serialized_start=480
46
+ _globals['_UNREGISTERNODEFLEETRESPONSE']._serialized_end=509
47
+ _globals['_PULLMESSAGESREQUEST']._serialized_start=511
48
+ _globals['_PULLMESSAGESREQUEST']._serialized_end=585
49
+ _globals['_PULLMESSAGESRESPONSE']._serialized_start=588
50
+ _globals['_PULLMESSAGESRESPONSE']._serialized_end=750
51
+ _globals['_PUSHMESSAGESREQUEST']._serialized_start=753
52
+ _globals['_PUSHMESSAGESREQUEST']._serialized_end=904
53
+ _globals['_PUSHMESSAGESRESPONSE']._serialized_start=907
54
+ _globals['_PUSHMESSAGESRESPONSE']._serialized_end=1108
55
+ _globals['_PUSHMESSAGESRESPONSE_RESULTSENTRY']._serialized_start=1062
56
+ _globals['_PUSHMESSAGESRESPONSE_RESULTSENTRY']._serialized_end=1108
57
+ _globals['_RECONNECT']._serialized_start=1110
58
+ _globals['_RECONNECT']._serialized_end=1140
59
+ _globals['_FLEET']._serialized_start=1143
60
+ _globals['_FLEET']._serialized_end=2199
53
61
  # @@protoc_insertion_point(module_scope)
flwr/proto/fleet_pb2.pyi CHANGED
@@ -13,50 +13,90 @@ import typing_extensions
13
13
 
14
14
  DESCRIPTOR: google.protobuf.descriptor.FileDescriptor
15
15
 
16
- class CreateNodeRequest(google.protobuf.message.Message):
17
- """CreateNode messages"""
16
+ class RegisterNodeFleetRequest(google.protobuf.message.Message):
17
+ """RegisterNode messages (add prefix to avoid name clash)"""
18
18
  DESCRIPTOR: google.protobuf.descriptor.Descriptor
19
+ PUBLIC_KEY_FIELD_NUMBER: builtins.int
20
+ public_key: builtins.bytes
21
+ def __init__(self,
22
+ *,
23
+ public_key: builtins.bytes = ...,
24
+ ) -> None: ...
25
+ def ClearField(self, field_name: typing_extensions.Literal["public_key",b"public_key"]) -> None: ...
26
+ global___RegisterNodeFleetRequest = RegisterNodeFleetRequest
27
+
28
+ class RegisterNodeFleetResponse(google.protobuf.message.Message):
29
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
30
+ NODE_ID_FIELD_NUMBER: builtins.int
31
+ node_id: builtins.int
32
+ def __init__(self,
33
+ *,
34
+ node_id: builtins.int = ...,
35
+ ) -> None: ...
36
+ def ClearField(self, field_name: typing_extensions.Literal["node_id",b"node_id"]) -> None: ...
37
+ global___RegisterNodeFleetResponse = RegisterNodeFleetResponse
38
+
39
+ class ActivateNodeRequest(google.protobuf.message.Message):
40
+ """ActivateNode messages"""
41
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
42
+ PUBLIC_KEY_FIELD_NUMBER: builtins.int
19
43
  HEARTBEAT_INTERVAL_FIELD_NUMBER: builtins.int
44
+ public_key: builtins.bytes
20
45
  heartbeat_interval: builtins.float
21
46
  def __init__(self,
22
47
  *,
48
+ public_key: builtins.bytes = ...,
23
49
  heartbeat_interval: builtins.float = ...,
24
50
  ) -> None: ...
25
- def ClearField(self, field_name: typing_extensions.Literal["heartbeat_interval",b"heartbeat_interval"]) -> None: ...
26
- global___CreateNodeRequest = CreateNodeRequest
51
+ def ClearField(self, field_name: typing_extensions.Literal["heartbeat_interval",b"heartbeat_interval","public_key",b"public_key"]) -> None: ...
52
+ global___ActivateNodeRequest = ActivateNodeRequest
27
53
 
28
- class CreateNodeResponse(google.protobuf.message.Message):
54
+ class ActivateNodeResponse(google.protobuf.message.Message):
29
55
  DESCRIPTOR: google.protobuf.descriptor.Descriptor
30
- NODE_FIELD_NUMBER: builtins.int
31
- @property
32
- def node(self) -> flwr.proto.node_pb2.Node: ...
56
+ NODE_ID_FIELD_NUMBER: builtins.int
57
+ node_id: builtins.int
33
58
  def __init__(self,
34
59
  *,
35
- node: typing.Optional[flwr.proto.node_pb2.Node] = ...,
60
+ node_id: builtins.int = ...,
36
61
  ) -> None: ...
37
- def HasField(self, field_name: typing_extensions.Literal["node",b"node"]) -> builtins.bool: ...
38
- def ClearField(self, field_name: typing_extensions.Literal["node",b"node"]) -> None: ...
39
- global___CreateNodeResponse = CreateNodeResponse
62
+ def ClearField(self, field_name: typing_extensions.Literal["node_id",b"node_id"]) -> None: ...
63
+ global___ActivateNodeResponse = ActivateNodeResponse
40
64
 
41
- class DeleteNodeRequest(google.protobuf.message.Message):
42
- """DeleteNode messages"""
65
+ class DeactivateNodeRequest(google.protobuf.message.Message):
66
+ """DeactivateNode messages"""
43
67
  DESCRIPTOR: google.protobuf.descriptor.Descriptor
44
- NODE_FIELD_NUMBER: builtins.int
45
- @property
46
- def node(self) -> flwr.proto.node_pb2.Node: ...
68
+ NODE_ID_FIELD_NUMBER: builtins.int
69
+ node_id: builtins.int
47
70
  def __init__(self,
48
71
  *,
49
- node: typing.Optional[flwr.proto.node_pb2.Node] = ...,
72
+ node_id: builtins.int = ...,
50
73
  ) -> None: ...
51
- def HasField(self, field_name: typing_extensions.Literal["node",b"node"]) -> builtins.bool: ...
52
- def ClearField(self, field_name: typing_extensions.Literal["node",b"node"]) -> None: ...
53
- global___DeleteNodeRequest = DeleteNodeRequest
74
+ def ClearField(self, field_name: typing_extensions.Literal["node_id",b"node_id"]) -> None: ...
75
+ global___DeactivateNodeRequest = DeactivateNodeRequest
76
+
77
+ class DeactivateNodeResponse(google.protobuf.message.Message):
78
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
79
+ def __init__(self,
80
+ ) -> None: ...
81
+ global___DeactivateNodeResponse = DeactivateNodeResponse
82
+
83
+ class UnregisterNodeFleetRequest(google.protobuf.message.Message):
84
+ """UnregisterNode messages (add prefix to avoid name clash)"""
85
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
86
+ NODE_ID_FIELD_NUMBER: builtins.int
87
+ node_id: builtins.int
88
+ def __init__(self,
89
+ *,
90
+ node_id: builtins.int = ...,
91
+ ) -> None: ...
92
+ def ClearField(self, field_name: typing_extensions.Literal["node_id",b"node_id"]) -> None: ...
93
+ global___UnregisterNodeFleetRequest = UnregisterNodeFleetRequest
54
94
 
55
- class DeleteNodeResponse(google.protobuf.message.Message):
95
+ class UnregisterNodeFleetResponse(google.protobuf.message.Message):
56
96
  DESCRIPTOR: google.protobuf.descriptor.Descriptor
57
97
  def __init__(self,
58
98
  ) -> None: ...
59
- global___DeleteNodeResponse = DeleteNodeResponse
99
+ global___UnregisterNodeFleetResponse = UnregisterNodeFleetResponse
60
100
 
61
101
  class PullMessagesRequest(google.protobuf.message.Message):
62
102
  """PullMessages messages"""
@@ -18,15 +18,25 @@ class FleetStub(object):
18
18
  Args:
19
19
  channel: A grpc.Channel.
20
20
  """
21
- self.CreateNode = channel.unary_unary(
22
- '/flwr.proto.Fleet/CreateNode',
23
- request_serializer=flwr_dot_proto_dot_fleet__pb2.CreateNodeRequest.SerializeToString,
24
- response_deserializer=flwr_dot_proto_dot_fleet__pb2.CreateNodeResponse.FromString,
21
+ self.RegisterNode = channel.unary_unary(
22
+ '/flwr.proto.Fleet/RegisterNode',
23
+ request_serializer=flwr_dot_proto_dot_fleet__pb2.RegisterNodeFleetRequest.SerializeToString,
24
+ response_deserializer=flwr_dot_proto_dot_fleet__pb2.RegisterNodeFleetResponse.FromString,
25
25
  )
26
- self.DeleteNode = channel.unary_unary(
27
- '/flwr.proto.Fleet/DeleteNode',
28
- request_serializer=flwr_dot_proto_dot_fleet__pb2.DeleteNodeRequest.SerializeToString,
29
- response_deserializer=flwr_dot_proto_dot_fleet__pb2.DeleteNodeResponse.FromString,
26
+ self.ActivateNode = channel.unary_unary(
27
+ '/flwr.proto.Fleet/ActivateNode',
28
+ request_serializer=flwr_dot_proto_dot_fleet__pb2.ActivateNodeRequest.SerializeToString,
29
+ response_deserializer=flwr_dot_proto_dot_fleet__pb2.ActivateNodeResponse.FromString,
30
+ )
31
+ self.DeactivateNode = channel.unary_unary(
32
+ '/flwr.proto.Fleet/DeactivateNode',
33
+ request_serializer=flwr_dot_proto_dot_fleet__pb2.DeactivateNodeRequest.SerializeToString,
34
+ response_deserializer=flwr_dot_proto_dot_fleet__pb2.DeactivateNodeResponse.FromString,
35
+ )
36
+ self.UnregisterNode = channel.unary_unary(
37
+ '/flwr.proto.Fleet/UnregisterNode',
38
+ request_serializer=flwr_dot_proto_dot_fleet__pb2.UnregisterNodeFleetRequest.SerializeToString,
39
+ response_deserializer=flwr_dot_proto_dot_fleet__pb2.UnregisterNodeFleetResponse.FromString,
30
40
  )
31
41
  self.SendNodeHeartbeat = channel.unary_unary(
32
42
  '/flwr.proto.Fleet/SendNodeHeartbeat',
@@ -73,14 +83,30 @@ class FleetStub(object):
73
83
  class FleetServicer(object):
74
84
  """Missing associated documentation comment in .proto file."""
75
85
 
76
- def CreateNode(self, request, context):
77
- """Missing associated documentation comment in .proto file."""
86
+ def RegisterNode(self, request, context):
87
+ """Register Node
88
+ """
78
89
  context.set_code(grpc.StatusCode.UNIMPLEMENTED)
79
90
  context.set_details('Method not implemented!')
80
91
  raise NotImplementedError('Method not implemented!')
81
92
 
82
- def DeleteNode(self, request, context):
83
- """Missing associated documentation comment in .proto file."""
93
+ def ActivateNode(self, request, context):
94
+ """Activate Node
95
+ """
96
+ context.set_code(grpc.StatusCode.UNIMPLEMENTED)
97
+ context.set_details('Method not implemented!')
98
+ raise NotImplementedError('Method not implemented!')
99
+
100
+ def DeactivateNode(self, request, context):
101
+ """Deactivate Node
102
+ """
103
+ context.set_code(grpc.StatusCode.UNIMPLEMENTED)
104
+ context.set_details('Method not implemented!')
105
+ raise NotImplementedError('Method not implemented!')
106
+
107
+ def UnregisterNode(self, request, context):
108
+ """Unregister Node
109
+ """
84
110
  context.set_code(grpc.StatusCode.UNIMPLEMENTED)
85
111
  context.set_details('Method not implemented!')
86
112
  raise NotImplementedError('Method not implemented!')
@@ -146,15 +172,25 @@ class FleetServicer(object):
146
172
 
147
173
  def add_FleetServicer_to_server(servicer, server):
148
174
  rpc_method_handlers = {
149
- 'CreateNode': grpc.unary_unary_rpc_method_handler(
150
- servicer.CreateNode,
151
- request_deserializer=flwr_dot_proto_dot_fleet__pb2.CreateNodeRequest.FromString,
152
- response_serializer=flwr_dot_proto_dot_fleet__pb2.CreateNodeResponse.SerializeToString,
175
+ 'RegisterNode': grpc.unary_unary_rpc_method_handler(
176
+ servicer.RegisterNode,
177
+ request_deserializer=flwr_dot_proto_dot_fleet__pb2.RegisterNodeFleetRequest.FromString,
178
+ response_serializer=flwr_dot_proto_dot_fleet__pb2.RegisterNodeFleetResponse.SerializeToString,
179
+ ),
180
+ 'ActivateNode': grpc.unary_unary_rpc_method_handler(
181
+ servicer.ActivateNode,
182
+ request_deserializer=flwr_dot_proto_dot_fleet__pb2.ActivateNodeRequest.FromString,
183
+ response_serializer=flwr_dot_proto_dot_fleet__pb2.ActivateNodeResponse.SerializeToString,
153
184
  ),
154
- 'DeleteNode': grpc.unary_unary_rpc_method_handler(
155
- servicer.DeleteNode,
156
- request_deserializer=flwr_dot_proto_dot_fleet__pb2.DeleteNodeRequest.FromString,
157
- response_serializer=flwr_dot_proto_dot_fleet__pb2.DeleteNodeResponse.SerializeToString,
185
+ 'DeactivateNode': grpc.unary_unary_rpc_method_handler(
186
+ servicer.DeactivateNode,
187
+ request_deserializer=flwr_dot_proto_dot_fleet__pb2.DeactivateNodeRequest.FromString,
188
+ response_serializer=flwr_dot_proto_dot_fleet__pb2.DeactivateNodeResponse.SerializeToString,
189
+ ),
190
+ 'UnregisterNode': grpc.unary_unary_rpc_method_handler(
191
+ servicer.UnregisterNode,
192
+ request_deserializer=flwr_dot_proto_dot_fleet__pb2.UnregisterNodeFleetRequest.FromString,
193
+ response_serializer=flwr_dot_proto_dot_fleet__pb2.UnregisterNodeFleetResponse.SerializeToString,
158
194
  ),
159
195
  'SendNodeHeartbeat': grpc.unary_unary_rpc_method_handler(
160
196
  servicer.SendNodeHeartbeat,
@@ -207,7 +243,41 @@ class Fleet(object):
207
243
  """Missing associated documentation comment in .proto file."""
208
244
 
209
245
  @staticmethod
210
- def CreateNode(request,
246
+ def RegisterNode(request,
247
+ target,
248
+ options=(),
249
+ channel_credentials=None,
250
+ call_credentials=None,
251
+ insecure=False,
252
+ compression=None,
253
+ wait_for_ready=None,
254
+ timeout=None,
255
+ metadata=None):
256
+ return grpc.experimental.unary_unary(request, target, '/flwr.proto.Fleet/RegisterNode',
257
+ flwr_dot_proto_dot_fleet__pb2.RegisterNodeFleetRequest.SerializeToString,
258
+ flwr_dot_proto_dot_fleet__pb2.RegisterNodeFleetResponse.FromString,
259
+ options, channel_credentials,
260
+ insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
261
+
262
+ @staticmethod
263
+ def ActivateNode(request,
264
+ target,
265
+ options=(),
266
+ channel_credentials=None,
267
+ call_credentials=None,
268
+ insecure=False,
269
+ compression=None,
270
+ wait_for_ready=None,
271
+ timeout=None,
272
+ metadata=None):
273
+ return grpc.experimental.unary_unary(request, target, '/flwr.proto.Fleet/ActivateNode',
274
+ flwr_dot_proto_dot_fleet__pb2.ActivateNodeRequest.SerializeToString,
275
+ flwr_dot_proto_dot_fleet__pb2.ActivateNodeResponse.FromString,
276
+ options, channel_credentials,
277
+ insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
278
+
279
+ @staticmethod
280
+ def DeactivateNode(request,
211
281
  target,
212
282
  options=(),
213
283
  channel_credentials=None,
@@ -217,14 +287,14 @@ class Fleet(object):
217
287
  wait_for_ready=None,
218
288
  timeout=None,
219
289
  metadata=None):
220
- return grpc.experimental.unary_unary(request, target, '/flwr.proto.Fleet/CreateNode',
221
- flwr_dot_proto_dot_fleet__pb2.CreateNodeRequest.SerializeToString,
222
- flwr_dot_proto_dot_fleet__pb2.CreateNodeResponse.FromString,
290
+ return grpc.experimental.unary_unary(request, target, '/flwr.proto.Fleet/DeactivateNode',
291
+ flwr_dot_proto_dot_fleet__pb2.DeactivateNodeRequest.SerializeToString,
292
+ flwr_dot_proto_dot_fleet__pb2.DeactivateNodeResponse.FromString,
223
293
  options, channel_credentials,
224
294
  insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
225
295
 
226
296
  @staticmethod
227
- def DeleteNode(request,
297
+ def UnregisterNode(request,
228
298
  target,
229
299
  options=(),
230
300
  channel_credentials=None,
@@ -234,9 +304,9 @@ class Fleet(object):
234
304
  wait_for_ready=None,
235
305
  timeout=None,
236
306
  metadata=None):
237
- return grpc.experimental.unary_unary(request, target, '/flwr.proto.Fleet/DeleteNode',
238
- flwr_dot_proto_dot_fleet__pb2.DeleteNodeRequest.SerializeToString,
239
- flwr_dot_proto_dot_fleet__pb2.DeleteNodeResponse.FromString,
307
+ return grpc.experimental.unary_unary(request, target, '/flwr.proto.Fleet/UnregisterNode',
308
+ flwr_dot_proto_dot_fleet__pb2.UnregisterNodeFleetRequest.SerializeToString,
309
+ flwr_dot_proto_dot_fleet__pb2.UnregisterNodeFleetResponse.FromString,
240
310
  options, channel_credentials,
241
311
  insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
242
312
 
@@ -12,13 +12,25 @@ import grpc
12
12
 
13
13
  class FleetStub:
14
14
  def __init__(self, channel: grpc.Channel) -> None: ...
15
- CreateNode: grpc.UnaryUnaryMultiCallable[
16
- flwr.proto.fleet_pb2.CreateNodeRequest,
17
- flwr.proto.fleet_pb2.CreateNodeResponse]
18
-
19
- DeleteNode: grpc.UnaryUnaryMultiCallable[
20
- flwr.proto.fleet_pb2.DeleteNodeRequest,
21
- flwr.proto.fleet_pb2.DeleteNodeResponse]
15
+ RegisterNode: grpc.UnaryUnaryMultiCallable[
16
+ flwr.proto.fleet_pb2.RegisterNodeFleetRequest,
17
+ flwr.proto.fleet_pb2.RegisterNodeFleetResponse]
18
+ """Register Node"""
19
+
20
+ ActivateNode: grpc.UnaryUnaryMultiCallable[
21
+ flwr.proto.fleet_pb2.ActivateNodeRequest,
22
+ flwr.proto.fleet_pb2.ActivateNodeResponse]
23
+ """Activate Node"""
24
+
25
+ DeactivateNode: grpc.UnaryUnaryMultiCallable[
26
+ flwr.proto.fleet_pb2.DeactivateNodeRequest,
27
+ flwr.proto.fleet_pb2.DeactivateNodeResponse]
28
+ """Deactivate Node"""
29
+
30
+ UnregisterNode: grpc.UnaryUnaryMultiCallable[
31
+ flwr.proto.fleet_pb2.UnregisterNodeFleetRequest,
32
+ flwr.proto.fleet_pb2.UnregisterNodeFleetResponse]
33
+ """Unregister Node"""
22
34
 
23
35
  SendNodeHeartbeat: grpc.UnaryUnaryMultiCallable[
24
36
  flwr.proto.heartbeat_pb2.SendNodeHeartbeatRequest,
@@ -67,16 +79,36 @@ class FleetStub:
67
79
 
68
80
  class FleetServicer(metaclass=abc.ABCMeta):
69
81
  @abc.abstractmethod
70
- def CreateNode(self,
71
- request: flwr.proto.fleet_pb2.CreateNodeRequest,
82
+ def RegisterNode(self,
83
+ request: flwr.proto.fleet_pb2.RegisterNodeFleetRequest,
84
+ context: grpc.ServicerContext,
85
+ ) -> flwr.proto.fleet_pb2.RegisterNodeFleetResponse:
86
+ """Register Node"""
87
+ pass
88
+
89
+ @abc.abstractmethod
90
+ def ActivateNode(self,
91
+ request: flwr.proto.fleet_pb2.ActivateNodeRequest,
72
92
  context: grpc.ServicerContext,
73
- ) -> flwr.proto.fleet_pb2.CreateNodeResponse: ...
93
+ ) -> flwr.proto.fleet_pb2.ActivateNodeResponse:
94
+ """Activate Node"""
95
+ pass
74
96
 
75
97
  @abc.abstractmethod
76
- def DeleteNode(self,
77
- request: flwr.proto.fleet_pb2.DeleteNodeRequest,
98
+ def DeactivateNode(self,
99
+ request: flwr.proto.fleet_pb2.DeactivateNodeRequest,
78
100
  context: grpc.ServicerContext,
79
- ) -> flwr.proto.fleet_pb2.DeleteNodeResponse: ...
101
+ ) -> flwr.proto.fleet_pb2.DeactivateNodeResponse:
102
+ """Deactivate Node"""
103
+ pass
104
+
105
+ @abc.abstractmethod
106
+ def UnregisterNode(self,
107
+ request: flwr.proto.fleet_pb2.UnregisterNodeFleetRequest,
108
+ context: grpc.ServicerContext,
109
+ ) -> flwr.proto.fleet_pb2.UnregisterNodeFleetResponse:
110
+ """Unregister Node"""
111
+ pass
80
112
 
81
113
  @abc.abstractmethod
82
114
  def SendNodeHeartbeat(self,
flwr/proto/node_pb2.py CHANGED
@@ -14,7 +14,7 @@ _sym_db = _symbol_database.Default()
14
14
 
15
15
 
16
16
 
17
- DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x15\x66lwr/proto/node.proto\x12\nflwr.proto\"\x17\n\x04Node\x12\x0f\n\x07node_id\x18\x01 \x01(\x04\x62\x06proto3')
17
+ DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x15\x66lwr/proto/node.proto\x12\nflwr.proto\"\x17\n\x04Node\x12\x0f\n\x07node_id\x18\x01 \x01(\x04\"\xd3\x02\n\x08NodeInfo\x12\x0f\n\x07node_id\x18\x01 \x01(\x04\x12\x11\n\towner_aid\x18\x02 \x01(\t\x12\x0e\n\x06status\x18\x03 \x01(\t\x12\x15\n\rregistered_at\x18\x04 \x01(\t\x12\x1e\n\x11last_activated_at\x18\x05 \x01(\tH\x00\x88\x01\x01\x12 \n\x13last_deactivated_at\x18\x06 \x01(\tH\x01\x88\x01\x01\x12\x1c\n\x0funregistered_at\x18\x07 \x01(\tH\x02\x88\x01\x01\x12\x19\n\x0conline_until\x18\x08 \x01(\x01H\x03\x88\x01\x01\x12\x1a\n\x12heartbeat_interval\x18\t \x01(\x01\x12\x12\n\npublic_key\x18\n \x01(\x0c\x42\x14\n\x12_last_activated_atB\x16\n\x14_last_deactivated_atB\x12\n\x10_unregistered_atB\x0f\n\r_online_untilb\x06proto3')
18
18
 
19
19
  _globals = globals()
20
20
  _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
@@ -23,4 +23,6 @@ if _descriptor._USE_C_DESCRIPTORS == False:
23
23
  DESCRIPTOR._options = None
24
24
  _globals['_NODE']._serialized_start=37
25
25
  _globals['_NODE']._serialized_end=60
26
+ _globals['_NODEINFO']._serialized_start=63
27
+ _globals['_NODEINFO']._serialized_end=402
26
28
  # @@protoc_insertion_point(module_scope)
flwr/proto/node_pb2.pyi CHANGED
@@ -5,6 +5,7 @@ isort:skip_file
5
5
  import builtins
6
6
  import google.protobuf.descriptor
7
7
  import google.protobuf.message
8
+ import typing
8
9
  import typing_extensions
9
10
 
10
11
  DESCRIPTOR: google.protobuf.descriptor.FileDescriptor
@@ -19,3 +20,50 @@ class Node(google.protobuf.message.Message):
19
20
  ) -> None: ...
20
21
  def ClearField(self, field_name: typing_extensions.Literal["node_id",b"node_id"]) -> None: ...
21
22
  global___Node = Node
23
+
24
+ class NodeInfo(google.protobuf.message.Message):
25
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
26
+ NODE_ID_FIELD_NUMBER: builtins.int
27
+ OWNER_AID_FIELD_NUMBER: builtins.int
28
+ STATUS_FIELD_NUMBER: builtins.int
29
+ REGISTERED_AT_FIELD_NUMBER: builtins.int
30
+ LAST_ACTIVATED_AT_FIELD_NUMBER: builtins.int
31
+ LAST_DEACTIVATED_AT_FIELD_NUMBER: builtins.int
32
+ UNREGISTERED_AT_FIELD_NUMBER: builtins.int
33
+ ONLINE_UNTIL_FIELD_NUMBER: builtins.int
34
+ HEARTBEAT_INTERVAL_FIELD_NUMBER: builtins.int
35
+ PUBLIC_KEY_FIELD_NUMBER: builtins.int
36
+ node_id: builtins.int
37
+ owner_aid: typing.Text
38
+ status: typing.Text
39
+ registered_at: typing.Text
40
+ last_activated_at: typing.Text
41
+ last_deactivated_at: typing.Text
42
+ unregistered_at: typing.Text
43
+ online_until: builtins.float
44
+ heartbeat_interval: builtins.float
45
+ public_key: builtins.bytes
46
+ def __init__(self,
47
+ *,
48
+ node_id: builtins.int = ...,
49
+ owner_aid: typing.Text = ...,
50
+ status: typing.Text = ...,
51
+ registered_at: typing.Text = ...,
52
+ last_activated_at: typing.Optional[typing.Text] = ...,
53
+ last_deactivated_at: typing.Optional[typing.Text] = ...,
54
+ unregistered_at: typing.Optional[typing.Text] = ...,
55
+ online_until: typing.Optional[builtins.float] = ...,
56
+ heartbeat_interval: builtins.float = ...,
57
+ public_key: builtins.bytes = ...,
58
+ ) -> None: ...
59
+ def HasField(self, field_name: typing_extensions.Literal["_last_activated_at",b"_last_activated_at","_last_deactivated_at",b"_last_deactivated_at","_online_until",b"_online_until","_unregistered_at",b"_unregistered_at","last_activated_at",b"last_activated_at","last_deactivated_at",b"last_deactivated_at","online_until",b"online_until","unregistered_at",b"unregistered_at"]) -> builtins.bool: ...
60
+ def ClearField(self, field_name: typing_extensions.Literal["_last_activated_at",b"_last_activated_at","_last_deactivated_at",b"_last_deactivated_at","_online_until",b"_online_until","_unregistered_at",b"_unregistered_at","heartbeat_interval",b"heartbeat_interval","last_activated_at",b"last_activated_at","last_deactivated_at",b"last_deactivated_at","node_id",b"node_id","online_until",b"online_until","owner_aid",b"owner_aid","public_key",b"public_key","registered_at",b"registered_at","status",b"status","unregistered_at",b"unregistered_at"]) -> None: ...
61
+ @typing.overload
62
+ def WhichOneof(self, oneof_group: typing_extensions.Literal["_last_activated_at",b"_last_activated_at"]) -> typing.Optional[typing_extensions.Literal["last_activated_at"]]: ...
63
+ @typing.overload
64
+ def WhichOneof(self, oneof_group: typing_extensions.Literal["_last_deactivated_at",b"_last_deactivated_at"]) -> typing.Optional[typing_extensions.Literal["last_deactivated_at"]]: ...
65
+ @typing.overload
66
+ def WhichOneof(self, oneof_group: typing_extensions.Literal["_online_until",b"_online_until"]) -> typing.Optional[typing_extensions.Literal["online_until"]]: ...
67
+ @typing.overload
68
+ def WhichOneof(self, oneof_group: typing_extensions.Literal["_unregistered_at",b"_unregistered_at"]) -> typing.Optional[typing_extensions.Literal["unregistered_at"]]: ...
69
+ global___NodeInfo = NodeInfo