flwr-nightly 1.23.0.dev20251017__py3-none-any.whl → 1.23.0.dev20251020__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/cli/app.py +4 -4
- flwr/cli/supernode/__init__.py +4 -4
- flwr/cli/supernode/ls.py +12 -12
- flwr/cli/supernode/{create.py → register.py} +13 -12
- flwr/cli/supernode/{delete.py → unregister.py} +12 -10
- flwr/common/exit/exit_code.py +5 -0
- flwr/proto/control_pb2.py +15 -15
- flwr/proto/control_pb2.pyi +12 -12
- flwr/proto/control_pb2_grpc.py +41 -41
- flwr/proto/control_pb2_grpc.pyi +24 -24
- flwr/proto/node_pb2.py +2 -2
- flwr/proto/node_pb2.pyi +10 -10
- flwr/server/app.py +11 -0
- flwr/server/superlink/fleet/grpc_rere/fleet_servicer.py +28 -2
- flwr/server/superlink/linkstate/in_memory_linkstate.py +14 -12
- flwr/server/superlink/linkstate/sqlite_linkstate.py +13 -13
- flwr/supercore/constant.py +2 -2
- flwr/superlink/servicer/control/control_servicer.py +41 -40
- flwr/supernode/start_client_internal.py +14 -0
- {flwr_nightly-1.23.0.dev20251017.dist-info → flwr_nightly-1.23.0.dev20251020.dist-info}/METADATA +1 -1
- {flwr_nightly-1.23.0.dev20251017.dist-info → flwr_nightly-1.23.0.dev20251020.dist-info}/RECORD +23 -23
- {flwr_nightly-1.23.0.dev20251017.dist-info → flwr_nightly-1.23.0.dev20251020.dist-info}/WHEEL +0 -0
- {flwr_nightly-1.23.0.dev20251017.dist-info → flwr_nightly-1.23.0.dev20251020.dist-info}/entry_points.txt +0 -0
flwr/cli/app.py
CHANGED
|
@@ -28,9 +28,9 @@ from .new import new
|
|
|
28
28
|
from .pull import pull
|
|
29
29
|
from .run import run
|
|
30
30
|
from .stop import stop
|
|
31
|
-
from .supernode import create as supernode_create
|
|
32
|
-
from .supernode import delete as supernode_delete
|
|
33
31
|
from .supernode import ls as supernode_list
|
|
32
|
+
from .supernode import register as supernode_register
|
|
33
|
+
from .supernode import unregister as supernode_unregister
|
|
34
34
|
|
|
35
35
|
app = typer.Typer(
|
|
36
36
|
help=typer.style(
|
|
@@ -55,8 +55,8 @@ app.command()(pull)
|
|
|
55
55
|
|
|
56
56
|
# Create supernode command group
|
|
57
57
|
supernode_app = typer.Typer(help="Manage SuperNodes")
|
|
58
|
-
supernode_app.command()(
|
|
59
|
-
supernode_app.command()(
|
|
58
|
+
supernode_app.command()(supernode_register)
|
|
59
|
+
supernode_app.command()(supernode_unregister)
|
|
60
60
|
# Make it appear as "list"
|
|
61
61
|
supernode_app.command("list")(supernode_list)
|
|
62
62
|
# Hide "ls" command (left as alias)
|
flwr/cli/supernode/__init__.py
CHANGED
|
@@ -14,12 +14,12 @@
|
|
|
14
14
|
# ==============================================================================
|
|
15
15
|
"""Flower command line interface `supernode` command."""
|
|
16
16
|
|
|
17
|
-
from .create import create as create
|
|
18
|
-
from .delete import delete as delete
|
|
19
17
|
from .ls import ls as ls
|
|
18
|
+
from .register import register as register
|
|
19
|
+
from .unregister import unregister as unregister
|
|
20
20
|
|
|
21
21
|
__all__ = [
|
|
22
|
-
"create",
|
|
23
|
-
"delete",
|
|
24
22
|
"ls",
|
|
23
|
+
"register",
|
|
24
|
+
"unregister",
|
|
25
25
|
]
|
flwr/cli/supernode/ls.py
CHANGED
|
@@ -36,8 +36,8 @@ from flwr.common.constant import FAB_CONFIG_FILE, CliOutputFormat
|
|
|
36
36
|
from flwr.common.date import format_timedelta, isoformat8601_utc
|
|
37
37
|
from flwr.common.logger import print_json_error, redirect_output, restore_output
|
|
38
38
|
from flwr.proto.control_pb2 import ( # pylint: disable=E0611
|
|
39
|
-
|
|
40
|
-
|
|
39
|
+
ListNodesRequest,
|
|
40
|
+
ListNodesResponse,
|
|
41
41
|
)
|
|
42
42
|
from flwr.proto.control_pb2_grpc import ControlStub
|
|
43
43
|
from flwr.proto.node_pb2 import NodeInfo # pylint: disable=E0611
|
|
@@ -135,9 +135,7 @@ def ls( # pylint: disable=R0914, R0913, R0917
|
|
|
135
135
|
def _list_nodes(stub: ControlStub, dry_run: bool) -> list[_NodeListType]:
|
|
136
136
|
"""List all nodes."""
|
|
137
137
|
with flwr_cli_grpc_exc_handler():
|
|
138
|
-
res:
|
|
139
|
-
ListNodesCliRequest(dry_run=dry_run)
|
|
140
|
-
)
|
|
138
|
+
res: ListNodesResponse = stub.ListNodes(ListNodesRequest(dry_run=dry_run))
|
|
141
139
|
|
|
142
140
|
return _format_nodes(list(res.nodes_info), res.now)
|
|
143
141
|
|
|
@@ -153,7 +151,9 @@ def _format_nodes(
|
|
|
153
151
|
|
|
154
152
|
formatted_nodes: list[_NodeListType] = []
|
|
155
153
|
# Add rows
|
|
156
|
-
for node in sorted(
|
|
154
|
+
for node in sorted(
|
|
155
|
+
nodes_info, key=lambda x: datetime.fromisoformat(x.registered_at)
|
|
156
|
+
):
|
|
157
157
|
|
|
158
158
|
# Calculate elapsed times
|
|
159
159
|
elapsed_time_activated = timedelta()
|
|
@@ -168,10 +168,10 @@ def _format_nodes(
|
|
|
168
168
|
node.node_id,
|
|
169
169
|
node.owner_aid,
|
|
170
170
|
node.status,
|
|
171
|
-
_format_datetime(node.
|
|
171
|
+
_format_datetime(node.registered_at),
|
|
172
172
|
_format_datetime(node.last_activated_at),
|
|
173
173
|
_format_datetime(node.last_deactivated_at),
|
|
174
|
-
_format_datetime(node.
|
|
174
|
+
_format_datetime(node.unregistered_at),
|
|
175
175
|
format_timedelta(elapsed_time_activated),
|
|
176
176
|
)
|
|
177
177
|
)
|
|
@@ -200,7 +200,7 @@ def _to_table(nodes_info: list[_NodeListType], verbose: bool) -> Table:
|
|
|
200
200
|
_,
|
|
201
201
|
last_activated_at,
|
|
202
202
|
last_deactivated_at,
|
|
203
|
-
|
|
203
|
+
unregistered_at,
|
|
204
204
|
elapse_activated,
|
|
205
205
|
) = row
|
|
206
206
|
|
|
@@ -210,12 +210,12 @@ def _to_table(nodes_info: list[_NodeListType], verbose: bool) -> Table:
|
|
|
210
210
|
elif status == "offline":
|
|
211
211
|
status_style = "bright_yellow"
|
|
212
212
|
time_at = last_deactivated_at
|
|
213
|
-
elif status == "
|
|
213
|
+
elif status == "unregistered":
|
|
214
214
|
if not verbose:
|
|
215
215
|
continue
|
|
216
216
|
status_style = "red"
|
|
217
|
-
time_at =
|
|
218
|
-
elif status == "
|
|
217
|
+
time_at = unregistered_at
|
|
218
|
+
elif status == "registered":
|
|
219
219
|
status_style = "blue"
|
|
220
220
|
time_at = "N/A"
|
|
221
221
|
else:
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
# ==============================================================================
|
|
15
|
-
"""Flower command line interface `supernode
|
|
15
|
+
"""Flower command line interface `supernode register` command."""
|
|
16
16
|
|
|
17
17
|
|
|
18
18
|
import io
|
|
@@ -36,8 +36,8 @@ from flwr.common.constant import FAB_CONFIG_FILE, CliOutputFormat
|
|
|
36
36
|
from flwr.common.exit import ExitCode, flwr_exit
|
|
37
37
|
from flwr.common.logger import print_json_error, redirect_output, restore_output
|
|
38
38
|
from flwr.proto.control_pb2 import ( # pylint: disable=E0611
|
|
39
|
-
|
|
40
|
-
|
|
39
|
+
RegisterNodeRequest,
|
|
40
|
+
RegisterNodeResponse,
|
|
41
41
|
)
|
|
42
42
|
from flwr.proto.control_pb2_grpc import ControlStub
|
|
43
43
|
from flwr.supercore.primitives.asymmetric import public_key_to_bytes, uses_nist_ec_curve
|
|
@@ -45,7 +45,7 @@ from flwr.supercore.primitives.asymmetric import public_key_to_bytes, uses_nist_
|
|
|
45
45
|
from ..utils import flwr_cli_grpc_exc_handler, init_channel, load_cli_auth_plugin
|
|
46
46
|
|
|
47
47
|
|
|
48
|
-
def
|
|
48
|
+
def register( # pylint: disable=R0914
|
|
49
49
|
public_key: Annotated[
|
|
50
50
|
Path,
|
|
51
51
|
typer.Argument(
|
|
@@ -90,7 +90,7 @@ def create( # pylint: disable=R0914
|
|
|
90
90
|
federation, federation_config = validate_federation_in_project_config(
|
|
91
91
|
federation, config
|
|
92
92
|
)
|
|
93
|
-
exit_if_no_address(federation_config, "supernode
|
|
93
|
+
exit_if_no_address(federation_config, "supernode register")
|
|
94
94
|
|
|
95
95
|
channel = None
|
|
96
96
|
try:
|
|
@@ -98,7 +98,7 @@ def create( # pylint: disable=R0914
|
|
|
98
98
|
channel = init_channel(app, federation_config, auth_plugin)
|
|
99
99
|
stub = ControlStub(channel) # pylint: disable=unused-variable # noqa: F841
|
|
100
100
|
|
|
101
|
-
|
|
101
|
+
_register_node(
|
|
102
102
|
stub=stub, public_key=public_key_bytes, output_format=output_format
|
|
103
103
|
)
|
|
104
104
|
|
|
@@ -130,15 +130,16 @@ def create( # pylint: disable=R0914
|
|
|
130
130
|
captured_output.close()
|
|
131
131
|
|
|
132
132
|
|
|
133
|
-
def
|
|
134
|
-
"""
|
|
133
|
+
def _register_node(stub: ControlStub, public_key: bytes, output_format: str) -> None:
|
|
134
|
+
"""Register a node."""
|
|
135
135
|
with flwr_cli_grpc_exc_handler():
|
|
136
|
-
response:
|
|
137
|
-
request=
|
|
136
|
+
response: RegisterNodeResponse = stub.RegisterNode(
|
|
137
|
+
request=RegisterNodeRequest(public_key=public_key)
|
|
138
138
|
)
|
|
139
139
|
if response.node_id:
|
|
140
140
|
typer.secho(
|
|
141
|
-
f"✅
|
|
141
|
+
f"✅ SuperNode {response.node_id} registered successfully.",
|
|
142
|
+
fg=typer.colors.GREEN,
|
|
142
143
|
)
|
|
143
144
|
if output_format == CliOutputFormat.JSON:
|
|
144
145
|
run_output = json.dumps(
|
|
@@ -150,7 +151,7 @@ def _create_node(stub: ControlStub, public_key: bytes, output_format: str) -> No
|
|
|
150
151
|
restore_output()
|
|
151
152
|
Console().print_json(run_output)
|
|
152
153
|
else:
|
|
153
|
-
typer.secho("❌
|
|
154
|
+
typer.secho("❌ SuperNode couldn't be registered.", fg=typer.colors.RED)
|
|
154
155
|
|
|
155
156
|
|
|
156
157
|
def try_load_public_key(public_key_path: Path) -> bytes:
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
# ==============================================================================
|
|
15
|
-
"""Flower command line interface `supernode
|
|
15
|
+
"""Flower command line interface `supernode unregister` command."""
|
|
16
16
|
|
|
17
17
|
|
|
18
18
|
import io
|
|
@@ -31,13 +31,13 @@ from flwr.cli.config_utils import (
|
|
|
31
31
|
)
|
|
32
32
|
from flwr.common.constant import FAB_CONFIG_FILE, CliOutputFormat
|
|
33
33
|
from flwr.common.logger import print_json_error, redirect_output, restore_output
|
|
34
|
-
from flwr.proto.control_pb2 import
|
|
34
|
+
from flwr.proto.control_pb2 import UnregisterNodeRequest # pylint: disable=E0611
|
|
35
35
|
from flwr.proto.control_pb2_grpc import ControlStub
|
|
36
36
|
|
|
37
37
|
from ..utils import flwr_cli_grpc_exc_handler, init_channel, load_cli_auth_plugin
|
|
38
38
|
|
|
39
39
|
|
|
40
|
-
def
|
|
40
|
+
def unregister( # pylint: disable=R0914
|
|
41
41
|
node_id: Annotated[
|
|
42
42
|
int,
|
|
43
43
|
typer.Argument(
|
|
@@ -61,7 +61,7 @@ def delete( # pylint: disable=R0914
|
|
|
61
61
|
),
|
|
62
62
|
] = CliOutputFormat.DEFAULT,
|
|
63
63
|
) -> None:
|
|
64
|
-
"""
|
|
64
|
+
"""Unregister a SuperNode from the federation."""
|
|
65
65
|
suppress_output = output_format == CliOutputFormat.JSON
|
|
66
66
|
captured_output = io.StringIO()
|
|
67
67
|
|
|
@@ -78,7 +78,7 @@ def delete( # pylint: disable=R0914
|
|
|
78
78
|
federation, federation_config = validate_federation_in_project_config(
|
|
79
79
|
federation, config
|
|
80
80
|
)
|
|
81
|
-
exit_if_no_address(federation_config, "supernode
|
|
81
|
+
exit_if_no_address(federation_config, "supernode unregister")
|
|
82
82
|
|
|
83
83
|
channel = None
|
|
84
84
|
try:
|
|
@@ -86,7 +86,7 @@ def delete( # pylint: disable=R0914
|
|
|
86
86
|
channel = init_channel(app, federation_config, auth_plugin)
|
|
87
87
|
stub = ControlStub(channel) # pylint: disable=unused-variable # noqa: F841
|
|
88
88
|
|
|
89
|
-
|
|
89
|
+
_unregister_node(stub=stub, node_id=node_id, output_format=output_format)
|
|
90
90
|
|
|
91
91
|
except ValueError as err:
|
|
92
92
|
typer.secho(
|
|
@@ -116,15 +116,17 @@ def delete( # pylint: disable=R0914
|
|
|
116
116
|
captured_output.close()
|
|
117
117
|
|
|
118
118
|
|
|
119
|
-
def
|
|
119
|
+
def _unregister_node(
|
|
120
120
|
stub: ControlStub,
|
|
121
121
|
node_id: int,
|
|
122
122
|
output_format: str,
|
|
123
123
|
) -> None:
|
|
124
|
-
"""
|
|
124
|
+
"""Unregister a SuperNode from the federation."""
|
|
125
125
|
with flwr_cli_grpc_exc_handler():
|
|
126
|
-
stub.
|
|
127
|
-
typer.secho(
|
|
126
|
+
stub.UnregisterNode(request=UnregisterNodeRequest(node_id=node_id))
|
|
127
|
+
typer.secho(
|
|
128
|
+
f"✅ SuperNode {node_id} unregistered successfully.", fg=typer.colors.GREEN
|
|
129
|
+
)
|
|
128
130
|
if output_format == CliOutputFormat.JSON:
|
|
129
131
|
run_output = json.dumps(
|
|
130
132
|
{
|
flwr/common/exit/exit_code.py
CHANGED
|
@@ -43,6 +43,7 @@ class ExitCode:
|
|
|
43
43
|
SUPERNODE_REST_ADDRESS_INVALID = 300
|
|
44
44
|
# SUPERNODE_NODE_AUTH_KEYS_REQUIRED = 301 --- DELETED ---
|
|
45
45
|
SUPERNODE_NODE_AUTH_KEY_INVALID = 302
|
|
46
|
+
SUPERNODE_STARTED_WITHOUT_TLS_BUT_NODE_AUTH_ENABLED = 303
|
|
46
47
|
|
|
47
48
|
# SuperExec-specific exit codes (400-499)
|
|
48
49
|
SUPEREXEC_INVALID_PLUGIN_CONFIG = 400
|
|
@@ -110,6 +111,10 @@ EXIT_CODE_HELP = {
|
|
|
110
111
|
"Please ensure that the file path points to a valid private key "
|
|
111
112
|
"file and try again."
|
|
112
113
|
),
|
|
114
|
+
ExitCode.SUPERNODE_STARTED_WITHOUT_TLS_BUT_NODE_AUTH_ENABLED: (
|
|
115
|
+
"The private key for SuperNode authentication was provided, but TLS is not "
|
|
116
|
+
"enabled. Node authentication can only be used when TLS is enabled."
|
|
117
|
+
),
|
|
113
118
|
# SuperExec-specific exit codes (400-499)
|
|
114
119
|
ExitCode.SUPEREXEC_INVALID_PLUGIN_CONFIG: (
|
|
115
120
|
"The YAML configuration for the SuperExec plugin is invalid."
|
flwr/proto/control_pb2.py
CHANGED
|
@@ -19,7 +19,7 @@ from flwr.proto import run_pb2 as flwr_dot_proto_dot_run__pb2
|
|
|
19
19
|
from flwr.proto import node_pb2 as flwr_dot_proto_dot_node__pb2
|
|
20
20
|
|
|
21
21
|
|
|
22
|
-
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x18\x66lwr/proto/control.proto\x12\nflwr.proto\x1a\x14\x66lwr/proto/fab.proto\x1a\x1a\x66lwr/proto/transport.proto\x1a\x1b\x66lwr/proto/recorddict.proto\x1a\x14\x66lwr/proto/run.proto\x1a\x15\x66lwr/proto/node.proto\"\xfa\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\x34\n\x12\x66\x65\x64\x65ration_options\x18\x03 \x01(\x0b\x32\x18.flwr.proto.ConfigRecord\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\"2\n\x10StartRunResponse\x12\x13\n\x06run_id\x18\x01 \x01(\x04H\x00\x88\x01\x01\x42\t\n\x07_run_id\"<\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\"\x18\n\x16GetLoginDetailsRequest\"\x8b\x01\n\x17GetLoginDetailsResponse\x12\x12\n\nauthn_type\x18\x01 \x01(\t\x12\x13\n\x0b\x64\x65vice_code\x18\x02 \x01(\t\x12!\n\x19verification_uri_complete\x18\x03 \x01(\t\x12\x12\n\nexpires_in\x18\x04 \x01(\x03\x12\x10\n\x08interval\x18\x05 \x01(\x03\"+\n\x14GetAuthTokensRequest\x12\x13\n\x0b\x64\x65vice_code\x18\x01 \x01(\t\"D\n\x15GetAuthTokensResponse\x12\x14\n\x0c\x61\x63\x63\x65ss_token\x18\x01 \x01(\t\x12\x15\n\rrefresh_token\x18\x02 \x01(\t\" \n\x0eStopRunRequest\x12\x0e\n\x06run_id\x18\x01 \x01(\x04\"\"\n\x0fStopRunResponse\x12\x0f\n\x07success\x18\x01 \x01(\x08\"&\n\x14PullArtifactsRequest\x12\x0e\n\x06run_id\x18\x01 \x01(\x04\"1\n\x15PullArtifactsResponse\x12\x10\n\x03url\x18\x01 \x01(\tH\x00\x88\x01\x01\x42\x06\n\x04_url\"
|
|
22
|
+
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x18\x66lwr/proto/control.proto\x12\nflwr.proto\x1a\x14\x66lwr/proto/fab.proto\x1a\x1a\x66lwr/proto/transport.proto\x1a\x1b\x66lwr/proto/recorddict.proto\x1a\x14\x66lwr/proto/run.proto\x1a\x15\x66lwr/proto/node.proto\"\xfa\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\x34\n\x12\x66\x65\x64\x65ration_options\x18\x03 \x01(\x0b\x32\x18.flwr.proto.ConfigRecord\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\"2\n\x10StartRunResponse\x12\x13\n\x06run_id\x18\x01 \x01(\x04H\x00\x88\x01\x01\x42\t\n\x07_run_id\"<\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\"\x18\n\x16GetLoginDetailsRequest\"\x8b\x01\n\x17GetLoginDetailsResponse\x12\x12\n\nauthn_type\x18\x01 \x01(\t\x12\x13\n\x0b\x64\x65vice_code\x18\x02 \x01(\t\x12!\n\x19verification_uri_complete\x18\x03 \x01(\t\x12\x12\n\nexpires_in\x18\x04 \x01(\x03\x12\x10\n\x08interval\x18\x05 \x01(\x03\"+\n\x14GetAuthTokensRequest\x12\x13\n\x0b\x64\x65vice_code\x18\x01 \x01(\t\"D\n\x15GetAuthTokensResponse\x12\x14\n\x0c\x61\x63\x63\x65ss_token\x18\x01 \x01(\t\x12\x15\n\rrefresh_token\x18\x02 \x01(\t\" \n\x0eStopRunRequest\x12\x0e\n\x06run_id\x18\x01 \x01(\x04\"\"\n\x0fStopRunResponse\x12\x0f\n\x07success\x18\x01 \x01(\x08\"&\n\x14PullArtifactsRequest\x12\x0e\n\x06run_id\x18\x01 \x01(\x04\"1\n\x15PullArtifactsResponse\x12\x10\n\x03url\x18\x01 \x01(\tH\x00\x88\x01\x01\x42\x06\n\x04_url\")\n\x13RegisterNodeRequest\x12\x12\n\npublic_key\x18\x01 \x01(\x0c\"8\n\x14RegisterNodeResponse\x12\x14\n\x07node_id\x18\x01 \x01(\x04H\x00\x88\x01\x01\x42\n\n\x08_node_id\"(\n\x15UnregisterNodeRequest\x12\x0f\n\x07node_id\x18\x01 \x01(\x04\"\x18\n\x16UnregisterNodeResponse\"#\n\x10ListNodesRequest\x12\x0f\n\x07\x64ry_run\x18\x01 \x01(\x08\"J\n\x11ListNodesResponse\x12(\n\nnodes_info\x18\x01 \x03(\x0b\x32\x14.flwr.proto.NodeInfo\x12\x0b\n\x03now\x18\x02 \x01(\t2\xbc\x06\n\x07\x43ontrol\x12G\n\x08StartRun\x12\x1b.flwr.proto.StartRunRequest\x1a\x1c.flwr.proto.StartRunResponse\"\x00\x12\x44\n\x07StopRun\x12\x1a.flwr.proto.StopRunRequest\x1a\x1b.flwr.proto.StopRunResponse\"\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\x12\\\n\x0fGetLoginDetails\x12\".flwr.proto.GetLoginDetailsRequest\x1a#.flwr.proto.GetLoginDetailsResponse\"\x00\x12V\n\rGetAuthTokens\x12 .flwr.proto.GetAuthTokensRequest\x1a!.flwr.proto.GetAuthTokensResponse\"\x00\x12V\n\rPullArtifacts\x12 .flwr.proto.PullArtifactsRequest\x1a!.flwr.proto.PullArtifactsResponse\"\x00\x12S\n\x0cRegisterNode\x12\x1f.flwr.proto.RegisterNodeRequest\x1a .flwr.proto.RegisterNodeResponse\"\x00\x12Y\n\x0eUnregisterNode\x12!.flwr.proto.UnregisterNodeRequest\x1a\".flwr.proto.UnregisterNodeResponse\"\x00\x12J\n\tListNodes\x12\x1c.flwr.proto.ListNodesRequest\x1a\x1d.flwr.proto.ListNodesResponse\"\x00\x62\x06proto3')
|
|
23
23
|
|
|
24
24
|
_globals = globals()
|
|
25
25
|
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
|
|
@@ -62,18 +62,18 @@ if _descriptor._USE_C_DESCRIPTORS == False:
|
|
|
62
62
|
_globals['_PULLARTIFACTSREQUEST']._serialized_end=1201
|
|
63
63
|
_globals['_PULLARTIFACTSRESPONSE']._serialized_start=1203
|
|
64
64
|
_globals['_PULLARTIFACTSRESPONSE']._serialized_end=1252
|
|
65
|
-
_globals['
|
|
66
|
-
_globals['
|
|
67
|
-
_globals['
|
|
68
|
-
_globals['
|
|
69
|
-
_globals['
|
|
70
|
-
_globals['
|
|
71
|
-
_globals['
|
|
72
|
-
_globals['
|
|
73
|
-
_globals['
|
|
74
|
-
_globals['
|
|
75
|
-
_globals['
|
|
76
|
-
_globals['
|
|
77
|
-
_globals['_CONTROL']._serialized_start=
|
|
78
|
-
_globals['_CONTROL']._serialized_end=
|
|
65
|
+
_globals['_REGISTERNODEREQUEST']._serialized_start=1254
|
|
66
|
+
_globals['_REGISTERNODEREQUEST']._serialized_end=1295
|
|
67
|
+
_globals['_REGISTERNODERESPONSE']._serialized_start=1297
|
|
68
|
+
_globals['_REGISTERNODERESPONSE']._serialized_end=1353
|
|
69
|
+
_globals['_UNREGISTERNODEREQUEST']._serialized_start=1355
|
|
70
|
+
_globals['_UNREGISTERNODEREQUEST']._serialized_end=1395
|
|
71
|
+
_globals['_UNREGISTERNODERESPONSE']._serialized_start=1397
|
|
72
|
+
_globals['_UNREGISTERNODERESPONSE']._serialized_end=1421
|
|
73
|
+
_globals['_LISTNODESREQUEST']._serialized_start=1423
|
|
74
|
+
_globals['_LISTNODESREQUEST']._serialized_end=1458
|
|
75
|
+
_globals['_LISTNODESRESPONSE']._serialized_start=1460
|
|
76
|
+
_globals['_LISTNODESRESPONSE']._serialized_end=1534
|
|
77
|
+
_globals['_CONTROL']._serialized_start=1537
|
|
78
|
+
_globals['_CONTROL']._serialized_end=2365
|
|
79
79
|
# @@protoc_insertion_point(module_scope)
|
flwr/proto/control_pb2.pyi
CHANGED
|
@@ -236,7 +236,7 @@ class PullArtifactsResponse(google.protobuf.message.Message):
|
|
|
236
236
|
def WhichOneof(self, oneof_group: typing_extensions.Literal["_url",b"_url"]) -> typing.Optional[typing_extensions.Literal["url"]]: ...
|
|
237
237
|
global___PullArtifactsResponse = PullArtifactsResponse
|
|
238
238
|
|
|
239
|
-
class
|
|
239
|
+
class RegisterNodeRequest(google.protobuf.message.Message):
|
|
240
240
|
DESCRIPTOR: google.protobuf.descriptor.Descriptor
|
|
241
241
|
PUBLIC_KEY_FIELD_NUMBER: builtins.int
|
|
242
242
|
public_key: builtins.bytes
|
|
@@ -245,9 +245,9 @@ class CreateNodeCliRequest(google.protobuf.message.Message):
|
|
|
245
245
|
public_key: builtins.bytes = ...,
|
|
246
246
|
) -> None: ...
|
|
247
247
|
def ClearField(self, field_name: typing_extensions.Literal["public_key",b"public_key"]) -> None: ...
|
|
248
|
-
|
|
248
|
+
global___RegisterNodeRequest = RegisterNodeRequest
|
|
249
249
|
|
|
250
|
-
class
|
|
250
|
+
class RegisterNodeResponse(google.protobuf.message.Message):
|
|
251
251
|
DESCRIPTOR: google.protobuf.descriptor.Descriptor
|
|
252
252
|
NODE_ID_FIELD_NUMBER: builtins.int
|
|
253
253
|
node_id: builtins.int
|
|
@@ -258,9 +258,9 @@ class CreateNodeCliResponse(google.protobuf.message.Message):
|
|
|
258
258
|
def HasField(self, field_name: typing_extensions.Literal["_node_id",b"_node_id","node_id",b"node_id"]) -> builtins.bool: ...
|
|
259
259
|
def ClearField(self, field_name: typing_extensions.Literal["_node_id",b"_node_id","node_id",b"node_id"]) -> None: ...
|
|
260
260
|
def WhichOneof(self, oneof_group: typing_extensions.Literal["_node_id",b"_node_id"]) -> typing.Optional[typing_extensions.Literal["node_id"]]: ...
|
|
261
|
-
|
|
261
|
+
global___RegisterNodeResponse = RegisterNodeResponse
|
|
262
262
|
|
|
263
|
-
class
|
|
263
|
+
class UnregisterNodeRequest(google.protobuf.message.Message):
|
|
264
264
|
DESCRIPTOR: google.protobuf.descriptor.Descriptor
|
|
265
265
|
NODE_ID_FIELD_NUMBER: builtins.int
|
|
266
266
|
node_id: builtins.int
|
|
@@ -269,15 +269,15 @@ class DeleteNodeCliRequest(google.protobuf.message.Message):
|
|
|
269
269
|
node_id: builtins.int = ...,
|
|
270
270
|
) -> None: ...
|
|
271
271
|
def ClearField(self, field_name: typing_extensions.Literal["node_id",b"node_id"]) -> None: ...
|
|
272
|
-
|
|
272
|
+
global___UnregisterNodeRequest = UnregisterNodeRequest
|
|
273
273
|
|
|
274
|
-
class
|
|
274
|
+
class UnregisterNodeResponse(google.protobuf.message.Message):
|
|
275
275
|
DESCRIPTOR: google.protobuf.descriptor.Descriptor
|
|
276
276
|
def __init__(self,
|
|
277
277
|
) -> None: ...
|
|
278
|
-
|
|
278
|
+
global___UnregisterNodeResponse = UnregisterNodeResponse
|
|
279
279
|
|
|
280
|
-
class
|
|
280
|
+
class ListNodesRequest(google.protobuf.message.Message):
|
|
281
281
|
DESCRIPTOR: google.protobuf.descriptor.Descriptor
|
|
282
282
|
DRY_RUN_FIELD_NUMBER: builtins.int
|
|
283
283
|
dry_run: builtins.bool
|
|
@@ -286,9 +286,9 @@ class ListNodesCliRequest(google.protobuf.message.Message):
|
|
|
286
286
|
dry_run: builtins.bool = ...,
|
|
287
287
|
) -> None: ...
|
|
288
288
|
def ClearField(self, field_name: typing_extensions.Literal["dry_run",b"dry_run"]) -> None: ...
|
|
289
|
-
|
|
289
|
+
global___ListNodesRequest = ListNodesRequest
|
|
290
290
|
|
|
291
|
-
class
|
|
291
|
+
class ListNodesResponse(google.protobuf.message.Message):
|
|
292
292
|
DESCRIPTOR: google.protobuf.descriptor.Descriptor
|
|
293
293
|
NODES_INFO_FIELD_NUMBER: builtins.int
|
|
294
294
|
NOW_FIELD_NUMBER: builtins.int
|
|
@@ -301,4 +301,4 @@ class ListNodesCliResponse(google.protobuf.message.Message):
|
|
|
301
301
|
now: typing.Text = ...,
|
|
302
302
|
) -> None: ...
|
|
303
303
|
def ClearField(self, field_name: typing_extensions.Literal["nodes_info",b"nodes_info","now",b"now"]) -> None: ...
|
|
304
|
-
|
|
304
|
+
global___ListNodesResponse = ListNodesResponse
|
flwr/proto/control_pb2_grpc.py
CHANGED
|
@@ -49,20 +49,20 @@ class ControlStub(object):
|
|
|
49
49
|
request_serializer=flwr_dot_proto_dot_control__pb2.PullArtifactsRequest.SerializeToString,
|
|
50
50
|
response_deserializer=flwr_dot_proto_dot_control__pb2.PullArtifactsResponse.FromString,
|
|
51
51
|
)
|
|
52
|
-
self.
|
|
53
|
-
'/flwr.proto.Control/
|
|
54
|
-
request_serializer=flwr_dot_proto_dot_control__pb2.
|
|
55
|
-
response_deserializer=flwr_dot_proto_dot_control__pb2.
|
|
52
|
+
self.RegisterNode = channel.unary_unary(
|
|
53
|
+
'/flwr.proto.Control/RegisterNode',
|
|
54
|
+
request_serializer=flwr_dot_proto_dot_control__pb2.RegisterNodeRequest.SerializeToString,
|
|
55
|
+
response_deserializer=flwr_dot_proto_dot_control__pb2.RegisterNodeResponse.FromString,
|
|
56
56
|
)
|
|
57
|
-
self.
|
|
58
|
-
'/flwr.proto.Control/
|
|
59
|
-
request_serializer=flwr_dot_proto_dot_control__pb2.
|
|
60
|
-
response_deserializer=flwr_dot_proto_dot_control__pb2.
|
|
57
|
+
self.UnregisterNode = channel.unary_unary(
|
|
58
|
+
'/flwr.proto.Control/UnregisterNode',
|
|
59
|
+
request_serializer=flwr_dot_proto_dot_control__pb2.UnregisterNodeRequest.SerializeToString,
|
|
60
|
+
response_deserializer=flwr_dot_proto_dot_control__pb2.UnregisterNodeResponse.FromString,
|
|
61
61
|
)
|
|
62
|
-
self.
|
|
63
|
-
'/flwr.proto.Control/
|
|
64
|
-
request_serializer=flwr_dot_proto_dot_control__pb2.
|
|
65
|
-
response_deserializer=flwr_dot_proto_dot_control__pb2.
|
|
62
|
+
self.ListNodes = channel.unary_unary(
|
|
63
|
+
'/flwr.proto.Control/ListNodes',
|
|
64
|
+
request_serializer=flwr_dot_proto_dot_control__pb2.ListNodesRequest.SerializeToString,
|
|
65
|
+
response_deserializer=flwr_dot_proto_dot_control__pb2.ListNodesResponse.FromString,
|
|
66
66
|
)
|
|
67
67
|
|
|
68
68
|
|
|
@@ -118,21 +118,21 @@ class ControlServicer(object):
|
|
|
118
118
|
context.set_details('Method not implemented!')
|
|
119
119
|
raise NotImplementedError('Method not implemented!')
|
|
120
120
|
|
|
121
|
-
def
|
|
122
|
-
"""
|
|
121
|
+
def RegisterNode(self, request, context):
|
|
122
|
+
"""Register SuperNode
|
|
123
123
|
"""
|
|
124
124
|
context.set_code(grpc.StatusCode.UNIMPLEMENTED)
|
|
125
125
|
context.set_details('Method not implemented!')
|
|
126
126
|
raise NotImplementedError('Method not implemented!')
|
|
127
127
|
|
|
128
|
-
def
|
|
129
|
-
"""
|
|
128
|
+
def UnregisterNode(self, request, context):
|
|
129
|
+
"""Unregister SuperNode
|
|
130
130
|
"""
|
|
131
131
|
context.set_code(grpc.StatusCode.UNIMPLEMENTED)
|
|
132
132
|
context.set_details('Method not implemented!')
|
|
133
133
|
raise NotImplementedError('Method not implemented!')
|
|
134
134
|
|
|
135
|
-
def
|
|
135
|
+
def ListNodes(self, request, context):
|
|
136
136
|
"""List SuperNodes
|
|
137
137
|
"""
|
|
138
138
|
context.set_code(grpc.StatusCode.UNIMPLEMENTED)
|
|
@@ -177,20 +177,20 @@ def add_ControlServicer_to_server(servicer, server):
|
|
|
177
177
|
request_deserializer=flwr_dot_proto_dot_control__pb2.PullArtifactsRequest.FromString,
|
|
178
178
|
response_serializer=flwr_dot_proto_dot_control__pb2.PullArtifactsResponse.SerializeToString,
|
|
179
179
|
),
|
|
180
|
-
'
|
|
181
|
-
servicer.
|
|
182
|
-
request_deserializer=flwr_dot_proto_dot_control__pb2.
|
|
183
|
-
response_serializer=flwr_dot_proto_dot_control__pb2.
|
|
180
|
+
'RegisterNode': grpc.unary_unary_rpc_method_handler(
|
|
181
|
+
servicer.RegisterNode,
|
|
182
|
+
request_deserializer=flwr_dot_proto_dot_control__pb2.RegisterNodeRequest.FromString,
|
|
183
|
+
response_serializer=flwr_dot_proto_dot_control__pb2.RegisterNodeResponse.SerializeToString,
|
|
184
184
|
),
|
|
185
|
-
'
|
|
186
|
-
servicer.
|
|
187
|
-
request_deserializer=flwr_dot_proto_dot_control__pb2.
|
|
188
|
-
response_serializer=flwr_dot_proto_dot_control__pb2.
|
|
185
|
+
'UnregisterNode': grpc.unary_unary_rpc_method_handler(
|
|
186
|
+
servicer.UnregisterNode,
|
|
187
|
+
request_deserializer=flwr_dot_proto_dot_control__pb2.UnregisterNodeRequest.FromString,
|
|
188
|
+
response_serializer=flwr_dot_proto_dot_control__pb2.UnregisterNodeResponse.SerializeToString,
|
|
189
189
|
),
|
|
190
|
-
'
|
|
191
|
-
servicer.
|
|
192
|
-
request_deserializer=flwr_dot_proto_dot_control__pb2.
|
|
193
|
-
response_serializer=flwr_dot_proto_dot_control__pb2.
|
|
190
|
+
'ListNodes': grpc.unary_unary_rpc_method_handler(
|
|
191
|
+
servicer.ListNodes,
|
|
192
|
+
request_deserializer=flwr_dot_proto_dot_control__pb2.ListNodesRequest.FromString,
|
|
193
|
+
response_serializer=flwr_dot_proto_dot_control__pb2.ListNodesResponse.SerializeToString,
|
|
194
194
|
),
|
|
195
195
|
}
|
|
196
196
|
generic_handler = grpc.method_handlers_generic_handler(
|
|
@@ -322,7 +322,7 @@ class Control(object):
|
|
|
322
322
|
insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
|
|
323
323
|
|
|
324
324
|
@staticmethod
|
|
325
|
-
def
|
|
325
|
+
def RegisterNode(request,
|
|
326
326
|
target,
|
|
327
327
|
options=(),
|
|
328
328
|
channel_credentials=None,
|
|
@@ -332,14 +332,14 @@ class Control(object):
|
|
|
332
332
|
wait_for_ready=None,
|
|
333
333
|
timeout=None,
|
|
334
334
|
metadata=None):
|
|
335
|
-
return grpc.experimental.unary_unary(request, target, '/flwr.proto.Control/
|
|
336
|
-
flwr_dot_proto_dot_control__pb2.
|
|
337
|
-
flwr_dot_proto_dot_control__pb2.
|
|
335
|
+
return grpc.experimental.unary_unary(request, target, '/flwr.proto.Control/RegisterNode',
|
|
336
|
+
flwr_dot_proto_dot_control__pb2.RegisterNodeRequest.SerializeToString,
|
|
337
|
+
flwr_dot_proto_dot_control__pb2.RegisterNodeResponse.FromString,
|
|
338
338
|
options, channel_credentials,
|
|
339
339
|
insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
|
|
340
340
|
|
|
341
341
|
@staticmethod
|
|
342
|
-
def
|
|
342
|
+
def UnregisterNode(request,
|
|
343
343
|
target,
|
|
344
344
|
options=(),
|
|
345
345
|
channel_credentials=None,
|
|
@@ -349,14 +349,14 @@ class Control(object):
|
|
|
349
349
|
wait_for_ready=None,
|
|
350
350
|
timeout=None,
|
|
351
351
|
metadata=None):
|
|
352
|
-
return grpc.experimental.unary_unary(request, target, '/flwr.proto.Control/
|
|
353
|
-
flwr_dot_proto_dot_control__pb2.
|
|
354
|
-
flwr_dot_proto_dot_control__pb2.
|
|
352
|
+
return grpc.experimental.unary_unary(request, target, '/flwr.proto.Control/UnregisterNode',
|
|
353
|
+
flwr_dot_proto_dot_control__pb2.UnregisterNodeRequest.SerializeToString,
|
|
354
|
+
flwr_dot_proto_dot_control__pb2.UnregisterNodeResponse.FromString,
|
|
355
355
|
options, channel_credentials,
|
|
356
356
|
insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
|
|
357
357
|
|
|
358
358
|
@staticmethod
|
|
359
|
-
def
|
|
359
|
+
def ListNodes(request,
|
|
360
360
|
target,
|
|
361
361
|
options=(),
|
|
362
362
|
channel_credentials=None,
|
|
@@ -366,8 +366,8 @@ class Control(object):
|
|
|
366
366
|
wait_for_ready=None,
|
|
367
367
|
timeout=None,
|
|
368
368
|
metadata=None):
|
|
369
|
-
return grpc.experimental.unary_unary(request, target, '/flwr.proto.Control/
|
|
370
|
-
flwr_dot_proto_dot_control__pb2.
|
|
371
|
-
flwr_dot_proto_dot_control__pb2.
|
|
369
|
+
return grpc.experimental.unary_unary(request, target, '/flwr.proto.Control/ListNodes',
|
|
370
|
+
flwr_dot_proto_dot_control__pb2.ListNodesRequest.SerializeToString,
|
|
371
|
+
flwr_dot_proto_dot_control__pb2.ListNodesResponse.FromString,
|
|
372
372
|
options, channel_credentials,
|
|
373
373
|
insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
|
flwr/proto/control_pb2_grpc.pyi
CHANGED
|
@@ -44,19 +44,19 @@ class ControlStub:
|
|
|
44
44
|
flwr.proto.control_pb2.PullArtifactsResponse]
|
|
45
45
|
"""Pull artifacts generated during a run (flwr pull)"""
|
|
46
46
|
|
|
47
|
-
|
|
48
|
-
flwr.proto.control_pb2.
|
|
49
|
-
flwr.proto.control_pb2.
|
|
50
|
-
"""
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
flwr.proto.control_pb2.
|
|
54
|
-
flwr.proto.control_pb2.
|
|
55
|
-
"""
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
flwr.proto.control_pb2.
|
|
59
|
-
flwr.proto.control_pb2.
|
|
47
|
+
RegisterNode: grpc.UnaryUnaryMultiCallable[
|
|
48
|
+
flwr.proto.control_pb2.RegisterNodeRequest,
|
|
49
|
+
flwr.proto.control_pb2.RegisterNodeResponse]
|
|
50
|
+
"""Register SuperNode"""
|
|
51
|
+
|
|
52
|
+
UnregisterNode: grpc.UnaryUnaryMultiCallable[
|
|
53
|
+
flwr.proto.control_pb2.UnregisterNodeRequest,
|
|
54
|
+
flwr.proto.control_pb2.UnregisterNodeResponse]
|
|
55
|
+
"""Unregister SuperNode"""
|
|
56
|
+
|
|
57
|
+
ListNodes: grpc.UnaryUnaryMultiCallable[
|
|
58
|
+
flwr.proto.control_pb2.ListNodesRequest,
|
|
59
|
+
flwr.proto.control_pb2.ListNodesResponse]
|
|
60
60
|
"""List SuperNodes"""
|
|
61
61
|
|
|
62
62
|
|
|
@@ -118,26 +118,26 @@ class ControlServicer(metaclass=abc.ABCMeta):
|
|
|
118
118
|
pass
|
|
119
119
|
|
|
120
120
|
@abc.abstractmethod
|
|
121
|
-
def
|
|
122
|
-
request: flwr.proto.control_pb2.
|
|
121
|
+
def RegisterNode(self,
|
|
122
|
+
request: flwr.proto.control_pb2.RegisterNodeRequest,
|
|
123
123
|
context: grpc.ServicerContext,
|
|
124
|
-
) -> flwr.proto.control_pb2.
|
|
125
|
-
"""
|
|
124
|
+
) -> flwr.proto.control_pb2.RegisterNodeResponse:
|
|
125
|
+
"""Register SuperNode"""
|
|
126
126
|
pass
|
|
127
127
|
|
|
128
128
|
@abc.abstractmethod
|
|
129
|
-
def
|
|
130
|
-
request: flwr.proto.control_pb2.
|
|
129
|
+
def UnregisterNode(self,
|
|
130
|
+
request: flwr.proto.control_pb2.UnregisterNodeRequest,
|
|
131
131
|
context: grpc.ServicerContext,
|
|
132
|
-
) -> flwr.proto.control_pb2.
|
|
133
|
-
"""
|
|
132
|
+
) -> flwr.proto.control_pb2.UnregisterNodeResponse:
|
|
133
|
+
"""Unregister SuperNode"""
|
|
134
134
|
pass
|
|
135
135
|
|
|
136
136
|
@abc.abstractmethod
|
|
137
|
-
def
|
|
138
|
-
request: flwr.proto.control_pb2.
|
|
137
|
+
def ListNodes(self,
|
|
138
|
+
request: flwr.proto.control_pb2.ListNodesRequest,
|
|
139
139
|
context: grpc.ServicerContext,
|
|
140
|
-
) -> flwr.proto.control_pb2.
|
|
140
|
+
) -> flwr.proto.control_pb2.ListNodesResponse:
|
|
141
141
|
"""List SuperNodes"""
|
|
142
142
|
pass
|
|
143
143
|
|