From bfab8a004263ded33f86b297079d357e8881a6c0 Mon Sep 17 00:00:00 2001 From: Tauquir <30658453+itstauq@users.noreply.github.com> Date: Fri, 2 Aug 2024 17:36:34 +0400 Subject: [PATCH 1/3] Add ability to directly specify enclave route as a string --- .../V3/V3-Enclave-Model-HostingSingle-Notebook.ipynb | 8 ++++---- .../syft/service/enclave/datasite_enclave_service.py | 2 +- packages/syft/src/syft/service/enclave/enclave.py | 11 ++++++++++- 3 files changed, 15 insertions(+), 6 deletions(-) diff --git a/notebooks/experimental/enclaves/V3/V3-Enclave-Model-HostingSingle-Notebook.ipynb b/notebooks/experimental/enclaves/V3/V3-Enclave-Model-HostingSingle-Notebook.ipynb index 3a3431e2917..a9197a101be 100644 --- a/notebooks/experimental/enclaves/V3/V3-Enclave-Model-HostingSingle-Notebook.ipynb +++ b/notebooks/experimental/enclaves/V3/V3-Enclave-Model-HostingSingle-Notebook.ipynb @@ -23,7 +23,6 @@ "import syft as sy\n", "from syft.abstract_server import ServerType\n", "from syft.service.code.user_code import UserCodeStatus\n", - "from syft.service.network.routes import HTTPServerRoute\n", "from syft.service.network.server_peer import ServerPeer\n", "from syft.service.project.project import ProjectCode\n", "from syft.service.project.project import check_route_reachability\n", @@ -486,8 +485,9 @@ "metadata": {}, "outputs": [], "source": [ - "route = HTTPServerRoute(host_or_ip=CANADA_ENCLAVE_HOST, port=CANADA_ENCLAVE_PORT)\n", - "do_canada_client.enclaves.add(route=route)" + "do_canada_client.enclaves.add(\n", + " route=f\"http://{CANADA_ENCLAVE_HOST}:{CANADA_ENCLAVE_PORT}\"\n", + ")" ] }, { @@ -959,7 +959,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.8" + "version": "3.11.7" } }, "nbformat": 4, diff --git a/packages/syft/src/syft/service/enclave/datasite_enclave_service.py b/packages/syft/src/syft/service/enclave/datasite_enclave_service.py index 9c535a00423..610314dc908 100644 --- a/packages/syft/src/syft/service/enclave/datasite_enclave_service.py +++ b/packages/syft/src/syft/service/enclave/datasite_enclave_service.py @@ -41,7 +41,7 @@ def __init__(self, store: DocumentStore) -> None: roles=ADMIN_ROLE_LEVEL, ) def add( - self, context: AuthedServiceContext, route: ServerRouteType + self, context: AuthedServiceContext, route: ServerRouteType | str ) -> SyftSuccess | SyftError: """Add an Enclave to the network.""" enclave = EnclaveInstance(route=route) diff --git a/packages/syft/src/syft/service/enclave/enclave.py b/packages/syft/src/syft/service/enclave/enclave.py index 6cc22b4cf30..e49635eee9a 100644 --- a/packages/syft/src/syft/service/enclave/enclave.py +++ b/packages/syft/src/syft/service/enclave/enclave.py @@ -1,6 +1,7 @@ # stdlib from enum import Enum from typing import Any +from urllib.parse import urlparse # third party from pydantic import model_validator @@ -11,6 +12,7 @@ from ...serde.serializable import serializable from ...server.credentials import SyftSigningKey from ...service.metadata.server_metadata import ServerMetadataJSON +from ...service.network.routes import HTTPServerRoute from ...service.network.routes import ServerRouteType from ...service.network.server_peer import route_to_connection from ...service.response import SyftException @@ -48,8 +50,15 @@ class EnclaveInstance(SyftObject): @model_validator(mode="before") @classmethod def initialize_values(cls, values: dict[str, Any]) -> dict[str, Any]: - is_being_created = "id" not in values + route = values.get("route") + if isinstance(route, str): + # convert the route string to a ServerRouteType object + route_url = urlparse(route) + values["route"] = HTTPServerRoute( + host_or_ip=route_url.hostname, port=route_url.port + ) + is_being_created = "id" not in values if is_being_created and "route" in values: connection = route_to_connection(values["route"]) metadata = connection.get_server_metadata(credentials=None) From 5c9be14451912647b867854f5004919b545daccb Mon Sep 17 00:00:00 2001 From: Tauquir <30658453+itstauq@users.noreply.github.com> Date: Sat, 3 Aug 2024 16:50:59 +0400 Subject: [PATCH 2/3] Add default port for the route if not provided --- packages/syft/src/syft/service/enclave/enclave.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/packages/syft/src/syft/service/enclave/enclave.py b/packages/syft/src/syft/service/enclave/enclave.py index e49635eee9a..dd347d67d00 100644 --- a/packages/syft/src/syft/service/enclave/enclave.py +++ b/packages/syft/src/syft/service/enclave/enclave.py @@ -5,6 +5,7 @@ # third party from pydantic import model_validator +from urllib3.connectionpool import port_by_scheme # relative from ...client.client import SyftClient @@ -54,9 +55,9 @@ def initialize_values(cls, values: dict[str, Any]) -> dict[str, Any]: if isinstance(route, str): # convert the route string to a ServerRouteType object route_url = urlparse(route) - values["route"] = HTTPServerRoute( - host_or_ip=route_url.hostname, port=route_url.port - ) + hostname = route_url.hostname + port = route_url.port or port_by_scheme.get(route_url.scheme) + values["route"] = HTTPServerRoute(host_or_ip=hostname, port=port) is_being_created = "id" not in values if is_being_created and "route" in values: From 37b27f24829737dfdf8f069f755b2f932f03c001 Mon Sep 17 00:00:00 2001 From: rasswanth-s <43314053+rasswanth-s@users.noreply.github.com> Date: Sun, 4 Aug 2024 19:26:00 +0530 Subject: [PATCH 3/3] update route addition, based on url --- ...-Enclave-Model-HostingSingle-Notebook.ipynb | 6 ++---- .../enclave/datasite_enclave_service.py | 18 ++++++++++++++++-- .../syft/src/syft/service/enclave/enclave.py | 11 ----------- 3 files changed, 18 insertions(+), 17 deletions(-) diff --git a/notebooks/experimental/enclaves/V3/V3-Enclave-Model-HostingSingle-Notebook.ipynb b/notebooks/experimental/enclaves/V3/V3-Enclave-Model-HostingSingle-Notebook.ipynb index bd93d00edef..3c9695070ed 100644 --- a/notebooks/experimental/enclaves/V3/V3-Enclave-Model-HostingSingle-Notebook.ipynb +++ b/notebooks/experimental/enclaves/V3/V3-Enclave-Model-HostingSingle-Notebook.ipynb @@ -483,9 +483,7 @@ "metadata": {}, "outputs": [], "source": [ - "do_canada_client.enclaves.add(\n", - " route=f\"http://{CANADA_ENCLAVE_HOST}:{CANADA_ENCLAVE_PORT}\"\n", - ")" + "do_canada_client.enclaves.add(url=f\"http://{CANADA_ENCLAVE_HOST}:{CANADA_ENCLAVE_PORT}\")" ] }, { @@ -961,7 +959,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.7" + "version": "3.11.8" } }, "nbformat": 4, diff --git a/packages/syft/src/syft/service/enclave/datasite_enclave_service.py b/packages/syft/src/syft/service/enclave/datasite_enclave_service.py index 610314dc908..967abac6750 100644 --- a/packages/syft/src/syft/service/enclave/datasite_enclave_service.py +++ b/packages/syft/src/syft/service/enclave/datasite_enclave_service.py @@ -6,6 +6,7 @@ # relative from ...serde.serializable import serializable from ...store.document_store import DocumentStore +from ...types.server_url import ServerURL from ...types.uid import UID from ..action.action_object import ActionObject from ..action.action_permissions import ActionObjectPermission @@ -13,7 +14,7 @@ from ..code.user_code import UserCode from ..context import AuthedServiceContext from ..model.model import ModelRef -from ..network.routes import ServerRouteType +from ..network.routes import HTTPServerRoute from ..response import SyftError from ..response import SyftSuccess from ..service import AbstractService @@ -41,9 +42,22 @@ def __init__(self, store: DocumentStore) -> None: roles=ADMIN_ROLE_LEVEL, ) def add( - self, context: AuthedServiceContext, route: ServerRouteType | str + self, + context: AuthedServiceContext, + route: HTTPServerRoute | None = None, + url: str | None = None, ) -> SyftSuccess | SyftError: """Add an Enclave to the network.""" + if route is None and url is None: + return SyftError(message="Either route or url must be provided.") + if url: + parsed_url = ServerURL.from_url(url) + route = HTTPServerRoute( + host_or_ip=parsed_url.host_or_ip, + port=parsed_url.port, + protocol=parsed_url.protocol, + ) + enclave = EnclaveInstance(route=route) result = self.stash.set( credentials=context.credentials, diff --git a/packages/syft/src/syft/service/enclave/enclave.py b/packages/syft/src/syft/service/enclave/enclave.py index dd347d67d00..af250de8c18 100644 --- a/packages/syft/src/syft/service/enclave/enclave.py +++ b/packages/syft/src/syft/service/enclave/enclave.py @@ -1,11 +1,9 @@ # stdlib from enum import Enum from typing import Any -from urllib.parse import urlparse # third party from pydantic import model_validator -from urllib3.connectionpool import port_by_scheme # relative from ...client.client import SyftClient @@ -13,7 +11,6 @@ from ...serde.serializable import serializable from ...server.credentials import SyftSigningKey from ...service.metadata.server_metadata import ServerMetadataJSON -from ...service.network.routes import HTTPServerRoute from ...service.network.routes import ServerRouteType from ...service.network.server_peer import route_to_connection from ...service.response import SyftException @@ -51,14 +48,6 @@ class EnclaveInstance(SyftObject): @model_validator(mode="before") @classmethod def initialize_values(cls, values: dict[str, Any]) -> dict[str, Any]: - route = values.get("route") - if isinstance(route, str): - # convert the route string to a ServerRouteType object - route_url = urlparse(route) - hostname = route_url.hostname - port = route_url.port or port_by_scheme.get(route_url.scheme) - values["route"] = HTTPServerRoute(host_or_ip=hostname, port=port) - is_being_created = "id" not in values if is_being_created and "route" in values: connection = route_to_connection(values["route"])